倒置字符串

倒置字符串



题目

在这里插入图片描述


提交代码

本人错误代码

当时的思路是:用reight来记录结尾字符下标,通过循环来发现“ ”(空格)和结束标志,只要寻找到一个空格就把后面元素遍历到新数组中,最后打印。
但是会有很多坑:

  1. 数组越界访问,有可能数组访问到下标为0之前的元素,导致程序崩溃;
  2. 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;

思路

  1. 逆序字符串;
  2. 逆序每个单词;

如:I like beijing.
      .gnijieb ekil I
      beijing. like I


总结

思路可行,但对于内存操作并不熟练,对于在线oj调试的生疏,总之,熟能生巧吧。在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值