我有以下计划:
#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);
}
我很困惑为什么在这个程序中name[i]=' '
以及name[i+j+1]=' '
和name[i+j+k+2]=' '
分配了一个空格。
如果我执行这些,那么我只是连接,但是如果我删除它们,我只得到fname
的字符串而不是所有的串联。
答案 0 :(得分:8)
这里的关键是空字符和''(空格字符)不一样。空字符是您的for
循环正在检查的'\ 0'字符,a.k.a。字符串的结尾。空间只是一个空间,插在名称的各个部分之间(想想“JamesEarlJones”和“James Earl Jones” - 你肯定想要空格)。
看起来像是:
'\0'
(虽然不应该依赖)或如果在填充name
数组(索引中的+1
和+2
)时跳过索引,则会将元素保留为默认值/现有值({{ 1}})。如果你不在那里打印一个空格,当打印出'\0'
时,它会在来自name
的字符后点击一个空字符,并认为这是字符串的结尾。如果你包含添加空格字符的行(与fname
不同),它会看到空格,打印它们并继续前进。