我使用 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()
是否是为这样的要求而生的。
这里只是一些想法...
-
我觉得使用
fgets
会为您提供一个不需要的换行标记。因此,您需要在反向打印功能中处理"rn"
。 -
我觉得反向打印在单个函数中更容易执行,尽管我喜欢递归方法,所以我将在这里使用它。
我应该指出,如果这是一个生产应用程序,我不会使用递归函数,因为我们会无缘无故地浪费资源并使堆栈膨胀。
在非递归方法中,我可能会使用
%.*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;
}