Стек Разрушение / BackTrace

Я написал небольшой фрагмент кода, который должен взять массив символов и заставить его выглядеть так, как будто компьютер печатает текст. Достаточно просто, верно? Но когда я запустил его, Терминал сказал мне следующее:

*** 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];
}

}

0

Решение

Ожидается, что строки в C ++ будут заканчиваться нулем, то есть их последний символ \0, В вашем коде цикл не заканчивается в конце строки letters потому что вы ищете \n символ, который на самом деле не существует в этой строке.

Первое исправление

Завершите строку с символом, который вы ищете в вашем цикле:

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

Второе исправление

Завершите цикл, ища символ конца строки \0 что на самом деле существует:

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

Третье исправление

Используйте правильное длина строки проверить в качестве критерия завершения цикла:

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

Или любая комбинация этих трех.

В целом, никогда не рекомендуется объявлять строку как массив фиксированного размера, поэтому используйте const char *letters = "..."; вместо.

2

Другие решения

Вы в бесконечном цикле

Ты ищешь '\n' который не существует Вы должны искать нулевой символ \0

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

Одно из двух решений вы можете использовать здесь.

1) Вы можете включить \ n в цикл, но это должно быть в самом массиве, а размер массива должен быть увеличен на 1 до букв [28].

2) Вы сохраняете массив так, как вы его объявили, но цикл for будет

for(int i = 0; letters[i]; i++){
cout << letters[i];
}

Второе решение: вам не нужно менять размер массива, и цикл будет продолжаться до конца массива.

0

В дополнение к проблемам конца строки, отмеченным другими комментаторами, ваш код, вероятно, не даст желаемого эффекта, потому что вы используете cout. Этот выходной поток буферизует вещи до тех пор, пока вы не отправите новую строку в любом случае, так что ваш «набор текста» будет отображаться сразу после печати последней строки.

Вы можете получить эффект по одному символу за раз, печатая в cerr или сбрасывая cout после того, как предполагается печатать каждый символ.

0

Вы должны использовать std::string если вы используете C ++. Это будет отслеживать длину для вас, но вы также можете использовать итераторы.

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

using namespace std;

void type(const string &);

int main(){

string letters = "abcdefghijklmnopqrstuvwxyz";
system("clear");
type(letters);

return 0;
}

void type(const string &letters)
{
unsigned int wait = 30000000;

system("clear");
for(string::const_iterator it = letters.begin(); it != letters.end(); it++)
{
usleep(wait)
cout << *it;
}
}

Хотя, если хотите, вы можете получить доступ к символам строки по индексу, например:

void type(const string &letters)
{
unsigned int wait = 30000000;

system("clear");
for(size_t i = 0; i < letters.length(); i++)
{
usleep(wait)
cout << letters[i];
}
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector