#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次。解决方案?也可以随意指出指针,分配等使用方式中的任何错误,任何反馈意见。
答案 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。:我很抱歉在这里写下我的建议,因为我没有足够的声誉来发表评论。