C语言中字符串相关操作注意事项
1.字符串赋值
字符数组可以在定义时整体赋值,不能在赋值语句中整体赋值
常见有一下三种方式:
1)定义的时候直接用字符串赋值
char a[10]="hello";
上例中a[6]=’\0’,即编译器自动为字符串末尾加上了结束符”\0“。
2)对数组中字符逐个赋值
char a[10]={'h','e','l','l','o'};
上例中同样有a[6]=’\0’。
3)利用strcpy
char a[10];
strcpy(a, "hello");
2.容易发生的错误赋值情况
char a[10];
a="hello";
这种情况容易出现,a虽然是指针,但是它已经指向在堆栈中分配的10个字符空间,现在这个情况a又指向数据区中的hello常量,这里的指针a出现混乱,不允许!
补充一点:
char *a; a="hello";
这种情况是正确的。这样赋值给a的是字符串“hello”第一个元素的地址。
3.字符串判等
试图使用关系运算符或判等运算符来比较字符串是合法的,但不会产生预期的结果:
if (str1==str2)
{
...
}
这条语句把str1和str2作为指针来进行比较,而不是比较两个数组的内容。因为str1和str2有不同的地址,所以表达式str1 == str2的值一定为0。不能使用关系运算符“==”来比较两个字符串,只能用strcmp() 函数来处理。
4.字符串复制
直接尝试对字符串进行复制或比较操作会失败。例如,假定str1和str2有如下声明:
char str1[10], str2[10];
利用=运算符来把字符串复制到字符数组中是不可能的:
str1 = "abc";
str2 = str1;
C语言把这些语句解释为一个指针与另一个指针之间的(非法的)赋值运算。但是,使用=初始化字符数组是合法的:
char str1[10] = "abc";
这是因为在声明中,=不是赋值运算符。
以上参考自c中给字符数组,字符串指针赋值的方法总结
5.字符串数组
1)二维字符型数组实现
char s[5][20]={0};
for(int i=0;i<5;i++)//输入
{
scanf("%s",s[i]);
}
for(int i=0;i<5;i++)//输出
{
for(int j=0;s[i][j];j++)
{
printf("%c",s[i][j]);
}
printf("\n");
}
2)字符指针数组实现
1.初始化数组内容
char *s[]={"Hello","world","!"}; //初始化时数组大小可以缺省
for(int i=0;i<3;i++)
printf("%s ",s[i]); //Hello world !
printf("%d",sizeof(s)); //12(3*sizeof(char *))——32位编译器
printf("%c\n",s[1][2]); //r
printf("%c\n",*(s[1]+2)); //r
printf("%c\n",*(*(s+1)+2)); //r
2.运行中赋值
char *s[5]; for(int i=0;i<5;i++) printf("%p\n",s[i]); //打印指针数组内的元素(随机) for(int i=0;i<5;i++) printf("%p\n",&s[i]); //打印指针数组各个元素的地址(连贯) for(int i=0;i<5;i++)//必须给每个指针分配空间后才可以用%s形式一一输入字符串 s[i]=new char[20]; for(int i=0;i<5;i++) printf("%p\n",s[i]); //打印指针数组内的元素(随机) for(int i=0;i<5;i++) printf("%p\n",&s[i]); //打印指针数组各个元素的地址(连贯) for(int i=0;i<5;i++) { scanf("%s",s[i]); } for(int i=0;i<5;i++) { for(int j=0;*(s[i]+j);j++) { printf("%c",*(s[i]+j)); } printf("\n"); }
00B015B8
00000000
0040CF4F
0040D640
000000000063FE64
0063FE68
0063FE6C
0063FE70
0063FE7400B033E8
00B03408
00B06C10
00B06C30
00B06C500063FE64
0063FE68
0063FE6C
0063FE70
0063FE74