反转字符串中单词顺序的程序错误地打印反转的字符串
Posted
技术标签:
【中文标题】反转字符串中单词顺序的程序错误地打印反转的字符串【英文标题】:Program to reverse order of words in a string printing reversed string incorrectly 【发布时间】:2021-12-09 23:54:22 【问题描述】:我正在尝试编写一个程序,该程序接受输入的字符串并反转单词的顺序。它还计算语句中有多少单词。所以如果输入“蝙蝠侠与知更鸟”,它会打印:
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);
【问题讨论】:
旁注:不要写fgets(ent, 50, stdin);
,你可以写fgets(ent, sizeof ent, stdin);
。这样做的好处是,如果您更改了ent
的大小,那么您只需更改一个数字,而不是两个。如果您不这样做,那么如果您在一个地方更改数字,但在另一个地方也忘记更改它,那么您就有可能出现错误。
【参考方案1】:
如果函数fgets
读取换行符,那么它也会将其写入字符串。
因此,您将写给rev
的第一个单词不是"robin"
,而是"robin\n"
。这就是导致您发布的不良输出的原因。
您可以处理换行符,也可以在调用fgets
后立即删除它。有关删除换行符的最佳方法,请参阅此问题:
Removing trailing newline character from fgets() input
【讨论】:
以上是关于反转字符串中单词顺序的程序错误地打印反转的字符串的主要内容,如果未能解决你的问题,请参考以下文章