用scanf("%s",array); 的话遇到空格就停止接收后面的字符了,那怎么才能接收带空格的字符串呢?
1.用 gets() ,它可以接收带空格的字符串, 直到回车才结束输入
char buf[80]={0};
gets(buf); //可以读取空格, 回车结束输入
2.使用"%[^ ]" 也是可以接收输入一个带空格的字符串,直到回车结束接收
char buf[10] = {0};
scanf("%[^ ]",buf); //可以读取空格,回车结束输入
注意:scanf_s("%s",buf,10); 不能接收带空格的字符串输入,虽然它的指定长度是10, 但是遇到空格时即使没有满10个字符它也自动结束输入了。
[…]和[^…]是scanf中一种很少见到但是很有用的转换字符串
#include <stdio.h>
main()
{
char strings[100];
scanf("%[1234567890]”,strings);
printf(“%s”,strings);
return ( 0 );
}
运行输入:125eqe后, 打印结果是 125.
它的作用是从输入的第一个字符开始算起,到地n个字符如果都是中括号中的字符,而第n+1个字符不是这个中括号中的字符,则提取前面n个字符,并自动添加一个结束符号,此外第n+2个算起不管是不是这个中括号中的字符,都不再提取。如:
scanf("%[1234567890]",strings ); 如果输入123567ascds3838 那么输出的结果是:123567 而不是:1235673838 。 要注意的是:面对scanf("%[1234567890]",strings); 输入的第一个字符必须是这个中括号中的数字它才开始提取,否则将输出乱码,如输入:adc123djfdj8907907, 这里输入的第一个字符是字符而不是中括号中的数字,那么将输出乱码,而不是把后面的那些数字输出来!
还有需要注意: 方括号两边不能有空格,如scanf("%[ 123 ]",strings); 这样是错误的,最终得不到正确的结果的,此外如果想把输入的字符中当碰到数字就截断时可以使用如下形式:
scanf("%[^1234567890]",strings) ; 这样当输入的字符中遇到包含中括号的数字时就自动结束接收,例如输入:-=-=sakjfd123, 那么打印strings的结果将是::-=-=sakjfd, 但是要注意如果一开始就输入数字那么就会显示乱码,如输入:1265423sdjfksdkf, 那么结果将会显示乱码!
"%[^ ]" 之所以能接收带空格的输入,是因为它接收所以的字符输入只要不输入 (即回车键的转义符)它就一直接收,直到超过变量能够接收的长度,遇到 则自动结束输入操作。
下面是MSDN的scanf格式参数的允许情况,注意%[]在最后
Conversion Argument Conversion
Specifier Type Function Base
%c char x[]
%lc wchar_t x[]
%d int *x strtol 10
%hd short *x strtol 10
%ld long *x strtol 10
%e float *x strtod 10
%le double *x strtod 10
%Le long double *x strtod 10
%E float *x strtod 10
%lE double *x strtod 10
%LE long double *x strtod 10
%f float *x strtod 10
%lf double *x strtod 10
%Lf long double *x strtod 10
%g float *x strtod 10
%lg double *x strtod 10
%Lg long double *x strtod 10
%G float *x strtod 10
%lG double *x strtod 10
%LG long double *x strtod 10
%i int *x strtol 0
%hi short *x strtol 0
%li long *x strtol 0
%n int *x
%hn short *x
%ln long *x
%o unsigned int *x strtoul 8
%ho unsigned short *x strtoul 8
%lo unsigned long *x strtoul 8
%p void **x
%s char x[]
%ls wchar_t x[]
%u unsigned int *x strtoul 10
%hu unsigned short *x strtoul 10
%lu unsigned long *x strtoul 10
%x unsigned int *x strtoul 16
%hx unsigned short *x strtoul 16
%lx unsigned long *x strtoul 16
%X unsigned int *x strtoul 16
%hX unsigned short *x strtoul 16
%lX unsigned long *x strtoul 16
%[...] char x[]
%l[...] wchar_t x[]
%% none