C++字母求和程序出现Segmentation Fault(段错误)问题求助
段错误原因及修复方案
错误原因
- 未初始化变量
n:你定义了int n;但没给初始值,局部变量默认是随机的垃圾值。直接用text[n]访问字符串时,这个随机的n大概率超出了字符串的有效索引范围,程序就会触发段错误(访问了不该碰的内存区域)。 - 循环逻辑错误:就算
n初始化了,你的循环是先n++再取text[n],会跳过第一个字符;而且用text[n] != '\0'判断结束,C的std::string虽然内部带终止符,但用size()方法判断长度更安全,也符合C的用法习惯。
修复后的代码
#include <iostream> using namespace std; int letter_sum(string text) { int Psum = 0; int n = 0; // 初始化n为0,从第一个字符开始遍历 // 用text.size()判断循环边界,彻底避免越界访问 while (n < text.size()) { // 直接计算每个小写字母对应的数值(a=1, b=2...) Psum += text[n] - 'a' + 1; n++; } return Psum; } int main () { string text; cout << "type the text: "; cin >> text; int displayvalue = letter_sum(text); cout << displayvalue << endl; }
额外说明
- 用
text[n] - 'a' +1代替原来的Psum - 96*n,逻辑更直观:小写字母'a'的ASCII码是97,text[n]-'a'得到0(对应a)、1(对应b)……加1后就是1、2……的目标数值,和你原来的计算结果完全一致,但可读性更强。 - 如果需要支持大写字母,可以加个转换逻辑:
tolower(text[n]) - 'a' +1,记得在代码开头包含<cctype>头文件。
内容的提问来源于stack exchange,提问作者Zenz
相关产品推荐
相关产品推荐

