c语言字符串处理函数

  • scanf
    输入以空格为分界符:
  1 #include <stdio.h>
  2 
  3 int main(void)
  4 {
  5     char buf[100] = {0};
  6     printf("please input string:");
  7     scanf("%s",buf);
  8     printf("%s\n",buf);
  9     return 0;
 10 }

假如输入hello world,输出:

[root@ligen 5]# ./a.out 
please input string:hello world
hello  #只输出了hello

中间有一空格,后面的world并没有消失,而是依然在缓冲区里面,下面的例子可以说明:

 1 #include <stdio.h>
  2 
  3 int main(void)
  4 {
  5     char buf[100] = {0};
  6     char tmp[20] = {0};
  7     printf("please input string:");
  8     scanf("%s",buf);
  9     printf("%s\n",buf);
 10     printf("please input tmp\n");
 11     scanf("%s",tmp);
 12     printf("%s\n",tmp);
 13     return 0;

依然输入hello world,来看输出:

[root@ligen 5]# ./a.out 
please input string:hello world
hello
please input tmp  
world #这里我并没有输入world,自己自动输出world。因为上次的world还在缓冲区里面,scanf直接读取了world。

scanf的缺点:不做越界检查

1 #include <stdio.h>
  2 
  3 int main(void)
  4 {
  5     char buf[10] = {0};
  6     printf("please input string:");
  7     scanf("%s",buf);
  8     printf("%s\n",buf);
  9     return 0;
 10 }
[root@ligen 5]# ./a.out 
please input string:jljljljljljljljjj
jljljljljljljljjj

假如输入超过9个的字符,linux依然可以显示输出,但是其实这是错误的。

  • fgets()
    // stdin 代表标准输入(键盘),读取内容
    //不以空格为分界符
    //如果输入内容大于sizeof(buf) - 1,只取sizeof(buf) -1,放在buf所在的数组,可以防止越界。
    //换行符也会读入。
 1 #include <stdio.h>
  2 
  3 int main()
  4 {
  5     char buf[10];
  6     printf("please input the string:\n");
  7     fgets(buf, sizeof(buf), stdin);
  8     printf("buf =%s\n",buf);
  9     return 0;
 10 }

查看输出:

[root@ligen 5]# ./a.out 
please input the string:
jlfjlsfslfls
buf =jlfjlsfsl #只读了9个字符
  • puts和printf:
    puts:在标准设备输出字符串,输出完成后自动输出"\n",不会加入字符串里面。
    printf:不会换行
1 #include <stdio.h>
  2 
  3 int main(void)
  4 {
  5     char buf[] = "hello";
  6     puts(buf);
  7     return 0;
  8 }   

输出:

[root@ligen 5]# ./a.out 
hello
  • strlen和sizeof:
    //strlen(数组名)需要使用返回值,返回值就是字符串的长度
    //从首元素开始,到结束符为止的长度,不包括结束符(遇到\0结束,就不会测量后面的了)。
    //sizeof测的是数据类型的长度,不会因为结束符提前结束

  • strcpy()和strncpy( ):
    给字符数组赋值
    strcpy(目的数组,源数组)//

  1 #include <stdio.h>
  2 #include <string.h>
  3 
  4 int main(void)
  5 {
  6     char src[20] = "hello world";
  7     char des[20];
  8     int len;
  9     strcpy(des, src);
 10     len = strlen(des);
 11     printf("%s\nlen=%d\n",des,len);
 12     return 0;
 13 }   

输出:

[root@ligen 6]# ./a.out 
hello world
len=11

当helloworld中间有\0时:

char src[20] = "hello\0 world";

输出是:

[root@ligen 6]# ./a.out 
hello
len=5

strncpy(des,src,值(可以规定拷贝前几个)):

strncpy(des, src, 5);

查看输出:

[root@ligen 6]# ./a.out 
hello
len=5

注意:当中间有\0时,之后拷贝\0之前的。

  • strcmp()和strncmp()
    前者是整个字符串的比较,后者是几个的比较。
    字符串的比较是根据ascii码来的。
    windows返回值:0、>0、<0;
    linux:大于返回正数,等于返回0,小于返回负数。
  1 #include <stdio.h>
  2 
  3 int main(void)
  4 {
  5     char s1[] = "abcd";
  6     char s2[] = "abcd";
  7     int flag = strcmp(s1, s2);
  8     printf("%d",flag);
  9 }

结果:

[root@ligen 6]# ./a.out 
0

strncmp:
指定比较的字符串:

  1 #include <stdio.h>
  2 #include <string.h>
  3 
  4 int main(void)
  5 {
  6     char s1[] = "abc";
  7     char s2[] = "abcd";
  8     int flag = strncmp(s1, s2, 3); //指定比较前三个字符
  9     printf("%d",flag);
 10 }

返回:

[root@ligen 6]# ./a.out 
0
  • strcat、strncat:字符串的追加
strcat(des, src);
strncat(des, src, 值(指定长度追加));
  • sprintf():
    把字符串输出到指定的数组
  1 #include <stdio.h>
  2 
  3 int main(void)
  4 {
  5     int a = 10;
  6     char b[] = "bbb";
  7     char tmp[100];
  8     sprintf(tmp, "a = %d, b = %s",a, b);  #输出到tmp字符数组里面
  9     printf("%s\n",tmp);
 10 
 11     return 0;
 12 }

查看输出:

[root@ligen 6]# ./a.out 
a = 10, b = bbb
  • **sscanf:**可以从字符数组中读取,并以指定格式输入:
    输入数字:
    1 #include <stdio.h>
    2
    3 int main(void)
    4 {
    5 char a1[]=“1 2 3”;
    6 int a,b,c;
    7 sscanf(a1,"%d %d %d",&a,&b,&c); //根据a1中的空格,这里也是空格。
    8 printf(“a = %d,b = %d, c = %d”,a, b, c);
    9
    10 return 0;
    11 }
    查看输出:
[root@ligen 6]# ./a.out 
a = 1,b = 2, c = 3

输入字符:

  1 #include <stdio.h>
  2 
  3 int main(void)
  4 {
  5     char a1[]="aaa bbb ccc";  //字符它不用正则表达式的化,只能用空格来输入
  6     char a[10],b[10],c[10];
  7     sscanf(a1,"%s %s %s",a,b,c);
  8     printf("a = %s,b = %s, c = %s\n",a, b, c);
  9 
 10     return 0;
 11 }

查看输出:

[root@ligen 6]# ./a.out 
a = aaa,b = bbb, c = ccc
  • strchr()查询字符
    strchr(数组,'查询字符’);//在数组中查询字符,如果找到返回查询字符所在位置,没有返回NULL

  • strstr():查询字符串
    strstr(数组名,“所查询字符串”):如果匹配返回字符串地址,没有返回NULL。

  • strtok:字符串的切割会破坏字符串的结构
    strtok(数组名,“切割符”); //返回切割后的字符
    第二次调用,数组名写空(NULL)

  • atoi()
    把字符串转化为整形,跳过空格字符,直到遇到数字或者正负号才开始做转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值