我已经为字符串反转编写了以下代码:
#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
$
正如您所看到的,一开始就有换行符。为什么会这样,我该如何删除它?
答案 0 :(得分:1)
当您使用fgets
时,string
将包含用户输入的尾随新行。使用此代码:
while(*final)
final++;
final-=1;
您将final
递增到结束字符串的NUL字节,然后将其移回用户输入的换行符。然后你继续在开始和结束时交换字符,向内移动。不幸的是,最后的换行符已经开始交换,可能会导致你提到的“不必要的空白”。
如果它指向换行符,解决方法是再次递减final
:
if(*final == '\n')
final--;
答案 1 :(得分:1)
fgets
函数返回字符串PLUS THE END OF LINE CHARACTER。
当您反转字符串时,此字符将位于您的行的开头。要向自己证明这一点,请查看以下代码:
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--;