题目:
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 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()遇到回车结束输入。