C语言中字符类型:char a='a';
字符串类型:

1
2
char a[100];
char a[ ]="Future is now!"

字符串末尾会自动补’\0’(串尾符)

输入&输出

gets() puts()

该函数原型:

1
2
3
# include <stdio.h>
char *gets(char *str);

gets() 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间

1
2
3
4
5
6
7
8
9
# include <stdio.h>
int main(void)
{
char a[256] = {0};//char *a;
gets(a);
puts(a);
//printf("%s",a);
return 0;
}

读空格/换行情况

gets/puts可以一直读/输出空格,不能读/输出换行

fgets() & fputs()

fgets()函数定义:
char *fgets(char *str, int n, FILE *stream)
从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。

fputs()函数定义:
C 库函数 int fputs(const char *str, FILE *stream) 把字符串写入到指定的流 stream 中,但不包括空字符(“\0”)。
空格字符不是空字符

1
2
3
4
5
6
7
8
9
10
# include <stdio.h>
int main(void)
{
char str[20]; /*定义一个最大长度为19, 末尾是'\0'的字符数组来存储字符串*/
printf("请输入一个字符串:");
fgets(str, 7, stdin); /*从输入流stdin即输入缓冲区中读取7个字符到字符数组str中*/
//或理解为最大读取字符数,但由于某位要加'\0',所以实际上只能读取7-1=6个
fputs(str,stdout);
return 0;
}

读空格/换行情况

fgets()读取字符数受变量int n控制,其余与gets/puts相同

getchar()

用法:
char a=getchar();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# include <stdio.h>
int main(void)
{
int i=0;
int j;
char ch;
char a[256] = {0};
while((ch=getchar())!='\n')//一直接收缓冲区的字符。直至收到回车
{
a[i]=ch;
i++;
}
a[i]='\0'; //加上串尾符
for(j=0;j<i;j++)
{
printf("%c",a[j]);
}
return 0;
}

scanf() fscanf() fscanf_s()

此类函数读到空格就停

1
2
3
4
5
6
7
8
9
10
11
12
# include <stdio.h>
int main(void)
{
char a[256];
scanf("%s",a);//a前面不用加&是因为a本身就是这个字符串的地址
//fscanf(stdin,"%s",a);
//fscanf_s(sydin,"%s",a,20);
//fscanf_s中"20"为额外提供一个表示缓冲区大小的参数
printf("%s",a);
return 0;
}

printf()类会输出空格

sscanf() sscanf_s()

sscanf是一个很好用的函数,利用它可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单,特别对于整数和浮点数来说。

  1. 常见用法。
1
2
3
charstr[512]={0};
  sscanf("123456","%s",str);
  printf("str=%s",str);
  1. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。

    1
    2
    3

    sscanf("123456","%4s",str);//多余的字符串不会留在缓存区
    printf("str=%s",str);
  2. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。

1
2
3
sscanf("123456abcdedf","%[^]",str);
printf("str=%s",str);

  1. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
1
2
sscanf("123456abcdedfBCDEF","%[1-9a-z]",str);
printf("str=%s",str);
  1. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
    1
    2
    3
    4

    sscanf("123456abcdedfBCDEF","%[^A-Z]",str);
    printf("str=%s",str);

    例:
    可以用如下代码将字符串形式的ip地址转换为四个整数:
1
2
3
char * inputIp
int ip[4];
sscanf_s(inputIp, "%d.%d.%d.%d", &ip[0], &ip[1],&ip[2],&ip[3]);

注意

  • scanf这种格式串不能接收带空格的字符串,比如输入”abc 123 678”的话,字符串只会接收到abc,遇空格就结束

  • 使用 gets() 时,系统会将最后“敲”(Enter)的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留换行符;
    而使用scanf时,最后的“敲”会遗留在缓冲区中,如果使用scanf,则需要使用gerchar()将缓冲区的Enter吃掉

实例(https://blog.csdn.net/Qxiaofei_/article/details/122142431):

  1. 使用gets()后再输入一个字符,可知缓冲区无残留Enter

  1. 换成scanf后,只敲了一次回车就结束程序,可知scanf情况下缓冲区有残留Enter

  1. 加入getchar()即可解决残留Enter问题