天天看點

c++ 使用範圍for語句和ispunct函數來統計string對象中标點的個數(詳細講解其中的所有問題)

先代碼:

#include<iostream>
#include<string>
#include<cctype>
using namespace std;

int main()
{
	string s("Hello world!?");
	decltype(s.size()) punct_cnt = 0;
	for (auto c : s)
		if (ispunct(c)) 
			punct_cnt++;
	cout << punct_cnt
		<< " punctuation characters in  "
		<< s << endl;
	system("pause");
	return 0;
}
           

第一個問題:這個decltype是什麼東西,怎麼個用法?

這是一個類型說明符,用法decltype(expression)

詳細請看

https://blog.csdn.net/zy2317878/article/details/79414096

第二個問題:decltype 後邊的這個s.size() 以及punct_cnt 是啥東西

s.size()是一個傳回類型,傳回string對象的長度(即string對象中字元的個數)

不是int類型,可以肯定的是一個無符号類型的值

是以,這裡傳回一個類型,然後,punct_cnt 就是這個類型,把他的初始值賦為0(即标點符号的個數剛開始是0)

第三個問題:for為什麼這麼用?

這是c++11 的新的語句 for(declaration:expression)

statement;

例如,for(int a : str) //str[]是一個數組

cout << a << endl;

什麼意思呢,就是說,每一次循環,str的一個元素就給了a,然後輸出a,也就是周遊,對str[0]完了以後,接着就是str[1],一直到結束。

這個是最簡單的例子,假如像上邊的,c是s的第一個字元,然後進入if語句,判斷這個字元是不是标點,是标點,就傳回1,然後punct_cnt ++ ,不是的話,c就成了s的第二個字元,一直這樣,一直到結束符為止。

關于這個ispunct函數,它包含在cctype頭檔案中,具體可以看這裡https://blog.csdn.net/zy2317878/article/details/79414096

最後輸出。

我用vs2019,注釋了這個cctype,編譯仍然能通過,并且還能過運作,我很奇怪,能指導的朋友指導指導!感激。

繼續閱讀