PAT乙级——1009 说反话(多种方法字符串逆序)

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello


思路一:
1、字符串从后往前遍历,遇到空格,输出空格后面的字符串
2、输出后,将空格替换成\0,这是字符串终止的标志
3、然后再向前遍历,遇到空格继续输出空格后面的内容,由于后面的空格以及替换成\0,那么第二次遇到空格只会输出空格后面的一个单词
PAT乙级——1009 说反话(多种方法字符串逆序)_第1张图片
如上图示,从后往前遍历,当遇到第一个空格时,输出空格后面的单词Come,然后将第一个空格替换成 ‘\0’(字符串终止标志),这是因为当遍历到第二个空格时,输出的第二个空格后面的单词I而不是I Come(如果不把空格替换成’\0’,那么当遍历到第二个空格会输出I Come),这里要注意的是第一个空格前面的单词,要单独输出。

#include
#include
#define MAX 90
int main(void) {
	char c[MAX];
	int i, k = 0;
//	gets(c);    
	fgets(c, MAX, stdin);  //为什么用fgets而不是用gets以及使用fgets的注意事项(见下面注意)
	/*将换行符替换为'\0'*/
	while(c[k] != '\n')
		k++;
	c[k] = '\0';
	
	for (i = strlen(c) - 1; c[i] != '\0'; i--) {
		if (c[i] == ' ') {
			printf("%s ", c + i + 1);
			c[i] = '\0';
		}
		if (i == 0) {
			printf("%s", c);
		}
	}
	return 0;
}

注意:
gets函数由于并不检查输入字符的个数,容易超出数组边界,在一些oj中不建议使用
fget函数可以检查字符个数,并且会存储换行符以及在末尾添加’\0’,前提是输入的字符数量小于允许的数量
比如fget(c, 4, stdin),允许输入的字符数量是3(4 - 1);
若输入的字符串是ho(两个字符),由于fgets函数会保留换行符,所以相当于输出ho\n\0
若输入字符串是hol,此时并不保留换行符号,相当于输出hol\0
在本题中,由于字符输入量小于允许输入的字符数量,换行符会保留在字符串中,因此在输出末尾的单词时,会带有换行符,导致输出格式不对,因此需要处理换行符,最好的办法是将换行符替换成’\0’。


思路二 2.1:
1、将输入的字符串保存到二维字符数组中,然后倒序输出
2、本方法采用while(scanf(“%s”, c[i]) != EOF) i++; 边输入,边将单词存储到数组中
3、需要注意的是在VS2017中,EOF退出的条件是:
Ctrl + z enter
Ctrl + z enter
Ctrl + z enter

#include
#include
#define MAX 90
int main(void) {
	char c[MAX][MAX];
	int i = 0, j;
	while (scanf("%s", c[i]) != EOF) {
		i++;
	}
	for (j = i - 1; j >= 0; j--) {
		printf("%s", c[j]);
        if (j != 0)		//末尾无空格
			printf(" ");
	}
	return 0;
}

思路二 2.2:
同思路2.1一样,也是将输入的字符串保存到二维字符数组中,然后倒序输出,但是存入二维数组的方法截然不同,从前往后遍历,在没遇到空格前,每个字符存入数组中。

int main(void) {
	char str[MAX];
	gets(str);  //hello world jhk
	int len = strlen(str);
	int r = 0, h = 0, i;
	char ans[MAX][MAX];  
	/*核心*/
	for (i = 0; i < len; i++) {
		if (str[i] != ' ') {
			ans[r][h++] = str[i];
		}
		else {
			ans[r][h] = '\0';
			r++;
			h = 0;
		}
	}
	
	for (i = r; i >= 0; i--) {
		printf("%s", ans[i]);
		if (i > 0) 
			printf(" ");
	}
	return 0;
}

你可能感兴趣的:(PAT—乙级)