C语言字符数组与字符串+十六进制转十进制+字母和汉字的存储差别+bool型变量+反斜杠代码换行

您所在的位置:网站首页 c语言将字符串转换为十六进制 C语言字符数组与字符串+十六进制转十进制+字母和汉字的存储差别+bool型变量+反斜杠代码换行

C语言字符数组与字符串+十六进制转十进制+字母和汉字的存储差别+bool型变量+反斜杠代码换行

2023-08-31 10:11| 来源: 网络整理| 查看: 265

上一篇文章:C语言数组+推箱子小游戏

C语言字符数组与字符串+十六进制转十进制+字母和汉字的存储差别+bool型变量+反斜杠代码换行 字符数组与字符串字符数组的定义与初始化字符串puts与gets函数 更多常用处理字符串的函数汉字与英文字母的储存差别代码案例 A+B plus十六进制转换为十进制*补充bool型变量和abs()绝对值函数*补充反斜杠代码换行下一篇文章

先了解一下字符常量,字符常量很简单,就是用双引号引起来的字符序列,比如“Holle world”。字符串常量“Hello world”代表的是字符串首个字符的内存地址,所以可以用字符串常量直接给字符数组赋值 字符数组与字符串 字符数组的定义与初始化

字符数组和普通的数字数组基本类似。

定义:char 数组名 [数组长度] 例如:char ch[10]; 并给它赋值: ch[0]=‘b’; ch[1]=‘e’; ch[2]=‘i’; ch[3]=‘j’; ch[4]=‘i’; ch[5]=‘n’; ch[6]=‘g’; 如果我只给了部分元素赋值,那么其他元素的值是不确定的。字符数组的初始化: 例如:char[5]={ ‘h’, ‘e’, ‘l’, ‘l’, ‘o’ }; 如果只是赋值一部分元素,那么没赋值的元素就会自动赋值‘\0’,即“空操作”,不可显示,也不起任何控制作用,只起一个标志作用。字符数组也可以定义成字符二维数组,同普通的二维数组一样。二维字符数组多用于多个字符串的处理。可以用字符串初始化二维字符数组。字符数组的引用,同普通的数组一样。 #include int main() { char ch[10]="hello"; for (int i = 0; i if (ch[i] >= 'a' && ch[i] 'H','e','l','l','o','\0'};

“\0”是结束的标志,C语言中,所有对字符串的处理函数,都会忽略“\0”以后的内容。 由于系统在存储字符串常量时,会在串尾自动加上一个结束标志“\0”。 下面看一些细节上的问题:

细节一 #include int main() { char str_1[] = "hello",str_2[5] = "hello"; printf("%d,%d",sizeof(str_1),sizeof(str_2));//求字节长度时使用字符数组的名字,即字符数组的整体引用。 return 0; }

我定义了两个字符数组,str_1和str_2,str_1没有给它数组长度,str_2给了它数组长度,然后用求字节长度关键字“sizeof”来分别求出它俩所占的内存为多少字节。 在这里插入图片描述 结果是第一个字符数组占6个字节,而第二个字符数组占5个字节。 这是因为字符串hello后面还有个\0,\0也占一个字符。而第二个字符数组已经给了数组长度为5,所以最后一个转义字符\0没有空间可存。 sizeof是前面博客中说过的,注意它是一个关键字,而不是函数,它是一个运算符。

动态字符串数组如果不初始化,里面会自动存储一些没有意义的值 在这里插入图片描述给字符串数组中的每一个元素赋值为0 在这里插入图片描述静态数组不初始化会自动赋值为0 在这里插入图片描述转义字符 \0 在ASCII码表里面的十进制值为0 在这里插入图片描述字符数组的整体引用: 先注意一个点:数组名是一个常量,存储的是数组的首地址,所以不能给数组名赋值。

在这里插入图片描述 第一个ch_1正常输出了,因为我给它的存储空间足够大,当我用字符串给他赋值的时候,会把 \0 同时给它,输出的时候系统遇到 \0 后,就停止了;但是ch_2就没有正常输出,因为我给它的存储空间不能存得下hello这个字符串,而它后面的 \0 则不能赋给它,所以输出的时候系统并没有识别到结束标志“\0”,所以系统会在内存中继续访问数组之后的内容,并当作字符输出,直到遇到字符结束标志“\0”或者试图访问没有分配给该程序的内存单元而导致运行出错时为止。

