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);
}

このプログラムの and にname[i]=' 'スペースname[i+j+1]=' ' が割り当てられている理由がわかりません。name[i+j+k+2]=' '

これらを使用して実行すると、連結のみが取得されますが、それらを削除するとfname、すべての連結ではなく、文字列のみが取得されます。

4

1 に答える 1

8

ここで重要なのは、null 文字と ' ' (スペース文字) は同じではないということです。null 文字は、forループがチェックしている '\0' 文字、つまり文字列の末尾です。スペースは、名前の一部の間に挿入される単なるスペースです ("JamesEarlJones" と "James Earl Jones" を考えてみてください。間違いなくスペースが必要です)。

次のいずれかのようになります。

  • デフォルトでは、配列はnull文字で初期化されます。つまり、要素に値を割り当てない場合は、'\0' (これに依存するべきではありませんが)、または
  • 既存のメモリでnull文字が非常に偶然に配置されています(名前フルネームの長さに関係なく、試みている名前の後に1つがあります)。

name配列を埋めるときにインデックスをスキップする場合(インデックス内の+1and +2)、要素をデフォルト/既存の値 ( '\0') のままにします。そこにスペースを出力しないと、出力時にnameからの文字の後にヌル文字がヒットし、それがfname文字列の末尾であると見なされます。スペース文字を追加する行を含めると ( と同じではありません'\0')、スペースが認識され、印刷され、処理が続行されます。

于 2013-08-12T17:41:59.937 に答える