[英]Last reversed word of a string is shifting to a newline, why?
我正在尝试逐字反转C中的字符串。到目前为止,我成功地反转了单词,但是有一个换行问题我不明白为什么会发生。 代码如下。
#include <stdio.h>
void reverse_string(char input[], int start, int end)
{
char temp;
while (start < end)
{
temp = input[start];
input[start] = input[end];
input[end] = temp;
start++;
end--;
}
}
int main()
{
char input[100];
printf("Input > ");
fgets(input, 100, stdin);
int start = 0, end = 0;
while (input[end])
{
for (end = start; input[end] && input[end] != ' '; end++);
reverse_string(input, start, end - 1);
start = end + 1;
}
printf("%s", input);
return 0;
}
如果输入是“今天是晴天。”,结果将是
yadoT si a ynnu
.yad
我想要的是
yadoT si a ynnu .yad
我应该如何编辑上面的代码,以便每个颠倒的单词都在同一行上?
如评论中所述,调用fgets
返回的字符串将包含终止换行符。 由于该换行符不是实际的空格字符,因此它被视为最后一个单词的一部分。 要处理此问题,您可以删除该换行符,如链接帖子中所示。
或者(也许更简单),只需将您的input[end] != ' '
测试更改为检查任何空白字符的测试; isspace()
function (在“ctype.h”header 文件中声明)将为您执行此操作。 因此,只需将单行(空) for
循环更改为:
for (end = start; input[end] && !isspace((unsigned char)input[end]); end++) {}
请注意,我已经更改了您的“空语句” ;
循环体到{}
,这让你的代码的任何未来读者更清楚你实际上想要那个空循环体,而不是犯错字式的错误; 它还可以防止某些编译器出现警告。 另外,关于为什么我在isspace
的参数上使用(unsigned char)
强制转换,请参阅: Do I need to cast to unsigned char before calling toupper(), tolower(), et al.?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.