1. 程式人生 > >C++中sscanf的初級理解

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個引數就是公式,它只要告訴系統,你想要按照什麼樣方式劃分字串。系統就會怎麼劃分。這個函式難就難在這,所以如果你大概好像懂了一點那你就可以看看網上大神的文章。我也是剛剛弄懂得,不好說太多,錯太多了就誤人子弟了。