【问题标题】:scanf won't terminate with hex values?scanf 不会以十六进制值终止?
【发布时间】:2015-04-01 01:45:55
【问题描述】:

当我运行这段代码时:

main(){

    int hex;
    printf("Enter four hex values:\n");
    while(scanf("%x", &hex) == 1)
    {
        body
    }

}

它运行代码主体,但随后显示光标,因此用户可以输入更多数据,直到输入 NULL。如何修复 while 循环,以便一旦用户输入数据,例如 014C 456B 0894 0011(一些随机十六进制数字),它会执行主体然后程序终止?即,为什么循环仅在用户输入 NULL 时才结束,我该如何解决?

【问题讨论】:

    标签: c hex scanf


    【解决方案1】:

    您调用scanf() 直到您收到错误或EOF(最好测试值的数量——您会因此获得好成绩)。如果你只想调用它四次,那么你必须单独限制它:

    int main(void)
    {
        int hex;
        printf("Enter four hex values: ");
        for (int i = 0; i < 4 && scanf("%x", &hex) == 1; i++)
        {
            …body…
        }
        return 0;
    }
    

    注意在对scanf() 的调用中使用&amp;hex 而不仅仅是hex;你总是需要传递一个指针(但是如果对象是一个数组,通常是一个字符串,那么你可以通过名称传递它,而不是前面的&amp;)。

    如果需要在获取四个值之前检测是否退出,则在循环外定义i,之后进行测试。

    还要注意main() 的显式返回类型;这是当前和以前版本的 C 标准所要求的。只有过时的、四分之一世纪前的标准第一版允许隐含的int。而且该标准需要来自 main() 的返回值,现代标准让您摆脱困境(更遗憾的是,IMO)。

    【讨论】:

    • 是的,我只是在谈到 & 时匆匆浏览了帖子。无论如何,如果我现在想随意设置,因为他们可以输入任意数量的四个十六进制数字块,我该怎么做?我尝试了我发现的“标准”scanf while 循环,但它可能不适用于十六进制值?
    • 不要急于发帖。花时间尽可能地完善问题中的代码,避免尽可能多的无端错误,因为问题很可能会存在很长时间,而且您可能不希望愚蠢的错误在一天之内或两个时间。提前提出整个问题也很有帮助——如果他们能看到整个问题,这对回答的人来说更公平。在处理 4 个值之前,您将如何存储它们?一种选择是将我给出的循环包装在while 循环中;你只需要担心如何终止外循环。
    • 我不明白“存储 4 个值的集合”...目前程序的主体运行良好,只是程序在主体执行后没有停止......它只是显示一个光标,用户可以输入更多数据,主体可以对这些新数据执行它的操作,并且该过程继续进行,直到用户手动输入 NULL。然后它终止......所以我的问题是如何让程序在第一组数据之后终止,而不是用户必须输入 NULL?
    • NULL 唯一的数据,还是触发循环结束的所有非十六进制和非空白数据?也许the scanf manual 可能会解释您的循环何时以及为何终止......
    • 当您说“输入四个十六进制值”时,是指四个单独的多位值,还是指任意数量的 4 位十六进制值?我假设您的意思是前者;也许你的意思是后者?您可以使用"%4x" 指定scanf() 一次最多处理4 个十六进制数字,而不仅仅是"%x"。如果用户键入 A1B2C3 D4,则将被读取为一组 4 位数字 (A1B2) 和两组两位数字 (C3D4)。如果您想读取 4 组十六进制数字,这就是我解释您的问题的意思,您可以使用我在回答中概述的代码的变体。
    猜你喜欢
    • 2018-07-26
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 2018-05-16
    • 2021-02-25
    • 2014-11-30
    相关资源
    最近更新 更多