1. 程式人生 > >PTA7-26 單詞長度(15 分)通俗解法

PTA7-26 單詞長度(15 分)通俗解法

你的程式要讀入一行文字,其中以空格分隔為若干個單詞,以.結束。你要輸出每個單詞的長度。這裡的單詞與語言無關,可以包括各種符號,比如it's算一個單詞,長度為4。注意,行中可能出現連續的空格;最後的.不計算在內。
輸入格式:
輸入在一行中給出一行文字,以.結束
提示:用scanf("%c",...);來讀入一個字元,直到讀到.為止。
輸出格式:
在一行中輸出這行文字對應的單詞的長度,每個長度之間以空格隔開,行末沒有最後的空格。
輸入樣例:
It's great to see you here.
輸出樣例:

4 5 2 3 3 4

此題雖然是15分,但是我認為20分的水準可以有了,原因在於要考慮的情況比較多,處理起來難。本人第一次提交的時候,5個點,只過了3個,經檢查發現。這兩個點考察得不太符合常規,一個點是輸入只有“.”的時候,雖然沒有單詞,但是你不能輸出0,你除了輸出換行其他什麼都不能輸出。第二個點是“.”前有空格的情況,沒錯,按道理講一行文字以“.”結束,“.”前怎麼能有空格?我想大概是“.”前有空格的情況才是本題的難點,作者為了提高難度,就加上了這個測試點,結果使本人處理了很長時間也沒處理好,於是結合網上答案,寫出如下通俗演算法,並附詳細註釋:

#include<iostream>
using namespace std;
int main()
{
	string s;
	int cnt_ch=0;//統計字元個數 
	int cnt_sp=0;//統計空格個數 
	getline(cin,s);
	int len=s.length();
	for(int i=0;i<len-1;i++)//從第一個字元到倒數第二個字元 
	{
		if(s[i]!=' ')//如果當前字元不為空格 
		{
			if(cnt_sp&&cnt_ch)//如果當前字元前面有空格且空格前有單詞 
			//即存在當前單詞的上一個單詞 
			{
				cout<<cnt_ch<<' ';//輸出上一個單詞長度和空格 
				cnt_ch=0;//字元個數清0,重新計算 
			}//執行完後直到下一個單詞即將判定才執行此分支
			cnt_ch++;//字元個數自增,將當前字元算進去 
			cnt_sp=0;//空格個數清0
		}
		else//如果當前字元為空格 
		cnt_sp++;//空格個數自增 
	}
	if(cnt_ch)//如果字元個數不為0
	cout<<cnt_ch;//輸出最後一個單詞的長度 
	return 0;
}