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

在循环之前调用gets以丢弃scanf.

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

int c;
while ((c = getchar()) != '\n' && c != EOF);
于 2013-08-17T18:17:16.510 回答
2

这里的问题是该scanf语句的典型问题,即当您输入所需名称的数量并按“回车”时,它不使用换行符。

结果,换行符卡在标准输入缓冲区中,直到您进行下一次读取,在这种情况下,这是您尝试读取的名字,因此您的名字只是“换行符”。要解决这个问题,请使用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 回答
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

您也可以使用or语句fflush(stdin);作为替代。getchar()while(...)

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

于 2013-08-17T22:02:27.913 回答