C语言学习---(五)

文章详细介绍了C语言中字符串的概念,包括字符串常量、动态存储、输入输出函数如scanf、gets、fgets等的使用,以及字符串处理函数如strlen、strcpy、strcat等。同时,提到了指针在字符串操作中的应用,包括指针数组和指针变量的区别。此外,还讨论了命令行参数和字符串排序的相关知识。
摘要由CSDN通过智能技术生成

字符串:

s%,字符串字面量又称字符串常量(被视为const数据),指用双引号括起来的字符串内容。编译器会自动往末尾加\0字符;

定义字符串时必须让编译器知道需要多少空间,一种方法是用足够空间的数组存储字符串,另一种方法是省略初始化声明中的大小,编译器自动计算;

是以 /0 结尾的 char型 数组 ;用数组表示法/指针表示法创建;

<stdio.h>中的puts()函数仅用于显示字符串,自动在字符串结尾加换行符;

字符串常量属于静态存储类别;

字符串数组表示与指针表示区别:

数组形式字符串最初存储于静态存储区;程序运行才为数组分配内存;接着拷贝静态存储区的字符串至数组;故字符串有两个副本;需要注意,数组中字符串首地址也就是数组名,不能更改,否则会更改数组的存储位置;

指针形式字符串最初存储于静态存储区;程序一旦开始就会为指针变量留出一个存储位置并把字符串地址存储在指针变量中;需要注意,指针变量最初指向字符串首字符,但其可以改变;可以进行递增操作;

初始化数组是那静态存储区的字符串拷贝到数组中,而初始化指针是把字符串的地址拷贝给指针;

如果不修改字符串,就不要用指针表示法(或用const限定符);

如果要用数组表示一系列待显示的字符串,则使用指针数组,效率更高;

字符串读入:分配空间、输入函数;

分配空间3种方法:1初始化指针 使用scanf将信息拷贝至指定地址2声明时指定数组大小3使用C库函数分配内存

字符串输入函数:

读入字符串:scanf() \ gets() \ fgets() \ gets_s()

scanf()读取字符串时故通常读取一个单词;有两种方法确定输入结束,无论哪种方法,输入都得从覅一个非空字符开始,1是以下一个空白字符作为字符串结束2是读取到指定字段宽度(例%10s)读取10个字符/读到第一个空白字符(优先)结束;scanf()函数返回值为项数/EOF(文件结尾)

gets()函数读取整行输入,丢掉换行符存储其他字符,结尾加空字符;gets(数组名)只知道数组开始处若输入字符串过长会造成缓冲区溢出;

puts()函数显示字符串,结尾加换行符

fgets(数组名,字符最大数量,要读人的文件)函数;读入字符最大数量比实际读入字符多1,读到换行符不丢,会存储在字符串中;会保留换行符作为字符串一部分,要编写额外代码将其替换为\0;

fputs(数组名,要写入的文件)函数,结尾不加换行符

两两配套使用;其中gets()与fgets()两个函数都是用于读取整行输入;

注意,,fgets()存储换行符,优点通过检查字符串末尾有无换行符可判断是否读取一行,有些情况处理掉换行符;

gets_s(数组名,字符最大数量)函数,只从标准输入中读取数据;只要输入行未超过最大字符数,等价于gets()函数;

当输入行太长,fgets()最好用;

字符串输出函数:

打印字符串:puts) \ fputs() \ printf()

puts(输出字符串起始地址)函数 在末尾自动加换行符,仅当遇空字符才停止输出;

fputs(输出字符串起始地址,要写入数据的文件)函数 不会在输出末尾加换行符;

printf(输出字符串起始地址\n) 不会在输出末尾加换行符,要用需在参数中指定;打印多个字符串更简单;

可以在getchar()、putchar()的基础上自定义输入输出函数;

字符串常用函数:

在<string.h>、<stdio.h>头文件中;

strlen() 函数用于统计字符串的长度,空字符不计算在内(编译器提供);

strcat() 函数用于拼接字符串,将参数2备份附加在参数1后形成新的参数1;返回第1个参数,即拼接后第1个参数的地址;该函数类型是char *  ;无法检查是否会溢出;

strncat() 函数参数:参数1,参数2,参数1后可添加最大字符数  ;最后总的长度再加一用于存放末尾空字符;

strcmp(“字符串1”,“字符串2”) 函数用于比较两个字符串,按机器排序序列挨个比较所有字符(直到找到不同的为止);字符串参数相同返回0,参数不同返回非0(第一个字符串在第二个之前返回负值,二者相等返回0,第二个在第一个之前返回正值);该函数比较的是字符串不受数组故只会比较第一个空字符之前的;

strncmp(“字符串1”,“字符串2”,限定的字符比较个数)

