编辑:我必须添加一个getchar(); scanf之后(“%i”,& choice);现在它只问了一次!
显然它的案例开关导致它输出两次。如果我在外壳开关外调用该功能,则输出1,但如果我在开关内调用它,则输出两次
造成这种情况的原因是什么?我怀疑是scanf的选择吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void test();
void choose();
int main(void)
{
//if i call here its fine
test();
choose();
return 0;
}
void choose()
{
int choice;
do
{
printf("1 - Testing if double ask\n");
printf("2 - Exit\n");
printf("Please enter your choice: ");
scanf("%i", &choice);
switch(choice)
{//but pressing 1 here asks twice?
case 1:
test();
break;
default:
if(choice !=2)
printf("Input Not Recognized!\n");
break;
}
}
while(choice !=2);
if(choice == 2)
printf("Ciao!");
}
void test()
{
printf("HELLO");
char *name = malloc (256);
do
{
printf("Would you like to continue (y/n)\n");
fgets(name, 256, stdin);
}
while(strncmp(name, "n", 1) != 0);
free (name);
}
答案 0 :(得分:4)
首先:您无法将C字符串与比较运算符!=
和==
进行比较。您需要使用strcmp
。
此外,我认为在这种情况下你会发现do { ... } while
循环更有用。在用户有机会添加任何输入之前,您需要检查一次name
。
接下来需要注意的是fgets
会在您的输入中保留换行符,因此您需要在strcmp
的使用中解决此问题。
答案 1 :(得分:1)
字符串比较不像C中那样,你必须在string.h中使用strcmp。
或者你可以看一下名字中的第一个字符。
while(name[0] != 'n')