程序的参数描述如下:创建一个程序,允许用户输入最多五个朋友的名字。使用二维数组来存储朋友的名字。输入每个名称后,用户应该可以选择输入其他名称或打印出一个报告,显示到目前为止输入的每个名称。
我的问题是它会将两个单词的名称存储为两个单独的名称,另外还会打印菜单选项两次。我似乎无法想出这一点,所以任何帮助都会受到赞赏。
以下是代码:
int main(void)
{
char cName[5][21]= {0};
int x=0;
int iPick;
printf("Enter the name of 5 people\n\n");
for(x=0;x<=5;x++){
printf("Enter name %d:", x+1);
scanf("%s", cName[x]);
printf("\n\nWould you like to add another name or view current names stored?\n");
printf("1)\tAdd another name\n");
printf("2)\tView names stored\n");
scanf("%d", &iPick);
switch(iPick){
case 1:
break;
case 2:
for(x=0;x<=5;x++){
printf("\nName %d is %s\n",x+1, cName[x]);
}
}
}
return 0;
}
答案 0 :(得分:2)
scanf()是关于白色空间的小气。它倾向于在缓冲区中的空格之后保留任何内容,并将其放入下一个可用变量中。
这将导致循环在没有用户输入的情况下运行两次。基本上它第一次完成循环,然后它看到stdin缓冲区中有东西,所以scanf自动选择它并将其用作下一个变量,因此菜单第二次打印...因为程序我认为您输入了两个不同的名称,而不是一个带有空格的名称。
答案 1 :(得分:0)
你应该改变你的第一个“for”循环: for(x = 0; x <5; x ++)
答案 2 :(得分:0)
首先,带有%s
格式参数的scanf不允许您输入字符串。它只用于输入一个单词。如果输入是用空格分隔的两个或更多单词,则它们将被视为separeted输入。但是你可以使用gets函数输入一个字符串:
printf("Enter name %d: ", x+1);
gets(cName[x]);
第二个你应该将for条件更改为x&lt; 5以将循环停在第五个名称而不是第六个名称。
最后一想,你不应该在for循环中使用开关,否则如果用户选择打印出名称并且x值仍然低于5,程序将重新开始,直到x值达到5.所以只是检查iPick值,如果它是2打破循环并将打印循环移出第一个。
// Inside the fitst loop
if (iPick == 2) break;
// Out of the first loop
for (x=0; x<5; x++){
printf("\nName %d is %s\n",x+1, cName[x]);
}
要在此处查看完整的代码http://pastebin.com/nnhYsRh7