2015-12-01 2 views
-2

У меня есть домашнее задание, которое включает в себя создание массива c-строк из пользовательского ввода, изменение содержимого массива, чтобы каждая другая буква была заглавной и выводила окончательный результат , Мой код в настоящее время застрял в бесконечном цикле. Я пытаюсь понять, как получить доступ к массиву, а затем изменить его. (На этой неделе мы только начали работать с массивами.) Я вставил свой код ниже. Любая помощь приветствуется!C++: Помогите исправить бесконечный цикл при изменении массива c-string

#include <iostream> 
#include <cctype> 
#include <string> 
#include <cstring> 

const int j = 1024; 

using namespace std; 

int main() 
{ 
    char letter; 
    char lineArray[j]; 
    char modifyArray[j]; 

    cout << "Hello! Please type a letter, word, " //user input prompt 
    << "or phrase, followed by enter." << endl; 

    cin.getline(lineArray, j); 

    for(int i=0; i < 1024; i++) 
    { 
     letter = lineArray[i]; 

     while (letter != '\n')   //change and store letters 
      { 
       if (i%2 == 0) 
        letter = toupper(letter); 
       else if(i%2 != 0) 
        letter = tolower(letter); 
      } 

     modifyArray[i] = letter; 
    } 

    cout << modifyArray[j]; 

    return 0; 
} 
+0

Не каждая строка заканчивается «\ п». Calc удлиньте длину строки перед ее повторением. – antonpp

+0

Если первая буква '' A'', то цикл while будет бесконечным, потому что '' A '! =' \ N'', и не имеет значения, измените ли вы его на 'a' ', так как' 'a'' не равно' '\ n''. Внешний цикл должен быть 'for (int i = 0; lineArray [i]! = '\ 0'; i ++)', а 'while' просто нужно уйти. – user3386109

+0

'while (letter! = '\ N')' - единственный выход отсюда - это установить букву в '' \ n'' - которую вы никогда не делаете ... - также не нужно говорить 'else if (i % 2! = 0) ', просто скажите' else'. – John3136

ответ

1

В следующем фрагменте кода

letter = lineArray[i]; 
while (letter != '\n')   //change and store letters 
    { 
     if (i%2 == 0) 
      letter = toupper(letter); 
     else if(i%2 != 0) 
      letter = tolower(letter); 
    } 

Вы подключение петлей на основе letter, но внутри цикла, она не изменяется таким образом, что это когда-нибудь изменится к '\n'.

Кроме того, при использовании getline символ '\n' (символ новой строки) не попадает в строку, поэтому ваше сравнение с '\n' бессмысленно. Вместо этого, изменить свой цикл к следующему (и удалить время цикла):

for(int i=0; i < strlen (lineArray) + 1; i++) // You need strlen + 1, because otherwise string terminating '\0' character wouldn't be copied over. 

Таким образом, вы бы петлю для точности длины строки (предполагается, что в никогда не было более 1024 символов

.

Кроме того, вы должны напечатать массив как это:

cout << modifyArray; 

Потому что в вашем коде, вы печатаете первый символ, который находится вне пределов вашего массива

+0

Большое вам спасибо! Теперь мой код работает отлично. Я действительно ценю твою помощь. – madamePsychosis

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