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

时间:2015-05-26 07:46:48

标签: 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;
    }
    

    我知道在这个程序中,用户只能输入num的值,因为新的行字符会留在输入缓冲区中,下次scanf会输入新的如果我们在第二个scanf函数中在%c之前添加额外空格,则可以解决行字符问题。

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

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

  5. spacenewlinescanf字符之间有什么区别?我的意思是会有一些例外吗?

1 个答案:

答案 0 :(得分:4)

第一个问题

  

我的意思是当他们被scanf跳过并且他们不是

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

  

7.21.6.2 fscanf功能

     

[...]

     
      
  1. 跳过输入空白字符(由isspace函数指定),除非规范包含[cn说明符。 284)
  2.   

  

如何跳过它们?

请阅读并弃掉它们。

第二个问题

  

我也无法理解scanf功能的工作原理?

scanfvariadic function,意味着它可以使用任意数量的参数,最小值为1。 scanf解析第一个参数,它是一个字符串文字,因此需要输入。

第三个问题

  

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

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

第四个问题

  

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

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

第五个问题

  

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

scanf中的格式字符串中放置任何内容时没有区别。虽然它们是不同的字符,但它们都被视为whitespace characters。它们跳过任意数量的空白字符,包括无字符,直到第一个非空格字符用于格式字符串scanf时。 C11标准的相关引用:

  

7.21.6.2 fscanf功能

     

[...]

     
      
  1. 由空白字符组成的指令通过读取第一个非空白字符(仍然未读取)的输入来执行,或者直到不再能够读取字符为止。该指令永远不会失败。
  2.