scanf不能输入字符串Linux,scanf的用法

1、 scanf()函数是格式化输入函数,它从标准输入设备(键盘)缓存中读取输入的信息。

其调用格式为: scanf("",),如下所示:

inta;

scanf("%d",&a);

以上代码会将键盘的输入转换成int类型,并赋值给a。

所有转换指定符的含义如下:

转换字符

含义

d

将输入转换成int

i

将输入转换成int。如果加了前缀0,就输入八进制数。0x或OX,则输入十六进制数

o

将输入转换成int,并假定所有的数字都是八进制数

u

将输入转换成unsigned int

x

将输入转换成int,并假定所有的数字都是十六进制数

c

将下一个字符读入为char类型(包含空白)。如果在读入单个字符时要忽略空白,就在格式指定符的前面加上一个空白字符。

s

从下一个非空白字符开始,输入一串连续的非空白字符

e、f、g

将输入转换成float类型,输入中的小数点和指数是可选的。

n

不读入任何输入,但前面读到此处为止的数字字符存储在对应的int*类型参数中

下表中,是转换指定符的应用实例:

指定符

说明

%lf

将下一个值读取为double类型

%*d

读入下一个整数值,但不存储它

%lc

将一下字符读取为wchar_t类型

%\nc

将下一个字符读取为char类型,并忽略空白字符

%10lld

将接下来的10个字符读取为long long类型的整数值

%5d

将接下来的5个字符读取为一个整数

%Lf

将下一个值读取为long double类型的浮点数

%hu

将下一个值读取为unsigned short类型

M

指定输入数据所占宽度

*

空读一个字符,有了这个符号,只会读取,但不存储

H

输入“短”数据

L

输入“长”数据

2、空白字符

在scanf函数在从键盘读取的时候,会自动忽略一个或多个空白字符。

3、非空白字符()

一个非空白字符会使scanf函数在读取的时候,剔除掉与这个非空白字符相同的字符。

地址表是需要读入的所有变量的地址,而不是变量本身,这个与printf()函数不同,需要特别注意!

#include 

intmain()

{

inti,j;

printf("i = %d,j = %d\n",i,j);

scanf("%d,%d",&i,&j);

return0;

}

说明:scanf()函数先读一个整型数,然后把接着输入的逗号剔除掉,最后读入另一个整型数。如果","这一特定字符没有找到,scanf()函数就终止。若参数之间的分隔符为空格,则参数之间必须输入一个或多个空格。

4、地址问题

对于字符串数组或者是字符串指针变量,由于数组名和指针变量名本身就是地址,因此在使用scanf函数的时候,不需要加&操作符。

#include 

intmain()

{

char*p = NULL;

charstr1[20],str2[20];

p = str2;

scanf("%s",str1);

printf("str1 = %s ",str1);

printf("str2 = %s\n",p);

return0;

}

输入:123 \n 345  输出结果: str1 = 123 str2 = 345。输出正确

5、输入控制

可以在格式化字符串中的"%"各转换指定符之间加入一个整数,表示任意数读取中的最大位数。

如上例中,若规定只能输入2个字符给字符串数组str1,则需要在第一条更改为:

#include 

intmain()

{

char*p = NULL;

charstr1[20],str2[20];

p = str2;

scanf("%2s",str1);

scanf("%s",p);

printf("str1 = %s\n",str1);

printf("str2 = %s\n",p);

return0;

}

程序运行时一旦输入字符个数大于2,str1就不再继续读入,而后面的一个读入函数即scanf("%s", p)就会从第3个字符开始读入。

所以当输入一次输入的字符大于2的时候,剩下的部分会由字符串指针p接收,事实上,就这等于执行第二个scanf语句。所以,如果第一次输入的字符个数大于2,那么按回车之后,程序就会打印了。

6、多个数值数据

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

#include 

intmain()

{

inta;

scanf("%d",&a);

printf("after a  = %d\n",a);

return0;

}

输入:12A  输出: after a = 12

7、字符串数据(%c)问题

在使用scanf函数的时候,如果格式化字符串指定为"%c",则会将所有输入的字符均认为是有效的字符,看下面程序:

#include 

intmain()

{

chara,b,c;

scanf("%c%c%c",&a,&b,&c);

printf("a = %c,b = %c,c = %c\n",a,b,c);

return0;

}

输入:a(空格)b(空格)c   输出: a = a b = (空格) c = b

输出并未按照我们的想法输出。

由于没有指定分割符,所以,在读取输入的时候,scanf将空格也作为一个有效字符进行读取,并赋值给第二个变量。故b的值就是一个空格而已。

如果加了分割符,如下:

#include 

intmain()

{

chara,b,c;

scanf("%c %c %c",&a,&b,&c);

printf("a = %c,b = %c,c = %c\n",a,b,c);

return 0;

}

输入:a(空格)b(空格)c   输出: a = a b = b c = c

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值