倒置字符串
题目
提交代码
本人错误代码
当时的思路是:用reight来记录结尾字符下标,通过循环来发现“ ”
(空格)和结束标志,只要寻找到一个空格就把后面元素遍历到新数组中,最后打印。
但是会有很多坑:
- 数组越界访问,有可能数组访问到下标为0之前的元素,导致程序崩溃;
- reight寻找到
空格
后,在下一次循环未- -,导致一直处于空格位,一直停留在原空格位,导致死循环,程序崩溃;
提交结果显示段错误,数组越界访问了;
#include<stdio.h>
#include<string.h>
void reverse_word(char*str,char*str1,int len){
int reight = len-1;
int n = 0;
while(reight>0){
while(str[reight]!=' '&&reight>=0){
reight--; //reight的值未更改
}
for(int i = reight+1;str[i]!=' '&& str[i]!='\0';i++){
str1[n++]= str[i];
}
str1[n]=' ';
}
str1[n]= '\0';
}
int main(){
char str1[101] = {0};
char str[101] = {0};
gets(str);
int len = strlen(str);
reverse_word(str,str1,len);
printf("%s",str1);
return 0;
}
reight的值未更改,每次循环的时候上来都是6,所以停止在空格处的时候要-1
修正代码
#include<stdio.h>
#include<string.h>
void reverse_word(char*str, char*str1, int len){
int reight = len - 1;
int n = 0;
while (reight>=0){
while (str[reight] != ' '&&reight >= 0){
reight--;
}
for (int i = reight + 1; str[i] != ' '&& str[i] != '\0'; i++){
str1[n++] = str[i];
}
reight--;
str1[n++] = ' ';
}
str1[n] = '\0';
}
int main(){
char str1[101] = { 0 };
char str[101] = { 0 };
gets(str);
int len = strlen(str);
reverse_word(str, str1, len);
printf("%s", str1);
return 0;
}
进阶方法
>代码如下:
#include<stdio.h>
#include<string.h>
void reverse(char*left, char*right){
while (left<right){
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main(){
char str[101] = { 0 };
gets(str);
int len = strlen(str);
reverse(str, str + len - 1);
char* start = str;
while (*start){
char* end = start;
while (*end != ' '&&*end != '\0'){
end++;
}
reverse(start, end - 1);
start = end + 1;
}
printf("%s", str);
return 0;
思路
- 逆序字符串;
- 逆序每个单词;
如:I like beijing.
.gnijieb ekil I
beijing. like I
总结
思路可行,但对于内存操作并不熟练,对于在线oj调试的生疏,总之,熟能生巧吧。