K&R 1.19 练习 ("reverse" func)
K&R 1.19 exercise ("reverse" func)
这是任务:
Write a function reverse(s) that reverses the character string s . Use it to write a program that reverses its input a line at a time.
好的,现在,我的表演:
#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] = '[=11=]';
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
INPUT: se se OUTPUT: es es'
看到了吗?一些奇怪的“'”出现在输出的末尾,我无法弄清楚为什么这些 "artifacts" 被打印出来的任何模式。它随机发生(对我而言)。能否请您提出任何建议,代码中有什么问题?
你的reverse
函数有问题:
您不应该将换行符存储到 s
数组中,因为您不希望它参与反向操作。
您应该在到达 s
中的字符串结尾时停止后续的 for
循环,而不是 运行 一直到结尾缓冲区.
你应该用 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] = '[=10=]';
for (i = 0; i < len; i++) {
rev[len - i - 1] = s[i];
}
rev[i] = '[=10=]';
printf("%s\n", rev);
return len;
}
更模块化的解决方案。我不太确定 K&R 所说的 "one line at a time" 是什么意思。但这将反转字符串,直到找到换行符。然后等待用户重复。
#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] = '[=10=]';
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] = '[=10=]';
return i;
}
输出:
testing one two
owt eno gnitset
three four
ruof eerht
five six
xis evif
这是任务:
Write a function reverse(s) that reverses the character string s . Use it to write a program that reverses its input a line at a time.
好的,现在,我的表演:
#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] = '[=11=]';
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
INPUT: se se OUTPUT: es es'
看到了吗?一些奇怪的“'”出现在输出的末尾,我无法弄清楚为什么这些 "artifacts" 被打印出来的任何模式。它随机发生(对我而言)。能否请您提出任何建议,代码中有什么问题?
你的reverse
函数有问题:
您不应该将换行符存储到
s
数组中,因为您不希望它参与反向操作。您应该在到达
s
中的字符串结尾时停止后续的for
循环,而不是 运行 一直到结尾缓冲区.你应该用 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] = '[=10=]';
for (i = 0; i < len; i++) {
rev[len - i - 1] = s[i];
}
rev[i] = '[=10=]';
printf("%s\n", rev);
return len;
}
更模块化的解决方案。我不太确定 K&R 所说的 "one line at a time" 是什么意思。但这将反转字符串,直到找到换行符。然后等待用户重复。
#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] = '[=10=]';
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] = '[=10=]';
return i;
}
输出:
testing one two
owt eno gnitset
three four
ruof eerht
five six
xis evif