翻转字符串:
如:“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--; }