1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef char* string;

int main(void)
{
    char *names[6];
    int num_entries = 0,i=0,size=0;
    string name = (string) malloc(sizeof(char) * 16);

    printf("\nHow many names do you want to enter ? \n");
    scanf("%d",&num_entries);

    for(i=0 ; i < num_entries ; i++)
    {
        printf("\nEnter a name : ");
        gets(name);
        size = strlen(name);
        names[i] = (string) malloc(sizeof(char)*size + 1);
        strcpy(names[i],name);
    }

    for(i=0 ; i < num_entries ; i++)
        puts(names[i]);

}

このプログラムでは、ループの最初の回では文字列が読み取られませんが、後続のすべての呼び出しでは正常に機能します。プログラムは単に n 個の文字列を受け入れ、保存して表示する必要があります。ただし、n-1 回実行されます。

4

4 に答える 4

2

ステートメントの典型であるここでの問題は、scanf必要な名前の数を入力して「Enter」を押したときに改行を使用しないことです。

その結果、改行は、次の読み取りを行うまで stdin バッファーにスタックされます。この場合は、最初に読み取ろうとする名前であるため、最初の名前は単に「改行」になります。これに対処するには、 を使用getchar()して改行文字を使い果たし、その問題が発生しなくなります。

通常、経験則として、ほとんどの場合、この問題に対処するためにステートメントgetchar()の後に a または類似のものを使用することをお勧めします。scanf

以下のコードを変更しましたが、問題なく動作します。一部の行が不要だったので、少しクリーンアップしました。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef char* string;

int main(void)
{
    string names[6];
    int num_entries=0, i=0;
    string name = malloc(sizeof(char) * 16);

    printf("\nHow many names do you want to enter ? \n");
    scanf("%d",&num_entries);
    getchar();
    for(i=0 ; i < num_entries ; i++)
    {
        printf("\nEnter a name : ");
        fgets(name,16,stdin);
        names[i] = malloc(sizeof(char)*strlen(name) + 1);
        strcpy(names[i],name);
    }

    for(i=0 ; i < num_entries ; i++)
        puts(names[i]);
return 0;
}
于 2013-08-17T18:35:38.553 に答える
2

ループの前に を呼び出しgetsて、 によって残された新しい行を破棄しscanfます。

または、標準的な回避策を使用して、未読の入力を破棄することをお勧めします。

int c;
while ((c = getchar()) != '\n' && c != EOF);
于 2013-08-17T18:17:16.510 に答える
1

これがすべての提案を含むコードです。Anthony Accioly が回答のクレジットを取得していることに注意してください。

int main(void)
{
    char *names[6];
    int num_entries = 0, i = 0, size = 0, c = 0;
    string name = malloc(sizeof(char) * 16);

    if ( !name )
    {
        printf( "Unable to allocate memory for name\n" );
        return(1);
    }

    printf("\nHow many names do you want to enter ? \n");
    scanf("%d",&num_entries);
    while ((c = getchar()) != '\n' && c != EOF);

    for( i = 0 ; i < num_entries; i++)
    {
        printf("\nEnter a name : ");
        gets(name);
        size = strlen(name);
        names[i] = (string) malloc(sizeof(char)*size + 1);
        strcpy(names[i],name);
    }

    for(i=0 ; i < num_entries ; i++)
        puts(names[i]);

    return(0);
}
于 2013-08-17T18:37:49.190 に答える
0

またはステートメントfflush(stdin);の代わりとして使用することもできます。getchar()while(...)

PS: コメントするのに十分な評判がないため、ここに私の提案を書いて申し訳ありません。

于 2013-08-17T22:02:27.913 に答える