### C语言中的输入语句scanf详解
在C语言编程中,`scanf`函数是用于从标准输入(通常是键盘)读取格式化输入的一个非常重要的函数,它允许程序根据指定的格式字符串来解析输入的数据,并将解析后的数据存储到对应的变量中,`scanf`函数是C标准库函数之一,定义在`stdio.h`头文件中。
#### 基本语法
`scanf`函数的基本语法如下:
```c
int scanf(const char *format, ...);
- `format`:这是一个格式字符串,用于指定后续参数(即变量)的输入格式。格式字符串中的每个格式说明符(如`%d`、`%f`、`%s`等)都对应一个输入项,并指示了如何解释输入的数据。 - `...`:表示可变数量的参数,这些参数是接收输入数据的变量的地址。注意,由于`scanf`需要变量的地址来存储输入的数据,因此传递给`scanf`的应该是变量的地址,通常使用`&`操作符来获取。 `scanf`函数返回成功读取的输入项的数量,如果读取失败或到达文件末尾,则返回`EOF`(通常是-1)。 #### 示例 下面是一些使用`scanf`函数的示例: ##### 示例1:读取整数 ```c #include <stdio.h> int main() { int number; printf("Enter an integer: "); scanf("%d", &number); // 注意使用&操作符来获取number的地址 printf("You entered: %d\n", number); return 0; }
在这个例子中,`%d`是格式说明符,用于指示`scanf`函数读取一个整数,`&number`是变量`number`的地址,`scanf`将读取的整数存储在这个地址指向的位置。
##### 示例2:读取浮点数
#include
int main() {
float value;
printf("Enter a floating-point number: ");
scanf("%f", &value);
printf("You entered: %.2f\n", value);
return 0;
}
这里,`%f`用于读取浮点数,并将其存储在变量`value`中。 ##### 示例3:读取字符串 ```c #include <stdio.h> int main() { char str[50]; // 假设字符串不超过49个字符加上一个空字符'\0' printf("Enter a string: "); scanf("%s", str); // 注意,这里不需要&,因为数组名本身就是地址 printf("You entered: %s\n", str); return 0; }
对于字符串,`%s`格式说明符用于读取一个以空格、制表符或换行符为分隔符的字符串,这里传递给`scanf`的是数组名`str`,它本身就是数组首元素的地址,因此不需要使用`&`操作符。
#### 注意事项
1. **缓冲区溢出**:当使用`%s`读取字符串时,如果输入的字符串长度超过了目标数组的大小,就会发生缓冲区溢出,这可能导致未定义行为,包括程序崩溃或安全漏洞,为了避免这种情况,可以使用`%ms`(GNU扩展)或限制读取的字符数(如`%49s`),但请注意`%ms`不是标准C的一部分。
2. **空格、制表符和换行符**:默认情况下,`scanf`会跳过任何空白字符(空格、制表符、换行符等)直到遇到第一个非空白字符,它会根据格式字符串中的格式说明符读取数据,一旦开始读取数据(例如,使用`%d`读取整数),它就会继续读取直到遇到下一个非法字符(对于整数来说,是任何非数字字符),并将该非法字符留在输入缓冲区中。
3. **输入验证**:`scanf`本身不提供强大的输入验证机制,如果输入的数据与格式字符串不匹配,`scanf`可能会失败并返回读取的输入项数(小于预期的数量),但不会自动清除输入缓冲区中的剩余数据,这可能导致后续的`scanf`调用读取到意外的数据,在使用`scanf`时,通常需要编写额外的代码来验证输入并处理错误情况。
4. **混合类型输入**:`scanf`可以一次读取多种类型的数据,只需在格式字符串中相应地指定多个格式说明符,并在参数列表中提供足够数量的变量地址即可。
#### 进阶用法
- **读取特定数量的字符**:可以使用`%n`格式说明符来读取特定数量的字符(包括空格),但这通常不是`scanf`的直接用途。