【问题标题】:Scanning space as char将空间扫描为字符
【发布时间】:2018-11-03 02:48:43
【问题描述】:

所以我有一个简单的代码,它可以扫描单词的每个字母并使用指针写入它的值和地址。

我的问题是 %c 不扫描空格,我希望他们这样做。我该如何管理?

#include <stdio.h>

int main()
{
    char c1, c2, *p_c;
    while (scanf_s(" %c", &c1) == 1)
    {
        if (c1 == '*')
            break;
        p_c = &c1;
        c2 = *p_c;
        printf("c1: %c (%p) c2: %c (%p) c_p: %c (%p)\n", c1, &c1, c2, &c2, *p_c, p_c);
    }

    return 0;
}

例如

输入:

is this C?*

预期输出:

c1: i (00D3F7CF) c2: i (00D3F7C3) c_p: i (00D3F7CF)
c1: s (00D3F7CF) c2: s (00D3F7C3) c_p: s (00D3F7CF) 
c1:   (00D3F7CF) c2:   (00D3F7C3) c_p:   (00D3F7CF)
c1: t (00D3F7CF) c2: t (00D3F7C3) c_p: t (00D3F7CF)
c1: h (00D3F7CF) c2: h (00D3F7C3) c_p: h (00D3F7CF)
c1: i (00D3F7CF) c2: i (00D3F7C3) c_p: i (00D3F7CF)
c1: s (00D3F7CF) c2: s (00D3F7C3) c_p: s (00D3F7CF)
c1:   (00D3F7CF) c2:   (00D3F7C3) c_p:   (00D3F7CF)
c1: C (00D3F7CF) c2: C (00D3F7C3) c_p: C (00D3F7CF)
c1: ? (00D3F7CF) c2: ? (00D3F7C3) c_p: ? (00D3F7CF)

我的代码完全跳过了空格,就好像它们根本不存在一样。 提前致谢。

【问题讨论】:

  • 您显示的输出是实际还是预期输出?请花一些时间阅读有关 how to ask good questionsthis question checklist 的信息。
  • 另外,对于scanf 格式" %c",您认为前导空格有什么作用?请阅读例如this scanf (and family) reference 了解更多信息。
  • 特别是紧跟在标题 "A 指令是以下之一的段落:" in scanf(3) - Linux manual page
  • 格式说明符 '%c' 可以获取任何字节值,包括空格。问题的核心是scanf() 的格式字符串是“%c”,并且前导空格导致所有前导“空白”被跳过。 (空白是空格、制表符、换行符等)

标签: c char scanf


【解决方案1】:

编码错误

"%c"scanf_s() 需要 2 个参数,rsize_tchar*
这也意味着编译可能不会在启用所有警告的情况下完成。
节省时间,启用所有警告。

scanf_s 函数等价于 fscanf_s,参数为 stdin 插入到scanf_s 的参数之前。 C11dr §K.3.5.3.4 4

fscanf_s 函数等效于 fscanf,除了 cs[ 转换说明符适用于一对参数... §K.3.5.3.2 4

// scanf_s(" %c", &c1)
scanf_s(" %c", &c1, sizeof c1)

我的问题是 %c 不扫描空格,我希望他们这样做。我该如何管理?

" " 消耗空格

' '这样使用空格,省略前导" "

// scanf_s(" %c", &c1, sizeof c1)
scanf_s("%c", &c1, sizeof c1)

或者用scanf()简化

scanf("%c", &c1)

或者使用getchar()进一步简化

char c1;
int ich;
while ((ich = getchar()) != EOF) {
  c1 = (char) ich;
  ...

【讨论】:

  • 谢谢,删除空间有帮助,我在早期使用它来解决打印问题。虽然我不能使用scanf函数,因为我在Visual Community Studio 2017中的编译器从来没有让我不使用scanf_s,说它可能不安全......
  • @MichalKováč Perhasp Remove secure warnings ... from projects by default in Visual Studio。 IAC,scanf_s() 并不比scanf() 安全。
猜你喜欢
  • 1970-01-01
  • 2019-10-06
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多