2016-07-09 62 views
0

我正在尝试检查用户是否输入y或其他内容。如何检查用户输入是否为特定字符

我已经尝试创建一个字符串,并循环通过用户输入,但是这并不起作用。

char answer[] = "n"; 
for(int i = 0; i < sizeof(answer)/4; i++) { 
    if(answer[i] == "y") { 
     calculatorPrompt(); 
    } else if(answer[i] === "n") { 
       printf("Okay, bye!"); 
       System(100); 
    } 
} 

这是我的代码(我敢肯定,它崩溃的if语句):

printf("Thanks for that\nDo you want a calculator?(y/n)"); 
char answer = 'n'; 
scanf("%s", answer); 
    if(answer == 'y') { 
     calculatorPrompt(); 
    } else if(answer == 'n') { 
     printf("Okay bye!"); 
     Sleep(100); //wait for 100 milliseconds 
    } 

calculatorPrompt()功能:

void calculatorPrompt() { 
int a = 0; 
int b = 0; 
int sum = 0; 
printf("Enter your first number: "); 
if(scanf("%d\n", a) != 1) { 
    checkNumber(); 
} else { 
    printf("Enter your second number: "); 
    if(scanf("%d\n", b) != 1) { 
     checkNumber(); 
    } else { 
     sum = calculate(a, b); 
     printf("Your answer is: %d", sum); 
    } 
} 

} 

calculate()功能:

int calculate(int a, int b) { 
    return a + b; 
} 

checkNumber()功能:

void checkNumber() { 
    printf("Really? You didn't enter a number... Now exiting.."); 
    return; 
} 

我已经包括<windows.h> <stdio.h><stdbool.h>

我也困惑,为什么它崩溃。

程序的返回值是-1,073,741,819。

+0

请提供更多详细信息。它崩溃并不是一个很好的描述。 –

+3

首先,崩溃是因为您没有研究[**'scanf()**](http://en.cppreference.com/w/c/io/fscanf)是如何工作的。提示:'scanf(“%s”,answer)',其中'answer'只是'char',不正确。实际上,在发布的代码中'scanf'的用法都是正确的,所以我建议在使用它之前了解一下它。 – WhozCraig

+0

感谢您的提示,我会进一步研究scanf。 – aparms

回答

2

您有scanf()语句在代码中的多个问题:在calculatorPrompt() funtion代码的

  • ,您可以使用:

    if(scanf("%d\n", a) != 1) //wrong : sending variable as argument 
    
  • 这是错误的因为你需要发送address of the variable作为一个而不是variable本身作为论据。

    if(scanf("%d", &a) != 1) //correct : sending address as argument 
    
  • 同样在扫描其他integers代码时发生变化。


这里,

char answer = 'n'; 
scanf("%s", answer); 
  • 当你使用了错误的格式说明,这个调用未定义行为

  • 在这里,因为answerchar如此,改用:

    scanf(" %c", &answer); //space to avoid white spaces 
    

和我的意见已经建议:

  • 您在使用i < sizeof(answer)/4for循环

不!它必须是i < sizeof(answer),如在字符串中的每个元素只占用一个字节14的方式(你是误认为一个int阵列)

你没有任何在你的代码中

+1

^:)可能值得一提的是为什么'scanf(“%s”,answer);'是灾难性的 – sjsam

+0

对不起'printf'忽略了它。但是如果操作使用'printf(“%s”,回答);'打印他们会得到一个seg故障。 – sjsam

+1

是的,它是未定义的行为,它并不总是段错误。 – sjsam

0

我不推荐您为计算器编写的代码,但希望帮助您找到工作代码。尝试使用基于您自己的代码的代码。希望你能看到差异,并理解程序崩溃的原因。

#include <Windows.h> 
#include <stdio.h> 
#include <stdbool.h> 
bool checkNumber(int num) 
{ 
    return true; 
} 


int calculate(int a, int b) { 
    return a + b; 
} 

void calculatorPrompt() { 
    int a = 0; 
    int b = 0; 
    int sum = 0; 
    printf("Enter your first number: "); 
    scanf_s("%d", &a); 
    if (checkNumber(a)) { 
    } 

    printf("Enter your second number: "); 
    scanf_s("%d", &b); 
    if (checkNumber(b)) { 
    } 

    sum = calculate(a, b); 
    printf("Your answer is: %d", sum); 

} 

int main() 
{ 
    printf("Thanks for that\nDo you want a calculator?(y/n)"); 
    char answer = 'n'; 
    scanf_s("%c", &answer); 
    if (answer == 'y') { 
     calculatorPrompt(); 
    } 
    else if (answer == 'n') { 
     printf("Okay bye!"); 
     Sleep(100); //wait for 100 milliseconds 
    } 
} 
+0

请解释你所做的更改 – sjsam

+0

1.修改scanf将变量的地址作为参数2.如果else块基于scanf的返回值。该代码块看起来不正确。理想情况下,应该进行数字验证并处理任何意外的值。所以移动checknumber呼叫如果阻止。希望有所帮助。 – Kevin

0
#include <windows.h> 
#include <stdio.h> 
#include <stdbool.h> 

void calculatorPrompt(void); 

int main(void){ 
    printf("Thanks for that\nDo you want a calculator?(y/n)"); 
    char answer = 'n'; 
    scanf("%c", &answer);//scanf need address of store place 
    if(answer == 'y') { 
     calculatorPrompt(); 
    } else if(answer == 'n') { 
     printf("Okay bye!\n"); 
     Sleep(100); //wait for 100 milliseconds 
    } 
    return 0; 
} 

void checkNumber(void); 
int calculate(int a, int b); 

void calculatorPrompt() { 
    int a = 0; 
    int b = 0; 
    int sum = 0; 
    printf("Enter your first number: "); 
    if(scanf("%d", &a) != 1) {//\n : skip white spaces and wait input not spaces 
     checkNumber();//call when invalid input 
    } else { 
     printf("Enter your second number: "); 
     if(scanf("%d", &b) != 1) { 
      checkNumber(); 
     } else { 
      sum = calculate(a, b); 
      printf("Your answer is: %d\n", sum); 
     } 
    } 
} 

void checkNumber(void){//output message and clear input. 
    fprintf(stderr, "invalid input!\n"); 
    scanf("%*[^\n]%*c");//clear upto end of line. 
} 

int calculate(int a, int b) { 
    return a + b; 
} 
0

当你扫描一个字符时,你只需要使用%c。如果您打算继续使用字符串,则必须使用strcmp()进行比较而不是==。

相关问题