例子:
"I like beijing.",经过处理后变为:"beijing. like I"。
//字符串长度不超过100。(注意不是简单的将字符串全部倒置);
思路方法:
方法:
第一步:先将字符串全部倒置;
第二步:将每个单词进行倒置;
方法2:
也可以先进行单词倒置,在将整个字符串倒置;
图解:
(分板块)代码的实现:
一.字符串的获取(3种简单的方法)
注意:
这里我们不能通过循环用scanf函数来读取;因为scanf()函数遇到空格就停止读取;
例如
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { char arr[100]; int i = 0; while (scanf("%s", &arr) != EOF) { ; } return 0; }
当输入 “ i like beijing." 时,arr的内容为:
解决方法:
1.用gets()函数,即使中间有空格也会读取
#include <stdio.h> int main() { char arr[100]; printf("获取字符\n"); gets(arr); printf("\narr字符串的内容为:%s\n",arr); return 0; }
运行结果:
2.用fgets()函数
gets(arr,100,stdin)
用法:fgets(读取的字符放大位置(如要放入arr里),限制最多读取多少(如限制最多读取100字符,在哪里读取(如从键盘上获取stdin));
stdin——>标准输入—键盘;
注意:fgets会把(\n)回车作为字符获取;如果\n影响代码实现,不想要\n,可以在读取后,计算字符串长度然后将最后一个字符换为\0;
#include <stdio.h> int main() { char arr[100]; printf("获取字符\n"); fgets(arr,100,stdin); printf("\narr字符串的内容为:%s\n", arr); return 0; }
删去\n:
#include <stdio.h> int main() { char arr[100]; printf("获取字符\n"); fgets(arr,100,stdin); //计算字符串长度(不用sizeof的原因在在其他博客作品 //”strlen和sizeof的区别及用法中“有写过) int len = strlen(arr); //将最后一个字符\n用\0取代,从而删去\n arr[len - 1] = '\0'; printf("\narr字符串的内容为:%s\n", arr); return 0; }
效果:
3.用scanf("%[^\n]s")读取也可以达到同样的效果
加了[^\n]——>意思是一直读取,直到遇到 \n (回车),即使中间有空格
#include <stdio.h> int main() { char arr[100]; printf("获取字符\n"); while (scanf("%[^\n]s", &arr) != EOF) { ; } printf("\narr字符串的内容为:%s\n", arr); return 0; }
运行结果:(不会像最前面那样遇到空格就停止读取)
二.字符串倒置代码的实现:
因为后面单词的倒置和字符串的倒置相同,所以这里分装一个函数 ReversrArr( ) 来实现倒置;
这里参数只需将字符串的初末元素地址传入,用指针char* left 和char* right接收
数组名即首元素地址,容易得到;
末元素地址可以用strlen(arr)函数得到长度,再用(arr+长度-1)得到;
字符串倒置的代码实现:
//字符串倒置代码实现 void ReverseArr(char* left, char* right) { while (left < right) { char tmp = *left;//中间变量 *left = *right; *right = tmp; left++; right--; } } #include <stdio.h> #include <string.h> int main() { char arr[100]; printf("获取字符\n"); gets(arr); //计算字符串的长度 int len = strlen(arr); //倒置字符串 ReverseArr(arr,arr+len-1); printf("%s\n",arr); return 0; }
运行结果:
三.每个单词的倒置代码实现:
我们要用前面的 ReverseArr()需要知道每个单词的起始(left)和(right)
由于每个单词用 空格 隔开的,所以我们可以用 空格 来作为遍历条件
代码实现:
//每个单词的倒置 char* start = arr; char* end = arr; while (*end != '\0') { while (*end != ' ' && *end != '\0') { end++; } ReverseArr(start, end-1); start = end + 1; if (*end == ' ') { end++; } }
整个代码的实现:
//字符串倒置代码实现 void ReverseArr(char* left, char* right) { while (left < right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; } } #include <stdio.h> #include <string.h> int main() { char arr[100]; printf("获取字符\n"); gets(arr); /*printf("%s\n",arr);*/ //计算字符串的长度 int len = strlen(arr); ReverseArr(arr,arr+len-1); /*printf("%s\n",arr);*/ //每个单词的倒置 char* start = arr; char* end = arr; while (*end != '\0') { while (*end != ' ' && *end != '\0') { end++; } ReverseArr(start, end-1); start = end + 1; if (*end == ' ') { end++; } } printf("%s\n",arr); return 0; }
运行结果:
知识点总结:
1.该算法思想
2.字符串输入(获取)的3种方法
1. scanf("%[^\n]s",&arr) 注意:scanf("%s",&arr)遇到空格会停止读取
加了[^\n]——>意思是一直读取,直到遇到 \n (回车),即使中间有空格
2.gets(arr) 可以读取空格
3.fgets(arr,100,stdin)
arr --->读取的文本放在哪里(arr)
100--->读取的最大限制
stdin--->标准输入----键盘
注意:fgets会把(\n)回车作为字符获取;如果\n影响代码实现,不想要\n,可以在读取 后,计算字符串长度然后将最后一个字符换为\0;删除方法示例在前面fgets处
3.倒置字符串和单词的方法