苏嵌实训——day4(下)

简介: 苏嵌实训——day4(下)

5.2.4 strcat()


头文件:#include 
原型:char *strcat(char *dest, const char *src);
功能: 将src追加到dest的后面
参数:
    dest:目的字符串
    src:源字符串
返回值:
    追加后字符串的首地址
char *strncat(char *dest, const char *src, size_t n);
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
  char s1[32] ="hello wo\0rldadadjajdalsdkjaskdj";  //hello woabcdefg\0
  char s2[32] ="abcdefg\0higk";
  strcat(s1,s2);
  printf("s1 = %s\n",s1);
  return 0;
}


5.2.5 自己实现strcpy函数的功能


#include <stdio.h>
char *my_strcpy(char *s1,char *s2)
{
    if(NULL == s1 || NULL == s2)
    {
  return NULL;
    }
    int i = 0;
    while(s2[i] != '\0')
    {
  s1[i] = s2[i];
  i++;
    }
    s1[i] = '\0';
    return s1;
}
int main()
{
    char s1[] = "hello world";
    char s2[] = "world";
    char *result = my_strcpy(s1,s2); 
    for(int i = 0; i < sizeof(s1)/sizeof(s1[0]); i++)
    {
  printf("[%c] %d\n",result[i],result[i]);
    }
    return 0;
}


六、指针


6.1 指针的用途


使用程序简洁,紧凑,高效
有效地表示复杂的数据结构
动态分配内存
得到多于一个函数的返回值


6.2 指针的概念


当程序中定义一个变量之后,程序就会为这个变量在内存中开辟内存空间,我们内存中每一个字节的空间都有一个编号,将这个编号称之为地址,地址也叫做指针


在不影响理解的情况,有时对地址,指针,指针变量不区分,通称指针

&:取地址符

*:

1.定义时,如果前面是一种类型,表示这是一条定义语句,定义一个指针变量,pa是一个指针,指向整数a

2.使用时,*pa = 100;*表示取值的意思,取指针pa指向的内存的值

pa = 地址


#include <stdio.h>
int main(int argc, const char *argv[])
{
  //int a = 1;
  //int *pa = &a;
  printf("int* = %ld\n",sizeof(int *));
  printf("char* = %ld\n",sizeof(char *));
  printf("double* = %ld\n",sizeof(double *));
  printf("float* = %ld\n",sizeof(float *));
  printf("long* = %ld\n",sizeof(long *));
  int a = 1;
  char ch = 'a';
  //int *pc = &ch;  //类型不兼容
  char *pch = &ch;
  //ch = 'x';
  *pch = 'x';  //等价于ch = 'x'
  printf("ch = %c\n",ch);
  printf("ch = %c\n",*pch);
  int *pa = &a;
  printf("%p\n",pch);
  printf("%p\n",pa);
  printf("%p\n",pch + 1);  //不同类型的指针,步长不一样
  printf("%p\n",pa + 1);
  return 0;
}


6.3 指针变量的运算


指针运算是以指针变量所存放的地址量作为运算量而进行运算的。

因此,指针运算的实质就是地址的运算。

指针运算的种类是有限的,它只能进行算术运算,关系运算和赋值运算


6.3.1 算术运算符


+:  px + n 指针向地址大的方向移动n个数据 
-:  px - n 指针向地址小的方向移动n个数据
++: px++   指针向地址大的方向移动1个数据
--: px++   指针向地址小的方向移动1个数据


指针变量加减,表示指针变量向地址大或小的方向移动N个操作空间,两个指针变量相减,表示两个地址之间有多少个操作空间(多少个元素)

注意,两个指针做运算,必须是同类型的,类型不同没有任何意义。

一个指针变量加减有意义,乘除没有意义


后置++优先级高于前置++
后置++结合律从左往右
前置++和*优先级相同,结合律从右往左


#include <stdio.h>
int main(int argc, const char *argv[])
{
  int arr[6] = {1,3,5,8,9,10};
  int *p1 = arr;
  printf("*p1 = %d\n",*p1);
  p1++;
  int *p2 = p1++;
  printf("*p1 = %d,*p2 = %d\n",*p1,*p2);
  printf("p1 - p2 = %ld\n",p1 - p2);
  int y = *p1;  //取值
  printf("y = %d\n",y);
  y = ++*p1;
  printf("y = %d\n",y);
  y = (*p1)++;
  printf("y = %d\n",y);
  y = *p1++;   //赋值完成后,指针px加1
  printf("y = %d\n",y);
  printf("*p1 = %d\n",*p1);
  /*y = ++*p1++;   //赋值完成后,指针px加1
  printf("y = %d\n",y);
  printf("*p1 = %d\n",*p1);
  */
  return 0;
}


