C语言中没有专门的字符串数据类型,是通过字符数组、字符指针两种形式,对字符串进行表示。
一、字符数组
字符数组,即由一个个字符类型的元素构成的数组;与之相似的,可以想象int数组、float数组等。
1. 1 初始化&初始化时赋值
归纳以下4种初始化、及初始化时赋值方法
//方法1 先初始化,再strcpy赋值
char str[10];
memset(str,'\0',sizeof(str)); //赋值前,通常使用memset()清理元素。重要!
strcpy(str,"123");
//方法2 先初始化,再每个元素赋值
char str[10];
str[0]='1';
str[1]='2';
str[2]='3';
str[3]='\0'; //c语音里,‘\0’为字符串结束符
//方法3 字符串直接赋值 (仅限初始化时!!)
char str[10] = "123";
//方法4 字符数组直接赋值 (仅限初始化时!!)
char str[10]={1,2,3};
注意:
上面char str[10],申请了10个元素的字符数组,sizeof(str)的结果为10;但是实际的元素个数为3个(不包括‘\0’),strlen(str)的结果为3。.
1.2 使用字符串
1)读数据
//方法1 直接读数组名
printf("str:%s\n", str);
//方法2 读数组元素
printf("str[0]:%c\n", str[0]);
2)取地址
//方法1 数组名取地址
printf("&str:%d\n", &str);
//方法2 数组第一元素取地址/
printf("&str[0]:%d\n\n", &str[0]);
1.3 修改字符串(重要)
//方法1(推荐) strcpy()赋值
char str2[10] = "ab";
memset(str,'\0',sizeof(str));
strcpy(str, str2);
//方法2 字符数组元素的赋值。
//(注意:对strlen以外、即字符串尾部以后的元素赋值时,需要考虑到尾部的‘\n’;‘\n’时字符串结束)
str[1] = '0';
str[2] = '1';
str[3] = '\0';
注意:
1、strcpy()后,数组的内存大小不变,只是元素的值发生改变。
2、strcpy()要求源变量的内存小于等于目标变量。
1.4 其他
初始化时,[]内不设定字符串长度。
此时根据实际的赋值,数组长度=元素个数+1
char g_strErrorCode[] = "333";
printf("sizeof g_strErrorCode:%d\n", sizeof(g_strErrorCode)); //尺寸大小为4
printf("strlen g_strErrorCode:%d\n\n\n", strlen(g_strErrorCode)); //元素个数为3
二、字符指针
字符指针,即创建指向(一个或多个)字符的指针。
2. 1 初始化&初始化时赋值
//方法1 字符串直接赋值
char*p_str = "123";
//方法2 先初始化,再字符串赋值
char*p_str;
p_str = "123";
2. 2 使用字符串
1)读地址
//方法1 直接读指针名
printf("p_str:%s\n",p_str);
//方法2 逐个读元素
printf("p_str[1]:%c\n\n", p_str[1]);
2.3 修改字符串
//方法1 字符串常量直接赋值
p_str = "2";
//方法2 字符指针变量赋值
char*p_str2 = "33";
p_str = p_str2;
下面为完整的示例demo:
/*
* main.cpp
*
* Created on:
* Author: hisense
*/
#include <iostream>
#include <string.h>
#pragma warning(disable:4996)
#define LENTH 10
int main()
{
//============字符数组=============
if (1)
{
//1)初始化&赋值
char str[10]; //方法1 strcpy赋值(赋值前,先使用memset()清理元素。重要!)
memset(str,'\0',sizeof(str));
strcpy(str,"123");
//str[0]='1'; //方法2 字符数组元素的赋值
//str[1]='2';
//str[2]='3';
//str[3]='\0';
//char str[LENTH] = "123"; //方法3 字符串赋值,仅限初始化时
//char str[10]={1,2,3}; //方法4 字符数组赋值,仅限初始化时
printf("sizeof str:%d\n", sizeof(str));
printf("strlen str:%d\n\n", strlen(str));
//2)读
//读数据
printf("str:%s\n", str); //方法1 直接读数组
printf("str[0]:%c\n", str[0]); //方法2 读数组元素
//读地址
printf("&str:%d\n", &str); //方法1 数组名取地址
printf("&str[0]:%d\n\n", &str[0]); //方法2 数组第一元素取地址/
//3)修改数据 (重要!!!)
char str2[LENTH] = "ab";
memset(str,'\0',sizeof(str));
strcpy(str, str2); //方法1(推荐) strcpy()函数赋值
printf("str:%s\n", str);
printf("sizeof str:%d\n", sizeof(str));
printf("strlen str:%d\n", strlen(str));
str[1] = '0'; //方法2 字符数组元素的赋值。 (注意:对strlen以外、即字符串尾部以后的元素赋值时,需要考虑到尾部的‘\n’;c认为‘\n’时字符串结束)
str[2] = '1';
str[3] = '\0';
printf("str:%s\n", str);
printf("sizeof str:%d\n", sizeof(str));
printf("strlen str:%d\n\n", strlen(str));
//4)其他
//不设定字符串长度
char g_strErrorCode[] = "333";
printf("sizeof g_strErrorCode:%d\n", sizeof(g_strErrorCode)); //尺寸大小为4
printf("strlen g_strErrorCode:%d\n\n\n", strlen(g_strErrorCode)); //元素个数为3
}
//============字符指针=============
if (1)
{
//1)初始化&赋值
//char*p_str = "123"; //方法1 字符串赋值
char*p_str;
p_str = "123"; //方法2 字符串间接赋值
printf("p_str:%s\n",p_str);
printf("sizeof p_str:%d\n",sizeof(p_str));
printf("strlen p_str:%d\n\n",strlen(p_str));
//2)读
//读数据
printf("p_str:%s\n",p_str); //方法1 直接读指针
printf("p_str[1]:%c\n\n", p_str[1]); //方法2 读元素
//3)修改数据
p_str = "2"; //方法1 字符串赋值
printf("p_str:%s\n", p_str);
printf("sizeof p_str:%d\n", sizeof(p_str));
printf("strlen p_str:%d\n", strlen(p_str));
char*p_str2 = "33";
p_str = p_str2; //方法2 字符指针赋值
printf("p_str:%s\n", p_str);
printf("sizeof p_str:%d\n", sizeof(p_str));
printf("strlen p_str:%d\n", strlen(p_str));
}
std::cin.get();
return 0;
}