我如何验证ARGV中的密钥?

问题描述 投票:0回答:2

我太困了。尝试了好几天。我需要验证每个输入到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");
    }
}

任何帮助将不胜感激!

c cs50 argv atoi argc
2个回答
1
投票

一个简单又肮脏的例子on onlinegdb

没有做很多测试...

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

int main(int argc, char * argv[])
{
    if (argc == 2)        
    {
        for (int k = 0; k <strlen(argv[1]); 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)。

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


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]不是数字时要进行上述测试的原因。

© www.soinside.com 2019 - 2024. All rights reserved.