通过scanf()函数输入字符串 char str[20]; scanf("%s",str);//没有&,因为数组本身就代表了数组的首地址,&是地址运算符

注意:在使用scanf()输入字符串的时候,scanf()函数会自动跳过诸如空格、换行符和制表符等类似的前导空白字符,从第一个非空白字符开始,逐个扫描,并把扫描到的字符逐个复制到字符数组的连续存储空间中。当遇到空白字符时停止扫描,并自动在结尾处存入一个“\0”,停止标志符,即空字符NULL。

puts与gets函数

puts函数和gets函数专门的字符串输出和输入函数。也包含在标准输入输出头文件stdio.h中。在这里插入图片描述

puts()函数括号内可以加字符数组的名字,表示输出该数组puts()函数可以输出空格puts()函数中遇到转义字符“\0”时停止输出,即空字符后面的字符不再输出使用puts()函数时,当转义字符 \n 出现在字符中间或结尾时,可以执行换行操作。gets()函数从键盘输入字符串,以回车键作为输入结束的标志,注意最后的回车换行\n不会输入进去。使用gets()函数时,对字符串的长度没有限制,所以需要保证字符数组的长度足够用。gets()函数中允许输入空格。 更多常用处理字符串的函数

C语言提供了很多处理字符串的函数,这些函数均包含在string.h头文件中。使用之前必须先#include

strcpy()函数 调用:strcpy(字符数组名,字符串或字符数组); 在这里插入图片描述 在这里插入图片描述 定义的字符数组长度要尽可能大,至少要比赋给它的字符串的长度大1,这样才能在末尾加上'\0' 如何解决Visual Studio 2019中strcpy()函数报错的问题 在这里插入图片描述 点击Project-------->点击最后一个项目属性 在这里插入图片描述 点击C/C++ 然后点击preprocessor 在CONSOLE;后面加上_CRT_SECURE_NO_WARNINGS;就可以了。 这个是VS中修改后的运行结果: 在这里插入图片描述 (不修改会报错) strncpy()函数 调用strncpy(字符数组名,字符串或字符数组,n); 将第二个字符串或字符数组的前n个字符复制到第一个字符数组中 在这里插入图片描述 在这里插入图片描述strcat()函数 拼接两个字符串或字符数组 在这里插入图片描述 在这里插入图片描述strncat()函数 调用格式:strncat(字符数组名,字符串或字符数组,n); 将第二个字符串或字符数组的前n个字符拼接到前一个字符数组中 在这里插入图片描述 在这里插入图片描述strcmp()函数 调用:strcmp(字符数组或字符串,字符数组或字符串); 作用是比较两个字符串的大小,比较的是从第一个字符开始往后的字符的ASCII码值 如果前面的字符大于后面的字符,则函数返回值为1 如果前面的字符等于后面的字符,则函数返回值为0 如果前面的字符小于后面的字符,则函数返回值为-1 在这里插入图片描述 在这里插入图片描述strlen()求字符串长度函数 调用:strlen(字符串); 求字符串有效长度,即 \0 之前的字符个数 区别sizeof()求字节数单目运算符,求数组在内存中所占的字节数 在这里插入图片描述strlwr()函数 将字符串中的大写字母转换为小写字母 在DevC++编译器中strlwr()和_strlwr()都能正常使用 在VS编译器中只能使用_strlwr() 在这里插入图片描述strupr()函数 将小写字母转换为大写字母函数 在DevC++中_strupr()函数和strupr()函数是一样的,都能用 在VS编译器中只能使用_strupr()函数 在这里插入图片描述 汉字与英文字母的储存差别

在内存中,一个英文字母占一个字节,但是一个汉字占两个字节。 在这里插入图片描述 字节数不够则会出错。 在这里插入图片描述 字节数正好够也会出错,因为没有字符串结束标志 \0 在这里插入图片描述 在最后加上字符串结束标志即可正常输出。(注意字符数组第一个元素的下标是从零开始的)

