我创建了一个函数,该函数可以反转句子中的所有单词,这意味着如果输入是“ Hello World”,则输出应该是“ World Hello”。下面的代码是函数。
char* reversesentence(char sent[]) {
int lth = strlen(sent);
int i;
for(i = lth -1; i >= 0; i--) {
if(sent[i] == ' ') {
sent[i] = '\0';
printf("%s ", &(sent[i]) + 1);
}
}
printf("%s", sent);
}
在主体中,我试图向用户询问句子并在主体中调用该函数。
int main(void)
{
char sentence[2000];
printf("Please enter the sentence you want to be reversed.\n");
scanf("%s", sentence);
reversesentence(sentence);
printf("%s", sentence);
}
似乎数组仅存储句子的第一个单词。
输出:
Please enter the sentence you want to be reversed.
hello my name is
hellohello
Process finished with exit code 0`
有人可以帮我解决这个问题吗?在线搜索,没有发现有用的信息。
答案 0 :(得分:2)
scanf
在出现空格,制表符或换行符时停止读取。
匹配一系列非空格字符;下一个指针 必须是足以容纳字符的字符数组的指针 输入序列和终止的空字节('\ 0'),已添加 自动。 输入字符串停在空格或最大值处 字段宽度,以先到者为准。
因此,您输入时不会读取整个字符串。
尝试如下使用fgets
。
fgets(sentence, sizeof(sentence), stdin);
注意
fgets
附加\n
到字符串的末尾。 see how to trim the new line from fgets
答案 1 :(得分:0)
您有两个问题
reversesentence
只是将所有空格替换为空字符,因此即使您读了整行,也会在第一个空格处将其剪切。因此,如果您输入“ hello world”,结果将是“ hello”,而如果输入“ hello world”,结果将是一个空字符串简单的方法是循环使用 scanf 阅读单词,直到返回EOF并记住它们,最后生成返回的单词列表
例如:
#include <stdlib.h>
#include <string.h>
int main()
{
size_t len = 0;
char * result = 0;
char word[256];
while (scanf("%256s", word) != EOF) {
if (result == 0) {
result = strdup(word);
len = strlen(word);
}
else {
size_t l = strlen(word);
char * r = malloc(len + l + 2);
strcpy(r, word);
r[l] = ' ';
strcpy(r + l + 1, result);
free(result);
result = r;
len += l + 1;
}
}
puts(result);
free(result);
return 0;
}
阅读在输入的末尾完成(在Linux shell下为^ d),单词可以在多行中给出。
使用输入
hello world
how
are you
?
可打印
?你是世界如何