以相反的顺序打印字符串中的单词C

时间:2016-02-19 04:29:45

标签: c user-input

我使用fgets()获取用户输入并将其存储到临时数组中。然后我将它连接到一个名为userInput的主数组,以便用户可以输入多行。

假设用户输入以下内容:

This is a sentence
This is a new line

我需要它按照输入的顺序打印每一行,但是反转下面的单词顺序:

sentence a is This
line new a is This

我有目前的做法,但我明白了:

line
new a is sentence
This a is This 

下面是我的代码,我用一个字符串来调用reversePrint()来反转:

void printToSpace(const char *str) {
  do {
    putc(*str, stdout);
  } while(*str++ != ' ');
}

void reversePrint(const char *str) {
  const char *p = strchr(str, ' ');
  if (p == NULL) {
    printf("%s", str);
  }
  else {
    reversePrint(p + 1);
    printToSpace(str);
  }
}

2 个答案:

答案 0 :(得分:2)

这是另一种方式:

#include <stdio.h>
#include <string.h>

void reversePrint(const char *str)
{
    if (str)
    {
        reversePrint(strtok (NULL, " \t\n\r"));
        printf("%s ", str);
    }
}

int main(void)
{
    char string[] = "This is a sentence";
    reversePrint(strtok(string, " \t\n\r"));
    return 0;
}

看起来如此清晰和简单,我怀疑strtok()是否符合这样的要求。

答案 1 :(得分:1)

以下只是一些想法......

  1. 我觉得使用fgets会为您提供不受欢迎的换行符。因此,您需要在反向打印功能中处理"\r\n"

  2. 我觉得反向打印在单个功能中更容易执行,虽然我喜欢递归方法,所以我会在这里使用它。

    我应该指出,如果这是一个生产应用程序,我就不会使用递归函数,因为我们会浪费资源并且没有充分理由膨胀堆栈。

    在非递归方法上,我可能会使用%.*s格式,而不是分别打印每个字符。

  3. 我认为如果您只更改了printToSpace以便它管理\n意外事件,那么您的代码就会有效 - 但我觉得重新编写了这个函数。在您的解决方案中尝试这一点:

    void printToSpace(const char *str) {
      do {
        putc(*str, stdout);
      } while(*str && *str != '\n' && *str != '\r' && *str++ != ' ');
    }
    

    这是我的完整代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void print_rev(char* str);
    
    // collects two strings and send them to the `print_rev` function
    int main(int argc, char const* argv[]) {
      char str_array[2][255];
      // Get string 1
      printf("Enter the first string (up to 255 characters):\n");
      fgets(str_array[0], 255, stdin);
      printf("Please enter the second string (up to 255 characters):\n");
      fgets(str_array[1], 255, stdin);
      printf("You entered:\n1. %s2. %s", str_array[0], str_array[1]);
      printf("\nString 1 reversed: ");
      print_rev(str_array[0]);
      printf("\nString 2 reversed: ");
      print_rev(str_array[1]);
      printf("\n");
    }
    
    // prints a string in reverse order.
    void print_rev(char* str) {
      // find the first occurrence of the ` ` (space)
      char* p = strchr(str, ' ');
      // if a space exists...
      if (p) {
        // call `print_rev` for whatever's after the space.
        print_rev(p + 1);
        // print a space
        putc(' ', stdout);
      }
      // print every character until an EOL, space or NULL is encountered
      while (*str && *str != ' ' && *str != '\n' && *str != '\r')
        putc(*(str++), stdout);
    }