2016-11-29 3 views
2

Я попытался изменить строку, используя следующий код, но получаю бесконечный вывод небольших ящиков. (1 на каждой строке)реверсирование строки с использованием цикла for C++

код:

#include <iostream> 
#include <math.h> 
#include <iomanip> 
#include <sstream> 



int main() { 


    // Reversing A String 
    cout<<"welcome to string reverser"<<endl; 
    int sizeOfString; 
    cout<<"please input size of string"<<endl; 
    cin>>sizeOfString; 
    char charray3[sizeOfString]; 
    cin>>charray3; 

    for(unsigned int i=sizeOfString-1; i>=0; i--){ 

    cout<<charray3[i]<<endl; 
    } 
return 0; 
} 

в моей попытке установить я sizeOfString 3 и установить charray3 к 'ABC'.

выход:

box output

, что я делаю неправильно?

+3

Что произойдет, если вы выполните этот код в своем отладчике? – MrEricSir

+0

Является ли 'sizeOfString' числом байтов, которое занимает строка в памяти, или количеством символов в ней? Вы говорите, что вы устанавливаете 'sizeOfString' в 3 для« abc », подразумевая, что это число допустимых символов в нем, но затем вы используете его как размер массива для выделения, подразумевая, что это размер памяти. (Если вы не понимаете, почему это невозможно, вы не понимаете строки C-стиля.) –

+1

FYI, 'char charray3 [sizeOfString];' не является стандартным C++, когда 'sizeOfString' не является постоянным выражением , – crashmstr

ответ

5
  1. Стандарт C++ не позволяет использовать переменную как размер массива.
  2. Строка завершается символом \0.
  3. Не используйте массивы символов, а скорее std::string.
  4. Ваша петля никогда не будет таить, потому что i>=0 всегда правка, так как i является неподписанным (где i будет самым большим значением, которое ваш беззнаковый может удерживать после итерации 0).
5

Не запрашивайте размер строки. Помимо необходимости, это делает вашу программу нестандартной, потому что массив массивов переменной длины, char charray3[sizeOfString], является расширением компилятора.

Используйте вместо этого std::getline, чтобы выделить как можно больше символов. После этого напечатайте строку в обратном порядке так же, как вы делали выше, или измените строку на месте, если хотите. Будьте осторожны с неподписанными вычитаниями! Однако ваш компилятор должен предупредить вас об этом.

Примечание: В случае, если вы задаетесь вопросом, почему ваша программа не работает, есть пережиток '\n' сидит в буфере после прочтения int. Из-за этого буферизованного символа программа возвращается с пустой строкой, как только вы вызываете cin>>charray3.

2

Вы заново изобретать колесо :) Используйте std::string и std::reverse:

#include <algorithm> 
#include <iostream> 
#include <string> 

int main() { 
    std::string str{"Hello, World!"}; 
    std::reverse(str.begin(), str.end()); 
    std::cout << str << std::endl; 
} 

Here's a working online example.

0

вы можете легко использовать класс строку:

#include <iostream> 
#include <string> 


int main() 
{ 

    std::string s1 = "Hello", s2; 

    for(int i(s1.length() - 1); i >= 0; i--) 
     s2+= s1[i]; 

    std::cout << s1 << std::endl; 
    std::cout << s2 << std::endl; 

    return 0; 
} 
  • , чтобы решить на вашем пути с использованием массива символов рассмотрим:

1- вы вводите sizeOfString один вопрос: Что касается ввода с переполнением cin или нижним уровнем входного размера (меньше или больше) ???

например:

sizeOfString = 5; 
cin >> charray3; // "ab" now the size is only 3 (+ null terminator) 

так писать:

charray3[sizeOfString - 1] = 'c'; // charray3[5 - 1] // charray[4] 

пока charray4 не введен, потому что вы введены только charray3[0] и charray3[1] так, как следствие, Segfault.

, чтобы исправить это вы должны сделать некоторую дополнительную работу:

#include <iostream> 
using namespace std; 


int main() 
{ 
    // Reversing A String 
    cout << "welcome to string reverser" << endl; 
    int sizeOfString; 

    cout << "please input size of string" << endl; 
    cin >> sizeOfString; // you specified size 

    cin.ignore(1, '\n'); // clean the input buffer 

    char* charray3 = new char[sizeOfString + 1]; 
    //cin>>charray3; use getline instead to get whitespaces 

    cout << "enter text: " << endl; 
    cin.getline(charray3, sizeOfString); // what if the user enter a text smaller or bigger than sizeOfString??? 
    charray3[sizeOfString] = '\0'; 
    //to correct it: 

    // take effects of input on sizeOfString 
    sizeOfString = strlen(charray3); 

    cout << "before reversing: " << endl; 
    cout << charray3 << endl; 
    // to reverse it create a temporary array: 

    char* pTmp = new char[sizeOfString + 1]; 

    for(int i(sizeOfString-1), j = 0; i >= 0; i--, j++) 
     pTmp[j] = charray3[i]; 
    pTmp[sizeOfString] = '\0'; 

    cout << "after reversing: " << endl; 
    cout << pTmp << endl; 

    // don't forget to clean: 
    delete[] charray3; 
    delete[] pTmp; 

return 0; 
} 
+0

Я использую цикл forwards: unsigned int sizeOfString; cout << "введите размер строки" << endl; cin >> sizeOfString; char charray3 [размерOfString]; cin >> charray3; for (unsigned int i = 0; i codingpeasant

0
// First method 
const int MAXLENGTH = 100; 
char s[MAXLENGTH]; 
cin >> s; 
int len = strlen(s); 
for(int i = 0; i < len/2; i++) { 
    char temp = s[i]; 
    s[i] = s[len-1-i]; 
    s[len-1-i] = temp; 
} 
cout << s; 

// Second 
string s; 
cin >> s; 
for(int i = 0, len = s.length(); i < len/2; i++) { 
    char t = s[i]; 
    s[i] = s[len-1-i]; 
    s[len-1-i] = t; 
} 
cout << s; 
-2

код теперь работает таинственно. 1) Я изменил цикл, чтобы сделать его форвардным циклом, и он сработал 2) я вернул обратно код проблемы и удалил неподписанный тип.

#include <iostream> 
#include <math.h> 
#include <iomanip> 
#include <sstream> 



int main() { 


cout<<"welcome to string reverser"<<endl; 
    int sizeOfString; 
    cout<<"please input size of string"<<endl; 
    cin>>sizeOfString; 
    char charray3[sizeOfString]; 
    cin>>charray3; 

    for(int i=sizeOfString-1; i>=0; i--){ 

    cout<<charray3[i]<<endl; 
    } 
return 0; 
} 

Благодарим всех за ваши комментарии и ответы. Я попробую разнообразие альтернативного кода.

Смежные вопросы