暂时答案:
#include <iostream>
#include <string.h>
using namespace std;
int main(int argc, char *argv[]) {
int num;
cin >> num;
while(num--){
int n;
cin >> n;
cin.sync();
string str[n];
for(int i=0;i<n;i++)
getline(cin,str[i]);
string temp;
int j=0;
for(int k=0;k<n;k++){
for(int i=0;i<=strlen(str[k].c_str());i++) {
if(str[k][i]!=' '&&str[k][i]!='\0'){
temp[j]=str[k][i];
j++;
}
else{
if(str[k][i]==' ') {
for(int i=j-1;i>=0;i--)
cout << temp[i];
j=0;
cout << " ";
}
if(str[k][i]=='\0'){
for(int i=j-1;i>=0;i--)
cout << temp[i];
j=0;
}
}
}
cout << endl;
}
if(num) cout << endl;
}
return 0;
}
分析:
1、 getline(cin,str)在使用时,若前面有过输入,那么最好先cin.sync()一次,因为cin中可能有换行等东西残留,getline第一次会把cin残留读入,导致输入最后一行没有被读入。
2、strlen的返回值不包括’\0‘这一位,要是想算上'\0’给返回值+1就好了。
3、zoj上好多题的输出格式说得很模糊,貌似是约定俗称了,做多了才能知道到底想要怎样的输出格式。比如这教科书一般的格式,题中根本就没说:
while(num--){
...
if(num) cout << endl;
}
4、这道题的输出格式上要注意不要在每行多输出一个“ ”。
附,堆栈+立即输出的写法:
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<stack>
#include<string.h>
using namespace std;
stack<char>z;
int main()
{
int k;
int n;
char a[999];
scanf("%d",&k);
while(k--)
{
scanf("%d",&n);
getchar();
while(n--)
{
gets(a);
int l=strlen(a);
int i=0;
while(1)
{
while(a[i]!=' '&&i<l)
{
z.push(a[i]);
i++;
}
while(!z.empty())
{
printf("%c",z.top());
z.pop();
}
if(i!=l)
{
printf(" ");
i++;
}
else break;
}
printf("\n");
}
if(k)
printf("\n");
}
return 0;
}