奇妙的字符串

本文深入探讨C语言中字符串的各种初始化方式及其对strlen()与sizeof()的影响。通过具体实例讲解不同字符串初始化方法的区别,并分析每种情况下字符串长度及占用字节数的具体计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  面对字符串是我们最关系的就是字符串的长度(用strlen())与它所占的字节数(用sizeof())也就是大小,下来我们就讨论一下 


/* 一般我们初始化字符串的几种方式
char a1[]="1234";
char *a2="1234";
char a3[10]="1234";
char a4[]={'1','2','3','4'};
char a5[]={'1','2','3','4','\0'};
char a6[10]={'1','2','3','4'};
char a7[10]={'1','2','3','4','\0'};

char *a6={'1'};//错误  可能有的编译器.c可以通过
char *a5={'1','2'};//必须给指针一个字符串首地址这个没有给
char *a7={'1','\0'};//错误

char A[2]="1234";//当然它是错的  不是因为名字是大写奥(哈哈)
char A[1]='1';//当然它也是错的
char *A='1';//当然它也是错的   
char A[10]="'1','2'";//当然它也是错的
char A[]='1','2'";//当然它也是错的
char *A="'1','2'";//当然它也是错的
char A[10]={"1","2"};//当然它也是错的  " "之间是字符串 ' '之间是字符
char *A={1,2,3,4};//当然它也是错的

*/

是不是感觉这莫简单的东西如果细分还有这莫多东西呢,下来我就浅谈一下我的理解


//情况一:
#include<stdio.h>
 
int main()
{
	char a1[]="1234";	
  printf("%d\n",a1[0]);
  printf("%d\n",strlen(a1));
  printf("%d\n",sizeof(a1));

  return 0;

}
//对于上边的代码输出结果是什么
// 答案是:49 4 5   
// 49 是因为这里是字符1    
//4 是因为strlen()函数在计算长度时找'\0',对于这种字符串会末尾默认有'\0',当strlen()遇到'\0'就会停止计算,所以个数不包括'\0'
//5 是因为sizeof()这个运算符(这里也提一句sizeof 是运算符不是函数而且是一个关键字)会计算字节数这里都是字符类型所以只占5个字节(也包括后边的'\0')
//情况二:
#include<stdio.h>
 
int main()
{
	char a1[]="\1\2\3\4";
	//char a1[]="\1234";答案是:83 (转义字符会转义后边三个字符把他们当作8进制也就是83的8进制是123即'\123'=83) 	
                       //        2  '\123'  和 '4'两个字符
	                  //         3   包含'\0'三个字符型 占3字节
	printf("%d\n",a1[0]);
  printf("%d\n",strlen(a1));
  printf("%d\n",sizeof(a1));
  
  return 0;

}
//对于上边的代码输出结果是什么
// 答案是:1 4 5   
// 1 是因为这里是转义字符为数字1    
//4 是因为strlen()函数在计算长度时找'\0',对于这种字符串会末尾默认有'\0',当strlen()遇到'\0'就会停止计算,所以个数不包括'\0'
//5 是因为sizeof()这个运算符(这里也提一句sizeof 是运算符不是函数而且是一个关键字)会计算字节数这里都是字符类型所以只占5个字节(也包括后边的'\0')

//情况三:
#include<stdio.h>
 
int main()
{
	char *a2="1234";
	printf("%d\n",a2[0]);
  printf("%d\n",strlen(a2));
  printf("%d\n",sizeof(a2));
  
  return 0;

}
//对于上边的代码输出结果是什么
// 答案是:49 4 4   
// 49 是因为这里是字符1    
//4 是因为strlen()函数在计算长度时找'\0',对于这种字符串会末尾默认有'\0',当strlen()遇到'\0'就会停止计算,所以个数不包括'\0'
//4 是因为这里的a2 是一个指针 指针就是四个字节 无论什么数据类型指针在32位系统下都是4个字节,有人会说那上一种情况中数组名也是指针,我想说的是数组名代表的是那片空间的地址数组名本身就是地址,所以sizeof()可以顺着这个地址计算这个空间占得字节数,而这里的指针本身占有四个字节只是它的里边存着那个字符串空间的首地址,指针自身也是个变量也有自己的地址(可以用二级指针存储),它自己本身不是地址

//情况四:
#include<stdio.h>
#include<string.h>
 
int main()
{
	char a3[10]="1234";	
  printf("%d\n",a3[0]);
  printf("%d\n",strlen(a3));
  printf("%d\n",sizeof(a3));
  
  return 0;

}
//答案是:49  4 10
// 我只解释一下 10  因为数组是一片的连续空间在定义数组是就为它开辟了10个字符型空间  

//情况五
#include<stdio.h>
#include<string.h>
 
int main()
{
	char a4[]={1,2,3,4};//char a[]={1111,2,3,4}	//整型1111 存入char型会发生低位截断  后边的长度与大小与本例相同
  printf("%d\n",a4[0]);
  printf("%d\n",strlen(a4));
  printf("%d\n",sizeof(a4));
  
  return 0;

}
//答案是:1,随机,4
// 1 是因为int 数据1 可以存入char
//strlen()因为没有找到'\0'或数字0 所以继续找直至找到 所以是一个随机值,但是会大于等于4,因为这里边有四个元素呀

//情况六:
#include<stdio.h>
#include<string.h>
 
int main()
{
  char a4[]={'1','2','3','4'};
  printf("%d\n",a4[0]);
  printf("%d\n",strlen(a4));
  printf("%d\n",sizeof(a4));
  
  return 0;

}
//答案是:49,随机,4
//我只解释 strlen()因为用户在定义时没有初始化'\0'或数字0 所以会继续向后边的空间之中找'\0'或数字0,直至找到为止,但是大于等于4

/情况七:
#include<stdio.h>
#include<string.h>
 
int main()
{
  char a5[]={'1','2','3','4','\0'};//  char a5[]={'1','2','3','4',0}
  printf("%d\n",a5[0]);
  printf("%d\n",strlen(a5));
  printf("%d\n",sizeof(a5));
  
  return 0;

}
//答案是:49,4,5
//我只想说 '\0'与数字0等价在strlen()计算长度时

//情况八:
#include<stdio.h>
#include<string.h>
 
int main()
{
  char a6[10]={'1','2','3','4'};
  printf("%d\n",a6[0]);
  printf("%d\n",strlen(a6));
  printf("%d\n",sizeof(a6));
  
  return 0;

}
//答案是:49,4,10
//我只想说 a6[10]在初始化的时候前四个用字符初始化后边六个用数字0默认初始化所以strlen()找到第一个0就停了

//情况八:
#include<stdio.h>
#include<string.h>
 
int main()
{
  char a6[10]={'1','2','3','4','\0'};
  printf("%d\n",a6[0]);
  printf("%d\n",strlen(a6));
  printf("%d\n",sizeof(a6));
  
  return 0;

}
//答案是:49,4,10  读者应该十分清楚





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值