c - 如何检查最后一个命令行参数是否为有效数字 - C 编程
问题描述
我正在尝试编写一个程序来检查文本文件,但也使用一个作为最后一个参数传递的数字。我想做一些错误检查以确保最后一个参数是一个数字。
解决方案
原来的
我不知道digit()
这个函数是什么,但不管这个函数是什么,它永远不会检查字符串argv[argc-1]
是否成功。这是因为atoi()
如果 is 不是数字字符串,该函数将返回零argv[argc-1]
作为错误,但如果argv[argc-1]
is也将返回零"0"
。要验证是否argv[argc-1]
是一位且只有一位,您需要:
- 检查字符串的长度(
argv[argc-1][1] == '\0'
); - 检查第一个字符是否为数字字符 (
isdigit( argv[argc-1][0] )
)。
这是最终的代码。
char *a = argv[argc-1];
if ( (a[1] != '\0') || !isdigit(a[0]) ) {
printf("No valid digit entered\n");
exit(1);
}
编辑#1
正如一些用户在下面提到的,我的原始答案有两个问题。
首先,我假设字符串argv
不能为空。但是,如果一个程序被称为./program ""
,argv[1]
将是一个空字符串。
出于演示目的,这是一个打印stdout
所有argv
字符串及其长度的程序。
/* program.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char **argv) {
for (int i = 0; i < argc; i++)
printf("strlen(\"%s\") = %zu\n", argv[i], strlen(argv[i]));
return EXIT_SUCCESS;
}
这是输出,确认argv[1]
是一个空字符串。
$ gcc -Wall -std=c99 -o program program.c
$ ./program ""
strlen("./program") = 9
strlen("") = 0
$
第二个问题与isdigit()
函数的使用有关。根据手册(man isdigit
在终端上),传递给isdigit()
我的参数必须是unsigned char
.
int isdigit(int c);
这些函数根据指定的语言环境检查必须具有 unsigned char 或 EOF 值的 c 是否属于某个字符类。
这是没有以下评论中提到的问题的最终解决方案。
char *a = argv[argc-1];
if ( !isdigit((unsigned char) a[0]) || (a[1] != '\0') ) {
printf("No valid digit entered\n");
exit(1);
}
推荐阅读
- c++ - V8 QuickIsUndefined 在使用 IsConstructCall 时随机崩溃
- amazon-s3 - 防止 rclone 将文件重新复制到 AWS S3 Deep Archive
- php - 如何将 DTO 和 Messenger 与 Api-Platform 一起使用?
- mysql - MySQL 5:如何在工作时间找到客户高峰
- c - printf 中的转换类型(没有强制转换运算符)
- keras - Keras 词嵌入矩阵的第一行为零
- javascript - 为什么 For..in(loop) 总是破坏它所在的函数?
- python - 在使用 keras 进行训练的每个 epoch 之后获取所有验证细节
- performance - 如何在 Linux 开发笔记本电脑上修复“java.lang.OutOfMemoryError:无法创建新的本机线程”
- laravel - 如何显示所有信息的动物?