You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何程序无法识别only_digits函数?链接错误问题求助

链接错误 undefined reference to 'only_digits' 的原因分析与修复

核心原因

你只在代码开头声明了bool only_digits(string s);函数,但没有编写这个函数的具体实现代码(函数体)。链接器在链接阶段找不到该函数的二进制执行代码,因此抛出这个错误。

代码里的其他问题

  1. 多余的函数声明:你在main函数内部重复写了bool only_digits(string s);,这完全没必要,函数声明只需要在全局范围内写一次即可。
  2. 错误的代码位置:你紧接着写的for循环逻辑,本来是想实现only_digits的功能,但这段代码直接放在main函数里是错误的——main的返回类型是int,不能直接返回false/true这类布尔值,而且这段逻辑应该是only_digits函数的函数体,必须放在main外面。
  3. 错误的判断逻辑:你原来的条件(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 09:33:21