字符串没有被第一次读取

时间:2013-08-17 18:14:31

标签: c

#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 个答案:

答案 0 :(得分:2)

在循环前调用gets以放弃scanf留下的新行。

或者更好的是,使用标准的解决方法来丢弃未读的输入:

int c;
while ((c = getchar()) != '\n' && c != EOF);

答案 1 :(得分:2)

此处的问题(scanf声明的典型特征是,当您输入所需的名称数量并按“输入”时,它不会使用换行符。

结果,换行符停留在stdin缓冲区中,直到你进行下一次读取,在这种情况下是你尝试读取的第一个名字,所以你的名字只是“换行符”。要解决这个问题,请使用getchar()来换取换行符,这样就不再有问题了。

通常,根据经验,您几乎总是希望在getchar()语句后使用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;
}

答案 2 :(得分: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);
}

答案 3 :(得分:0)

您还可以使用fflush(stdin);替代getchar()while(...)声明。

P.S。:我很抱歉在这里写下我的建议,因为我没有足够的声誉来发表评论。