随堂测试题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;
}
就是标红的这一行,因为他,我浪费了将近三个小时的大好年华。
让输出的是最后一个单词无空格,自己原本把最后一个从循环里单独搞出来单独输出,以为这样就不会在最后一个单词输出空格了
太幼稚!
如果最后一个单词与前面的重复,那不就直接裂开?因此改为先输出空格再输出单词,第一个单词单独输出,不输出空格。
看到“答案正确”的那一刻,我幸福的哭出了声

浙公网安备 33010602011771号