将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符
数据范围:输入的字符串长度满足
注意本题有多组输入
将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
输入一个英文语句,每个单词用空格隔开。保证输入只包含空格和字母。
得到逆序的句子
I am a boy
boy a am I
nowcoder
nowcoder
#include <ctype.h> #include <stdio.h> #include <string.h> /* * ch[]:要被逆序的数组,start:逆序操作的起始位置,end:逆序操作的结束位置。 */ int proc(char ch[], int start, int end) { // 检查输入参数 if (ch == NULL || start >= end) { return -1; // 输入参数错误 } // 逆序操作 for (int i = start, j = end; i < j; i++, j--) { char temp = ch[i]; ch[i] = ch[j]; ch[j] = temp; } return 1; // 成功执行逆序 } void print(char a[]) { int len = strlen(a); for (int i = 0; i < len; i++) { printf("%c", a[i]); } printf("\n"); } int main() { char arr[1002] = "\0"; int slow = 0, fast = 0; //快慢Flag,辅助标记用 fgets(arr, sizeof(arr), stdin); arr[strcspn(arr, "\n")] = '\0'; int len = strlen(arr); int i = 0; //确保每一个数组元素是字符或空格 for (i = 0; i < len; i++) { if ( !(isalpha(arr[i]) || isblank(arr[i])) ) { return -1; } } //第一次处理,先反转全部字符串 proc(arr, 0, len - 1); //第二次处理,反转每个单词。初始slow和fast都是零。 for (i = 0; i < len; i++) { if (arr[i] == ' ') { fast = i - 1; //快游标拿到一个单词的末尾游标值 proc(arr, slow, fast); slow = i + 1; } } //这一步是反转最后一个单词,此时特殊在 slow < len-1 ,且因为上一步的for循环循环到最后时, //最后一个元素不是空格而是\n了,所以此时直接反转从 slow 到 len-1 的元素即可。 if(slow < len - 1) { proc(arr, slow, len - 1); } print(arr); return 0; }
#include <stdio.h> int main() { int len; char str[1001] ={0}; gets(str); len = strlen(str); while(len--) { if(str[len] == ' ') { printf("%s ", &str[len + 1]); str[len] = '\0'; } } printf("%s", str); return 0; }
#include <stdio.h> /*思路:把单词依次存入字符串数组,然后逆序输出字符串*/ int main() { char word[1000][1000]={0}; int n = 0; while (scanf("%s", word[n++]) != EOF){} for (int i = n - 2; i >= 0; i--) { // n-2是因为最后输入'\n'时n也会+1 printf("%s ", word[i]); } return 0; }
#include <stdio.h> #include <string.h> int main() { char str[1000]; gets(str); for(int i=strlen(str)-1; i>0; i--){ if(str[i] == ' ') { str[i] = '\0'; printf("%s ", &str[i+1]); } } printf("%s ", str); return 0; }
获取字符串从后往前遍历到第2个字符,遇到空格将其替换为结束符'\0',然后将后面字符串打印出来,最后将剩下的最后一个字符串打印出来
#include <stdio.h> #include <string.h> int main() { char str[1000] = {0}; gets(str); int len = strlen(str); int len2 = 0; //记录一个的单词长度 for (int i = len - 1; i >= 0; i--) {//从后往前扫描字符 if (str[i] !=' ') { len2++; } else { for (int j = 0; j < len2; j++) printf("%c", str[i + 1 + j]); printf(" "); len2 = 0; } } if (len2 != 0) {//打印最后一个单词 for (int k = 0; k < len2; k++) printf("%c", str[k]); } return 0; }
我的思路是先获取空格位置,然后先输出最后一个单词,中间用空格为标志逆序输出单词,最后输出第一个单词,但是为什么在线自测不通过啊,我在本地编译器随便试了好多个都能正常输出啊,哪位牛友指点一下吗? #include <stdio.h> int main() { int i, j = 0, len, s[100]; char str[1000]; gets(str); //scanf("%s", str); len = strlen(str); for (i = 1; i <= len; i++) if (str[i] == ' ') { s[j] = i; j++; } j = j - 1; //输出最后一个单词 for (i = s[j]; i < len; i++) printf("%c", str[i + 1]); //逆序输出中间部分单词 for (j; j > 0; j--) { for (i = s[j - 1]; i < s[j]; i++) printf("%c", str[i + 1]); } //输出第一个单词 for (i = 0; i < s[0]; i++) printf("%c", str[i]); printf("\n"); return 0; }
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char arr[1001]={}; gets(arr); int len=strlen(arr); int count=0; for(int i=len-1;i>=0;i--){ if(arr[i]==' '){ if(count==0){ printf("%s",&arr[i+1]); arr[i]='\0'; count=1; } else{ printf(" %s",&arr[i+1]); arr[i]='\0'; } } } if(count==0) printf("%s\n",&arr[0]); else printf(" %s\n",&arr[0]); return 0; }重点在于处理好scanf("%s")和printf("%s")之间的关系,前者读到空格会直接结束,后者读到'\0'才结束,也是说,需要在读到空格输出的时候将对应的空格转换成‘\0’。
#include <stdio.h> int main() { char buf[1000] = {0}; int i; gets(buf); for(i = strlen(buf) - 1; i; i--) { if(buf[i] == ' ') { printf("%s ",&buf[i + 1]); buf[i] = 0; } } printf("%s",&buf[0]); }