gpt4 book ai didi

c++ - 堆栈粉碎/回溯

转载 作者:太空宇宙 更新时间:2023-11-04 07:12:01 27 4
gpt4 key购买 nike

我写了一小段代码,它应该接受一个字符数组并让它看起来像计算机正在输入文本。很简单,对吧?但是当我运行它时,Terminal 告诉我:

*** stack smashing detected ***: ./TYPE terminated
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x45)[0xb759aeb5]
/lib/i386-linux-gnu/libc.so.6(+0x104e6a)[0xb759ae6a]
./TYPE[0x80486a9]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb74af4d3]
./TYPE[0x8048591]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:01 1580147 /home/jeremy/Desktop/programming/cpp/Jumping into C++/TYPE
08049000-0804a000 r--p 00000000 08:01 1580147 /home/jeremy/Desktop/programming/cpp/Jumping into C++/TYPE
0804a000-0804b000 rw-p 00001000 08:01 1580147 /home/jeremy/Desktop/programming/cpp/Jumping into C++/TYPE
08a30000-08a51000 rw-p 00000000 00:00 0 [heap]
b7449000-b744b000 rw-p 00000000 00:00 0
b744b000-b7467000 r-xp 00000000 08:01 4195157 /lib/i386-linux-gnu/libgcc_s.so.1
b7467000-b7468000 r--p 0001b000 08:01 4195157 /lib/i386-linux-gnu/libgcc_s.so.1
b7468000-b7469000 rw-p 0001c000 08:01 4195157 /lib/i386-linux-gnu/libgcc_s.so.1
b7469000-b7493000 r-xp 00000000 08:01 4198259 /lib/i386-linux-gnu/libm-2.15.so
b7493000-b7494000 r--p 00029000 08:01 4198259 /lib/i386-linux-gnu/libm-2.15.so
b7494000-b7495000 rw-p 0002a000 08:01 4198259 /lib/i386-linux-gnu/libm-2.15.so
b7495000-b7496000 rw-p 00000000 00:00 0
b7496000-b763a000 r-xp 00000000 08:01 4198264 /lib/i386-linux-gnu/libc-2.15.so
b763a000-b763c000 r--p 001a4000 08:01 4198264 /lib/i386-linux-gnu/libc-2.15.so
b763c000-b763d000 rw-p 001a6000 08:01 4198264 /lib/i386-linux-gnu/libc-2.15.so
b763d000-b7640000 rw-p 00000000 00:00 0
b7640000-b7718000 r-xp 00000000 08:01 8786914 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
b7718000-b7719000 ---p 000d8000 08:01 8786914 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
b7719000-b771d000 r--p 000d8000 08:01 8786914 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
b771d000-b771e000 rw-p 000dc000 08:01 8786914 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
b771e000-b7725000 rw-p 00000000 00:00 0
b773e000-b7742000 rw-p 00000000 00:00 0
b7742000-b7743000 r-xp 00000000 00:00 0 [vdso]
b7743000-b7763000 r-xp 00000000 08:01 4198254 /lib/i386-linux-gnu/ld-2.15.so
b7763000-b7764000 r--p 0001f000 08:01 4198254 /lib/i386-linux-gnu/ld-2.15.so
b7764000-b7765000 rw-p 00020000 08:01 4198254 /lib/i386-linux-gnu/ld-2.15.so
bffc0000-bffe1000 rw-p 00000000 00:00 0 [stack]
abcdefghijklmnopqrstuvwxyzAborted (core dumped)

我是 C++ 的新手(我有 C 语言背景),我不知道堆栈粉碎或回溯是什么。如果你能帮助我,那将有很大帮助!这是代码:

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <unistd.h>

using namespace std;

void type(char letters[]);

int main(){

char letters[27] = "abcdefghijklmnopqrstuvwxyz";
system("clear");
type(letters);

return 0;
}

void type(char letters[]){

unsigned int wait = 30000000;

system("clear");
for(int i = 0; letters[i] != '\n'; i++){
usleep(wait)
cout << letters[i];
}

}

最佳答案

C++ 中的字符串应该以 null 结尾,即它们的最后一个字符是 \0。在您的代码中,循环不会在字符串 letters 的末尾终止,因为您正在寻找该字符串中实际上不存在的 \n 字符.

第一次修复

用您在循环中查找的字符终止字符串:

char letters[28] = "abcdefghijklmnopqrstuvwxyz\n";

第二次修复

通过查找实际存在的字符串结尾字符 \0 来终止循环:

for(int i = 0; letters[i] != '\0'; i++)

第三次修复

使用适当的 string length检查作为循环终止标准:

int len = strlen(letters);
for(int i = 0; i < len; i++)

或这三者的任意组合。

一般来说,将字符串声明为固定大小的数组绝不是一个好主意,因此请改用 const char *letters = "...";

关于c++ - 堆栈粉碎/回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27661824/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com