用scanf("%s",array); 的话遇到空格就停止接收后面的字符了,那怎么才能接收带空格的字符串呢?
1.用 gets() ,它可以接收带空格的字符串, 直到回车才结束输入
char buf[80]={0};
gets(buf); //可以读取空格, 回车结束输入2.使用"%[^\n]" 也是可以接收输入一个带空格的字符串,直到回车结束接收
char buf[10] = {0};
scanf("%[^\n]",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, 那么结果将会显示乱码!
"%[^\n]" 之所以能接收带空格的输入,是因为它接收所以的字符输入只要不输入\n (即回车键的转义符)它就一直接收,直到超过变量能够接收的长度,遇到\n 则自动结束输入操作。
下面是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