C++中sscanf的初级理解

吃饱了没事,翻了翻网上的一些程序面试题,看到了C++这么一道题
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个参数就是公式,它只要告诉系统,你想要按照什么样方式划分字符串。系统就会怎么划分。这个函数难就难在这,所以如果你大概好像懂了一点那你就可以看看网上大神的文章。我也是刚刚弄懂得,不好说太多,错太多了就误人子弟了。

猜你喜欢

转载自blog.csdn.net/www1157763637qqcom/article/details/17739221