读取C中的命令行参数并检查它是否为数字



关于我的目标的详细信息

在C中,我的程序应该从命令行获取输入,读取它,确保它是一个数字,然后打印出";成功;如果为真;用法:/凯撒键";如果为false。

预期结果

./caesar 33
Success

./caesar zzz
Usage: ./caesar key

实际结果

./caesar 33
Segmentation error

我尝试过的

int main (int argc, string argv[])
{
if (argc == 2)
{
if (isdigit(argv[1]))
{
printf("Successn");
return 0;
}

if (argc == 2)
{
if (isdigit(argv[0][1]))
{
printf("Successn");
return 0;
}

int main (int argc, string argv[])
{
if (argc == 2 && isdigit(argv[1]))
{
printf("Successn");
return 0;
}

这里的错误是,您想检查整个字符串是否由数字组成,但您将字符串本身传递给isdigit,CCD_1需要一个char。您可以手动遍历char数组,并检查每个char是否是一个数字,或者您可以使用strspn函数,如下所示。

strspn(argv[1], "0123456789") == strlen(argv[1])

这将比较参数中的数字跨度,如果它与字符串本身的长度相同,则返回true。如果你想在参数中允许+和-符号,那么在strspn中使用"-+0123456789",尽管这会导致像+++++这样的情况出现误报(正如下面的@dreamcrash所提到的(,这就是为什么定义自定义函数总是一个更好的选择。CCD_ 9和CCD_。

如果您不需要使用isdigit函数,那么您可以按照@Param Siddharth的建议使用strspn函数。然而,它们是使用的几个角落情况

if (strspn(string, "-+0123456789") == strlen(string))

例如,像CCD_ 13这样的值将被视为有效数字

如果您想使用isdigit函数,则需要遍历String中的所有char(而不是一次性传递整个String(,并检查它们中的每一个是否确实是一个数字:

...
int i, is_number = 1;
for (i = 0; is_number && argv[1][i] != ''; i++){
if(i == 0 && (argv[1][i] == '-' || argv[1][i] == '+')){
continue;
}   
is_number = isdigit(string[i]);
}
// It should fail for Strings that are : empty, only "-" or "+"
if(i == 0 || (i == 1 && !isdigit(argv[1][0])) || !is_number){
printf("The String is not a Number n");
return 1;
}
printf("Successn");
return 0;
}

我用输入进行了测试:

  • &quot-&";,不是数字
  • ";,不是数字
  • &quot-1〃;,数字
  • "1〃;,数字
  • "1+1";不是数字
int main (int argc, string argv[])

string数据类型未在C中定义。第二个参数应为char* argv[]

请看答案:https://stackoverflow.com/questions/14709323/does-c-have-a-string-type#:~:text=有%20is%20no%20string%20类型,一个%20附加%20zero%20终止%20字符。

相关内容

最新更新