C语言中输入含有空格的字符串一般用 scanf("%[^\n]", &a) (也可以使用gets()或者是fgets()不过会存在一些隐患 可能会存在目标数组缓冲区溢出的问题 且C++11及以后版本的标准,gets函数都不能再用)
可以使用结构体解决 二维数组方法类似 都要记录单词的出现顺序
以下是结构体解决的方案
#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include<bits/stdc++.h>
using namespace std;
struct fan//创建结构体记录每一个单词
{
int xu;
char dan[100];
};
int main()
{
fan arr[10000];
int ji = 0, i = 0, k = 0, ii = 0;
char a[10000];
scanf("%[^\n]", &a);
int len = strlen(a);
for (i = 0;i < len;i++)
{
if (a[i] == ' ')//判断单词的位置
{
arr[ii].xu = ii;
k = 0;//进行归零
ii++;//记录单词的个数
continue;
}
arr[ii].dan[k++] = a[i];
}
for (ii; ii >= 0;ii--)
{
if(ii)
printf("%s ", arr[ii].dan);
else
printf("%s\n", arr[ii].dan);
}
return 0;
}
我们可以将其稍微进行一下优化 也就是二维数组的方法 如下:
#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include<bits/stdc++.h>
using namespace std;
int main()
{
char arr[1000][200];
int i = 0, k = 0, han = 0;
char a[10000];
scanf("%[^\n]", &a);
int len = strlen(a);
for (i = 0;i < len;i++)
{
if (a[i] == ' ')//保证了每行一个单词
{
han++;
k = 0;
continue;
}
arr[han][k++] = a[i];
}
for (han; han >= 0;han--)
{
if(han)
printf("%s ", arr[han]);
else
printf("%s\n", arr[han]);
}
return 0;
}
若是多组输入 则要注意缓冲区的问题 多组输入代码如下:
通过getchar() 去除未被scanf()接收的字符影响下一次循环;
while (scanf("%[^\n]", &arr) != EOF)
{
getchar();//可以拿取缓冲区的\n
}