CS50替换密码程序异常:argv[]仅读取前9个输入字符
问题分析与解决
核心问题
你用sizeof key获取密钥长度是错误的。在CS50中,string是char*(字符指针)的别名,sizeof(key)得到的是指针变量本身的字节大小(64位系统下为8字节,32位为4字节),而非字符串实际包含的字符数。这就是循环只打印8个字符、且错误判定密钥长度不符合要求的原因。
解决步骤
- 引入字符串处理头文件:要获取字符串实际长度,需使用
strlen()函数,该函数定义在<string.h>中,需在代码开头添加#include <string.h>。 - 替换
sizeof为strlen():所有需要判断密钥长度的地方,用strlen(key)替代sizeof key。strlen()返回size_t类型,直接用于比较或强制转换为int即可。 - 修正数组定义:把
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
相关产品推荐
相关产品推荐