代码案例 判断字符是否为回文 #include int main() { int i, k; char line[80]; printf("Enter a string:"); k = 0; while ((line[k] = getchar()) != '\n') k++; //统计输入字符的个数 line[k] = '\0'; //字符数组从零开始的,第k个元素中没有字符,给它赋值'\0',作为字符串结束标志 i = 0; k = k - 1; while (i char sno[20];//学号 char syear[5];//入学年份 char sprof[3];//专业编号 char sclass[3];//班级 char snum[3];//班内编号 char str[100] = ""; int i = 0, l, flag = 0; printf("请输入一个学号:"); gets(sno);//或scanf("%s",sno); l = strlen(sno);//求出输入的学号的长度 strncpy(syear,sno,4); syear[4] = '\0'; strcat(str, "该学生 ");//连接字符串 strcat(str,syear);//连接字符串 strcat(str, "年入学的 ");//连接字符串 for (i = 4; i case 1:strcat(str, "计算机专业"); break; case 2:strcat(str, "测控技术专业"); break; case 3:strcat(str, "数学专业"); break; case 4:strcat(str, "英语专业"); break; case 5:strcat(str, "无机非金属专业"); break; case 6:strcat(str, "化工专业"); break; case 7:strcat(str, "高分子专业"); break; case 8:strcat(str, "采矿专业"); break; case 9:strcat(str, "机械专业"); break; case 10:strcat(str, "给排水专业"); break; };//switch后的这个分号可加可不加 strcat(str,sclass); strcat(str,"班学生"); strcat(str,"\n班内编号为:"); strcat(str,snum); puts(str); }

在这里插入图片描述

A+B plus

编写一个程序,输入两个100位的数字,并相加输出。无论是整型还是double型,都无法存储一个100位数的数据,所以可以用字符串来做。

#include int main() { int d=0,e=0,flag=0,h=0,la,lb; static int an[101],bn[101],cn[101]; char a[101],b[101]; while((a[d]=getchar())!='\n') { d++; } la=d; while((b[e]=getchar())!='\n') { e++; } lb=e; for(int i=100;i>0;i--) { an[i]=a[la-1]-'0'; la--; if(la==0) break; } an[0]=0; for(int i=100;i>0;i--) { bn[i]=b[lb-1]-'0'; lb--; if(lb==0) break; } bn[0]=0; for(int i=100;i>=0;i--) { if(flag==0) { if(an[i]+bn[i]>=10) { cn[i]=(an[i]+bn[i])%10; flag=1; } else { cn[i]=an[i]+bn[i]; flag=0; } } else { if(an[i]+bn[i]+1>=10) { cn[i]=(an[i]+bn[i]+1)%10; flag=1; } else { cn[i]=an[i]+bn[i]+1; flag=0; } } } for(int i=0;i int i, flag, j, count; char hexad[80]; long number; printf("Enter a string:");//提示输入字符串 do { flag = count = 0; for (i = 0; (hexad[i] = getchar()) != '\n'; i++) { count++; continue; } hexad[i] = '0';//这个语句是必要的,为了覆盖最后输入的回车字符,因为getchar()输入会把转义的回车字符也输入进去,这样下面判断是否输入了非十六进制字符时会判断错误 for (j = 0; j flag = 1; printf("您输入非十六进制的字符,请重新输入!\n"); break; } } } while (flag != 0); //这个do-while循环的功能是输入一个十六进制数,如果输入了非十六进制的字符,提示重新输入,再输入,直到输入正确为止 hexad[i] = 0;//如果前面输入正确了,再用字符串结束标志0把最后一个字符'0'覆盖掉 //后面的语句是把十六进制数转换为十进制数的语句 number = 0; for (i = 0; hexad[i] != '\0'; i++) { if (hexad[i] >= '0' && hexad[i] = 'A' && hexad[i] = 'a' && hexad[i] 语句; } abs()函数 abs()函数是求绝对值函数,但是只针对整型变量,不需要包含math.h头文件 fabs()函数也是求绝对值函数,既可以针对整型变量,也可以针对浮点型变量,但是必须包含math.h头文件 *补充反斜杠代码换行

在这里插入图片描述 编写一个代码,如果直接换行的话,是会报错的。代码想要换行的话,要加一个反斜杠,如下: 在这里插入图片描述 相当于: 在这里插入图片描述 当一个代码语句非常长的时候,就可以用到反斜杠换行。

下一篇文章

编译预处理知识点梳理:宏定义+文件包含+条件编译



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3