2017-04-16 65 views
0

我正在尝试制作一个程序,该程序可生成随机数并让用户猜测这些数字的总和的答案!如果用户插入字母d,我不知道如何发送错误的输入消息。如果他插入字母s或S,程序只是完成for循环。如果在循环中插入了错误的数字或字符,则会出现错误输出

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
#include <math.h> 
#include<time.h> 

main(void){ 
    int num1,num,result,resultuser; 
    int i; 
    //char s,S; 
    srand(time(NULL));  
    printf("Numeros:"); 

    for(i=0 ; i<10 ; i++) { 
    num1 = (rand()%50); 
    num = (rand()%50); 

    printf("Qual o resultado da conta: %i + %i =", num,num1); 
    scanf("%i",&resultuser); 

    result = num + num1; 

    if (result == resultuser){ 
     printf("Correto!\n\n"); 
    } else{ 
     printf("Errado!\n\n"); 
    } 
    } 
} 
+0

所以你真正的问题是如何“编辑”用户的输入......? – TonyB

回答

1

scanf的返回码是成功解析的元素数。在你的情况下,如果整数解析成功,你会期望它是1。

如果您保存scanf的返回码,您可以确定何时解析元素的数量为0,即它不能按照您的请求解析整数。此时,您可以向用户打印他们没有输入有效的号码。

+0

Enduser还必须处理进行部分有效输入的情况,例如“12abc”,scanf会报告它已成功解析“1”整数,但“12abc”不是唯一的整数。 – TonyB

+0

确实。另一个可以考虑的选择是读取整个行并将它传递给'atoi',只是在这种情况下atoi可能导致未定义的行为...所以也许我们可以看看'strtol',它具有更好的安全性承诺?但是,不,strtol在它无法成功转换时返回0,这很难从真实的0中分辨出来。这里的标准库不会使生活变得简单:可能值得阅读整个字符串,快速通过无效字符,然后当我们满意时发送到'strtol'。 –

+1

要检测'strtol(some_string,&endptr,10)'中没有转换,而不是查找返回值0,请测试'endptr == some_string'。 “快速传递”方法仍然会通过'“--123”'这会使'strtol()'失效。 – chux

0

使用fget()读取输入,然后解析它为int或字母。

printf("Qual o resultado da conta: %i + %i =", num,num1); 

    char buffer[100]; 
    if (fgets(buffer, sizeof buffer, stdin) == NULL) { 
     // EOF or error detect, quit the loop 
     break; 
    } 

    // Test if a number was found 
    if (sscanf(buffer, "%i", &resultuser) != 1) { 
     // use `resultuser` 
    } else if (buffer[0] == 's' || buffer[0] == 'S') { 
     // exit the loop normally as S was found 
     break; 
    } else { 
     // bad input detected 
    }