1

我有以下程序:

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

4

1 回答 1

8

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

它看起来像:

  • 默认情况下,您的数组使用空字符初始化,这意味着如果您不为元素分配值,它将是'\0' (尽管不应该依赖它),或者
  • 你有一些非常巧合的空字符放置在现有内存中(在你一直在尝试的名字和全名的任何长度之后恰好有一个)。

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

于 2013-08-12T17:41:59.937 回答