HDU1062(Text Reverse)
一、首先是自己的做法
1.想法很傻瓜。就是先输入字符串,然后直接在原有的数组中进行处理,找到字符串中各个单词。通过设置flag标志,该元素为空格时flag=0,为字符且不为’\0’时flag=1。设置start与finish表示单词在数组中的起始与终止位置。从而length=finish-start+1。找到该单词位置时即可将该单词利用for循环原地翻转。通过
if ((a[k] != ' ') && (flag == 0))
判断是否是单词的初始位置。然后利用一个for循环寻找单词的结尾位置。此处需要注意字符串的结尾为’\0’,所以用如下两行代码:
if (a[z] != ' '&&a[z]!='\0') //最终在添加&&a[z]!='\0'条件后调试成功
if (a[z] ==' '||a[z]=='\0')
2.一些注意事项:
(1)scanf()函数使用后,因为有个’\n’残留在缓冲区内,所以先用getchar()把’\n’吞掉。
(2)scanf()函数输入字符串遇到空格会结束。所以此处选择使用gets()函数与puts()函数简化输入输出过程。
(3)使用 gets() 时,系统会将最后“敲”的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留换行符。
(4)puts(s)的作用与语句printf("%s”,s)的作用基本相同,puts()函数只能输出字符串,不能输出数值或进行格式变换。puts()函数在输出字符串后会自动输出一个回车符。
(5)strlen所作的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0’)。
代码如下:
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
char a[1000];
int n, i;
int m;
char * rever(char *,int);
while (scanf("%d", &n) != EOF)
{
getchar();
for (i = 0; i < n; i++)
{
gets(a); //输入该行的所有字符,gets不会受到空格影响。
m = strlen(a);
rever(a,m);
puts(a);
}
}
return 0;
}
char * rever(char * a,int n)
{
int j, k, z;
int flag,len;
int temp;
int start, finish;
flag = 0;
start = finish = 0;
for (k = 0; k < n; k++)
{
if ((a[k] != ' ') && (flag == 0)) //是否是单词的起始位置
{
start = k; //start的初始位置
finish = k;
flag = 1;
for (z = k + 1;; z++) //计算finish的位置
{
if (a[z] != ' '&&a[z]!='\0') //最终在添加&&a[z]!='\0'条件后调试成功
{
finish++;
}
if(a[z]==' '||a[z]=='\0')
{
flag = 0; //为空格或'\0'则寻找结尾结束
k = z; //k该位置继续开始寻找单词
break;
}
}
len = finish - start + 1;
for (j = 0; j < (len / 2); j++) //单词原位置倒序
{
temp = a[start + len - j - 1];
a[start + len - j - 1] = a[start + j];
a[start + j] = temp;
}
}
}
return a;
}
二、网上的第一种基本做法
1.该做法中运用变量t来控制输出格式可以借鉴学习。预设t=0。然后用if(t>0) printf(" ");就无法输出第一个空格。
2.运用两个数组,将原数组单词存入另一个数组然后翻转输出。
3.同时依旧需要注意字符串结尾是’\0’,所以有了最后一个if
if(i==len-1)
代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
int i,n,len,j,k,t;
char s1[1005],s2[100];
scanf("%d",&n);
getchar();
while(n--)
{
gets(s1);
len=strlen(s1);
for(i=0,j=0,t=0;i<len;i++)
{
if(s1[i]!=' ')
s2[j++]=s1[i]; /*保存单词*/
else
{
if(t>0) printf(" "); /*控制格式*/
for(k=j-1;k>=0;k--)
printf("%c",s2[k]); /*反转输出*/
j=0;
t++;
}
if(i==len-1) /*反转最后一个单词,这里要特别注意*/
{
printf(" ");
for(k=j-1;k>=0;k--)
printf("%c",s2[k]);
}
}
printf("\n");
}
return 0;
}
三、其他方法
https://www.cnblogs.com/Strugglinggirl/p/5986581.html
四、经典方法:堆栈!
将一个数组或者字符串倒置的方法,会想到运用堆栈这种数据结构!
利用堆栈后进先出的原理,逆序处理可以使用堆栈来实现。每一个单词是用空格或行结束符隔开的。每行的处理到换行符为止。
#include <stdio.h>
#define MAXSTACK 1024
char stack[MAXSTACK];
int pstack;
void push(char c)
{
stack[pstack++] = c;
}
char pop()
{
return stack[--pstack];
}
int main(void)
{
int t;
char c;
scanf("%d", &t);
getchar();
while(t--)
{
pstack = 0; //初始栈顶指向位置
for(;;)
{
c = getchar(); //利用getchar读取数据
if(c == ' ' || c == '\n')
{
while(pstack) //遇见空格或换行就全部出栈
putchar(pop());
putchar(c);
}
else
push(c); //是字符就压栈
if(c == '\n')
break;
}
}
return 0;
}