【问题标题】:Catching the user entering a string when expecting an integer?在期望整数时捕获用户输入字符串?
【发布时间】:2020-01-17 16:40:55
【问题描述】:

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

#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;
}

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

【问题讨论】:

  • 你可以使用atoi将字符串转换为整数。
  • 您可以将带有fgets 的完整输入行读入缓冲区。然后您可以测试缓冲区的内容是否为“quit\n”。如果不是,您可以使用sscanf 扫描缓冲区的内容。另一种方法是测试您的scanf 的返回值。如果为 0,则输入不以数字开头。您可以使用scanf(" %s") 读取输入字符串并将其与“quit”进行比较。
  • "quit\n" 是一个 6 个字符大小的字符串。对于char run[4],你怎么能期望strcmp(run, "quit\n") 为0?
  • @chmike 建议scanf(" %s", ...) 就像建议gets()
  • @chux-ReinstateMonica 并不完全相同。 Scanf 只会在空格处停止单词。获取将采取完整的路线。除了 gets 在 C11 中被弃用。

标签: c scanf user-input


【解决方案1】:

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

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);
  }
}

【讨论】:

    【解决方案2】:

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

    基本上,您使用 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      相关资源
      最近更新 更多