C语言风格字符串
字符串的长度:
- C语言风格的字符串末尾有一个‘\0’。
- 比如:
char * = "HelloWorld";
在堆内存中会有一个字符数组,它存储的是“HelloWorld”末尾有一个“\0”
在栈内存中会有一个字符指针,名字为str指向字符数组0号位置的字符‘H’
如下图所示:
- 那么如何求字符串的长度呢?
- 定义一个指针p指向0号位置,然后再定义一个变量初始化为0;把指针p不断往后移动,移动的过程中将那个变量不断加一;最终p所指向的字符是’\0’;这时候停止循环返回定义的变量的值。
求字符串的长度的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int Max=32;
int strLength(char* str){
int count=0;
char* p=str;
while(*p++){
count++;
}
return count;
}
int main(int argc, char **argv) {
char* str=(char*)malloc(sizeof(char)*Max);
scanf("%s",str);
printf("%d %d\n",strLength(str),strlen(str));
return 0;
}
字符串的拷贝:
求字符串的拷贝的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int Max=32;
void strCopy(char* dest,char* src){
char* p=dest;
char* q=src;
while(*p++=*q++){
}
}
int main(int argc, char **argv) {
char* dest=(char*)malloc(Max*sizeof(char));
char* src=(char*)malloc(Max*sizeof(char));
gets(dest);
gets(src);
strCopy(dest,src);
printf("%s\n",dest);
free(dest);
free(src);
dest=(char*)malloc(Max*sizeof(char));
src=(char*)malloc(Max*sizeof(char));
gets(dest);
gets(src);
strcpy(dest,src);
printf("%s\n",dest);
free(dest);
free(src);
return 0;
}
字符串的连接:
- 首先要保证目标串的尾部,有足够的空间容纳源字符串;
- 步骤:
- 1.求目标字符串的长度
- 2.将源字符串复制到目标串的尾部
字符串的连接的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int Max=32;
void strCat(char* dest,char* src){
int len=strlen(dest);
char* p=dest+len;
strcpy(p,src);
}
int main(int argc, char **argv) {
char* dest=(char*)malloc(Max*sizeof(char));
char* src=(char*)malloc(Max*sizeof(char));
gets(dest);
gets(src);
strCat(dest,src);
printf("%s\n",dest);
free(dest);
free(src);
dest=(char*)malloc(Max*sizeof(char));
src=(char*)malloc(Max*sizeof(char));
gets(dest);
gets(src);
strcat(dest,src);
printf("%s\n",dest);
free(dest);
free(src);
return 0;
}
字符串的比较:
- 原则:相等返回0,小于返回-1,大于返回1
- 方法:
- 1.定义两个指针,分别指向两个字符串
- 2.两个指针往后移动,直到指向的连个字符不相等时比较大小
- 3.当都指向了末尾,且之前的都相等,则返回0;
- 4.当长度不相等,且两个指针有一个指向的’\0’,则长度长的大
字符串的比较的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int Max=32;
int strCompare(char* s1,char* s2){
char* p=s1;
char* q=s2;
while(*p==*q&&*p&&*q){
p++;
q++;
}
if(*p-*q==0){
return 0;
}else{
return *p>*q?1:-1;
}
}
int main(int argc, char **argv) {
char* s1=(char*)malloc(Max*sizeof(char));
char* s2=(char*)malloc(Max*sizeof(char));
gets(s1);
gets(s2);
printf("%d\n",strCompare(s1,s2));
free(s1);
free(s2);
s1=(char*)malloc(Max*sizeof(char));
s2=(char*)malloc(Max*sizeof(char));
gets(s1);
gets(s2);
printf("%d\n",strcmp(s1,s2));
free(s1);
free(s2);
return 0;
}
字符串的大小写转换:
- 大写转化为小写:指针指向的字符加上32
- 小写转化为大写:指针指向的字符加减32
字符串的大写转化为小写:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int Max=32;
void strLower(char* s){
char* p=s;
while(*p){
if(*p>='A'&&*p<='Z'){
*p+=32;
}
p++;
}
}
int main(int argc, char **argv) {
char* s=(char*)malloc(Max*sizeof(char));
gets(s);
strLower(s);
printf("%s\n",s);
free(s);
s=(char*)malloc(Max*sizeof(char));
gets(s);
strlwr(s);
printf("%s\n",s);
free(s);
return 0;
}
字符串的小写转化为大写:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int Max=32;
void strUper(char* s){
char* p=s;
while(*p){
if(*p>='a'&&*p<='z'){
*p-=32;
}
p++;
}
}
int main(int argc, char **argv) {
char* s=(char*)malloc(Max*sizeof(char));
gets(s);
strUper(s);
printf("%s\n",s);
free(s);
s=(char*)malloc(Max*sizeof(char));
gets(s);
strupr(s);
printf("%s\n",s);
free(s);
return 0;
}