首页 > 其他分享 >C语言字符串的使用

C语言字符串的使用

时间:2023-04-08 23:11:07浏览次数:47  
标签:使用 C语言 大小 数组 printf 字符串 sizeof strlen

做题常常遇到和字符串相关的,发现自己对《字符串》和《字符数组》有误会,因为他们的声明太像了,我会搞混。于是我在DevC++上尝试了9种不同的声明方式,想看看什么时候才算是有效的字符串声明,都是我当前水平可能遇到的。

#include <stdio.h>
#include <string.h>
/*	解释: 
	字符串和字符数组的关系不是等价的
	他们的关系可以这样说:“字符串一定是字符数组,字符数组不一定是字符串。” ,要知道C语言没有字符串类型,只有字符类型。
	如果字符数组以\0或0结尾,则他是一个字符串。
	如果字符数组不以 \0或0结尾,则他不是一个字符串,而仅仅是一个字符数组 
*/

// 子函数用来展示字符串与字符数组的区别 
// 不指定数组大小,赋值字符而不是字符串字面量,没有\0结尾 
void test1()
{
	char words1[]={'a','b','c','d','e','0'};
	printf("数组words1[]={'a','b','c''d','e','0'}的sizeof大小是%d\n",sizeof(words1));
	printf("数组words1[]={'a','b','c''d','e','0'}的strlen大小是%d\n",strlen(words1));
	printf("按字符串输出:%s\n",words1);
	printf("数组words1的地址在%x\n",words1) ;
} 
// 不指定数组大小,赋值字符而不是字符串字面量,有\0结尾
void test2()
{
	char words2[]={'a','b','c','d','e','\0'} ;
	// 注意,这里要用转义符,否则printf()中双引号内的,字符串的输出会在\0中断,这就是\0的功能 
	printf("数组words2[]={'a','b','c''d','e','\\0'}的sizeof大小是%d\n",sizeof(words2));
	printf("数组words2[]={'a','b','c''d','e','\\0'}的strlen大小是%d\n",strlen(words2));
	printf("按字符串输出:%s\n",words2);
	printf("数组words2的地址在%x\n",words2) ;
} 
// 不指定数组大小,赋值字符串字面量
void test3()
{
	char words3[]="abcde";
	
	printf("数组words3[]=\"abcde\"的sizeof大小是%d\n",sizeof(words3));
	printf("数组words3[]=\"abcde\"的strlen大小是%d\n",strlen(words3));
	printf("按字符串输出:%s\n",words3);
	printf("数组words3的地址在%x\n",words3) ;
}
// 指定数组大小,赋值等长度的字符串字面量
void test4()
{
	char words4[6]="abcde0";
	 
	printf("数组words4[6]=\"abcde0\"的sizeof大小是%d\n",sizeof(words4));
	printf("数组words4[6]=\"abcde0\"的strlen大小是%d\n",strlen(words4));
	printf("按字符串输出:%s\n",words4);
	printf("数组words4的地址在%x\n",words4) ;
}
// 指定数组大小,赋值-1长度的字符串字面量,并且在右引号前加\0 
void test5()
{
	char words5[6]="abcde\0";
	 
	printf("数组words5[6]=\"abcde\\0\"的sizeof大小是%d\n",sizeof(words5));
	printf("数组words5[6]=\"abcde\\0\"的strlen大小是%d\n",strlen(words5));
	printf("按字符串输出:%s\n",words5);
	printf("数组words5的地址在%x\n",words5) ;
}
// 指定数组大小,赋值小于数组长度至少2的字符串字面量
void test6()
{
	char words6[6]="abcd";
	 
	printf("数组words6[6]=\"abcd\"的sizeof大小是%d\n",sizeof(words6));
	printf("数组words6[6]=\"abcd\"的strlen大小是%d\n",strlen(words6));
	printf("按字符串输出:%s\n",words6);
	printf("数组words6的地址在%x\n",words6) ;
}
// 指定数组大小,赋值小于数组长度至少2的字符变量
void test7()
{
	char words7[6]={'a','b','c','d'};
	 
	printf("数组words7[6]={'a','b','c','d'}的sizeof大小是%d\n",sizeof(words7));
	printf("数组words7[6]={'a','b','c','d'}的strlen大小是%d\n",strlen(words7));
	printf("按字符串输出:%s\n",words7);
	printf("数组words7的地址在%x\n",words7) ;
}
// 指定数组大小,不赋值
void test8()
{
	char words8[6];
	 
	printf("数组words8[6]的sizeof大小是%d\n",sizeof(words8));
	printf("数组words8[6]的strlen大小是%d\n",strlen(words8));
	printf("按字符串输出:%s\n",words8);
	printf("数组words8的地址在%x\n",words8) ;
}
// 指定数组大小,赋值0
void test9()
{
	char words9[6]={0};
	 
	printf("数组words9[6]=0的sizeof大小是%d\n",sizeof(words9));
	printf("数组words9[6]=0的strlen大小是%d\n",strlen(words9));
	printf("按字符串输出:%s\n",words9);
	printf("数组words9的地址在%x\n",words9) ;
}

