C语言 —— PAT 乙级 【1009. 说反话】

25 篇文章 4 订阅
15 篇文章 2 订阅

题目:

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

输入格式:

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

输出格式:

每个测试用例的输出占一行,输出倒序后的句子。

 

两种做法:

做法一:(使用二维数组存储)

#include <stdio.h>
int main(void)
{
	char s[20][20];
	char ch;
	int row = 0;
	int col = 0;
	while ((ch = getchar()) != '\n')
	{
		if (ch == ' ')
		{
			s[row][col] = '\0';
			row = row + 1;
			col = 0;
		}
		else
		{
			s[row][col] = ch;
			col = col + 1;
		}
	}
	s[row][col] = '\0';

	for (int i = row; i >= 0; i--)
	{
		int j = 0;
		while (s[i][j] != '\0')
		{
			printf("%c", s[i][j]);
			j++;
		}
		if(i!=0)
			printf(" ");
	}
}

做法二:(使用指针数组存储)

#include <stdio.h>
int main(void)
{
	char *s[20];
	char word[20];
	char ch;
	int i = 0;
	int word_count = 0;
	
	while ((ch = getchar()) != '\n')
	{
		if (ch == ' ')
		{
			word[i] = '\0';
			s[word_count] = (char*)malloc(sizeof(char) * (strlen(word) + 1));            //important
			strcpy(s[word_count], word);
			word_count++;
			i = 0;
		}
		else
		{
			word[i] = ch;
			i++;
		}
	}
	word[i] = '\0';
	s[word_count] = (char*)malloc(sizeof(char) * (strlen(word) + 1));            //important
	strcpy(s[word_count], word);
	word_count++;



	for (int i = word_count-1; i >= 0; i--)
	{
		if(i!=0)
			printf("%s ", s[i]);
		else
			printf("%s", s[i]);
		free(s[i]);
	}
}

 

笔记:

两天没熟悉指针数组的用法,就忘记了。。。做法一很快就能想到,做法二中间出现了一些问题。

1. 指针数组定义后要分配内存空间,否则会报错。除了直接赋值字符串常量,采用动态分配最好。使用完这些动态空间时,别忘了要释放。

s[i] = (char*)malloc(sizeof(char) * (strlen(word) + 1));

free(s[i])

2. 存字符进字符串数组时,别忘了最后要存 '\0'

3. 由于输入最后一个字符串后面没有空格,不会将输入的最后一个字符串保存进s中,所以要在while大循环后面再保存一次word。

4. 由于题目要求回车结束输入,所以while不能使用scanf()来获取回车以结束输入。若使用scanf()来获取回车以结束输入,会一直保持等待输入的状态。切记:scanf()遇到空格或者回车结束输入,gets()遇到回车结束输入。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值