如何检查命令行参数的每个字符?凯撒PSET2

时间:2019-05-22 21:19:34

标签: c cs50 caesar-cipher

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

我基本上已经尝试了不同种类的循环,但是似乎没有用。

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”的输出应为“非数字”

1 个答案:

答案 0 :(得分:0)

对于此问题,您不需要两个for循环。任何一个循环都将独立工作,并且差异将处于停止状态。在此示例中,我将使用for循环,但是使用while循环的类似实现将仅检查下一个字符是否为nul终止符。

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;
}

输出:

x20 is not a valid integer.
20x is not a valid integer.
20 is a valid integer.

请记住,argv是一个指向以null终止的字符数组的指针的数组,因此,您始终可以通过检查是否命中了nul终止符来遍历“字符串”。如果您想使用string.h中的所有功能,可以重新实现它们。例如,这是strlen函数。

size_t my_strlen(const char* s) {
    size_t len = 0;

    while (*s++)
        ++len;

    return len;
}

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

所以基本上我在示例中为您的程序使用的for循环取决于输入的字符串长度,间接取决于查找输入字符串的nul终止符。这就是为什么在检查nul终止符时也可以使用while循环的原因。


顺便说一句,我确实注意到您在成功分支和失败分支的末尾都返回1,对此我有些困惑。通常返回1表示错误,实际上stdlib.hEXIT_FAILURE宏定义为1。我确实使用了这些宏,尽管如果您注意到我定义了TRUEFALSE使用一个枚举,这使得它们在程序上都按词法显示为“ FALSE”和“ TRUE”以及分别为0和1的值,而不是由预处理器简单地将其文本替换为0和1。 / p>

此外,您没有包含标头或以前的定义,但是我猜您在Windows上,因为false在C中未经手动定义就不是有效值,而Visual Studio作为C ++编译器,确实允许这样做。之所以提出这一点,是因为我对行string s = argv[1]感到困惑。这可能意味着您正在使用C ++编译器并使用了臭名昭著的using namespace std;,或者键入了typedef const char* string。我个人不喜欢任何一种选择,但每个人都有自己的选择。

无论如何,我希望这会有所帮助,祝你好运。