1. 程式人生 > 實用技巧 >隨堂測試題2:整到崩潰的文字單詞去重

隨堂測試題2:整到崩潰的文字單詞去重

題目:請用C++編寫一個預處理小程式,將輸入一行文字進行預處理,要求根據標點將文字切割成英文單詞(除了字母其他字元均視為標點),每個英文單詞中將大寫字母轉換成小寫字母,並統計出英文單詞的個數(重複出現的單詞算一個),最後依照文章中單詞出現的順序輸出處理後的英文單詞以及處理後單詞的總數。

輸入

一行文字,長度不超過100字元(英文單詞數不超過50),含空格,標點、數字。

輸出

兩行,第一行依次輸出各單詞,空格隔開,最後一個詞後無空格;第二行輸出單詞總數。

樣例輸入
"To be or not to be!"----that is a question!
樣例輸出
to be or not that is a question
8

本題沿用做第一題的思想,完美實現將所有單詞儲存在二位char陣列中

剛開始單詞去重還想著寫迴圈把重複的單詞改成\0,但是其實不需要,只需要輸出時判斷前面是否輸出過一樣的就行了

寫到這,以為大功告成

萬萬沒想到,

在提交答案的時候遇到了一系列問題,讓我接近崩潰。

一直有格式錯誤,逼得我開始口吐芬芳。

直到搞到了測試點,才知道自己哪錯了

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
char x[10][20];
int main()
{
    char
a[100]; cin.getline(a, 100); int len = strlen(a); a[len] = ' '; for (int i = 0; i < len; i++) { if (a[i] == ' ' || (a[i] >= 'a' && a[i] <= 'z')) continue; else if (a[i] >= 'A' && a[i] <= 'Z') a[i] = a[i] + 'a' - 'A';
else a[i] = ' '; } int num = 0; int length = 0; for (int i = 0; i <= len; i++) { int offset = 0; if (a[i] != ' ') length++; else if (length > 0) { for (int j = i - length; j < i; j++) { x[num][offset++] = a[j]; } num++; length = 0; } } int realnum = 0; int i=0; int flag = 1; for (int j = 0; j < i; j++) { if (strcmp(x[j], x[i]) == 0) { flag = 0; } } if (flag) { cout << x[i]; realnum++; } for (i=1; i < num; i++) { int flag = 1; for (int j = 0; j < i; j++) { if (strcmp(x[j], x[i]) == 0) { flag = 0; } } if (flag) { cout << " " << x[i]; realnum++; } } cout << endl << realnum; return 0; }

就是標紅的這一行,因為他,我浪費了將近三個小時的大好年華。

讓輸出的是最後一個單詞無空格,自己原本把最後一個從迴圈裡單獨搞出來單獨輸出,以為這樣就不會在最後一個單詞輸出空格了

太幼稚!

如果最後一個單詞與前面的重複,那不就直接裂開?因此改為先輸出空格再輸出單詞,第一個單詞單獨輸出,不輸出空格。

看到“答案正確”的那一刻,我幸福的哭出了聲