// 分割线函数 
void fline()
{
	printf("==================================================\n");
}

int main()
{
	char word[]="abcde";
	
	// sizeof()能得到整个字符数组的大小,因此对于字符串,他会把\0计入 
	printf("数组word[]=\"abcde\"的sizeof大小是%d\n",sizeof(word));
	// strlen()得到的是字符串的大小,因此,他不会把字符串结尾\0计入 
	printf("数组word[]=\"abcde\"的strlen大小是%d\n",strlen(word));
	// 输出word的地址
	printf("数组word的地址在%x\n",word) ;
	
	// 分割线 
	fline();
	
	// 不指定数组大小,赋值字符而不是字符串字面量,没有\0结尾 
	// 不是字符串 ,计算strlen()会算错,按字符串输出会乱码 
	test1(); 
	fline();
	// 不指定数组大小,赋值字符而不是字符串字面量,有\0结尾
	// 是字符串 ,可以用 strlen()计算,可以按字符串输出
	test2();
	fline();
	// 不指定数组大小,赋值字字符串字面量
	// 是字符串 ,可以用 strlen()计算,可以按字符串输出
	test3();
	fline();
	// 指定数组大小,赋值等长度的字符串字面量
	// 不是字符串 ,计算strlen()会算错,按字符串输出会乱码  
	test4();
	fline();
	// 指定数组大小,赋值-1长度的字符串字面量,并且在右引号前加\0 
	// 是字符串 ,可以用 strlen()计算,可以按字符串输出
	test5();
	fline();
	// 指定数组大小,赋值小于数组长度至少2的字符串字面量
	// 是字符串 ,可以用 strlen()计算,可以按字符串输出
	test6();
	fline();
	// 指定数组大小,赋值小于数组长度至少2的字符变量
	// 是字符串 ,可以用 strlen()计算,可以按字符串输出
	test7();
	fline();
	// 指定数组大小,不赋值
	// 数组储存的是该地址原有的值,因此不确定,原来如果是字符串,那就是字符串,原来不是,那就不是 
	test8();
	fline();
	// 指定数组大小,赋值0
	// 空字符串,但是也是每个元素都为0的char型数组 
	test9();
	fline();
	
	return 0;
} 

上面是代码部分,以后搞混了不用再去写了,直接来查找就好
下面是终端的显示:

数组word[]="abcde"的sizeof大小是6
数组word[]="abcde"的strlen大小是5
数组word的地址在28feea
==================================================// 第一个子函数从这里开始,可以看输出内容,有序号
数组words1[]={'a','b','c''d','e','0'}的sizeof大小是6
数组words1[]={'a','b','c''d','e','0'}的strlen大小是10
按字符串输出:abcde0諏ev
数组words1的地址在28feba
==================================================
数组words2[]={'a','b','c''d','e','\0'}的sizeof大小是6
数组words2[]={'a','b','c''d','e','\0'}的strlen大小是5
按字符串输出:abcde
数组words2的地址在28feba
==================================================
数组words3[]="abcde"的sizeof大小是6
数组words3[]="abcde"的strlen大小是5
按字符串输出:abcde
数组words3的地址在28feba
==================================================
数组words4[6]="abcde0"的sizeof大小是6
数组words4[6]="abcde0"的strlen大小是10
按字符串输出:abcde0諏ev
数组words4的地址在28feba
==================================================
数组words5[6]="abcde\0"的sizeof大小是6
数组words5[6]="abcde\0"的strlen大小是5
按字符串输出:abcde
数组words5的地址在28feba
==================================================
数组words6[6]="abcd"的sizeof大小是6
数组words6[6]="abcd"的strlen大小是4
按字符串输出:abcd
数组words6的地址在28feba
==================================================
数组words7[6]={'a','b','c','d'}的sizeof大小是6
数组words7[6]={'a','b','c','d'}的strlen大小是4
按字符串输出:abcd
数组words7的地址在28feba
==================================================
数组words8[6]的sizeof大小是6
数组words8[6]的strlen大小是4
按字符串输出:abcd
数组words8的地址在28feba
==================================================
数组words9[6]=0的sizeof大小是6
数组words9[6]=0的strlen大小是0
按字符串输出:
数组words9的地址在28feba
==================================================

