C中用scanf()时应注意的一些问题

Posted 路人姜。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C中用scanf()时应注意的一些问题相关的知识,希望对你有一定的参考价值。

  最近在做题时遇到了scanf()的一些问题,下面说一下,scanf()中一些需要注意的地方:

先说一下scanf()的格式:

scanf(“格式控制字符串”, 地址表列);

0、格式字符串一般形式如下:

%[*][输入数据宽度][长度]类型

其中有方括号[]的项为任选项,举个*的栗子:

 

#include <stdio.h>
int main()
{
    int a,c;
    scanf("%3d%*d%d",&a,&c);//第二个%d被略过了
    printf("%d\\n%d",a,c);
    return 0;
}

 

 

 

1、scanf函数中没有精度控制,而printf()可以,如下:

#include <stdio.h>
int main()
{
    float a;
  //  scanf("%3.2f",&a); 错误写法
    scanf("%f",&a);
    printf("%3.2f",a);
    return 0;
}

2、在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束,如下:

 

#include <stdio.h>
int main()
{
    int a;
    scanf("%d",&a);
    printf("%d",a);
    return 0;
}

 

 

 

其中数据结束在d,所以输出123

 

3、在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符,如下:

 

#include <stdio.h>
int main()
{
    char a,b,c;
    scanf("%c%c%c",&a,&b,&c);
    printf("%c%c%c",a,b,c);
    return 0;
}

 

 

 

其中a为d,b为空格,c为e

4、若想在输入字符时用空格隔开则这样写:

 

#include <stdio.h>
int main()
{
    char a,b,c;
    scanf("%c %c %c",&a,&b,&c);//之间加上空格
    printf("%c%c%c",a,b,c);
    return 0;
}

注:如果输入的是整形等非字符型数据,根据2、可知道不须这么写,因为空格会被视为非格式串。

5、scanf()中%s和%c的区别:

 

首先声明:在键盘中敲入字符后,字符会首先保存在键盘缓冲区中供scanf函数读取(scanf,getchar等函数是读取缓冲区,getch函数是读取的控制台信息,即为直接从键盘读取)。另外特别注意键盘上敲入回车实际为“\\r\\n”,但存储到缓冲区时候会舍弃‘\\r’而只存储\\n.例如我们敲入字符“12345回车”,缓冲区内存储的为“12345\\n”

对于scanf以%s格式输入时候,“空格、换行符、TAB”等是作为两个数据的分隔符存在的,即分隔符前后是两个数据,读入时候分隔符不读入。

对于scanf以%c格式输入时候,“空格、换行符、TAB”等是正常字符。

举个栗子:

 

#include <stdio.h>
int main()
{
    char c;
    char a[10];
    scanf("%s",a);
    scanf("%c",&c);
    printf("%s",a);
    printf("%c****",c);
    return 0;
}

 

“adc”存进了字符数组a,%s视空格为分隔符,但是空格存进了缓冲区,%c视空格为正常字符读进了c。

再来个栗子:

若让你输入如下所示n行n列的字符如:

abc

def

ghi

则应用%s,而不是%c,代码如下

#include <stdio.h>
int main()
{
    int i,j;
    char a[3][3];
    for(i=0;i<3;i++){
        scanf("%s",a[i]);
    }
    for(i=0;i<3;i++){
        for(j=0;j<3;j++){
                printf("%c",a[i][j]);
        }
    }
    return 0;
}

 

 

 

 

 

 

 

 

 

本文参考自http://c.biancheng.net/cpp/html/34.html

 

以上是关于C中用scanf()时应注意的一些问题的主要内容,如果未能解决你的问题,请参考以下文章

scanf输入与getchar的比较

使用if语句时应注意的问题(初学者)

c语言中用了scanf语句就输不出结果把scanf删掉就能出结果是为什么

scanf的使用及一些注意事项

C语言中用scanf和循环语句是怎么给数组一一赋值的,希望说得详细点

Promise使用时应注意的问题