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

CS50替换密码程序异常:argv[]仅读取前9个输入字符

问题分析与解决

核心问题

你用sizeof key获取密钥长度是错误的。在CS50中,string是char*(字符指针)的别名,sizeof(key)得到的是指针变量本身的字节大小(64位系统下为8字节,32位为4字节),而非字符串实际包含的字符数。这就是循环只打印8个字符、且错误判定密钥长度不符合要求的原因。

解决步骤

  1. 引入字符串处理头文件:要获取字符串实际长度,需使用strlen()函数,该函数定义在<string.h>中,需在代码开头添加#include <string.h>。
  2. 替换sizeof为strlen():所有需要判断密钥长度的地方,用strlen(key)替代sizeof key。strlen()返回size_t类型,直接用于比较或强制转换为int即可。
  3. 修正数组定义:把int werte_key[sizeof key];改为int werte_key[strlen(key)];,确保数组大小匹配实际密钥长度。

修正后的代码

#include <cs50.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>  // 添加字符串处理头文件

int main(int argc, char *argv[])
{
    string key = argv[1];

    // 用strlen获取实际密钥长度定义数组
    int werte_key[strlen(key)];

    // 循环条件改为strlen(key)
    for (int i = 0; i < strlen(key); i++)
    {
        printf("%c\n", key[i]);
    }

    // 判断密钥长度是否为26
    if (strlen(key) != 26)
    {
        printf("%zu\n", strlen(key));  // size_t类型用%zu格式化输出
        printf("Key must contain 26 characters.\n");
        return 1;
    }

    // 后续逻辑可在此添加
    return 0;
}

额外提示

  • strlen()从字符串起始位置计数,直到遇到终止符\0,只要输入的密钥是合法字符串(无嵌入空字符),就能正确获取长度。
  • 输出strlen()结果时,推荐用%zu格式符,它是专门用于size_t类型的格式化输出。

内容的提问来源于stack exchange,提问作者Lxqnd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:01:10