C语言重修

在这里补充我所不知道的C语言坑点

C的自带函数

Scanf( )函数相关

**简介:**scanf()函数是通过终端格式化输入函数,它从标准输入设备(键盘)读取输入信息。可以读入任何固有类型的数据并自动把数值转变成适当的机内格式。其返回值是成功读取的变量个数

  1. 当使用"%d%d%d"这种输入格式时,输入可以是一个空格或者多个空格、tab键、回车键分割。输出都是正确的
  2. “%d,%d,%d"格式与”%d%d%d"格式基本相同,不同之处在"%d,%d,%d"这种格式在输入时“,”一定要紧跟输入的数字,作为分隔符时以"%d,"为单位进行格式化读取,其他字符同理
  3. 字符读取时,也即"%c"输入,空格和转义字符均作为有效字符,例如
#include<stdio.h>
int main()
{
	char a, b, c;
	scanf("%c%c%c", &a, &b, &c);
	printf("%c,%c,%c\n", a, b, c);
	system("pause");
	return 0;
}

当你输入:

1 2 3

此时a->“1”,b->" ",c->"2"其余被丢弃,还有类似的问题,比如:

#include<stdio.h>
int main()
{
	int a;
	char c;
	scanf("%d", &a);
	scanf("%c", &c);
	printf("a=%d,  c=%c,\n", a, c);
	printf("c=%d\n", c);
	system("pause");
	return 0;
}

当你输入1然后直接敲回车时,他会读取1[\n],也即c='\n'

解决办法:

  1. 在接收第二个数之前清空缓冲区,fflush(stdin);getch();getchar();随便一个都可以,fflush(stdin)是全部清空,getchar()是清空一个字符,如果缓冲区还有多余的字符则会被正常使用
  2. 在%c之前加入空格,空格可以吸收回车符、空格
//解决方法2
#include<stdio.h>
#include <stdlib.h>
int main()
{
	int a;
	char c;
	scanf("%d", &a);
	scanf(" %c", &c);
	printf("a=%d,  c=%c,\n", a, c);
	printf("c=%d\n", c);
	system("pause");
	return 0;
}
  1. scanf()函数接收输入数据时,遇到以下问题结束一个数据的输入:

1.遇见空格,回车,跳格

2.遇见宽度

3.遇见非法输入

解决方法:使用%[](扫描字符集合),可以用来进行多个字符串的输入,并对结束符进行自定义。对于%[]可以用^+结束标志(可以使任意字符,代表着输入这个字符就终止对字符串的读取)。

char arr[20];
	scanf("%[^\n]", arr);
	printf("%s", arr);
	system("pause");
	return 0;

比如上述代码就可以顺利读取hello world

  1. 神奇的缓冲区指针:
#include <stdio.h>
int main()
{
int a = 0, b=999;
char str[30];
printf("b=%d\n", b);
scanf("%d", &a);
scanf("%d", &b);
scanf("%s", str);
printf("a=%d, b=%d, str=%s\n", a, b, str);
return 0;
}

输入hello

你会得到一个这样的结果:

b=999
hello
a=0, b=999, str=hello

分析如下:

程序执行到第一个 scanf() 时等待用户输入,从键盘输入 hello ,按下回车键,scanf() 匹配到 hello

不是scanf()想要的整数,所以不赋值给a,也不赋值给b,他们二者的值不动

匹配失败意味着不会移动内部的位置指针,此时缓冲区中的内容仍然是 hello 。执行到底三个 scanf() 时,它想要一个字符串,这不是正好捡漏吗,把 hello 赋值给 str 就好了。

  1. 不能忽略空白符的情况:
#include <stdio.h>
int main()
{
int a = 1, b = 2;
scanf("a=%d", &a);
scanf("b=%d", &b);
printf("a=%d, b=%d\n", a, b);
return 0;
}

输入a=100,程序居然直接就结束了,它与以往的程序有什么不同呢?你可以自行比较一下:

#include <stdio.h>
int main()
{
int a = 1, b = 2;
scanf("%d", &a);
scanf("%d", &b);
printf("a=%d, b=%d\n", a, b);
return 0;
}

这个程序输入100,它是会等你输入第二个scanf()的,并且会忽略之后的空格,

但是,当控制字符串不是以格式控制符 %d、%c、%f 等开头时,空白符就不能忽略了,它会参与匹配过程,如果匹配失败,就意味着 scanf() 读取失败了。

Malloc()函数

C 库函数 void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针


C语言重修
http://pikapikagfy.github.io/2024/01/20/c/
作者
PikaPikaGFY
发布于
2024年1月20日
许可协议