我使用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);
}
}
答案 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)
以下只是一些想法......
我觉得使用fgets
会为您提供不受欢迎的换行符。因此,您需要在反向打印功能中处理"\r\n"
。
我觉得反向打印在单个功能中更容易执行,虽然我喜欢递归方法,所以我会在这里使用它。
我应该指出,如果这是一个生产应用程序,我就不会使用递归函数,因为我们会浪费资源并且没有充分理由膨胀堆栈。
在非递归方法上,我可能会使用%.*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);
}