【发布时间】:2016-11-27 22:08:38
【问题描述】:
这是任务:
编写一个反转字符串 s 的函数 reverse(s) 。用它来编写一个程序,一次将其输入反转一行。
好的,现在,我的表演:
#include <stdio.h>
#define LIM 40
char line[LIM];
int c;
int reverse(char line[], int lim);
int len;
int main(void) {
while ((len = reverse(line, LIM)) > 0) {
;
}
printf("\n END OF THE PROGRAM \n");
return 0;
}
********** THE REVERSE FUNCTION*********
int reverse(char s[], int lim) {
char rev[LIM];
int i;
for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i) {
s[i] = c;
}
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
int r;
for (r = 0; r < lim - 1; ++r) {
rev[r] = s[i];
--i;
}
int x;
for (x = 0; x < lim - 1; ++x) {
putchar(rev[x]);
}
printf("\n");
return r;
}
它似乎工作正常,但有一些与输出相关的错误。 例如:
输入:大家好输出:ydobyreve olleh
输入:abc 输出:cba'
输入:ABC 输出:CBA'
输入:ABC ABC 输出:CBA CBA
输入:se se 输出:es es'
看到了吗?一些奇怪的“'”出现在输出的末尾,我无法弄清楚为什么这些“工件”会被打印出来。它随机发生(对我来说)。您能否提出任何建议,代码有什么问题?
【问题讨论】:
-
抱歉,这太可怕了,而且太复杂了。我什至不知道从哪里开始! main中的空while循环?将全局
line传递给函数reverse但从未在其他任何地方使用它?三重条件如果for? -
@John3136 是的,我的代码还不好,抱歉。好吧,关于'reverse':第一个'for' - 我从输入中得到一条线。第二个'for' - 我声明一个数组并用反向线填充它。第三个'for' - 我打印反转线。
-
为什么不“分而治之”让
reverse只是反转一个字符串:不读取字符串并写入字符串。然后,您可以专注于做一件事,并为其提供一些“预先确定的”输入,直到它工作为止。考虑一下您是只想打印反转的字符串还是将其反转或反转它的副本。 -
第二个和第三个循环的问题是它们一直运行到
lim - 1,也就是全部 40 个字符。它们应该只针对字符串中实际存在的字符数运行。因此,在第二个循环中,您应该循环直到i达到 0,同时在循环内递增r。然后第三个循环可以运行直到x等于r。 -
@user3386109 好的,谢谢你,我试试看。
标签: c arrays string function kernighan-and-ritchie