- 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()
把字符串转化为整形,跳过空格字符,直到遇到数字或者正负号才开始做转换。