C语言字符串知识点

1.字符串的存储

C语言没有提供字符串数据类型,因此字符串的存储要用字符型数组进行存储

注意:字符型数组大小会在实际的字符个数的基础上加1,一定要注意数据的溢出问题

    //字符串的储存
	char str[] = "helloworld";//此时字符型数组的大小为11
	for(int i=0;i<=10;i++)
	printf("%c", str[i]);
	//方法2
	char str1[] = { 'a','b','c','\0' };
	//注意:用此种方法进行初始化的时候一定要在末尾写'\0'
	//否则系统无法将其当做 字符串处理
    printf("%s", str1);

提示:两种输出字符串的方式

1.使用%s进行字符串的输出

2.使用for循环加%c(单个字符)进行输出

通常一个字符串放在一维数组中,两个以上字符串放在二维数组中

多个字符串初始化方法:数组名[字符串个数][字符串长度max]

char str[5][9] = { "We","have","recently","new","feature" };

字符串的访问和输入输出

1.字符串的访问与其他类型的数组类似可以通过下标来访问

2.使用puts(字符数组名)进行输出,使用puts函数进行输出时可以实现自动换行

    //单个字符的访问与打印
    char str[10] = "hello";
    printf("%c", str[1]);
    //用字符指针进行访问和打印
    char* p = str;
    printf("%c", *p);//字符数组首字符的输出
    printf("%c", *(p+1));//字符数组向后偏移一个字符的输出
    printf("%s",p)//整个字符串的输出
    puts(str);

字符串的输入

1.使用scanf函数进行输入,VS019编译器系统需要加一个sizeof(数组名)来告诉编译器字符数组大小来保证稳定性

注意:不用写&取地址符直接写数组名

2.使用fgets函数进行输入(我用的是vs编译器,其他的编译器应该是直接用gets就行)

但gets()函数不能限制字符串的长度容易造成数据溢出

    char str[128]; 
    printf("请输入字符串:");
    scanf_s("%s", str,sizeof(str));
    printf("%s", str);
    fgets(str, sizeof(str), stdin);
    printf("%s",str);

提示:如果想输出引号可以用\"来输出

  
    char str[128] = "\"hello\"";
    puts(str);

注意:1.在使用scanf函数进行输入时在遇到空格,回车,制表符等空白字符,系统在读到这些数据时会默认数据读入结束在输出时不再输出空白字符后面的字符串

           2.使用gets函数进行输出时可以输入带有空格的字符串,以回车作为字符串的终止符,同时回车不计入字符串的一部分,而scanf函数不会读走回车符

2.字符串处理函数(对应头文件#include<string.h>)

1.比字符串大小的函数----strcmp;

strcmp(字符串1,字符串2);

如果返回值是0则两者大小相同,>0则前者大于后者,<0则后者大于前者

字符串比较大小时实际上是根据两字符串对比时第一个不对称字符的ASCII值得大小来比较两字符串大小的

    char str[128] = "aaaa";
    char str1[128] = "abbb";
    printf("%d",strcmp(str, str1));//比较大小函数
    printf("%d",strlen(str));//求字符数组的有效长度
    strcat_s(str, str1);//字符串的拼接函数
    strcpy_s(str, str1);//将后一个字符串拷贝到前一个字符串上
    

2.求字符数组有效长度的函数---strlen;

sizeof是求类型大小的函数,而strlen是求字符数组有效长度的函数

3.字符串的拼接函数---strcat;

将两个字符串进行拼接,将后一个字符串拼接到前一个字符串的后面

注意:要留出足够的位置用于字符串的拼接;

4.限定个数的拼接字符串函数---strncat;

    char str[128] = "aaaa";
    char str1[128] = "abbb";
    strncat_s(str, str1,2);
    printf("%s",str);

将str中不多于2的字符拼接到前一个字符串中

注意要留出足够的大小防止数据溢出

5.限定个数的比较字符串大小函数---strncmp;

    char str[128] = "aaaa";
    char str1[128] = "abbb";
    unsigned int count = 2;
    printf("%d", strncmp(str, str1, count));

定义了一个整型变量count用于比较不多于count个字符的大小,结果与strcmp的相同

或者直接用数字代替count也行,这里是为了显示那里填什么。

6.字符串的拷贝---strcpy;

strcpy(字符数组1,字符数组2)

作用是将字符数组2中存放的字符串拷贝到字符数组1中,覆盖字符数组1中的数据

提示:对单个字符进行赋值操作可以使用赋值运算符,但赋值运算符不能用于字符串的赋值操作,只能利用strcpy进行字符数组的赋值;

    char str[128] = "aaaa";
    strcpy_s(str, "aaaaa");

7.限定字符的拷贝字符串函数---strncpy;

    char str[128] = "aaaa";
    char str1[128] = "help";
    strncpy_s(str, str1, 2);
    printf("%s",str);

3.向函数传递字符串

向函数传递字符串时既可以使用字符数组作为函数参数也可以使用字符指针做函数参数

举一个复制字符串的例子来解释

# include <stdio.h>
#include<string.h>
//函数作用:将后一个字符串拷贝到前一个字符数组
void copy(char* str2, char* str3)
{
    int i = 0;
    while (*str2 != '\0')
    {
        *str2 = *str3;
        str3++;
        str2++; 
    }
    *str2 = '\0';//在str2结尾加上'\0'字符串结束标志
}
int main(void)
{
    char str_[10]="bbbb", arr[128]="aaaa";
    char* str1 = str_;
    char* arr1 = arr;
    copy(str1, arr1);
    printf("%s\n%s",str_,arr);
    return 0;
}

输出结果是aaaa

                  aaaa

注意:与其他类型的数组不同的是字符型数组的循环计数条件不是长度,而是利用字符串结束标志‘\0’作为循环计数条件

指针变量++表示向右偏转几个储存单元

4.从函数返回字符串指针

# include <stdio.h>
#include<string.h>
char *copy(char* str2, char* str3)
{
    char* astr2 = str2;//保存字符串str2的首地址
   while(*str3!='\0')
    {
        *str2 = *str3;
        str2++;
        str3++;
    }
   *str2 = '\0';
    return astr2;//返回字符串str2的首地址
}
int main(void)
{
    char str_[5]="bbbb", arr[5]="aaaa";
    char* str1 = str_;
    char* arr1 = arr;
    printf("%s",copy(str1, arr1));
    return 0;
}

注意:返回的是字符串的首地址,一定要先保存字符串的首地址进行返回

           或者定义一个计数的整型变量return astr2-n;

5.字符处理函数

C语言字符处理函数库中包含了用于对字符数据进行测试和操作的标准库函数,使用这些函数时必须使用头文件<ctype.h>

看完不要忘记关注点赞呦

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

茁@

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

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

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

打赏作者

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

抵扣说明:

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

余额充值