{
char s[5]="china";
printf("%s",s);
}
我在tc2下运行时,输出的字符不只是“china",后面还有几个莫名其妙的字符,为什么呢?
14 个解决方案
#1
数组溢出 "china"一共有6个字符呢,还有一个'\0'
这样 char s[]="china";
这样 char s[]="china";
#2
不是这个原因
刚才我调试了一下,其实输出的的确只有china,后面并没有莫名其妙的字符。
(TC2.0)
另外,C中允许char s[5]="china";这样赋值。
这种情况下S[4]='A'已经到字符串结尾了,字符串可以无结束标记'/0'
刚才我调试了一下,其实输出的的确只有china,后面并没有莫名其妙的字符。
(TC2.0)
另外,C中允许char s[5]="china";这样赋值。
这种情况下S[4]='A'已经到字符串结尾了,字符串可以无结束标记'/0'
#3
你最好还是不要这么做,毕竟程序是有隐患的,不要进行这些边缘行为。。。。。。
#4
我使用dev-C++没有这种情况。
#5
在赫伯特.希尔特的《C语言大全》中确实不提倡,但是谭浩强的《C程序设计中》说如果是用字符串常量赋值可以不用'/0'结束,系统自己会加上;如果使用字符赋值,也可以不加,但建议加上,只是为了保持清晰。
#6
我感觉你这样作不好!
printf("%s",s);
S是按照字符串输出的,而在C语言中没有对数组的检查,所以它将输出到一个内存内容是“/0”的,它才停止输出。
printf("%s",s);
S是按照字符串输出的,而在C语言中没有对数组的检查,所以它将输出到一个内存内容是“/0”的,它才停止输出。
#7
确实有么名奇妙的字符,printf("%s",s);按字符串打印时,系统会自动遇到'\0'而结束打印
由于s[5]="china",字符串里没有'\0',所以系统会继续打印。
如果s[6]="china"就不会出现这种情况了,因为系统会自动赋值s[5]='\0'
由于s[5]="china",字符串里没有'\0',所以系统会继续打印。
如果s[6]="china"就不会出现这种情况了,因为系统会自动赋值s[5]='\0'
#8
我在dev-c++下有一个compile error:
initializer-string for array of chars is too long
所以说不要这么干
initializer-string for array of chars is too long
所以说不要这么干
#9
在数组输入出的时候,拿你那道题说先找到S的地址判断是否为'\0',如果不是就输入,然后再依次判断下一个是否为'\0',如果是就停止输出不是的话就继续输出,如果最后开赋值的前五个中都没有'\0'的话,那第个有可能是是'\0'如果是的话就不输出了,也有可能不是,如果不是的话就继续输出一个地址中的内容直到'\0',所以就输出了一些莫名其妙的字符
#10
array bounds overflow
知道什么意思吧??
呵呵,就是已经溢出了
那当然就是奇怪的字符罗
呵呵
你把 5 改成 6 嘛,就可以了
知道什么意思吧??
呵呵,就是已经溢出了
那当然就是奇怪的字符罗
呵呵
你把 5 改成 6 嘛,就可以了
#11
char s[5]="china";
s 是一个数组,而非字符串,所以它没有足够的空间来容纳 '\0', 也就是说 '\0' 丢失了。
这样的话,就没有正确的字符串结束标志了,所以就如上面大家讲的知道碰到第一个 '\0' 才停止输出,也就出现了许多垃圾字符。
s 是一个数组,而非字符串,所以它没有足够的空间来容纳 '\0', 也就是说 '\0' 丢失了。
这样的话,就没有正确的字符串结束标志了,所以就如上面大家讲的知道碰到第一个 '\0' 才停止输出,也就出现了许多垃圾字符。
#12
字符串要求以'\0'结束的。
char s[]="china";这样系统会自动加上'\0'.
或者,自己赋值s[6]='\0'也可以。
char s[]="china";这样系统会自动加上'\0'.
或者,自己赋值s[6]='\0'也可以。
#13
还是按楼上的比较好,不同的编译器有时会有不同结果。
对于这等擦边球,最好还是清晰点好
对于这等擦边球,最好还是清晰点好
#14
在vc6.0下都不能同过编译
总之字符串是要以'\0'结尾的否则会出现意想不到的问题
总之字符串是要以'\0'结尾的否则会出现意想不到的问题
#1
数组溢出 "china"一共有6个字符呢,还有一个'\0'
这样 char s[]="china";
这样 char s[]="china";
#2
不是这个原因
刚才我调试了一下,其实输出的的确只有china,后面并没有莫名其妙的字符。
(TC2.0)
另外,C中允许char s[5]="china";这样赋值。
这种情况下S[4]='A'已经到字符串结尾了,字符串可以无结束标记'/0'
刚才我调试了一下,其实输出的的确只有china,后面并没有莫名其妙的字符。
(TC2.0)
另外,C中允许char s[5]="china";这样赋值。
这种情况下S[4]='A'已经到字符串结尾了,字符串可以无结束标记'/0'
#3
你最好还是不要这么做,毕竟程序是有隐患的,不要进行这些边缘行为。。。。。。
#4
我使用dev-C++没有这种情况。
#5
在赫伯特.希尔特的《C语言大全》中确实不提倡,但是谭浩强的《C程序设计中》说如果是用字符串常量赋值可以不用'/0'结束,系统自己会加上;如果使用字符赋值,也可以不加,但建议加上,只是为了保持清晰。
#6
我感觉你这样作不好!
printf("%s",s);
S是按照字符串输出的,而在C语言中没有对数组的检查,所以它将输出到一个内存内容是“/0”的,它才停止输出。
printf("%s",s);
S是按照字符串输出的,而在C语言中没有对数组的检查,所以它将输出到一个内存内容是“/0”的,它才停止输出。
#7
确实有么名奇妙的字符,printf("%s",s);按字符串打印时,系统会自动遇到'\0'而结束打印
由于s[5]="china",字符串里没有'\0',所以系统会继续打印。
如果s[6]="china"就不会出现这种情况了,因为系统会自动赋值s[5]='\0'
由于s[5]="china",字符串里没有'\0',所以系统会继续打印。
如果s[6]="china"就不会出现这种情况了,因为系统会自动赋值s[5]='\0'
#8
我在dev-c++下有一个compile error:
initializer-string for array of chars is too long
所以说不要这么干
initializer-string for array of chars is too long
所以说不要这么干
#9
在数组输入出的时候,拿你那道题说先找到S的地址判断是否为'\0',如果不是就输入,然后再依次判断下一个是否为'\0',如果是就停止输出不是的话就继续输出,如果最后开赋值的前五个中都没有'\0'的话,那第个有可能是是'\0'如果是的话就不输出了,也有可能不是,如果不是的话就继续输出一个地址中的内容直到'\0',所以就输出了一些莫名其妙的字符
#10
array bounds overflow
知道什么意思吧??
呵呵,就是已经溢出了
那当然就是奇怪的字符罗
呵呵
你把 5 改成 6 嘛,就可以了
知道什么意思吧??
呵呵,就是已经溢出了
那当然就是奇怪的字符罗
呵呵
你把 5 改成 6 嘛,就可以了
#11
char s[5]="china";
s 是一个数组,而非字符串,所以它没有足够的空间来容纳 '\0', 也就是说 '\0' 丢失了。
这样的话,就没有正确的字符串结束标志了,所以就如上面大家讲的知道碰到第一个 '\0' 才停止输出,也就出现了许多垃圾字符。
s 是一个数组,而非字符串,所以它没有足够的空间来容纳 '\0', 也就是说 '\0' 丢失了。
这样的话,就没有正确的字符串结束标志了,所以就如上面大家讲的知道碰到第一个 '\0' 才停止输出,也就出现了许多垃圾字符。
#12
字符串要求以'\0'结束的。
char s[]="china";这样系统会自动加上'\0'.
或者,自己赋值s[6]='\0'也可以。
char s[]="china";这样系统会自动加上'\0'.
或者,自己赋值s[6]='\0'也可以。
#13
还是按楼上的比较好,不同的编译器有时会有不同结果。
对于这等擦边球,最好还是清晰点好
对于这等擦边球,最好还是清晰点好
#14
在vc6.0下都不能同过编译
总之字符串是要以'\0'结尾的否则会出现意想不到的问题
总之字符串是要以'\0'结尾的否则会出现意想不到的问题