--------------------------------
Process exited after 0.4654 seconds with return value 0
请按任意键继续. . .

标签:使用,C语言,大小,数组,printf,字符串,sizeof,strlen
From: https://www.cnblogs.com/Hubugui/p/17299510.html

相关文章

  • 剑指 Offer 20. 表示数值的字符串
    题目链接:剑指Offer20.表示数值的字符串方法:模拟解题思路根据题意模拟,详情见代码注释。代码classSolution{public:boolisDecimal(strings){intfirst_symbol=s.find_first_of('.');//第一个'.'的位置intlast_symbol=s.find_last_of('.'......
  • scrapy爬虫框架(七)Extension的使用
    一、简介  Scrapy提供了一个Extension机制,可以让我们添加和扩展一些自定义的功能。利用Extension我们可以注册一些处理方法并监听Scrapy运行过程中的各个信号,做到发生某个事件时执行我们自定义的方法。  Scrapy已经内置了一些Extension,如LogStats这个Extension用于记录一些......
  • 使用注解开发
    在Spring4之后,要使用注解开发必须保证aop的包导入了使用注解需要导入context约束,增加注解的支持属性注入@ComponentpublicclassUser{//@Value("alice")publicStringname;@Value("alice")publicvoidsetName(Stringname){this.name......
  • 如何在 Mybatis 中优雅地使用枚举
    前言Mybatis遇到字段为枚举时无法解析成我们想要的数据MyBatis 内置枚举转换器org.apache.ibatis.type.EnumTypeHandler 和 org.apache.ibatis.type.EnumOrdinalTypeHandlerEnumTypeHandlerMybatis中默认的枚举转换器,获取枚举中的 name 属性EnumOrdinalTypeHandler......
  • c语言拾遗
    概述gcc-E则经过预编译变成.i文件,还是c代码只是对#中进行字符串的展开和复制-S则经过编译变成.s文件,为汇编代码-c则经过汇编变成.o文件,为二进制文件然后将许多(也许也就几个).o文件链接在一起生成linux中的可执行文件.out直接gcc会将上述整个如果要在编译停下来用......
  • SpringCloud使用Consul作为配置中心
    Consul提供了一个key/value存储,用于存储配置和其他元数据。SpringCloudConsulConfig是ConfigServer和Client的替代方案。在特殊的“bootstrap”阶段,配置被加载到Spring环境中。默认情况下,配置存储在/config文件夹中。根据应用程序的名称和模拟SpringCloud配置顺序解析财产的......
  • 查看 GPU 使用情况命令行代码
    要查看GPU使用情况,您可以根据您的操作系统使用以下命令行代码:对于NVIDIA显卡:使用nvidia-smi命令来查看GPU的使用情况。在命令行中输入以下命令:nvidia-smi这将显示当前NVIDIAGPU的状态,包括温度、功率、显存使用情况以及正在运行的进程等信息。对于Linux系......
  • HJ45_名字的漂亮度_贪心(字符串字符次数排序)_附:字典排序
    思路:每个字母都有一个漂亮度1-26。每个字母漂亮度不相同忽略大小写,字符串漂亮度是字母漂亮度总和。取次数最多的字符漂亮度最大,其他依次次大。 #贪心。先排序从大到小,后计算整体漂亮度。从局部最优到整体最优,为贪心算法。  代码:1fromcollectionsimportCounter2......
  • 1653. 使字符串平衡的最少删除次数
    题目链接:1653.使字符串平衡的最少删除次数方法:动态规划解题思路对于字符串\(s\),设使得字符串\(s[0,i]\)平衡的最小删除次数为\(dp[i]\)。若\(s[0,n-2]\)为平衡字符串,当\(s[n-1]==b\)时,则\(dp[n-1]=dp[n-2]\);当\(s[n-1]==a\)时,则\(dp[n-1]=min(dp[n-2]+1\),\(a\)......
  • 面试题 05.02. 二进制数转字符串
    题目链接:面试题05.02.二进制数转字符串方法:找规律解题思路(1)题目要求:将一个\(0-1\)之间的实数通过二进制进行表示,并通过字符串形式输出。(2)由于二进制的小数只能表示\(\frac{1}{2}\frac{1}{4}\frac{1}{8}...\frac{1}{2^n}\)数之间的和的十进制小数,因此有些十进制小数不能......