【问题标题】:Simple GCD program in c, having trouble filtering correct user input from scannerc中的简单GCD程序,无法过滤来自扫描仪的正确用户输入
【发布时间】:2016-06-18 22:29:16
【问题描述】:

我的程序提示用户输入两个正整数来计算他们的 GCD。来自扫描仪的程序不接受任何非正整数的输入,而是再次提示用户。

我的大部分代码已经可以正常工作了。我的问题是我的程序在要求另一个正整数之前需要两个负整数输入。其他角色工作得很好。有什么技巧可以解决这个小问题吗?

源代码


#include <stdio.h>
#include <stdlib.h>

int main() {

    int temp1, temp2, A, B, C;
    char str[256];

    while(1){
        printf("Enter a positive integer: ");
        while(scanf(" %d", &A)!=1 || A <= 0) {
            scanf(" %s", str);
            printf("Please enter a positive integer: ");
        }
        if(A > 0){
            break;
        }
    }
    //same loop to get B

    //compute GCD of A and B

    //print out answer

    return 0;
}

样本输出


Enter a positive integer: -5
-6
Please enter a positive integer: -7
-8
Please enter a positive integer: k
Please enter a positive integer: s
Please enter a positive integer: d
Please enter a positive integer: 5

【问题讨论】:

    标签: c string input conditional-statements


    【解决方案1】:

    您的程序想要读取某些内容,因为您告诉过。

    试试这个:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
    
        int temp1, temp2, scanf_ret, A, B, C;
    
        while(1){
            printf("Enter a positive integer: ");
            while((scanf_ret=scanf(" %d", &A))!=1 || A <= 0) {
                if(scanf_ret<0) {
                    puts("got unexpected EOF");
                    return 1;
                }
                if(scanf_ret==0)scanf(" %*s");
                printf("Please enter a positive integer: ");
            }
            if(A > 0){
                break;
            }
        }
        //same loop to get B
    
        //compute GCD of A and B
    
        //print out answer
    
        return 0;
    }
    

    在这段代码中,

    • 如果scanf_ret1,则表示读取成功,无需消耗垃圾。
    • 如果scanf_ret0,则表示存在一些无法读取为整数的障碍,请移除它们。
    • 如果scanf_ret为负数,表示输入结束,退出程序。

    还要注意不要存放垃圾,这样可以避免缓冲区溢出。

    【讨论】:

    • @Ryan,你应该接受他的回答,我实际上发现它最能描述scanf 问题。
    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多