首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检查命令行参数的每个字符?

如何检查命令行参数的每个字符?
EN

Stack Overflow用户
提问于 2019-05-23 05:19:34
回答 1查看 339关注 0票数 0

我需要检查命令行参数中是否有非数字字符。例如:./problem 20x应该打印出"Not a digit“,因为它包含一个x。我的代码似乎没有遍历命令行参数中的所有字符。

我基本上尝试了不同类型的循环,但似乎不起作用。

代码语言:javascript
复制
string s = argv[1];

for (int i = 0, n = strlen(s); i < n; i++)
{
    while (s[i] != '\0')
    {
        if (isdigit (s[i]) == false)
        {
            printf(" Not a digit\n");
            return 1; 
        }
    }
    int k = atoi(s);
    printf("Success\n");
    return 1;
    }
}

我希望"20x“的输出会打印出”一个数字都不是“。另外,"x20“的输出应该是”非数字“。

EN

回答 1

Stack Overflow用户

发布于 2019-05-23 11:08:21

这个问题不需要两个for循环。这两个循环都会自己工作,不同之处在于停止条件。在本例中,我将使用nul循环,但使用while循环的类似实现将简单地检查下一个字符是否为nul终止符。

代码语言:javascript
复制
enum bool_t {
    FALSE,
    TRUE
};

int main(int argc, char *argv[])
{
    if (argc == 1) {
        fprintf(stderr, "No input(s).\n");

        return EXIT_FAILURE;
    }

    while (*++argv) {
        int found_invalid_character = FALSE;

        for (size_t i = 0; i < strlen(*argv); ++i) {
            if (!isdigit((*argv)[i])) {
                found_invalid_character = TRUE;
                break;
            }
        }

        if (found_invalid_character) {
            printf("%s is not a valid integer.\n", *argv);
            continue;
        }

        int n = atoi(*argv);
        printf("%d is a valid integer.\n", n);
    }

    return EXIT_SUCCESS;
}

输出:

代码语言:javascript
复制
x20 is not a valid integer.
20x is not a valid integer.
20 is a valid integer.

请记住,argv是一个指向以null结尾的字符数组的指针数组,因此您总是可以通过检查是否命中nul结束符来迭代"string“。如果您愿意的话,您可以在string.h中重新实现这些函数,将其用于几乎所有的事情。下面是strlen函数的例子。

代码语言:javascript
复制
size_t my_strlen(const char* s) {
    size_t len = 0;

    while (*s++)
        ++len;

    return len;
}

每次评估while条件时,都会增加和取消对s指针的引用。在找到nul终止符之前,*s的每个值都将是某个ASCII值,因此是非零的,此时将不会执行++len语句。这就是为什么strlen通常返回字符串的长度减去nul结束符的原因。

因此,基本上,我在示例中为程序使用的for循环依赖于输入字符串的长度,间接依赖于找到输入字符串的nul结束符。这就是为什么你可以在检查nul终止符时使用while循环的原因。

顺便说一句,我确实注意到在成功分支和失败分支的末尾都返回了1,这让我有点迷惑。返回1通常表示错误,实际上stdlib.hEXIT_FAILURE宏定义为1。我自己也使用这些宏,但如果您注意到我使用枚举定义了TRUEFALSE,这使它们在词法上对程序可见为"FALSE“和"TRUE”以及0和1,这是它们各自的值,而不是被预处理器简单地文本替换为0和1。

此外,您没有包含头文件或以前的定义,但我猜您是在Windows上,因为如果不手动定义,false在C中不是有效值,而作为C++编译器的Visual Studio则允许这样做。我提出这个问题是因为我被string s = argv[1]这一行搞糊涂了。这可能意味着您使用的是C++编译器并使用了臭名昭著的using namespace std;,或者您输入了using namespace std;typedef const char* string。我个人不喜欢这两种选择,但各有各的选择。

不管怎样,我希望这对你有帮助,祝你好运。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56265161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档