代码不允许我输入并立即结束

时间:2019-01-07 09:23:19

标签: c arrays string clion sentence

我创建了一个函数,该函数可以反转句子中的所有单词,这意味着如果输入是“ 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`

有人可以帮我解决这个问题吗?在线搜索,没有发现有用的信息。

2 个答案:

答案 0 :(得分:2)

scanf在出现空格,制表符或换行符时停止读取。

  

匹配一系列非空格字符;下一个指针   必须是足以容纳字符的字符数组的指针   输入序列和终止的空字节('\ 0'),已添加   自动。 输入字符串停在空格或最大值处   字段宽度,以先到者为准。

因此,您输入时不会读取整个字符串。

尝试如下使用fgets

fgets(sentence, sizeof(sentence), stdin); 

  

注意fgets附加\n到字符串的末尾。 see how to trim the new line from fgets

答案 1 :(得分:0)

您有两个问题

  • 因为已经说过,您只能使用 scanf
  • 读一个单词
  • 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
?

可打印

  

?你是世界如何