对字符串中的所有单词进行倒排。
说明:
1、构成单词的字符只有26个大写或小写英文字母;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;
数据范围:字符串长度满足
对字符串中的所有单词进行倒排。
说明:
1、构成单词的字符只有26个大写或小写英文字母;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
输入一行,表示用来倒排的句子
输出句子的倒排结果
I am a student
student a am I
$bo*y gi!r#l
l r gi y bo
#include <ctype.h> #include <stdio.h> #include <string.h> int main() { char s[10000]; gets(s); int k = strlen(s), kong[10000] = {0}, m = 0; for (int i = 0; i < k; i++) { //剔除杂符号 换为空格 if (isupper(s[i])) continue; else if (islower(s[i])) continue; else s[i] = ' '; } char ns[10000] = {'\0'}; // 剔除多余空格,记录空格的位置 for (int i = 0, j = 0, b = 1; i < k; i++) { if (s[i] != ' ') {ns[j++] = s[i];b = 1;} else { if (b) {kong[m++] = j;ns[j++] = s[i];} b = 0; } } //以上处理ns中有m个空格 存在kong[]中 开始打印 if (m == 0)puts(ns); else { for (int i = strlen(ns)-1, j = m-1; j >= 0; j--) { for (k = kong[j]+1 ; k <=i ; k++) putchar(ns[k]); putchar(' '); i = kong[j]-1 ; } } for (k = 0; k < kong[0]; k++)putchar(ns[k]); return 0; }
#include <stdio.h> #include <string.h> int main() { char str[10001]={0}; int len,chr_count; char *ptmp; gets(str); chr_count = len = strlen(str); //去除特殊字符 while(len--) { if((str[len] < 'A' || str[len] > 'Z') && (str[len] < 'a' || str[len] > 'z')) { str[len] = '\0'; } } ptmp = str; while(chr_count--) { if((ptmp[chr_count] == '\0') && (ptmp[chr_count+1] != '\0')) { printf("%s ", &ptmp[chr_count+1]); } } printf("%s\n",str); return 0; }
#include <stdio.h> //扫描字符串。如果是英文,则将其写入二维数组当中, 遇到非英文,写入截止符号\0。倒序输出二维数组,中间穿插空格即可。 //flag == 0即为写入英文状态, 1即为当前是间隔符。 int main() { char c, str[100][21]; int i = 0, j = 0, flag = 0; /*扫描字符串*/ while(scanf("%c", &c) != EOF){ /*大写*/ if(c >= 'A' && c <= 'Z'){ str[i][j++] = c; flag = 0; } /*小写*/ else if(c >= 'a' && c <= 'z'){ str[i][j++] = c; flag = 0; } /*第1个非英文*/ else if(flag == 0){ str[i++][j] = '\0'; //换行 j = 0; //列号归零 flag = 1; } } /*输出*/ for(i=i-1; i>=0; i--) //while循环结束后i==行数 printf("%s ", str[i]); return 0; }
#include <stdio.h> #include <string.h> int main() { char str[10001] = {}; gets(str); int len = strlen(str); int word_len = 0; int flag = 0; //多个间隔符时,倒排转换后只允许出现一个空格间隔符 //从后往前遍历,遇到字母计算单词长度,遇到其他字符就打印 for (int i = len - 1; i >= 0; i--) { if (isalpha(str[i])) { word_len++; flag = 1; continue; } else { if (flag == 1) { for (int j = i + 1; j < i + 1 + word_len; j++) { printf("%c", str[j]); } printf(" "); flag = 0; word_len = 0; } } } //打印最后一个单词 if (isalpha(str[0])) { for (int i = 0; i < word_len; i++) printf("%c", str[i]); } return 0; }
#include <stdio.h> #include <stdlib.h> #include <string.h> void reverse(char* start, char* end){ //用于反转整个字符串 char tmp; while(start < end){ tmp = *start; *start = *end; *end = tmp; start++, end--; } } //用于将end-start的字符,逐个赋值给dst,并更新dstLen void copyReverseToDst(char* start, char* end, char* dst, int* dstlen){ while(end >= start){ *dst++ = *end--; (*dstlen)++; } } int main() { char input[10001]; char* ret = (char*)malloc(sizeof(char)*10001); //为返回值申请空间 int retLen = 0; int len, start, end; gets(input); len = strlen(input); reverse(&input[0], &input[len-1]); //翻转整个字符串 start = end = 0; while(1){ while((input[end]>='a'&&input[end]<='z') || (input[end]>='A'&&input[end]<='Z'))end++; //找到完整单词的下一位 copyReverseToDst(&input[start], &input[end-1], &ret[retLen], &retLen); //将该单词反转赋值到dst,注意end-1,因此此时end指向的是单词的下一位,即结束符 ret[retLen++] = ' '; //间隔 while(end < len && !((input[end]>='a'&&input[end]<='z') || (input[end]>='A'&&input[end]<='Z')))end++; //找到下一个单词的起始,虽然这里用end来移动,但是end会赋值给start if(end >= len)break; //如果end超过最大输入长度,则表示倒排结束 start = end; } ret[retLen] = '\0'; //结束符 printf("%s", ret); free(ret); return 0; }
#include <stdio.h> int my_strlen(char* s) { int i = 0; while (*s != 0) { i++; s++; } return i; } void voit(char* s) { while (*s != 0) { if ((*s >= 'A' && *s <= 'Z') || (*s >= 'a' && *s <= 'z')){} else { *s = ' '; } *s++; } } void down(char* s, int n, int m) { while (n < m) { char i = s[n]; s[n] = s[m]; s[m] = i; n++; m--; } } void rever(char* s, int n) { int m = 0; char* a = s; for (int i = 0; i <= n; i++, a++) { if (*a == ' ' || *a == 0) { down(s, m, i - 1); m = i + 1; } } } int main() { char s[10000]; scanf("%[^\n]", s); int n = my_strlen(s); //转换间隔符 voit(s); //倒排单词 rever(s, n); //倒排句子 down(s, 0, n - 1); printf("%s", s); return 0; }
#include <stdio.h> int main() { char sentence[1100] = {0}; char *p = sentence + 1; while(scanf("%s", p) != EOF) p += strlen(p) + 1; while(p-- > sentence) { if((*p >= 'A' && *p <= 'Z') || (*p >= 'a' && *p <= 'z')) { p[1] = 0; while(p--) if(((*p >= 'A' && *p <= 'Z') || (*p >= 'a' && *p <= 'z')) == 0) break; printf("%s ", p + 1); } } }