前言: 更新: 之前的前言是我说我写的第一种解法测试点3过不去,经过若干天后我重新看这个题。仍然觉得没问题 然后把字符数组的大小改为82就过了测试点3。 鬼知道什么情况。应该是输入的测试用例不规范吧
题目:
解法1 char型数组与string数组赋值解法:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char arr[82] = {0};
int i = 0;
while ((arr[i] = getchar()) != '\n')
i++;
// 用来存放每一个单词
string brr[40];
char* p = arr;
int a = 0;
// 调整字符串
for (int j = 0; j < 81; j++)
{
if (arr[j] == ' ' || arr[j] == '\n')
arr[j] = '\0';
}
// 正序存放单词
while (*p != '\0')
{
brr[a] = p;
while (*p != '\0')
p++;
p++;
a++;
}
// 逆序打印单词
for (int i = a - 1; i >= 0; i--)
{
cout << brr[i];
if (i == 0)
break;
cout << " ";
}
}
注:1. 如果把这个代码整体调试一遍 会让你对字符数组,string类型对象,缓冲区等有更深的理解 (对于我来说) 建议调试一遍
2. 如果把一个字符数组里面的内容存放在一个string类型的对象中 空格不会作为终止符 只有'\0'才会终止 如下图 这也是为什么存放单词之前要对字符串调整 让每个单词成功存入string数组中
解法2 :string数组解法(最简单的解法)
#include<iostream>
using namespace std;
#include<cstring>
int main()
{
//string c;
//cin >> c; //输入时 空格 \n都会称为终止输入的标志
//Hello' 'World' 'Here' 'I' 'Come'\n'
string arr[80];
int a = 0;
char c;
while (1)
{
cin >> arr[a];
a++;
c = getchar();
if (c == '\n')
break;
}
for (int i = a - 1; i >= 0; i--)
{
cout << arr[i];
if (i == 0)
break;
cout << " ";
}
return 0;
}
注: 在输入string类型对象时 ' ' 和 ‘\n' 都会作为输入终止的标志 所以在循环输入时 完全可以放心可以把正确的单词输入进string型数组中 最后把'\n'作为循环终止的标志 退出循环即可
解法3 :char型二维数组解法
#include<iostream>
using namespace std;
#include<cstring>
// 1009说反话 解法3:
int main()
{
char arr[81][81];
char c;
int length = 0;
int i = 0;
//Hello ' ' World ' ' Here ' ' I ' ' Come '\n'
while ((c = getchar()) != '\n')
{
if (c != ' ')
{
arr[length][i] = c;
i++;
}
else
{
arr[length][i] = '\0';
length++;
i = 0;
}
}
arr[length][i] = '\0';
for (int i = length; i >= 0; i--)
{
cout << arr[i];
if (i == 0)
break;
cout << " ";
}
return 0;
}
这个解法是 创建char型二维数组 把每个单词放置一行中 由于打印时会因'\0'终止 所以逆序打印出结果即可
总结: 如果可以把三种解法都调试一遍 会对数据的存入与读取有更深的理解;(别忘了解法1的测试点3过不去)