字符串处理易错点

素颜马尾好姑娘i 2022-08-10 08:33 288阅读 0赞

一.知识点

1.字符指针和字符数组

(1)字符指针,是个变量,存放的是地址而已。是个指针,如只 定义,则指针指向不可用的地址 ,不能乱用 ,则指针没指向任何地址,赋值后用来指向一个字符串。所以用时必须malloc

(2)字符数组,定义是系统就为其分配了数组大小的区域。字符串定义时可以为数组中的每个元素赋值。

2.字符可以通过ascii码进行算法运算

例:字符转换为数字

函数 atoi

字符9减去字符0就是9 ‘9’-‘0’

统计字母重复次数,利用差值作为数组索引

‘z’-‘a’就是26

3.字符指针赋值

*pOutputStr ++=pInputStr[i-1];//给字符串指针赋值

*pOutputStr=’\0’; //字符串结束赋值

4.sizeof字符指针的长度为4

二.例子

1.字符串数组和字符指针

char day[15] = “abcdefghijklmn”;
char* strTmp = “opqrstuvwxyz”;

char* myTmp;

myTmp=”aaaaaaaaaaaaaa”;

(1)定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间。定义字符串数组时,为其分配了内存

(2)char day[15] = “abcdefghijklmn”;这样理解,定义字符串数组时系统为其分配了15字节的空间, 然后用“abcdefghijklmn”来初始化这个字符串数组。char* strTmp = “opqrstuvwxyz”;这样理解, 系统认为”opqrstuvwxyz” 是字符串常量,存储在常量区(区别于堆栈)。用strTmp这个指针指向了这个区域。

2.常见错误

错误1:

  1. char \*name;
  2. scanf("%s",name);
  3. printf("%s",name);

有的编译器虽然也能通过,但这是错误的,因为是个指针,定义时指向不可用的地址。解决这个问题有两种方法:用数组的方法或给字符针针分配内存空间的方法。

  1. 数组的方法:
  2. char name\[20\];
  3. scanf("%s",name);
  4. printf("%s",name);
  5. 给字符针针分配内存空间的办法:
  6. char \*name;
  7. name=(char\*)malloc(50); //此时name已经指向一个刚刚分配的地址空间。
  8. scanf("%s",name);
  9. printf("%s",name);

错误2:

char *ps;

ps=”C Language”;

这样是正确的!

char a[10];
a[10]=”hello”;
这样是错误的!

1.char a[10]; a[10]=”hello”;//一个字符怎么能容纳一个字符串?况且a[10]也是不存在的!

2.char a[10]; a=”hello”;//这种情况容易出现,a虽然是指针,但是它已经指向在堆栈中分配的10个字符空间,现在这个情况a又指向数据区中的hello常量,这里的指针a出现混乱,不允许

错误3:不能使用关系运算符“==”来比较两个字符串,只能用strcmp() 函数来处理。赋值也是,不能用=,只能strcpy

试图使用关系运算符或判等运算符来比较字符串是合法的,但不会产生预期的结果:
if (str1==str2) … /*** WRONG ***/
这条语句把str1和str2作为指针来进行比较,而不是比较两个数组的内容。因为str1和str2有不同的地址,所以表达式str1 == str2的值一定为0。

错误4:

char str1[40]=”hello world!”;
str1[4]=’A’; //正确,定义字符串数组时,就分配了40个字节的空间,hello world是为其初始化的值,当然可以修改。

char *str1=”hello world!”;

str1[4]=’A’; //错误,str指针指向的是一个字符串常量,存储在常量去,不允许修改

发表评论

表情:
评论列表 (有 0 条评论,288人围观)

还没有评论,来说两句吧...

相关阅读