【发布时间】:2020-09-02 18:51:09
【问题描述】:
我正在尝试解决 K&R C 第二版中的练习 1-19。 “编写一个函数 reverse 来反转字符串 s。用它来编写一次将其输入反转一行的程序。”
我的解决方案采用两个输入字符串 s 和 t。 s 是源,t 是目标。并将源s 中的数据复制到t。我能够解决这个问题,但我很难理解为什么要修改源字符串s,即使它不在等号运算符的左侧。
#include <stdio.h>
/* Solution to Exercise 1-19. Chapter 1 */
#define MAXLENGTH 10
int getln(char s[], int lim);
void reverse(char s[], char t[]);
int main()
{
int i, len;
char s[MAXLENGTH]; /* original string */
char t[MAXLENGTH]; /* reversed string */
while ((len = getln(s, MAXLENGTH)) > 0) {
printf("before reverse: %s", s);
reverse(s,t);
printf("reversed string: %s\n", t);
printf("after reverse: %s", s);
}
return 0;
}
/* getln: read a line into s, return length */
int getln(char s[], int lim)
{
int c, i, l;
l = 0;
for (i = 0; ((c = getchar()) != EOF) && (c != '\n'); ++i) {
if (i < (lim - 1)) {
s[l] = c;
++l;
}
}
if (c == '\n') {
s[l] = c;
++l;
}
s[l] = '\0';
return l;
}
/* reverse: reverses s to target t */
void reverse(char s[], char t[])
{
int i, j;
for (i = 0; s[i] != '\0'; ++i)
;
--i;
if (s[i] == '\n') {
--i;
}
for (j = 0; i >= 0; ++j) {
t[j] = s[i];
--i;
}
t[j] = '\0';
}
测试用例:
$ ./a.out < testdata
before reverse: abcdefghi
reversed string: ihgfedcba
after reverse: abcdefghi
ihgfedcba$
文件testdata的内容:
$ cat testdata
abcdefghijklmnopqrstuvwxyz
$
【问题讨论】:
标签: c reverse c-strings kernighan-and-ritchie function-definition