如何验证 ARGV 中的密钥?

How do I Validate a Key in ARGV?

我被困住了。这几天一直在努力。我需要验证输入 argv[1] 的每个字符都是一个数字,但我尝试了 isdigitisalphacharatoi 转换但没有成功。我在编码方面还是新手。我很沮丧并删除了所有内容以重新开始,但这就是我现在的位置。

#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

int main(int argc, string argv[])
{
    if (argc == 2)        
    {
        for (int k = 0; k <strlen(argv[1]); k++)
        {
            printf("Success!\n");
            printf("%s\n", argv[1]);
        }    
    }     
    else                  
    {
        printf("Usage: ./caesar key\n");
    }
}

这是我之前所在的位置。每次我尝试 运行 这个:

时,我总是收到清理错误
#include <cs50.h>
#include <stdio.h>
#include <string.h>
include <ctype.h>
#include <stdlib.h>

int main(int argc, string argv[])
{
    if (isdigit(argv[1]))
    {
        if(atoi(argv[1])) 
        {
            if (argc == 2)
            {         
                for (int x = 0; x < strlen(argv[1]); x++)
                {
                    printf("Success!\n");
                    printf("%s", argv[1]);
                }
            }        
        }
    }
    else
    {
        printf("Usage: /caesar key\n");
    }
}

如有任何帮助,我们将不胜感激!

一个简单粗暴的例子on onlinegdb:

没有测试很多...

#include <stdio.h>
#include <string.h>

int main(int argc, char * argv[])
{
    if (argc == 2)        
    {
        int n = strlen(argv[1]);
        for (int k = 0; k < n; k++)
        {
            if ( isdigit(argv[1][k]) )
            {
                printf("%c is a digit\n", argv[1][k]);
            }
            else
            {
                printf("%c is not a digit\n", argv[1][k]);
            }
        }    
    }     
    else                  
    {
         printf("Error\n");
    }
}

记住 argv[1] 是一个字符串,即。一个字符数组(末尾有一个空字符)。

所以你必须遍历这个数组的所有字符。

编辑:chmike 在另一个答案中的好评。

你从 for (int x = 0; x < strlen(argv[1]); x++) 开始不错,不幸的是它不适合 C。

在 C 中,字符串以特殊字符 '\0' 结束。函数 strlen 计算从字符串开头到这个特殊字符的字符数。因此,当您编写 for (int x = 0; x < strlen(argv[1]); x++) 时,会在 x 的每次测试中执行 strlen()

这是避免这种情况的一种方法:

 for (int x = 0, n = strlen(argv[1]); x < n; x++)

这声明 i 初始化为 0,n 初始化为 argv[1] 的长度。该测试将 xn 进行比较,后者速度较快。

另一种测试是否到达字符串末尾的方法是测试我们是否到达了那个特殊字符'\0'。

 for (int x = 0; argv[1][x] != '[=11=]'; x++)

它们是等价的。做出你的选择。

现在,对于您要测试的每个字符,如果它是一个数字。您可以使用函数 isdigit() 来完成这项工作。或者您可以自己编写测试,这并不难。

for (int x = 0, n = strlen(argv[1]); x < n; x++)
    if (!isdigit(argv[1][x])) {
        printf("failure: argv[1] is not all digits\n");
        return;
    }
printf("success: argv[1] is all digits\n")

我们自己实现的替代测试是这个

for (int x = 0, n = strlen(argv[1]); x < n; x++)
    if (argv[1][x] < '0' || argv[1][x] > '9') {
        printf("failure: argv[1] is not all digits\n");
        return;
    }
printf("success: argv[1] is all digits\n")

请注意,argv[1][x] 包含字符的 ASCII 代码,“0”是 0 的 ASCII 代码。另请注意,数字的 ASCII 代码在“0”到“9”的范围内并且此范围仅包含数字。这就是为什么上面的测试测试 argv[1][x] 是否不是数字。

您可以使用一些辅助函数来检查字符串是否由所有数字组成。

/* Return pointer to first non-digit character in a string. */
const char *findnondigit(const char *input)
{
    while (*input >= '0' && *input <= '9')
    {
        input++;
    }
    return input;
}

/* Return 1 if string is all digits, or 0 if it contains a non-digit. */
int checkalldigits(const char *input)
{
    /* Find first non-digit character in input. */
    input = findnondigit(input);
    /* Return whether first non-digit character is the string's null terminator. */
    return *input == '[=10=]';
}

例如:

int main(int argc, char *argv[])
{
    if (argc > 1)
    {
        if (checkalldigits(argv[1]))
        {
            printf("%s is all digits\n", argv[1]);
        }
    }
}