如何验证ARGV中的密钥?

时间:2019-12-10 15:15:30

标签: c cs50 argv atoi argc

我被困住了。尝试了好几天。我需要验证输入到argv[1]的每个char是一个数字,但是我尝试了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");
    }
}

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:1)

一个简单而肮脏的示例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]是一个字符串,即。字符数组(末尾为chracter)。

所以您必须遍历此数组的所有字符。

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

答案 1 :(得分:0)

您从for (int x = 0; x < strlen(argv[1]); x++)开始有了一个不错的开端,很遗憾,它不适用于C。

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

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

 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] != '\0'; 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]不是数字的情况下进行以上测试的原因。

答案 2 :(得分:0)

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

/* 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 == '\0';
}

例如:

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