关于字符串后面加'\0'的误区[str[i]='\0';]——基于谭浩强答案链接两个字符串,不使用strcat函数之例

来源:互联网 发布:中卫的云计算基地 编辑:程序博客网 时间:2024/05/23 15:41
首先感谢论坛里大神的帮助:传送门:http://bbs.bccn.net/viewthread.php?tid=473045&pid=2608109&page=2#pid2608109
然后上谭浩强这个题答案的程序代码,代码如下:
#include<stdio.h>#include<string.h>int main(){char s1[80], s2[40];int i = 0, j = 0;printf("Input s1:\n");scanf_s("%s", s1, 80);printf("\n");printf("Input s2:\n");scanf_s("%s", s2, 40);while (s1[i] != '\0')               i++;while (s2[j] != '\0')               s1[i++] = s2[j++];              s1[i] = '\0';                       printf("\nThe new string is:\n");printf("%s", s1);printf("\n");return 0;}

这里关键是理解
while (s1[i] != '\0')              
         i++;
while (s2[j] != '\0')              
         s1[i++] = s2[j++];             
s1[i] = '\0';
这几行,假设s1输入123,s2输入456,那么,在执行完while (s2[j] != '\0')之后,s1[i]中的i会是几呢?
为了便于理解,对这几行做如下调整
while (s1[i] != '\0')              
{
     i++;
}
while (s2[j] != '\0') 
{              
     s1[i] = s2[j];
      i++;
      j++;   
}           
s1[i] = '\0';
这样做好处是便于理解,首先,在执行完第一个while后,i的值是3,这是因为当(s1[2]=3)!='\0'时候,执行了i++,所以i=3,进入到下一个while里,同理,当执行完这一轮的while后,i的值是6,而s1[5]=6,是因为i执行i++;但是最后一个字符确实是s1[5],到了这里,会产生如下问题:
1.输出的s1[5]后面到底有没有'\0'?如果没有,为什么s1[5]不会去执行上面的那个条件,即while (s1[i] != '\0') ?如果有,为什么下面还要加一个s1[i] = '\0';?
2.s1[i] = '\0';中的s1[i]到底是什么?是代表整个字符串s1[i] ?还是s1[i] 中的某一个值?
对此,楼楼首先回答第一个问题,首先,由于执行了s1[i] != '\0'和s2[i]! = '\0'字符串数组中是不带'\0'的,其次,由于两个while之间是平行关系,而不是嵌套关系,所以执行顺序是自上而下进行的,这样,当执行了s1[5]=6之后是不会去执行while (s1[i] != '\0')的,而while (s2[j] != '\0') 执行跳出后既然不会跳到上面去,那么他会紧接着执行s1[i] = '\0',由于在上面的while循环里,i++了,所以这里的i=6,即s1[6]='\0',意思就是在字符串后面加了'\0'。
对此,很多人都有两个理解误区:
第一是针对新手,很容易错误理解两个while之间的关系,从而造成计算错误。
第二是针对这个s1[i] = '\0',这里很多人都把s1[i] 想当然理解为了整个的字符串,实际上,经过上面的说明,这里的s1[i] = '\0'表示的是某一个特定的值,再换个例子,如果是for循环呢?请看:
for(x;y;x++)
{}
s1[i] = '\0';
不知道诸位看到上面那个x++了吗?正是由于这个缘故,下面表示的是字符串的某一特定的值被赋予了'\0'
0 0
原创粉丝点击