为什么这段代码将空格('')分配给字符数组的特定元素?

时间:2013-08-12 17:30:47

标签: c

我有以下计划:

#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的字符串而不是所有的串联。

1 个答案:

答案 0 :(得分:8)

这里的关键是空字符和''(空格字符)不一样。空字符是您的for循环正在检查的'\ 0'字符,a.k.a。字符串的结尾。空间只是一个空间,插在名称的各个部分之间(想想“JamesEarlJones”和“James Earl Jones” - 你肯定想要空格)。

看起来像是:

  • 默认情况下,您的数组使用空字符进行初始化 表示如果您没有为元素赋值,它将为'\0' (虽然不应该依赖)或
  • 你有一些 非常巧合地放置了空字符 现有的记忆(在任何长度之后都会发生一个记忆 名字你一直在尝试的全名。

如果在填充name数组(索引中的+1+2)时跳过索引,则会将元素保留为默认值/现有值({{ 1}})。如果你不在那里打印一个空格,当打印出'\0'时,它会在来自name的字符后点击一个空字符,并认为这是字符串的结尾。如果你包含添加空格字符的行(与fname不同),它会看到空格,打印它们并继续前进。