2016-06-18 2 views
0

Я кодировал Python около года и решил также изучить C. Я пытался написать функцию для изменения заданного массива символов по строкам (упражнение от K & R). Вот код:Индексирование не работает в двух вложенных циклах

void reverse(char s[]) { 
    int i, lastIndex, tempLetter1, tempLetter2; 
    i = lastIndex = 0; 
    while (s[lastIndex] != EOF) { 
     while (s[lastIndex] != '\n') { 
      i = lastIndex; 
      tempLetter2 = s[i]; 
      while (s[i] != '\n') { 
       tempLetter1 = tempLetter2; 
       tempLetter2 = s[i + 1]; 
       s[i + 1] = tempLetter1; 
       ++i; 
      } 
      ++lastIndex; 
     } 
     ++lastIndex; 
    } 
} 

Это заканчивается бесконечным циклом. Я вставил некоторые печатный код внутри второго цикла:

printf("s[0] = "); 
putchar(s[0]); 
printf("\ns[1] = "); 
putchar(s[1]); 
printf("\ns[2] = "); 
putchar(s[2]); 

И все они содержали первый символ входного массива (Hello World).

s[0] = H 
s[1] = H 
s[2] = H 

Я также пропустил первый цикл while и все еще не работал. Хотя индексирование отлично работает вне цикла. Третий цикл также работает.

Я поместил весь код в случае, если есть другие аспекты этого плохо написаны, я был бы признателен, если бы указывал :)

#include <stdio.h> 
#define LEN 1000 

void getLine(char[]); 
void reverse(char[]); 

int main() { 
    char line[LEN]; 
    getLine(line); 
    reverse(line); 
    printf("\n%s\n", line); 
    return 0; 
} 

void getLine(char s[]) { 
    int i, c; 
    for (i = 0; (c = getchar()) != EOF; ++i) { 
     s[i] = c; 
    } 
    s[i] = '\0'; 
} 
+0

В коде есть серьезная логическая ошибка. Пожалуйста, проверьте. Кроме того, массив char заканчивается на '\ 0' не '\ n'. – denis

+1

@denis Спасибо за ответ. Не могли бы вы объяснить немного больше? Я также проверяю новую строку с '' \ n''. Возможно, я должен заменить 'EOF'' '\ 0''? – keyan3d

+0

Как вы определяете и инициализируете то, что передается в 'reverse()'? – alk

ответ

2

Ваш код начинается с

while (s[lastIndex] != EOF) { 

Учитывая, что здесь нет чтения файлов, неверно EOF (Конец файла). Возможно, вы имели в виду 0, что означает конец строки? Или еще лучше, '\0' означает конец строки в форме символа? (Также называется NUL, но этот символ не определен.)

Хорошо, если предположить, что первый символ s не EOF, он тут же попадает второй цикл:

while (s[lastIndex] != '\n') { 

Первое, что: который больше не будет проверять на NUL. Если вы нажмете NUL, он пролетел бы прямо мимо него ... Но если предположить, что строка ввода хорошо сформирована, а ее последний символ перед окончательным NUL - это '\n', давайте продолжим.

Как я понимаю, вы хотите изменить символы в каждой строке в основной строке. Это означает, что вам нужно запомнить начало строки (хорошо, что в lastIndex - жалость к имени), а затем ищите конец строки. Вы используете i для этого ...

Подвешивание: вы меняете персонажей, когда идете? Конечно, вы должны искать конец линии, а затем начать движение lastIndex и i все ближе и ближе друг к другу, поменявшись, как вы идете? Таким образом, вы должны прирастать lastIndex, а декрементi, внутри того же цикла.

Или я что-то упускаю?

+0

Спасибо, Джон, я согласен, алгоритму может понадобиться какая-то работа ... Хотя то, что меня смущает, это факт, что 's [0]' и 's [2]' во втором цикле одинаковы! Я также удалил первый цикл (проверяет на 'EOF' - который должен проверять' '\ 0''), и проблема все еще была там. – keyan3d

+0

Если вы возитесь с петлей, как указано в нашем оригинальном посте, я не понимаю, что вы пытаетесь сделать, когда говорите «обратное». Приведенный код превратит «ABCDE» в «AABCD» - вы никогда не назначаете 's [i]'. –

+0

Еще раз спасибо, я пропустил 's [lastIndex] = tempLetter2' после третьего цикла. Я положил его и работал ... Хотя я до сих пор не понимаю, почему разные индексы возвращают одинаковое значение (как до, так и после третьего цикла) ... – keyan3d

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