首页 > C语言笔记

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 个字符,无论它们是什么。

注意事项

使用星号时需要注意以下几点:

相关文章