string !
10.1的请点我是404.
已修复,谢谢!
您这里是: $ ./main hello 实体书上的hello的第一个字母却给大写了,而上面的代码中的还是小写的,有点让人摸不着头脑。。。。。。
#include <stdio.h> int main(void) { char str[6] = "hello"; char reverse[6] = ""; int i; for(i = 0; str[i] != '\0'; i++){ reverse[5-i] = str[i]; } int j; for(j = 0;j < 6;j++){ printf("%c",reverse[j]); } printf("\n"); return 0; } 这个好像是对的啊:输出结果是。。。 olleh
to bowen: 没错,这么写输出结果是对的。但你没找出原题的程序为什么输出结果错
to laciqs:实体书上排版引入的错误。实体书出自编辑之手,此类问题已经让我十分恼火了,我对只出现在实体书上的错误概不负责。
#include <stdio.h> int main(void) { int i; char str[6] = "hello"; char reverse_str[6] = ""; printf("%s\n", str); for (i = 0; i < 5; i++) reverse_str[4-i] = str[i]; printf("%s\n", reverse_str); return 0; } 原题中reverse_str[0]并没有被赋值,还是'\0',所以打印错误
for(i=0;i<6;i++) { printf("%d:%c\n", i,reverse_str[i]); } 通过这样的输出,可以发现reverse_str[0]为'\0',上面已经有同学说了。由于printf遇到'\0'表示字符串末尾,所以其将reverse_str[5]做为了字符串头,所以输出了hello这样的结果
通过GDB调试,发现前方有多个 \0 经修改 for (i = 0; i < 6; i++) reverse_str[4 - i] = str[i]; 成功
用gdb的display reverse_str。可以看到每一步的值。最终reverse_str的值是 "\000olleh"。 对C语言的字符串结束符表示困惑!!! 我换个角度去替换: for (i = 0 ; i < 5; i++) reverse_str[i] = str[4-i]; 这样子,好像结果是预期想要的。
宋老师,我在执行完reverse_str[4] = str[1]后,再运行 continue语句,提示Program exited normally.的错误,自动停止了,何解?
char reverse_str[6] = "" 定义了5个字符位的数组 并用5个特殊字符"\0"初一始化 之所以长度用6,是因为如果将reverse_str当字符串变量来看除了要内容要有5个字符,还要有个结束标志"\0". 通过gdb执行程序到“char reverse_str[6] = "";”之后。display serverse_str 看到:1: reverse_str = "\000\000\000\000\000" 即reverse_str的五个字符都是"\000", 但reverse_str定义时长度定的是6? 继续单步执行下去,执行完第一条:reverse_str[5-i] = str[i];后,看到: reverse_str = "\000\000\000\000\000h" 可见reverse_str的结束标志"\000"被“h“代替, 即reverse_str[5]==h, 执行完所有代码,从数组的角度看: reverse_str[5]==h reverse_str[4]==e reverse_str[3]==l reverse_str[2]==l reverse_str[1]==o reverse_str[0]==\000 从字符串的角度看: reverse_str = "\000olleh" reverse_str的长度定义的是6,所以第6个字符是预留给“\0"的 但现在被h代替了。
#include <stdio.h> int main(void) { int i; char str[6] = "hello"; char reverse_str[6] = ""; printf("%s\n", str); for (i = 0; i < 5; i++) reverse_str[4-i] = str[i]; printf("%s\n", reverse_str); return 0; }
如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!