从小见大之——字符串反转

时间:2021-06-10 17:02:45

翻转字符串:

如:“I am a student.” 翻转其中所有字符得到“.tneduts a ma I

以下是测试后的代码:

#include<stdio.h>
#include<string.h>
#include<malloc.h>

void swapSentence(char* sen)
{
	int len = strlen(sen);//计算字符串s的长度,遇到'\0'截止(不包括'\0'在内)
	int j=len-1;
	char temp;
	for(int i=0; i<=(len-1)/2; i++)
	{
           temp=sen[j];
	   sen[j]=sen[i];
	   sen[i]=temp;
	   j--;
	}
}

int main()
{
	//char *s=(char *)malloc(sizeof(char)*10);正确
	//char s[]="";错误
	char s[20]="";
//	scanf("%s",s);//scanf遇到空格停止
	gets(s);
	swapSentence(s);
	printf("%s\n",s);
	return 0;
}

在调试过程中,发现以下几点需要注意:

1.字符串初始化

 刚开始写成char s[]=""; 随后程序在执行过程中异常终止,显示暴力访问的异常。原因是初始化时仅为s分配了1个字节的空间,之后却读取了大于1个字节的内容,内容访问越界。需要在初始化时就申请足够的空间。以下两种均可:

char *s=(char *)malloc(sizeof(char)*10);
char s[20]="";

2.读入一行字符

在C中有gets函数,在C++有getline函数。

-----

原型:char*gets(char*buffer);

从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为NULL值,并由此来结束字符串。

gets(s)函数与scanf("%s",s)相似,但不完全相同,使用scanf("%s",s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止

------

cin.getline()   // 接受一个字符串,可以接收空格并输出,需包含<iostream> 

#include <iostream> 
using namespace std; 
main () 

char m[20]; 
cin.getline(m,5); 
cout<<m<<endl; 
}
输入:jkljkljkl 
输出:jklj
接受5个字符到m中,其中最后一个为'\0',所以只看到4个字符输出;
cin.getline()实际上有三个参数,cin.getline(字符指针(char*),字符个数N(int),结束符(char)); 
当第三个参数省略时,系统默认为'\0' 
--------
getline()     // 接受一个字符串,可以接收空格并输出,需包含“#include<string>”
#include<iostream> 
#include<string> 
using namespace std; 
main () 

string str; 
getline(cin,str); 
cout<<str<<endl; 
}
输入:jkljkljkl 
输出:jkljkljkl

3.strlen

4.字符串反转临界条件

 i初始化为0,j初始化为len-1(即'\0'的前一个字符元素),临界值为(len-1)/2。然后从两边开始交换对应位置上的字符。

for(int i=0; i<=(len-1)/2; i++)
	{
           temp=sen[j];
	   sen[j]=sen[i];
	   sen[i]=temp;
	   j--;
	}