我有以下程序:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char name[50],fname[50],sname[50],lname[50];
int i,j,k;
printf("First Name:");
gets(fname);
printf("sname:");
gets(sname);
printf("lname:");
gets(lname);
for(i=0;fname[i]!='\0';i++)
name[i]=fname[i];
name[i]=' ';
for(j=0;sname[j]!='\0';j++)
name[i+j+1]=sname[j];
name[i+j+1]=' ';
for(k=0;lname[k]!='\0';k++)
name[i+j+k+2]=lname[k];
name[i+j+k+2]=' ';
printf("Concatenation is %s",name);
}
Run Code Online (Sandbox Code Playgroud)
我很困惑,为什么在分配空间name[i]=' '以及name[i+j+1]=' ' 与name[i+j+k+2]=' '此计划.
如果我执行这些,那么我只是连接,但如果我删除它们,我只得到字符串fname而不是所有的串联.
这里的关键是空字符和''(空格字符)不一样.空字符是您的for循环正在检查的'\ 0'字符,也就是字符串的结尾.空间只是一个空间,插在名称的各个部分之间(想想"JamesEarlJones"和"James Earl Jones" - 你肯定想要空间).
看起来像是:
'\0'
(虽然不应该依赖),或者如果在填充name数组时(+1和+2索引中的索引)跳过索引,则将元素保留为默认值/现有值('\0').如果你没有在那里打印一个空格,那么当打印出来时name,它会在字符之后点击一个空字符fname并认为它是字符串的结尾.如果包含添加空格字符的行(与其不同'\0'),它会看到空格,打印它们并继续前进.