6.3.2 关系运算符


>     px > py
<
>=
<=
!=
==


两个指针变量可以通过关系运算符来判断保存地址的大小

两指针之间的关系运算符表示他们指向的地址位置之间的关系,指向地址大的指针大于指向地址小的指针

具有不同数据类型的指针之间的关系运算没有意义,指向不同数据区域的数据两个指针之间,关系运算符也没有意义。

指针与一般整数变量之间的关系运算也没有意义,但是可以和零进行等于或者不等于的关系运算,判断指针是否为空,一般与NULL


6.3.3 赋值运算


指针变量直接可以直接赋值,但是不能将一个整数赋值给指针变量,因为没有开辟空间

指针赋值运算是通过赋值运算符向指针变量送一个地址值,


6.2.4 练习:输入一个字符串,将字符串的元素翻转


#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
  char str[32] = {0};
  gets(str);
  printf("反转之前的字符串:%s\n",str);
  char *p = NULL,*q = NULL;
  char tmp;
  p = &str[0];
  q = &str[strlen(str) - 1];
#if 0
  while(p < q)
  {
  tmp = *p;
  *p = *q;
  *q = tmp;
  p++;
  q--;
  }
#endif
  for(;p < q;p++,q--)
  {
  tmp = *p;
  *p = *q;
  *q = tmp;
  }
  printf("反转之后的字符串:%s\n",str);
  return 0;
}


七、指针和一维数组


#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
  int a[5] = {1,2,3,4,5};
  int *p = a;
  int i;
  for(i = 0 ; i < 5;i++)
  {
  //printf("%d ",a[i]);
  printf("%d ",*(p+i));
  }
  putchar(10);
  char *s = "helloworld";
  char str[32] ="hello nanjing";
  s = str;
  //printf("%s\n",s);
  for(i = 0 ; i < 10;i++)
  {
  printf("%c",s[i]);
  }
  putchar(10);
  return 0;
}


练习


练习1:通过指针自己实现strlen函数的功能


#include <stdio.h>
int main(int argc, const char *argv[])
{
  char buf[32] = {0};
  printf("请输入一个字符串:\n");
  gets(buf);
  char *p = buf;
  int i;
  while(*p != '\0')
  {
  p++;
  i++;
  }
  printf("strlen(buf) = %d\n",i);
  return 0;
}


练习2: 通过指针实现strcpy函数的功能


#include <stdio.h>
int main(int argc, const char *argv[])
{
  char s1[] = "helloworld!";
  char s2[] = "abcdefghijk";
  char *p = NULL,*q = NULL;
  p = s1;
  q = s2;
  while(*q != '\0')
  {
  *p = *q;
  p++;
  q++;
  }
  *p = *q;
  printf("s1 = %s\n",s1);
  return 0;
}


作业


作业:

1.通过指针实现strcat功能


#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
    char s1[32] = "hello world";
    char s2[] = "abcdefg";
    char *p1 = &s1[strlen(s1)];
    char *p2 = s2;
    while(*p2 != '\0')
    {
        *p1 = *p2;
        p1++;
        p2++;
    }
    *p1 = '\0';
    printf("%s\n",s1);
    return 0;
}


2.实现atoi函数的功能

char str[] = '5891";

int num;

“5891” ----->5891

3. 输入一个字符串,输出字符串中有多少个空格

4. 输入两个字符串,判断一个字符串是否为另一个的子串

s1 = hellloworld s2 = oworl



相关文章
|
7月前
|
Java 关系型数据库 MySQL
|
Ubuntu API 数据库
苏嵌实训——day19
苏嵌实训——day19
113 0
苏嵌实训——day19
|
网络协议 数据安全/隐私保护 网络架构
苏嵌实训——day17(上)
苏嵌实训——day17(上)
苏嵌实训——day17(上)
|
消息中间件 存储 Linux
苏嵌实训——day16(上)
苏嵌实训——day16(上)
苏嵌实训——day16(上)
|
存储 程序员 Linux
苏嵌实训——day14(上)
苏嵌实训——day14(上)
苏嵌实训——day14(上)
|
存储 自然语言处理 C语言
苏嵌实训——day2(上)
苏嵌实训——day2(上)
143 0
苏嵌实训——day2(上)
|
存储 Linux 程序员
苏嵌实训——day13(上)
苏嵌实训——day13(上)
113 0
苏嵌实训——day13(上)
|
存储
苏嵌实训——day9(上)
苏嵌实训——day9(上)
苏嵌实训——day9(上)
|
存储
苏嵌实训——day11(下)
苏嵌实训——day11(下)
106 0
苏嵌实训——day11(下)