索引在两个嵌套循环中不起作用
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
...
等等:你是边走边换角色吗?当然,您应该寻找行尾,然后开始移动 lastIndex
和 i
彼此越来越近,边走边交换?所以你应该递增 lastIndex
而 递减 i
,在同一个循环中。
还是我遗漏了什么?
我已经使用 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
...
等等:你是边走边换角色吗?当然,您应该寻找行尾,然后开始移动 lastIndex
和 i
彼此越来越近,边走边交换?所以你应该递增 lastIndex
而 递减 i
,在同一个循环中。
还是我遗漏了什么?