【问题标题】:How to scan in values and ignore the characters如何扫描值并忽略字符
【发布时间】:2015-12-06 15:01:57
【问题描述】:

我是 C 的新手,我正在查看一些问题,我思考了一个问题,我们需要使用用户输入扫描值。例子 1 2 3 45 6 7. 所以我们自动将这些值扫描到二维数组中。 困扰我的一件事是如果用户输入 1 2 3 2 3 Josh,我们如何忽略 Josh 而只将值扫描到数组中。 我查看了使用 getchar 并使用标志变量,但我无法弄清楚区分整数和字符的难题。 /* 这是我尝试过的*/

#include <stdio.h>

int main(int argc, char *argv[]) {
    int a;
    int b;
    int A[10];

    while (((a = getchar()) != '\n') && (b = 0)) {
        if (!(a >= "A" && a <= "Z")) {
            scanf("%d", A[b]);
        }
        b++;
    }

    }
    }

【问题讨论】:

  • while (((a = getchar()) != '\n') && (b = 0)) 这个循环永远不会执行,是吗?
  • 要检查一个char是否为数字,可以简单地使用C标准函数isdigit(a)
  • @dave_1234 赋值(b = 0) 返回00 AND 任何东西都被评估为0。所以循环不会执行。
  • @dave 因为赋值 (b=0) 应该得到 0,这是 && 运算符的第二个参数
  • @A.S.H 哦,好的,谢谢,顺便说一句,您能否使用 isdigit 函数编写一些代码来帮助我扫描,因为我不断遇到 seg 错误。

标签: c arrays char integer scanf


【解决方案1】:

您的代码完全错误。我建议删除它。

您可以使用scanf%d 来读取数字。如果它返回 0,则有一些无效输入。因此,扫描并丢弃 %s 并重复此过程:

int num = -1;

while(num != 0)
{
    printf("Enter a number, enter 0 to exit:");
    if(scanf("%d", &num) == 0) /* If scanf failed */
    {
        printf("Invalid input found!");
        scanf("%*s"); /* Get rid of the invalid input (a word) */
    }
}

【讨论】:

    【解决方案2】:

    我认为实现您想要的一种好方法是使用scanf 格式"%s",它将所有内容作为字符串读取,根据空格有效地拆分输入。来自手册:

    s

    匹配一系列非空白字符;下一个 指针必须是指向长字符数组的指针 足以容纳输入序列和终止 null 字节('\0'),它是自动添加的。 输入字符串 在空白处或最大字段宽度处停止,以两者为准 首先发生。

    要将字符串转换为整数,可以使用atoi。来自手册:

    atoi() 函数转换字符串的初始部分nptr 指向 int

    因此,如果它将字符串的初始部分转换为整数,我们可以使用它来识别什么是数字,什么不是。




    您可以为 atoi 构建一个简单的“单词检测器”

    使用来自ctype.h 的函数isalpha 你可以做到:

    int isword(char *buffer) 
    {
            return isalpha(*buffer);
    }
    

    重写你的阅读程序:

    #include <stdio.h>
    #include <ctype.h>
    
    int isword(char *buffer)
    {
        return isalpha(*buffer);
    }
    
    int main(void)
    {
        char input[200];
        int num;
    
        while (1) {
            scanf("%s", input);
            if (!strcmp(input, "exit")) break;
            if (isword(input)) continue;
            num = atoi(input);
    
            printf("Got number: %d\n", num);
        }
        return 0;
    }
    

    您应该记住,名称 isword 是错误的。此函数不会检测buffer 实际上是否是一个单词。它只测试第一个字符,如果那是一个字符,它返回真。原因在于我们的基本函数 itoa 的工作方式。如果缓冲区的第一个字符不是数字,它将返回零 - 这不是您想要的。所以,如果你有其他的需求,可以把这个函数作为base

    这也是我写了一个单独的函数而不是:

    if (!isalpha(input[0])) 
            num = itoa(input);
    else
            continue;
    

    输出(带有您的输入):

    $ ./draft
    1 2 3 2 3 Josh
    Got number: 1
    Got number: 2
    Got number: 3
    Got number: 2
    Got number: 3
    exit
    $
    

    关于分配和 &&

    while (((a = getchar()) != '\n') && (b = 0))
    

    正如我在评论中所说,这个循环永远不会起作用,因为您正在创建一个 logical conjunction(AND) ,其分配将始终返回 zero。这意味着循环条件将始终评估为 false

    在 C 中,赋值返回分配的值。所以,如果你这样做了

    int a = (b = 10);
    

    a 现在将拥有值10。同样的,当你这样做时

    something && (b = 0)
    

    你做得很好

    something && 0
    

    这将总是评估为假(如果您还记得 AND 真值表):

    p   q    p && q
    ---------------
    0   0      0
    0   1      0
    1   0      0
    1   1      1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      • 2018-07-01
      相关资源
      最近更新 更多