在期望整数时捕获用户输入字符串?

问题描述 投票:1回答:2

我正在编写一个程序,用户输入两个二进制数字和一个操作字符,然后以十进制打印输出。我希望while循环保持程序运行,直到用户输入quit。如果用户在scanf中输入quit而不是整数,该如何读取?有没有办法捕捉到这一点?

#include <stdio.h>
#include <string.h>
int toDecimal(int num);

int main(){
    // Define variables
    int num1, num2, result = 0;
    char op;
    char run[4] = "go";

    // While loop to rerun program until quit is entered
    while(strcmp(run, "quit\n") != 0){
        // Reads user input
        scanf("%i %c %i", run, &num1, &op, &num2);



        printf("\nnum1: %i num2: %i op: %c\n", num1, num2, op);

        num1 = toDecimal(num1);
        num2 = toDecimal(num2);
        printf("\nnum1: %i num2: %i op: %c\n", num1, num2, op);

    }
    printf("\nGoodbye!\n");
    return 0;
}

我相信我可以将所有内容读取为字符串,然后转换为整数,但是我不知道如何。这是我应该研究的解决方案吗?

c scanf user-input
2个回答
3
投票

如果用户输入quit而不是scanf中的整数,我该如何读取?

scanf()没有好的方法。而是使用fgets()来获取用户输入,并且不要使用scanf(),直到您知道它为什么不好。

// Read user input
char buf[80]; // Use adequate size input buffer,
while (fgets(buf, sizeof buf, stdin)) {
  buf[strcspn(buf, "\n")] = '\0'; // Lop off potential trailing \n

  if (sscanf(bufm "%i %c %i", &num1, &op, &num2) == 3) {
    printf("\nnum1: %i num2: %i op: %c\n", num1, num2, op);
    num1 = toDecimal(num1);
    num2 = toDecimal(num2);
    printf("\nnum1: %i num2: %i op: %c\n", num1, num2, op);
  } else if (strcmp(buf, "quit")== 0) {
    break;
  } else {
    printf("Bad input <%s> ignored\n", buf);
  }
}

1
投票

这是一个非常基本的想法,希望您能理解。在读取字符串时也可以使用动态内存分配。

基本上,您使用fgets读取整个输入,并使用sscanf提取变量。

#include <stdio.h>
#include <string.h>

int main ()
{
int n1,n2;
char arr[1000],oper;

fgets(arr,sizeof(arr),stdin);
 while (strcmp(arr,"quit\n")!=0){
    if (sscanf(arr,"%d %c %d",&n1,&oper,&n2)==3); /* Scanning for each number and operator and checking input*/
    else
    printf("wrong input");
/*  Code */
    fgets(arr,sizeof(arr),stdin);
    }
return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.