在 C 中读取命令行参数并检查它是一个数字
Reading command-line argument in C and checking is it a digit
我的目标详情
在 C 中,我的程序应该从命令行获取输入,读取它,确保它是一个数字,然后如果为真则打印“成功”,如果为假则打印“用法:./caesar key” .
预期结果
./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("Success\n");
return 0;
}
或
if (argc == 2)
{
if (isdigit(argv[0][1]))
{
printf("Success\n");
return 0;
}
或
int main (int argc, string argv[])
{
if (argc == 2 && isdigit(argv[1]))
{
printf("Success\n");
return 0;
}
你在这里做错的是你想检查整个字符串是否由数字组成,但是你将字符串本身传递给 isdigit
,它期望 char
。您可以做的是手动遍历 char
数组并检查每个 char
是否是一个数字,或者您可以使用 strspn
函数,如下所示。
strspn(argv[1], "0123456789") == strlen(argv[1])
这将比较参数中数字的跨度,如果它与字符串本身的长度相同,则return为真。如果您想在参数中允许 + 和 - 符号,请在 strspn
中使用 "-+0123456789"
,尽管这会导致 +++++
等情况的误报(如下面的@dreamcrash 所述) ,这就是为什么定义自定义函数总是更好的选择。 strspn
和 strlen
函数在 string.h
header.
中可用
如果你不需要使用isdigit
函数,那么你可以使用@Param Siddharth建议的strspn函数。但是,它们是一些使用
的极端情况
if (strspn(string, "-+0123456789") == strlen(string))
例如 "-----"
这样的值将被 视为有效数字。
如果您想使用 isdigit
函数,则需要遍历 String 中的所有 char
(而不是传递整个String 一次)并检查它们是否确实是一个数字:
...
int i, is_number = 1;
for (i = 0; is_number && argv[1][i] != '[=11=]'; 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("Success\n");
return 0;
}
我测试了输入:
- “-”,不是数字
- "",不是数字
- "-1", 数字
- "+1", 数字
- “+1+1”不是数字
int main (int argc, string argv[])
string
数据类型未在 C 中定义。第二个参数应为 char* argv[]
.
请看答案:.
我的目标详情
在 C 中,我的程序应该从命令行获取输入,读取它,确保它是一个数字,然后如果为真则打印“成功”,如果为假则打印“用法:./caesar key” .
预期结果
./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("Success\n");
return 0;
}
或
if (argc == 2)
{
if (isdigit(argv[0][1]))
{
printf("Success\n");
return 0;
}
或
int main (int argc, string argv[])
{
if (argc == 2 && isdigit(argv[1]))
{
printf("Success\n");
return 0;
}
你在这里做错的是你想检查整个字符串是否由数字组成,但是你将字符串本身传递给 isdigit
,它期望 char
。您可以做的是手动遍历 char
数组并检查每个 char
是否是一个数字,或者您可以使用 strspn
函数,如下所示。
strspn(argv[1], "0123456789") == strlen(argv[1])
这将比较参数中数字的跨度,如果它与字符串本身的长度相同,则return为真。如果您想在参数中允许 + 和 - 符号,请在 strspn
中使用 "-+0123456789"
,尽管这会导致 +++++
等情况的误报(如下面的@dreamcrash 所述) ,这就是为什么定义自定义函数总是更好的选择。 strspn
和 strlen
函数在 string.h
header.
如果你不需要使用isdigit
函数,那么你可以使用@Param Siddharth建议的strspn函数。但是,它们是一些使用
if (strspn(string, "-+0123456789") == strlen(string))
例如 "-----"
这样的值将被 视为有效数字。
如果您想使用 isdigit
函数,则需要遍历 String 中的所有 char
(而不是传递整个String 一次)并检查它们是否确实是一个数字:
...
int i, is_number = 1;
for (i = 0; is_number && argv[1][i] != '[=11=]'; 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("Success\n");
return 0;
}
我测试了输入:
- “-”,不是数字
- "",不是数字
- "-1", 数字
- "+1", 数字
- “+1+1”不是数字
int main (int argc, string argv[])
string
数据类型未在 C 中定义。第二个参数应为 char* argv[]
.
请看答案:.