数据类型、小数位问题、scanf()函数

C语言里面的数据类型共四大类:

基本类型 :

  1. 整型类型:基本整型(int)、短整型(short int)、长整型(long int) 、双长整型(long long int)、字符型(char)、布尔型(bool)
  2. 浮点类型:单精度浮点型(float) 、双精度浮点型(double) 、复数浮点型(float_complex,bouble_complex,long long_compled)

枚举类型 : 枚举类型(enum)

空类型   :空类型(void)

派生类型 指针类型(*) 、数组类型([ ]) 、结构体类型(struct) 、共用体类型 (union) 、函数类型

 其中基本类型枚举类型变量的值都是数值,所以统称为算术类型 (arithmetic type)。

算数类型指针类型统称为纯量类型(scalar type),因为其变量的值是以数字来表示的。

数组类型结构体类型统称为组合类型(aggregate type),共用体类型不属于组合类型,因为在同一时间内只有一个成员具有值。

函数类型用来定义函数,描述一个函数的接口,包括函数返回值的数据类型和参数类型。

C语言控制小数位数的方法

答:是通过控制格式说明符来控制的。

#include<stdio.h>
int main()
{
    const double pi = 3.1415926;  //双精度长度可以到16位
    printf("%lf",pi);  //输出的结果是3.141593,系统自动四舍五入了,不指定输出的小数位时系统默认输出小数位为6位
    putchar('\n');  //单字符输出
    printf("%.8lf",pi);  //指定小数位为8位,输出结果是:3.14159260,可预测
    return 0;
}

 int scanf( const char *format [, argument]... );

scanf()函数的作用是从标准的输入流中读取数据,并将读取到的数据保存到指定的变量中。

其格式为:

int scanf( const char *format [, argument]... );

其中,参数format指定了读取数据的方式;argument是一个参数列表,其类型是变量的地址,scanf()函数读取到的数据就保存到这些参数中。scanf()函数的返回值是保存数据的参数的数量,即对参数列表argument中多少个参数进行了赋值。

format参数是一个字符串:该字符串包含了格式说明符、空白字符和其他字符。

格式说明符也就是format参数中的百分号%。当scanf()函数遇到其参数中的格式说明符时,就开始从数据流中读取数据,并将数据转化为格式说明符指定的格式,保存到参数列表中的相应参数中。例如:

...
int i;
scanf("%d", &i);
...

在扫描标准输入函数时首先扫描到的是格式说明符%,当扫到这个时,程序就停止在这里等待用户输入数据(一个%占一个字符),当用户输入数据时,数据是被存储在后面&后面的变量里面,&是取地址符号。

空白字符指的是空格符(' ')、tab符('\t')和新行符('\n')。

当scanf()函数遇到空白字符时,该函数会读取输入数据流中连续的空白字符,但是不会存储这些字符,直到读取到输入数据流中非空白字符为止。

format格式与输入流匹配

例如:

...
int i;
char ch;
scanf("%d %c", &i, &ch);  //两个格式说明符中间有一个空格
...

 此时在控制台输入窗口中输入“123 a”。对于scanf()函数的format参数,首先第一个格式说明符%使得scanf()函数从数据流中读取“123”并且将其转换为整形保存到变量i中;之后对于format参数中的空格符,scanf()函数从输入数据流中读取连续的空白字符,但是并不将该字符保存到参数列表中的参数;最后第二个格式说明符%使得scanf()函数从数据流中读取“a”,并将其转换为字符类型保存到变量ch中。

 当format包含空白字符而输入流数据中不包含空白字符时,即

scanf("%d %c", &i, &ch);

而此时在控制台输入窗口中输入“123a”,scanf()函数的format参数的第一个格式说明符%使得scanf()函数从数据流中读取数据,需要注意的时,虽然此时输入的数据中不包含空白字符,但是scanf()函数无法将其中的“a”转换为整形,因此第一个格式说明符%使得scanf()函数从数据流中读取的数据为“123”,转换为整形后保存到变量i中;之后,在format参数中是一个空白字符,在上面的format格式与输入流匹配”中提到,空白字符使得scanf()函数读取输入数据流中连续的空白字符,但是此时输入数据中不包含空白字符,因此format参数中的空白字符并没有起作用,即此时scanf()函数并没有读取输入数据流中的数据;最后,format参数的第二个格式说明符%使得scanf()函数从数据流中读取数据“a”,并将其转换为字符类型保存到ch中。此时,i的值是123,而ch的值是’a’。

当format不包含空白字符而输入流包含时

当format包含不空白字符而输入流数据中包含空白字符时,即

scanf("%d%c", &i, &ch);

而此时在控制台输入窗口中输入“123 a”,scanf()函数的format参数的第一个格式说明符%使得scanf()函数从数据流中读取数据“123”,之后format参数的第二个格式说明符%使得scanf()函数从数据流中读取数据,需要注意的是,此时读取到的数据不是“a”而是空格符。因此,i的值是123,而ch的值是' '。

其他字符

format参数中的其他字符指的是除了空白字符和格式说明符之外的其他字符。format参数中的其他字符要与输入数据流中的字符匹配,例如:

scanf(“%d,%c”, &i, &ch);

此时,在控制台输入窗口中输入“123,a”,才能保证i的值是123,ch的值是’a’。如果format参数中的其他字符与输入数据流中的字符不匹配,则scanf()函数停止读取数据。

如果在控制台中输入“123a”,此时i的值是123,而ch的值是调用scanf()函数之前的值。

星号符号

格式说明符%之后除了跟指定数据类型的字符之外,还可以跟星号*。例如

%*d

scanf()函数遇到该符号时,只是从数据流中读取数据,但是并不把读取到的数据存储到参数列表中的参数。例如

scanf("%*d %d%c", &i, &ch);

在控制台输入窗口中输入“123 456a”,此时,i的值是456,而ch的值是’a’。

posted on 2019-09-20 18:35  iBoundary  阅读(1301)  评论(0编辑  收藏  举报

导航