C语言scanf()中*的两个作用
C语言 scanf() 是一个强大的输入函数,它允许我们从标准输入(通常是键盘)读取各种格式的数据。然而,scanf() 的格式说明符中的星号*
常常让初学者感到困惑。
*
在 scanf() 中主要有两个用途,一个是抑制赋值,一个是指定输入字段宽度。这两种用法虽然看似简单,但在实际编程中却非常有用。
抑制赋值
当我们在 scanf() 的格式说明符前面加上 * 时,它会告诉 scanf() 读取匹配的输入项,但不将其存储到任何变量中,这种用法被称为“抑制赋值”。
例如,假设我们有一个日期字符串,格式为“MM/DD/YYYY”,但我们只想读取年份,那么可以这样使用 scanf():
#include <stdio.h> int main() { int year; scanf("%*d/%*d/%d", &year); printf("Year: %d\n", year); return 0; }
如果用户输入 "05/20/2023",程序将输出:
Year: 2023
在这个例子中,前两个 %*d 会读取月份和日期,但不存储它们,只有最后一个 %d 会将年份存储到 year 变量中。
指定输入字段宽度
*
的另一个用途是指定输入字段的最大宽度,这在读取固定宽度的字段时非常有用。使用方法是在 % 和转换说明符之间放置*m
,其中 m 是一个整数,表示最大字段宽度。
例如,假设我们想读取一个产品代码,格式为“ABC-12345-XYZ”,我们只需要中间的数字部分:
#include <stdio.h> int main() { int code; scanf("%*3s-%5d-%*3s", &code); printf("Product Code: %d\n", code); return 0; }
如果用户输入 "ABC-12345-XYZ",程序将输出:
Product Code: 12345
在这个例子中,%*3s 表示跳过前三个字符,-5d 表示读取最多 5 个数字字符,最后的 %*3s 再次跳过三个字符。
结合使用
我们还可以结合使用这两种星号的用法,例如,如果我们想跳过输入中的前 10 个字符:
scanf("%*10s");
这行代码会读取(并丢弃)输入中的前 10 个字符,无论它们是什么。
注意事项
使用星号时需要注意以下几点:
- 使用抑制赋值时,scanf() 仍然会读取输入,只是不存储它,这可能会影响后续的输入操作。
- 指定字段宽度时,如果输入的字符数少于指定的宽度,scanf() 会在读取到的字符数量处停止。
- 当使用 * 指定宽度时,不能使用变量,宽度必须是一个常量。