首页 > 解决方案 > 反转字符串中单词顺序的程序错误地打印反转的字符串

问题描述

我正在尝试编写一个程序,该程序接受输入的字符串并反转单词的顺序。它还计算语句中有多少单词。因此,如果输入“batman and robin”,它将打印:

robin and batman
words in statement: 3

我的程序大部分工作,但它以一种奇怪的方式打印。这将是我编写的程序中“batman and robin”的输出:

robin

and batman

words in statement: 2

我不知道为什么会有一个额外的换行符将第一个单词与其他单词分开。无论我输入什么,第一个单词总是与其他单词分开,并且计数是一个。我不确定额外的换行符来自哪里。我可以通过在打印之前将计数加一来解决计数问题,但我正在尝试找到更好的解决方案。

我的代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include<string.h>

int main(void) {
char ent[50], rev[50];
int length, i = 0, start, end, j = 0, count = 0, k;

printf("Enter a statement: ");
fgets(ent, 50, stdin);
//printf("%s\n", ent);

length = strlen(ent);
start = length - 1;
end = length - 1;


while (start > 0) {
    if (ent[start] == ' ') {
        i = start + 1;
        count++; 

        while (i <= end) {
            rev[j] = ent[i];
            i++;
            j++;
        }
        rev[j++] = ' ';
        end = start - 1;
    }
    start--;
}

for (i = 0; i <= end; i++) {
    rev[j] = ent[i];
    j++;
}

rev[j] = '\0';
//count = count + 1;

printf("Reversed statement: %s\n", rev);
printf("Words in statement: %d\n", count);

return(0);
}

标签: cstringfor-loopwhile-loop

解决方案


如果函数fgets读取换行符,那么它也会将其写入字符串。

因此,您要写的第一个单词rev不是"robin",而是"robin\n"。这就是导致您发布的不良输出的原因。

您可以处理换行符,也可以在调用fgets. 请参阅此问题,了解删除换行符的最佳方法:

从 fgets() 输入中删除尾随换行符


推荐阅读