-5

我为字符串反转编写了以下代码:

#include<stdio.h>
#include<stdlib.h>
#define N 80

int main(void)
{
    char string[N];
    printf("enter the string\n");
    fgets(string,N,stdin);
    char *initial=string;
    char *final=string;
    while(*final)
        final++;
    final-=1;
    char temp;
    while(initial<=final)
    {
        temp=*final;
        *final=*initial;
        *initial=temp;
          initial++;
          final--;
    }
    printf("%s\n",string);
    return 0;
}

我像这样运行我的程序:

$ echo hello | ./reverse
enter the string

olleh
$

如您所见,开头有一个换行符。为什么会出现这种情况,我该如何删除它?

4

2 回答 2

1

当您使用fgets时,string将包含用户输入的尾随新行。使用此代码:

while(*final)
    final++;
final-=1;

您将递增final到结束字符串的 NUL 字节,然后将其移回用户输入的换行符。然后你继续在开始和结束时交换字符,向内移动。不幸的是,末尾的换行符已经换到开头,可能导致您提到的“不必要的空白”。

final如果它指向换行符,解决方案将是再次递减:

if(*final == '\n')
    final--;
于 2013-09-22T20:29:31.360 回答
1

fgets函数返回字符串加上行尾字符。

反转字符串时,此字符将位于行首。为了向自己证明这一点,请查看以下代码:

printf("give a word to check:\n");
fgets(buf, 100, stdin);
printf("you entered: %s\n", buf);
printf("In hex, that is ");
for(ii = 0; ii < strlen(buf); ii++) printf("%02X ", buf[ii]);
printf("\n");

在我的机器上,这会导致:

give a word to check:
Hello
you entered: Hello

In hex, that is 48 65 6C 6C 6F 0A

你可以看到0A最后...

现在我不能保证你的机器上会使用什么字符——所以我不能确定你是否需要从最后返回一两个字符。但是您可以使用该功能isspace在反转后测试字符,并摆脱它们。例如:

char *final = string + strlen(string);
while(isblank(*final))
    final--;
于 2013-09-22T20:29:48.267 回答