for循环忽略条件

时间:2014-04-29 18:34:12

标签: c for-loop

我试图编写一个函数将十六进制数转换为十进制数,但是我遇到的问题是我的第一个函数的for循环中的错误。我无法捕获任何字符是什么在我的数组的末尾,它又循环了一次。我已经删除了额外的代码,只留下了相关的部分。我认为这可以通过使用get / putchar来解决,但我真的想知道造成它的原因是什么。谢谢!

#include <stdio.h>
#include <ctype.h>
#include <stdio.h>
int main(){
    int check;

    char num_input[20];

    scanf("%s",num_input);

    int hex_check(char *hex_input){
        int i;
        int n;
        for(i=0;hex_input[i]!='\n' || hex_input[i]!=EOF;i++){
            if(isxdigit(hex_input[i])!=0){
                n++;
                printf("\nTRUE");
            }
            else{
                n=0;
                printf("\nFALSE");
                return n;
            }
        }
        return n;
    }
    check=hex_check(num_input);
    printf("\n%d",check);

    return 0;
}

输入123时的输出(我使用n将数字传递给函数的其他部分,如果数字不是十六进制则为0):

TRUE
TRUE
TRUE
FALSE
0

1 个答案:

答案 0 :(得分:4)

这是因为条件

hex_input[i]!='\n' || hex_input[i]!=EOF

始终为true:输入不能同时为'\n'EOF

另一个问题是你的字符串中永远不会看到EOF;但是,您将看到一个空终止符,即'\0'

更改为

hex_input[i]!='\n' && hex_input[i]!='\0'

解决问题。

您缺少的另一件事是n的初始化:您应该在循环开始递增之前将其设置为零。

最后,ANSI标准不允许嵌套函数,使您的代码不可移植。考虑将hex_check的代码移动到外层,并声明它static以确保其他模块不可见。