c语言字符串问题

走在路上的人吧 2011-12-10 10:13:22
c语言中编译器是不是会给字符串和字符数组默认的加'\0'
比如说char *p="abc";这后面有没有\0
又比如说char a[3]="abc"这后面有没有\0
...全文
169 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
pclvmm 2011-12-10
  • 打赏
  • 举报
回复

1 #include <stdio.h>
2
3 void show_chars(char *a, int len)
4 {
5 int i;
6
7 for (i=0; i<len; i++)
8 printf("%d\t",a[i]);
9 printf("\n");
10 }//show_chars
11
12 int main()
13 {
14 char *s1 = "abc";
15 char s2[3] = "abc";
16 char s3[4] = "abc";
17
18 show_chars( s1, sizeof(s1));
19 show_chars( s2, sizeof(s2));
20 show_chars( s3, sizeof(s3));
21
22 return 0;
23 }



输出结果:

97 98 99 0
97 98 99
97 98 99 0
x90386 2011-12-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhutou100hao 的回复:]
char p2[3]="abc"; 你这个能编译通过??
我改成 char p2[4]="abc";运行的结果是0啊~~~
引用 9 楼 x90386 的回复:

VC6下编译char a[3]="abc"报错。

于是做了个实验……
在Code::Blocks下编译
C/C++ code

#include <stdio.h>

int main(void)
{
……
[/Quote]

Code::Blocks SVN 7550 编译通过。
引用
-------------- Build: Debug in None ---------------

Compiling: Test.c
Linking console executable: bin\Debug\Test.exe
Output size is 25.46 KB
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 0 warnings (0 minutes, 0 seconds)
猪头小哥 2011-12-10
  • 打赏
  • 举报
回复

char p2[3]="abc"; 你这个能编译通过??
我改成 char p2[4]="abc";运行的结果是0啊~~~
[Quote=引用 9 楼 x90386 的回复:]

VC6下编译char a[3]="abc"报错。

于是做了个实验……
在Code::Blocks下编译
C/C++ code

#include <stdio.h>

int main(void)
{
char *p1="abc";
char p2[3]="abc";

printf("%x%x%x%x",*p1,*(p1+1),*(p1+2),*(p1+3)……
[/Quote]
猪头小哥 2011-12-10
  • 打赏
  • 举报
回复
char *p="abc";
char a[3]="abc";
这两个都是字符串,是吧,如果没有‘\0’那么系统就不知道它是在哪结束~~,这是字符串结束的标志~~~
char a[3]={'a', 'b', 'c'}; 是没有\0的,但是有的编译器会自动的给你加上。
你去看《C++程序设计》 谭浩强第五章 数组 在151页~~~
柯本 2011-12-10
  • 打赏
  • 举报
回复
这个应该是与编译器有关的,C/C++规定常量字串后面会有个'\0';
对某些编译器
char p2[3]="abc";
会出错(过多的初始化值)
正确的写出法
char p2[4]="abc"; //后面有'\0'

char p2[3]={'a','b','c'} ; //后面没'\0'
x90386 2011-12-10
  • 打赏
  • 举报
回复
按理说p2[3]即*(p2+3)应该为'\0'即0才对啊……各种囧ing……
x90386 2011-12-10
  • 打赏
  • 举报
回复
VC6下编译char a[3]="abc"报错。

于是做了个实验……
在Code::Blocks下编译

#include <stdio.h>

int main(void)
{
char *p1="abc";
char p2[3]="abc";

printf("%x%x%x%x",*p1,*(p1+1),*(p1+2),*(p1+3));
printf("\n");
printf("%x%x%x%x",p2[0],p2[1],p2[2],p2[3]);

return 0;
}


结果我囧了……
善良超锅锅 2011-12-10
  • 打赏
  • 举报
回复
那char a[3]=“abc”;输出的时候怎么确定已输出完毕?那没遇到'\0'怎么确定输出完毕呢?
zichen0422 2011-12-10
  • 打赏
  • 举报
回复
都有……
缺媳妇的郝 2011-12-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kongrenxin 的回复:]

char *p="abc";是以'\0'做结尾的
char a[3]="abc";的写法是错误的,应该是char a[3]={'a', 'b', 'c'};后面是没有'\0'的,除非写成
char a[4] = {'a', 'b', 'c', '\0'};
希望对你有帮助~
[/Quote]
++ 这个需要记住,很容易错的
x90386 2011-12-10
  • 打赏
  • 举报
回复
char a[3]实际会占4个字节的空间,\0在最后,它不计入串长,但要占用空间。
char *p同理。
kongrenxin 2011-12-10
  • 打赏
  • 举报
回复
自纠错:定义时候char a[3]="abc";的写法是可以的,除此外不能对数组直接赋值。abc后面有'\0',但此时a没地方放置。
kongrenxin 2011-12-10
  • 打赏
  • 举报
回复
char *p="abc";是以'\0'做结尾的
char a[3]="abc";的写法是错误的,应该是char a[3]={'a', 'b', 'c'};后面是没有'\0'的,除非写成
char a[4] = {'a', 'b', 'c', '\0'};
希望对你有帮助~
qq120848369 2011-12-10
  • 打赏
  • 举报
回复
都有.
vanguards 2011-12-10
  • 打赏
  • 举报
回复
字符数组不会默认的加'\0'
比如说char *p="abc";这后面有\0
又比如说char a[3]="abc"这后面有没有\0
第二种有问题了,定义的字符数组长度为3而字符串需要有3个空间存放abc,而后面还有个\0没地方存,所以错了
x90386 2011-12-10
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 fysola 的回复:]
楼主你好,我说说我在工作中对gcc编译器处理C字符串的理解:

char *p="abc"; 此种方式是使用指针指向常量区的一个字符串,
这个字符串的空间分配以及赋值情况完全又编译器自动完成,那么
编译器一定会在字符串结尾加上'\0'的,否则printf("%s",p)会发生内存泄露
----------------------------------------------------……
[/Quote]


膜拜,又做了个实验……
#include <stdio.h>

int main(void)
{
char *p1="abc";
char p2[3]="abc";
char *p3=p2+3;

printf("%x%x%x%x",*p1,*(p1+1),*(p1+2),*(p1+3));
printf("\n");
printf("%s",p2);

*p3='\0';

printf("\n");
printf("%s",p2);

return 0;
}

输出:
6162630
abc30@
abc
  • 打赏
  • 举报
回复
多谢各位已经清晰了,哈哈
whc748227431whc 2011-12-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kongrenxin 的回复:]
char *p="abc";是以'\0'做结尾的
char a[3]="abc";的写法是错误的,应该是char a[3]={'a', 'b', 'c'};后面是没有'\0'的,除非写成
char a[4] = {'a', 'b', 'c', '\0'};
希望对你有帮助~
[/Quote]+++就是这样子!
锋少 2011-12-10
  • 打赏
  • 举报
回复
以上好多的方法都可以解决
编程艺术 2011-12-10
  • 打赏
  • 举报
回复
同意3楼!学习
加载更多回复(3)

69,370

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