你那里有很多问题。首先是getReverse()
当你在main()
. 您应该提供一个原型或只是移动getReverse()
到上面main()
以便main()
了解它。
第二个事实是您在输入每个字符后都试图反转字符串,并且您的输入法不太正确(它c
在获取字符之前检查不确定)。像这样会更好:
count = 0;
c = getchar();
while (c != EOF) {
arr[count++] = c;
c = getchar();
}
arr[count] = '\0';
这将为您提供一个正确的 C 字符串,尽管末尾有一个换行符,甚至可能是一个多行字符串,它与您的规范不匹配(“从标准输入读取一行字符”)。如果您想要换行符或文件结尾来终止输入,您可以使用它来代替:
count = 0;
c = getchar();
while ((c != '\n') && (c != EOF)) {
arr[count++] = c;
c = getchar();
}
arr[count] = '\0';
而且,最重要的是,c
实际上应该是a ,而int
不是 a char
,因为它必须能够存储每个可能的字符和标记EOF
。
您的getReverse()
函数也有问题,主要是因为它没有在数组末尾放置一个结束字符串标记,还因为它使用了错误的大小(sizeof
而不是),并且因为它似乎每次通过循环都strlen
重新初始化j
. 无论如何,它可以大大简化:
void getReverse (char *dest, char *src) {
int i = strlen(src) - 1, j = 0;
while (i >= 0) {
dest[j] = src[i];
j++;
i--;
}
dest[j] = '\0';
}
或者,一旦您是熟练的编码员:
void getReverse (char *dest, char *src) {
int i = strlen(src) - 1, j = 0;
while (i >= 0)
dest[j++] = src[i--];
dest[j] = '\0';
}
如果您需要一个为每一行提供反转字符的主程序,您可以这样做:
int main (void) {
int count;
int MAX_SIZE = 20;
int c;
char arr[MAX_SIZE];
char revArr[MAX_SIZE];
c = getchar();
count = 0;
while(c != EOF) {
if (c != '\n') {
arr[count++] = c;
c = getchar();
continue;
}
arr[count] = '\0';
getReverse(revArr, arr);
printf("'%s' => '%s'\n", arr, revArr);
count = 0;
c = getchar();
}
return 0;
}
在示例运行中,它显示:
pax> ./testprog
hello
'hello' => 'olleh'
goodbye
'goodbye' => 'eybdoog'
a man a plan a canal panama
'a man a plan a canal panama' => 'amanap lanac a nalp a nam a'