0
int ReadNames(char ***Names, int *n)    
{    
int i, k;    
char name[100];    
printf("Enter how many names\n");    
scanf("%d", n);       
/* Allocate memory and read names */
*Names=(char **)malloc((*n)*sizeof(char *));
for(i=0;i<(*n);i++)
{
    *(*Names+i)=(char*)malloc(sizeof(name));
    gets(name);
    strcpy(*(*Names+i),name);
}

for(i=0;i<(*n);i++)
    printf("%s\n",*(*Names+i));
return 1;
}    
void main()        
{
char **Names;
int n, i;
ReadNames(&Names, &n);
}

该程序运行良好......但与我的预期略有不同。问题是当我输入“n”的值为 3 时,它只能读取 2 个字符串并打印这两个字符串....即。它读取 n-1 个字符串并打印 n-1 个字符串。我的代码有任何问题。

4

3 回答 3

2

getchar()之后添加scanf()

这样每个'\n'人在接受输入时都会被处理掉。您的代码将是

int ReadNames(char ***Names, int *n)
{
    int i, k;
    char name[100];
    printf("Enter how many names\n");
    scanf("%d", n);
    getchar(); // eats unnecessary '\n' in the buffer
    /* Allocate memory and read names */
    *Names=(char **)malloc((*n)*sizeof(char *));
    for(i=0;i<(*n);i++)
    {
            *(*Names+i)=(char*)malloc(sizeof(name));
                gets(name);
                    strcpy(*(*Names+i),name);
    }

    for(i=0;i<(*n);i++)
            printf("%s\n",*(*Names+i));
    return 1;
}
void main()
{
    char **Names;
    int n, i;
    ReadNames(&Names, &n);
}
于 2013-10-29T06:10:05.053 回答
1

您遇到的问题很可能是因为scanf您用来获取计数的换行符仍在缓冲区中。这意味着第一个gets调用读取该单个换行符,然后添加该空行。

一个简单易行的解决方案是在scanf格式后添加一个空格,这scanf表示跳过所有空格。喜欢

scanf("%d ", n);
于 2013-10-29T06:12:55.740 回答
1

1.请不要使用gets()usefgets()代替。

 fgets(name, sizeof name,stdin);

删除输入末尾的换行符。

2.在您的情况下,在您输入后,scanf()您应该按此Enter
gets()换行符作为第一个字符串的输入。

很少有简单的解决方案

用于getchar()在之后读取换行符scanf()

或者

%d 在in之后添加一个空格scanf()

或者

如果你在 Windows 上工作,你可以使用fflush()

3.不要强制转换 malloc 的结果,因为它返回通用指针,并且可以在没有强制转换的情况下进行分配

于 2013-10-29T06:19:49.790 回答