删除和添加空格字符真的发生了什么?

use*_*887 7 c whitespace scanf

我是编程和学习C编程基础知识的新手.我正在学习如何scanf()运作但我觉得现在我非常困惑,真的不知道如何以及要问什么.但我会尽力将问题清楚.

问题

  1. 我真的无法理解空白的整个概念.我的意思是当他们跳过它们scanf并且当它们不是并且最大的问题时:它们是如何被跳过的?
  2. 随着空白概念,我无法理解scanf功能的工作吗?我在许多书籍和网站以及本网站上都已经阅读过它,但它让我更加困惑,因为每个人都有自己的方式来讲述任何概念,并且它们各不相同.

  3. 看看这个简短的程序:

    #include<stdio.h>
    int main()
     {
      int num;
      char ch;
      printf("enter the value of num and ch:\n");
      scanf("%d",&num);      
      scanf("%c",&ch);
       printf("num = %d and ch = %c",num,ch);
       return 0;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    我知道,在这个程序的用户将被允许进入的价值num,因为停留早在输入缓冲器和下一次换行字符而已,scanf将输入新行字符,但是可以解决,如果我们之前添加额外的空间%c中第二个scanf函数.

    但是当我用char ch变量替换时int ch,scanf跳过新行.为什么?

  4. 为什么scanf不像空格一样跳过非空格字符例如 - a,b,c,d,@)#etc?

  5. spacenewline角色有scanf什么区别?我的意思是会有一些例外吗?

Spi*_*rix 5

第一个问题

我的意思是当它们被 scanf 跳过时

除非格式说明符是%c,%n或,否则会跳过空白字符%[。C11标准的相关引用:

7.21.6.2 fscanf 函数

[...]

  1. 输入的空白字符(由指定的isspace功能)被跳过,除非本说明书包括一个[cn说明符。284)

它们是如何被跳过的?

只需阅读并丢弃它们。

第二个问题

我也无法理解 scanf 函数的工作原理?

scanf是一个可变参数函数,这意味着它可以接受任意数量的参数,最少为一个。scanf解析作为字符串文字的第一个参数,并相应地接受输入。

第三个问题

但是当我用 int ch 替换 char ch 变量时,scanf 会跳过新行。为什么?

第一个答案的第一部分解释了它。%d将跳过空白字符。

第四题

为什么 scanf 不像空格那样跳过非空格字符?

对于某些转换说明符,如%c,非空白字符是有效输入。为什么他们应该跳过它们是没有意义的。对于其他类似的%d,字符(不是数字)是无效输入。scanf停止扫描并在看到无效输入时返回。它是这样设计的。

第五题

scanf中的空格和换行符有什么区别?

当它们中的任何一个放置在scanf. 尽管它们是不同的字符,但它们都被视为空白字符。它们跳过任意数量的空白字符,包括无,直到第一个非空白字符在scanf. C11标准的相关引用:

7.21.6.2 fscanf 函数

[...]

  1. 由空白字符组成的指令通过读取输入直到第一个非空白字符(保持未读)或直到无法读取更多字符来执行。该指令永远不会失败。