【问题标题】:Usage of *variable in scanf and why we use it? [closed]scanf 中 *variable 的用法以及我们为什么使用它? [关闭]
【发布时间】:2019-11-11 14:52:24
【问题描述】:

你好,我是一个初学者,我一直在代码中看到这个,但我不知道它到底是什么意思...... 像下面的例子

#include<stdio.h>

int main(void)
{
    char c1;
    do
    {
        scanf_s("%c%*c", &c1, 1);
        if ((c1>='a' && c1<='z')||(c1 >= 'A' && c1 <= 'Z'))
        {
            printf("%c  %d", c1, c1);
        }

    } while (c1!=0);
    return 0;
}

像这里一样,它是转换字符还是存储它的值? (%*c) in scanf 对我来说是个谜,因为我不明白它有点像内存的引用,但不会启动任何变量,它只是指向内存中存储的值...... 我说的对吗?

【问题讨论】:

  • 出于兴趣,这个例子出自哪里?
  • 您在任何地方都没有*variable。您是指scanf 格式字符串中的* 吗? scanf (and family) reference 可能对此有所帮助。
  • 请注意,您展示的示例将在不使用 ASCII 字符编码的系统上崩溃。如果您想知道某个字符是否为字母,请使用isalpha
  • 这只是一个示例 c1 被定义为一个字符,在 scanf 中它读取 %c 和 %*c 后来它打印 ascii 代码和字符我只想知道 *c 在这里做了什么
  • “百分号后面的星号 (*) 禁止分配下一个输入字段,它被解释为指定类型的字段。该字段被扫描但不存储。” 在您的格式规范"%c%*c" 中,这意味着读取一个字符并忽略下一个字符。

标签: c scanf format-specifiers


【解决方案1】:

来自 C 标准(7.21.6.2 fscanf 函数)

3....在%之后,依次出现:

一个可选的赋值抑制字符 *.

- 一个可选的大于零的十进制整数,用于指定 最大字段宽度(以字符为单位)。

——一个可选的长度修饰符,指定接收的大小 对象。

- 一个转换说明符字符,指定类型 要应用的转换。

和(K.3.5.3.2 fscanf_s 函数)

4 fscanf_s 函数等价于 fscanf,除了 c、s、 和 [ 转换说明符适用于一对参数(除非 分配抑制由 *)....

所以在这次通话中

scanf_s("%c%*c", &c1, 1);

%*c 格式禁止将读取的字符分配给参数。通常这种方法用于从缓冲区中读取用户按下 Enter 键后出现的换行符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-09
    • 2017-10-01
    • 2018-11-12
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    相关资源
    最近更新 更多