如何用C语言内置库判断字符串是否为数字?
C语言中是否有内置方法判断整个字符串是否全为数字?
你尝试用isdigit()函数判断命令行参数是否全为数字,但发现isdigit()仅对单个字符有效,想知道C语言有没有现成的内置方法替代自己遍历每个字符的操作。
你的代码如下:
#include <cs50.h> #include <ctype.h> #include <stdio.h> int main(int argc, string argv[]) { if (argc != 2) { printf("Usage: ./caesar key"); return 1; } else if (isdigit(argv[1]) != 1) { printf("Usage: ./caesar key"); return 1; } }
首先要明确:C标准库没有内置函数直接判断整个字符串是否全为数字,你必须手动遍历字符串的每个字符进行检查。
另外你的代码存在严重错误:isdigit(argv[1])是完全错误的用法——argv[1]是字符串指针(CS50里的string是char*的别名),而isdigit()要求的参数是单个unsigned char(或EOF),直接传指针会触发未定义行为,根本无法实现你想要的判断。
正确的实现方式
方式1:遍历每个字符用isdigit()检查
逐个遍历字符串的每个字符,用isdigit()验证,注意要把字符转为unsigned char,避免处理负数字符时的未定义行为:
#include <cs50.h> #include <ctype.h> #include <stdio.h> #include <string.h> int main(int argc, string argv[]) { if (argc != 2) { printf("Usage: ./caesar key\n"); return 1; } string key = argv[1]; int len = strlen(key); for (int i = 0; i < len; i++) { if (!isdigit((unsigned char)key[i])) { printf("Usage: ./caesar key\n"); return 1; } } // 验证通过,可继续后续逻辑 printf("Key is valid: %s\n", key); return 0; }
方式2:用strtol()转换并验证
如果你的最终目的是把字符串转为数字,strtol()是更可靠的选择——它不仅能完成转换,还能通过输出参数判断是否整个字符串都被成功转换(即全为数字),同时还能检测溢出:
#include <cs50.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> int main(int argc, string argv[]) { if (argc != 2) { printf("Usage: ./caesar key\n"); return 1; } char *endptr; errno = 0; // 重置错误码 long key = strtol(argv[1], &endptr, 10); // 检查转换是否无溢出、是否整个字符串都被转换、是否为非负数 if (errno != 0 || *endptr != '\0' || key < 0) { printf("Usage: ./caesar key\n"); return 1; } printf("Valid key: %ld\n", key); return 0; }
内容的提问来源于stack exchange,提问作者Wajih Benzayed
相关产品推荐
相关产品推荐

