繁体   English   中英

字符串的最后一个反转单词正在换行,为什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM