C语言中字符串相关操作注意事项

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
00000000

0063FE64
0063FE68
0063FE6C
0063FE70
0063FE74

00B033E8
00B03408
00B06C10
00B06C30
00B06C50

0063FE64
0063FE68
0063FE6C
0063FE70
0063FE74

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值