http://acm.tju.edu.cn/toj/showp1153.html
这道题之前做过,但是当时直接看的网上代码,自己没有过多思考。这次重新拿出来做一下。
第一个难关就是C语言中空格字符的读入和计入长度。由于第一个输入的是样例数目,因此在读入字符串的时候会读入第一个数的回车\n,所以我用getchar()来吃掉回车。
在网上查到,用gets(str)函数可以读入空格,用strlen(str)函数可以将空格计入字符串长度。
至此,第一个问题解决。
其次,就是要实现对每个单词的逆序排列了。在这里,我用一个新的字符串word来存储每个原来的单词,每次读到一个空格' '就存储一次,紧接着将句子中的单词替换成逆序,再继续下一个单词,这样一直到最后一个字母,所有单词都是逆序的了。直接输出即可。
在这个问题里,我调了一上午的代码,总是有许多错误,有的是因为粗心,有的是因为对字符串掌握不足。前前后后也使用了许多个printf语句查看程序运行过程中的参数变化,也算是掌握了调bug的一种小方法吧…吃饭去了。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
int N;
scanf("%d", &N);
getchar();
while(N--){
char sen[100];
gets(sen);
//printf("%s\n", sen);
int len = strlen(sen);
//printf("%d \n", len);
for(int i = 0; i < strlen(sen); i++){
int j = 0;
char word[100];
memset(word, 0, sizeof(word));
//printf("first %d %d\n", i ,j);//cout << i << " " << j << endl;
//cout << word << endl;
while(sen[i] != ' ' && i <strlen(sen)){
word[j] = sen[i];
j++;
i++;
}
//printf("second %d %d\n", i ,j);//cout << i << " " << j << endl;
//printf("%d\n", strlen(word));//cout << word.length() << endl;
//printf("%s\n", word);
int p = strlen(word)-1;
for(int k = i-strlen(word); k < i; k++){
sen[k] = word[p];
p--;
}
}
printf("%s\n", sen);
}
return 0;
}