我正在尝试用C++实现一个基本的移位密码.在找出导致分段错误的原因之前,我不能继续前进.我使用gdb逐步完成代码,问题似乎源于迭代器.
1 #include <iostream>
2 #include <string>
3
4 std::string encrypt (std::string plain, int key);
5
6 int main()
7 {
8 std::string plaintext;
9 std::getline(std::cin,plaintext,'\n');
10 encrypt(plaintext,3);
11 }
12
13 std::string encrypt(std::string plain, int key)
14 {
15 std::string::iterator ic;
16 for (ic= plain.begin(); ic != plain.end();++ic)
17 {
18 std::cout <<*ic + key << std::endl;
19 }
20 }
Run Code Online (Sandbox Code Playgroud)
错误:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7b73ef1 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() () from /usr/lib/libstdc++.so.6
Run Code Online (Sandbox Code Playgroud)
您已声明encrypt为返回an std::string,但您不从函数返回任何内容.您需要返回一个值,或者您需要将返回类型更改void为指示该函数不返回任何内容.
至于为什么它会像写的那样崩溃,我只能推测.编译器可能已生成对std::string析构函数的调用main以清理返回的std::string对象encrypt.由于encrypt实际上并没有返回任何东西,析构函数最终会被调用一个不存在的对象.应该包含对象的内存可能只包含垃圾数据,析构函数不喜欢它.
[C++ 2003标准第6.6.3-2节]流出函数末尾相当于没有值的返回值; 这会导致值返回函数中的未定义行为.
如果您的编译器没有警告您,这是一个非常容易犯的错误.通过启用尽可能多的编译器警告,您可以节省大量调试.在gcc/g ++的情况下,我建议使用"-Wall -Werror"为您正在编写的任何新代码进行编译.使用这些选项,此程序的编译失败,并显示以下消息:
cc1plus: warnings being treated as errors
In function 'std::string encrypt(std::string, int)':
Line 20: warning: control reaches end of non-void function
Run Code Online (Sandbox Code Playgroud)