索引在两个嵌套循环中不起作用

Indexing doesn't work in two nested loops

我已经使用 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] = '[=13=]';
}

您的代码以

开头
while (s[lastIndex] != EOF) {

鉴于此处没有文件读取,EOF(文件结尾)不正确。你的意思是0,意思是字符串的结尾?或者更好的是,'[=14=]' 表示字符形式的字符串结尾? (也称为 NUL,但未定义该符号。)

嗯,假设s的第一个字符不是EOF,那么它会立即进入第二个循环:

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

第一件事:不再检查 NUL。如果你点击 NUL,它会直接从它身边闪过……但假设输入字符串格式正确,并且它在最终 NUL 之前的最后一个字符是 '\n' ,让我们继续前进。

据我了解,您想反转主字符串中每一行的字符。这意味着您需要记住行的开头(很好,在 lastIndex 中 - 可惜这个名字),然后去寻找行的结尾。您正在为此使用 i...

等等:你是边走边换角色吗?当然,您应该寻找行尾,然后开始移动 lastIndexi 彼此越来越近,边走边交换?所以你应该递增 lastIndex 递减 i,在同一个循环中。

还是我遗漏了什么?