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



我使用 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);
  }
}

这是另一种方法:

#include <stdio.h>
#include <string.h>
void reversePrint(const char *str)
{
    if (str)
    {
        reversePrint(strtok (NULL, " tnr"));
        printf("%s ", str);
    }
}
int main(void)
{
    char string[] = "This is a sentence";
    reversePrint(strtok(string, " tnr"));
    return 0;
}

它看起来如此清晰和简单,以至于我怀疑strtok()是否是为这样的要求而生的。

这里只是一些想法...

  1. 我觉得使用 fgets 会为您提供一个不需要的换行标记。因此,您需要在反向打印功能中处理"rn"

  2. 我觉得反向打印在单个函数中更容易执行,尽管我喜欢递归方法,所以我将在这里使用它。

    我应该指出,如果这是一个生产应用程序,我不会使用递归函数,因为我们会无缘无故地浪费资源并使堆栈膨胀。

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

我认为如果您只更改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);
}
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100000
int main()
{
    char str[MAX_LEN], temp[MAX_LEN];
    printf("Enter the Sentence to print reverse : ");
    scanf("%[^n]%*c", &str);
    int i, left, right, length = strlen(str);
    left = 0;
    right = length - 1;
    printf("%d n", length);
    for(i=0;i<length;i++)
    {
        temp[i] = str[right];
        right--;
    }
     printf("%s",temp);
     return 0;
}

相关内容

  • 没有找到相关文章

最新更新