吃饱了没事,翻了翻网上的一些程序面试题,看到了C++这么一道题
结果是n的值为146,str为age,p为age 146,那么别以为这个sscanf函数这么简单,如果这么简单网络上的前辈就不会像开头写的那么深奥。
是不是很像正则表达式?说实话:第2个参数就是公式,它只要告诉系统,你想要按照什么样方式划分字符串。系统就会怎么划分。这个函数难就难在这,所以如果你大概好像懂了一点那你就可以看看网上大神的文章。我也是刚刚弄懂得,不好说太多,错太多了就误人子弟了。
void DoSomeThing(char* p) { char str[16]; int n; assert(NULL != p); sscanf(p, "%s%d", str, n); if (0 == strcmp(str, "something")) { ... } }
我表示不会sscanf();本着学习的精神,来翻看人家网上前辈们的解释,我觉得我被转晕了。什么东西啊?这句话是这么说的:“sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据”,没有责备的意思。我表示第一次看时,没分清东南西北,一个没有基础的菜鸟看这个....说的太深了。下面我就以一个菜鸟的角度来引领完全不懂的码农懂方位。
首先说一下sscanf(p,"%s%d",str,&n)这段代码的作用:把字符串P按照字符串和数字来拆分并放入str和n中,什么意思呢?举个例子p=“age 19”,我们使用上面的函数的结果是字符串str="age"和n=19。这就是sscanf()的作用。是不是有点懂了。sscanf的作用就是把一个字符串按照目的的切分。代码说话
char str[5]; char *p="age 146"; int n=21,m=33; sscanf(p, "%s%d",str, &n); cout<<n<<endl; cout<<str<<endl; cout<<p<<endl;
结果是n的值为146,str为age,p为age 146,那么别以为这个sscanf函数这么简单,如果这么简单网络上的前辈就不会像开头写的那么深奥。
sscanf函数中的第2个参数是有难度的。比如如果上面的代码中char *p的值为age:146你会发现sscanf函数貌似没有用。为什么?因为前面例子中age和146是有空格分开的,这一个例子中是“:”,前面例子中,sscanf函数会默认p中的空格会切割字符串,怎么理解呢?以上面为例,你把P切分为字符串和整数,中间总要一个界限或者是准则。这个准则的前面是字符串这个准则的后面是数字。空格就是一个准则,我们可以想一下,你一段字符串中如果有空格,那肯定空格的前后是2个信息。但是“:”不是这个准则。怎么划分?这个就是第二个函数的作用。把第2个参数换成下面
char str[5]; char *p="Hell:146"; int n=21,m=33; sscanf(p, "%[A-z,]:%d",str, &n); cout<<n<<endl; cout<<str<<endl; cout<<p<<endl;
是不是很像正则表达式?说实话:第2个参数就是公式,它只要告诉系统,你想要按照什么样方式划分字符串。系统就会怎么划分。这个函数难就难在这,所以如果你大概好像懂了一点那你就可以看看网上大神的文章。我也是刚刚弄懂得,不好说太多,错太多了就误人子弟了。