/*
============================================================================
Name : TestString.c
Author : lf
Version :
Copyright : Your copyright notice
Description : C语言字符串相关操作以及内存函数
1 在Java中有String数据类型,但是在C语言中没有
2 在C语言中一般用字符数组来表示字符串,因为在C中没有String这个数据类型
表示字符串的两种方式:
第一种:
char c0[]="hello";
第二种:
char c00[]={'h','e','l','l','o'};
注意的问题:
1 在第一种方式中系统会自动在其末尾添加'\0'即变成了"hello\0"
所以sizeof(&c0)大小为6.但是strlen(&c0)=5而不是6.
这是因为strlen()只获取'\0'之前的长度.
2 字符常量不可以写.
char *c="hello";
*c='A';//报错:Segmentation fault
因为"hello"是字符串常量存储在文字常量区;若去修改一个常量的值当然是不行的
============================================================================
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
void test0();
void test1();
void test3();
void test4();
void test5();
void myStrrev(char *p);
void myStrupr(char *p);
void myStrlwr(char *p);
char charArray1[20]="hello hello";
char charArray2[20]="world world";
int main(void) {
test0();
test1();
test2();
test3();
test4();
test5();
return EXIT_SUCCESS;
}
/**
* 字符数组的初始化
*/
void test0(){
char c[5]={'h','e','l','l','o','\0'};
printf("c=%x\n",c);
printf("c=%s\n",c);
char d[10]="hello";
printf("d=%s\n",d);
printf("==========\n");
}
/**
* 字符串常量不可以修改
* Segmentation fault
*/
void test1(){
char *c="hello";
printf("c=%s\n",c);
printf("==========\n");
//报错 Segmentation fault
//*c='A';
//错误的做法.数组越界
//a[10]="hello";代表的是从数组下标为10的位置开始存储
char a[10];
a[10]="hello";
}
/**
* 利用字符串初始化字符数组
*/
void test2(){
//char c[15]={"morning"};
//一般简写为:
char c[15]="morning";
printf("c=%s\n",c);
printf("==========\n");
}
/**
* 字符串的遍历
* putchar()输出一个字符
*/
void test3(){
int len=0;
char *str="hello world";
printf("size of hello world=%d\n",sizeof("hello world"));
//存储字符串首地址
char *p=str;
//*str的内容不为0(即最后的终止符)时输出字符
while(*str){
putchar(*str);
str++;
len++;
}
printf("\n");
printf("str=%s,len=%d\n",p,len);
printf("==========\n");
}
/**
* 字符串常用操作
* 0 strlen()求字符串长度
* 1 strstr()查找字符串
* 2 strcmp()按照ASCII对比字符串的大小(文件夹按照字母排序的大小一样)
* 3 strcha()查找字符在字符串中首次出现的位置
* 4 strcat()连接字符串
* 5 atoi()字符串转整数
* 6 myStrrev()字符串逆转
* 7 myStrupr()字符串转大写
* 8 myStrlwr()字符串转小写
*/
void test4(){
//strlen()求字符串长度
char c0[]="hello";
char c00[]={'h','e','l','l','o'};
printf("c0 strlen =%d\n",strlen(&c0));//5
printf("c00 strlen =%d\n",strlen(&c00));//5
printf("sizeof(*&c0) =%d\n",sizeof(*&c0));//6
printf("sizeof(*&c00) =%d\n",sizeof(*&c00));//5
printf("==========\n");
//strstr()查找字符串
char c1[20]="hello world";
char c2[5]="or";
char *p=strstr(c1,c2);
if (p==NULL) {
printf("NULL\n");
} else {
printf("p=%x,*p=%c\n",p,*p);
}
//strcmp()对比字符串的大小
char c3[6]="hello";
char c4[6]="hello";
int result=strcmp(c3,c4);
if (result==0) {
printf("char c3 = char c4 \n");
} else if(result<0){
printf("char c3 < char c4 \n");
}else{
printf("char c3 > char c4 \n");
}
//strchr查找字符在字符串中首次出现的位置
char c5[6]="hello";
char c='e';
char *f=strchr(c5,c);
if(f==NULL){
printf("not found\n");
}else{
printf("found ! location=%x\n",f);
}
//strcat()连接字符串
char c6[6]="hello";
char c7[6]="hello";
char *n=strcat(c6,c7);
printf("strcat result=%s\n",n);
//atoi()字符串转整数
char c8[6]="123456";
int i=atoi(c8);
printf("i=%d\n",i);
//myStrrev()字符串逆转
char str[30]="123456789";
//myStrrev(str);
//myStrrev(&str);
//char *pointer=&str;
//myStrrev(pointer);
printf("str=%s\n",str);
char charString[30]="abcd";
myStrupr(&charString);
printf("charString=%s\n",charString);
myStrlwr(&charString);
printf("charString=%s\n",charString);
printf("==========\n");
}
/**
* 实现字符串的逆转
*/
void myStrrev(char *p){
//获取字符串长度
int len=strlen(p);
int i;
for(i=0;i<len/2;i++){
char c=p[i];
p[i]=p[len-1-i];
p[len-1-i]=c;
}
}
/**
* 实现字符串小写转大写
*/
void myStrupr(char *p) {
while (*p != '\0') {
if (*p >= 'a' && *p <= 'z') {
*p = *p - 32;
}
p++;
}
}
/**
* 实现字符串大写转小写
*/
void myStrlwr(char *p) {
while (*p != '\0') {
if (*p >= 'A' && *p <= 'Z') {
*p = *p + 32;
}
p++;
}
}
/**
* 常用内存函数
* 1 memset()更改字符中的字符
* 2 memcpy()从源字符串中拷贝n个字节到目标字符串中
* 还有一个memccpy()与此类似但更灵活和强大
* 3 memchr()在字符串的前n个字节中搜索字符
* 4 memicmp()比较两个字符串前n个字节,且忽略大小写
* (非标准C函数,在此未实现)
*
*/
void test5(){
//memset()
char c0[10]="hello";
memset(c0,'A',3);
printf("c0=%s\n",c0);
//memcpy()
char c1[10]="123456";
memcpy(c1,c0,3);
printf("c1=%s\n",c1);
//memchr()
char c3[10]="hellohi";
char *p=memchr(c3,'e',10);
if (p==NULL) {
printf("NOT FOUND\n");
} else {
printf("result=%c\n",*p);
}
printf("==========\n");
}
字符串基本操作以及内存函数
最新推荐文章于 2024-09-18 21:46:14 发布