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

Mah*_*ahi 1 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);
}
Run Code Online (Sandbox Code Playgroud)

我很困惑,为什么在分配空间name[i]=' '以及name[i+j+1]=' 'name[i+j+k+2]=' '此计划.

如果我执行这些,那么我只是连接,但如果我删除它们,我只得到字符串fname而不是所有的串联.

Mic*_*lle 8

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

看起来像是:

  • 默认情况下,您的数组初始化为空字符,这意味着如果您没有为元素赋值,它将是'\0' (虽然不应该依赖),或者
  • 你已经在现有的记忆中有一些非常巧合的空字符放置(恰好在你曾经尝试的名字长度全名之后有一个).

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

  • 数组不是用C隐式初始化的.它们的值''\ 0'`是偶然的,不应该依赖于这种语义.特别是,当我编译并运行程序时,`name`数组没有用`'\ 0'`初始化.我还应该指出,在`name`数组中结束的字符串不是以null结尾的. (3认同)
  • @Michelle,C语言的定义是自动变量未初始化,以及"malloc"存储.编写依赖于一个编译器如何实现该语言定义的代码是危险的.它使代码不可移植,并且同一编译器的下一个版本可能会在遵守标准的同时更改其实现方法.因此,在C中永远不要依赖为您初始化的自动或堆变量.最后,C标准确定了编译器初始化变量的时间和位置. (2认同)
  • `NULL`指的是[未分配的指针](http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.11.html).`NUL`是[ASCII标签](http://en.wikipedia.org/wiki/ASCII#ASCII_control_code_chart),用于字符常量`\ 0`(例如,像'EOT'或'CR').`null`不是真正的C术语.请参阅[NULL,'\ 0'和0]之间的区别(http://stackoverflow.com/questions/1296843/what-is-the-difference-between-null-0-and-0)或[NUL未声明 - 首次使用此功能](http://stackoverflow.com/questions/10546625/nul-undeclared-first-use-in-this-function). (2认同)