2012-01-10 53 views
3

我刚刚学习C语言,并使用javascript和php语言到目前为止,我无法将一些思维步骤转换为C的可能性。正在写作(听起来比实际更大)使用一个输入菜单,让用户选择一个选项。该选项可以是1,2或3如何从用户获得一个号码

现在,我做:

int menu; 
scanf("%d", &menu); 

工作正常。但是,输入字符串的字符会导致问题。

在javascript中我会简单的菜单变量对选择匹配:

if (menu != 1 && menu != 2 && menu != 3){ 
    menu = 4; // a switch later on will catch this. 
} 

然而,这似乎并没有在C

工作,我应该如何看待呢?

回答

5

你应该检查错误:

int menu; 
if (scanf("%d", &menu) != 1) 
{ 
    /* error */ 
    /* e.g.: */ menu = 4; 
} 

(如果成功,scanf返回你想读的项目数),你如何处理这个错误是由你。你可以循环,直到你有一个有效的值,或立即中止,或将变量设置为默认值。

另一种方法是用fgets读取整行输入,然后尝试标记并解释该输入,例如,与strtokstrtol

+0

我可能理解这个错误,但我该如何使用它?输入“哈哈”这样的东西不会将菜单变量设置为4? – Lg102 2012-01-10 18:20:15

+1

你在问一个问题吗?我不明白...但是[看到这个问题](http://stackoverflow.com/q/8808145/596781)关于在无效输入的情况下清除输入。 – 2012-01-10 18:23:03

2

scanf函数返回结果,即成功读取输入的计数。 (并且还有%n格式序列来获取消耗的字符数)。

所以你可以使用任何解决方案。

if (scanf(" %d", &menu) != 1) { 
    /* handle error */ 
} 

或者是:

int pos = -1; 
if (scanf(" %d %n", &menu, &pos) <=0 || pos <= 0) { 
    /* handle error */ 
} 

我的第二个例子是不是真的你的情况是有用的。但有时%n是非常有用的。

我在%d之前放置了一个空格:C库会跳过空格。

相关问题