这是任务:
写一个反转字符串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;
}
它似乎工作正常,但有一些与输出相关的错误。 例如:
INPUT:大家好输出: ydobyreve olleh
INPUT :abc 输出:cba'
INPUT :ABC 输出:CBA'
INPUT :ABC ABC 输出:CBA CBA
INPUT :选择输出:es es'
请参阅?一些奇怪的“'”出现在输出的末尾,我无法弄清楚为什么这些“工件”被打印出来的任何模式。它随机发生(对我来说)。你能否提出一些建议,代码中有什么问题?
答案 0 :(得分:1)
您的reverse
功能有问题:
您不应将换行符存储到s
数组中,因为您不希望它参与相反的操作。
当你到达for
中字符串的末尾时,你应该停止后续的s
循环,而不是一直运行到缓冲区的末尾。
您应该终止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;
}
答案 1 :(得分:0)
更多模块化的解决方案。我不确定K&R“一次一行”是什么意思。但这将反转字符串,直到找到换行符为止。然后等待用户重复。
#include <stdio.h>
#define MAXLINE 1000
int get_line(char s[], int limit);
int reverse(char to[], char from[], int l);
int main() {
int size;
char line[MAXLINE];
while ((size = get_line(line, MAXLINE)) > 0) {
char revline[size];
int len = reverse(revline, line, size);
printf("%s\n", revline);
}
return 0;
}
int reverse(char to[], char from[], int l) {
int i;
int j = l - 2;
for (i = 0; i < l; i++, j--) {
to[i] = from[j];
}
to[i] = '\0';
return i;
}
// read a line into s until limit
// return length of line
int get_line(char s[], int limit) {
int c = 0;
int i = 0;
for (i = 0; i < limit-1 && (c = getchar()) != '\n'; ++i) {
s[i] = c;
}
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
输出:
testing one two
owt eno gnitset
three four
ruof eerht
five six
xis evif