strcpy(参数1 ,参数2)  拷贝整个字符串,将参数2指向的字符串拷贝到参数1 指向的数组中。用字符串2 覆盖字符串1中字符串2对应的元素位置;相当于字符串赋值运算符;将源字符串拷贝得到目标字符串;要确保目标数组由足够的空间容纳原字符串的副本;函数返回char *类型的地址,该地址不必指向整体第一个字符,而是指向拷贝过来的字符串的第一个字符;空字符也会拷贝;

strncpy(参数1 ,参数2,可拷贝的最大字符数)

sprintf(参数1,...) 函数在<stdio.h>中用于把数据写入字符串,可用于组合多个字符串;第一个参数是目标字符串的地址,其余与printf()用法相同,其实就相当于printf()前面加了一个参数;

<stdlib.h>atoi()函数用于一个字符串作为参数,返回相应整数值;扫描参数 str 字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过  isspace()  函数来检测),遇上数字或正负符号才开始转换,遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。
若参数不包含数字,返回0(未定义);stof() 、 atoi() 、 atol() 、 strtod() 、 strtol() 、 strtoul()  共6个可以将字符串转换为数字的函数,又新增了5个函数,分别是 atoll()、strtof()、strtold()、strtoll()、strtoull()

 字符串排序:

通常排序的是指向字符串的指针,这样还可以保留原有的原始顺序;

命令行参数:

在Linux终端提供类UNIX命令行环境;命令行参数是同一行附加项,C程序可读取并使用这谢谢附加项;

UNIX环境运行fuss程序的命令行:$ fuss

Windows环境运行fuss程序的命令行:C> fuss -r Ginger,后半部分是附加项命令行参数

许多环境(DOS/UNIX)都允许用双引号把多个单词括起来形成一个参数;

!!!main()函数是有三个参数的;main(int argc,char *argv[ ],char *envp[ ]),参数1表示参数计数,其值为命令行单词数量;参数2通常为指向数组的指针argv,数组内含指向char的指针。每个指向char的指针都指向一个命令行参数字符串margv[0]指向命令名称,argv[1]指向第1个命令行参数,以此类推;

现在大多都不用命令行运行程序,而是在IDE集成开发环境(intergrated development environment)中编译程序,再打开MS-DOS窗口在命令行模式中运行程序;

注意:

如果要在字符串内加双引号,格式为 \*  ;

定义字符串数组时若结尾缺失char类型空字符\0,则不受字符串,定义的是字符数组;

字符串数组的性质与前面数组、指针性质一样;

编译器可以把多次使用的相同字面量存储在一处或多处;

单目运算符又称一元运算符;

sizeof()可以以类型、指针、数组和函数等作为参数。返回值类型为unsigned int

p%是把输入解释称指针(地址);

指针的值就是它所存储的地址;

拷贝整个数组,strcpy() strncpy();

s%读取第一个非空白字符开始到下一个空白字符之前;

gets()与puts()联合使用;

空字符\0与空指针NULL:空字符是一个字符,占1字节;空指针是一个地址,通常占4字节;

空指针保证不会指向有效的数据,可通常用来标记某些特殊的情况;在代码中通常用宏NULL代替,有时候也用数字0代替;

用双引号括起来的字符是字符串常量,且被视为该字符串的地址;

#define是用来进行宏定义的,#undef是用来撤销宏定义的;

字符数组可以没有’\0’,但字符串数组必须有’\0’

很多时候,用while()编写测试语句,括号内用于判断真假;

这些输入输出函数返回的都是项数;

当指针指向空字符,其解引用的值为0;

在函数内操作中要改变字符串内容,可不用限定符const;

C语言比较结果只讲0与非0;不讲0和1;

在ASCII中,空字符排第一,大写字符排在小写字符之前;

声明数组将分配存储数据的空间,声明指针将分配一个地址的空间,故一定要对指针进行初始化;

<string.h>针对特定系统定义了size_t,size_t类型是sizeof的返回类型(整数);

char *prt[]的含义是内含指针变量的数组;

C标准库的排序函数qsort()函数,可以对任意类型的数据排序,是以快速排序的思想实现的;

<ctype.h>头文件定义了一批字符分类函数,也可用于处理字符串中的字符;<ctype.h>中的函数通常作为宏来实现;int toupper ( int c );int tolower(int c);将字符c转化为对应大写/小写字符;

char **a与char*a[]等价;

在我们写好一个main函数框架后按F10开始单步调试;

处理字符串时,要用strcmp()函数代替关系运算符,用strcpy与strncpy代替赋值运算符;

字符串处理函数大多在<string.h>;字符处理函数大多在<ctype.h>;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

amyun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值