这是任务:
编写一个将字符串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
输入:本身输出:es es'
看到?输出末尾会出现一些奇怪的“”,我无法弄清楚为什么这些“工件”会被打印出来。它对我来说是随机发生的。您能否提出任何建议,代码有什么问题?
最佳答案
您的reverse
函数有问题:
您不应该将换行符存储在s
数组中,因为您不希望它参与反向操作。
当您到达for
中的字符串末尾时,应该停止随后的s
循环,而不是一直运行到缓冲区末尾。
您应该将null终止rev
数组。
您不必一次输出一个字符的rev
数组,可以将它用作字符串。
这是一个经过纠正和简化的版本:
#include <stdio.h>
#define LIM 40
int reverse(char line[], int size);
int main(void) {
char line[LIM];
int len;
while (reverse(line, LIM) > 0) {
continue;
}
printf("\n END OF THE PROGRAM \n");
return 0;
}
/* THE REVERSE FUNCTION */
int reverse(char s[], int size) {
char rev[size];
int i, r, c, len;
for (i = 0; i < size - 1 && (c = getchar()) != EOF && c != '\n'; i++) {
s[i] = c;
}
len = i;
s[i] = '\0';
for (i = 0; i < len; i++) {
rev[len - i - 1] = s[i];
}
rev[i] = '\0';
printf("%s\n", rev);
return len;
}