为何程序无法识别only_digits函数?链接错误问题求助
链接错误
undefined reference to 'only_digits' 的原因分析与修复 核心原因
你只在代码开头声明了bool only_digits(string s);函数,但没有编写这个函数的具体实现代码(函数体)。链接器在链接阶段找不到该函数的二进制执行代码,因此抛出这个错误。
代码里的其他问题
- 多余的函数声明:你在
main函数内部重复写了bool only_digits(string s);,这完全没必要,函数声明只需要在全局范围内写一次即可。 - 错误的代码位置:你紧接着写的for循环逻辑,本来是想实现
only_digits的功能,但这段代码直接放在main函数里是错误的——main的返回类型是int,不能直接返回false/true这类布尔值,而且这段逻辑应该是only_digits函数的函数体,必须放在main外面。 - 错误的判断逻辑:你原来的条件
(argv[1])[i]<='z' && (argv[1])[i]>'A'完全不对,这个条件会匹配所有小写字母和大写字母B到Z,根本无法正确判断非数字字符。
修复后的代码示例
#include <cs50.h> #include <stdio.h> #include <string.h> #include <ctype.h> // 全局范围内声明函数 bool only_digits(string s); int main(int argc, string argv[]) { if(argc > 2) { printf("Usage: ./caesar key\n"); // 参数错误时返回非0退出码,符合程序规范 return 1; } // 调用only_digits函数 bool z = only_digits(argv[1]); if (!z) { printf("Key must be a positive integer.\n"); return 1; } // 后续逻辑写在这里 return 0; } // 实现only_digits函数:判断字符串是否全为数字 bool only_digits(string s) { for(int i = 0, n = strlen(s); i < n; i++) { // 使用标准库的isdigit函数,准确判断是否为数字字符 if(!isdigit(s[i])) { return false; } } return true; }
额外说明
- 用标准库的
isdigit函数判断数字字符,比手动比较ASCII范围更可靠,能避免逻辑错误。 - 处理参数错误时,记得返回非0的退出码,这是C程序的常规做法。
内容的提问来源于stack exchange,提问作者Renato2022
相关产品推荐
相关产品推荐

