找到重复的单词

时间:2017-11-30 19:26:22

标签: c++

当我尝试执行double while循环时,我的代码崩溃了。这是我的作业,所以我不能使用任何算法或string。只允许使用char数组。 有人可以帮我修复它。

#include <iostream>
#include <limits>
#include <cstring>

using namespace std;

int main()
{
    const char sepTxt[] = ".,:;()!%^?<>- ";
    int szTxt;
    char *txt = new char[256];
    cout << "Enter text length: ";
    cin >> szTxt;
    while(cin.fail())
    {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "\nFail. Try again.\nEnter text length: ";
        cin >> szTxt;
    }
    cin.ignore(1,'\n');
    cout << "Enter text: ";
    cin.getline(txt,szTxt);
    while (cin.fail() || strlen(txt) < 1)
    {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "\nFail. Try again.\nEnter text: ";
        cin.getline(txt,szTxt);
    }
    char *txtTmp = new char [szTxt]; //initialization dynamic arr for temp copy of entered text
    strncpy(txtTmp, txt, szTxt); //copy entered text to txtTmp
    char *bufTxt = strtok(txt, sepTxt); //find first word;
    char resTxt[256] = {};
    while (bufTxt) //crash here;
    {
        bufTxt = strtok(NULL, sepTxt);
        while ((txtTmp = strstr(txtTmp, bufTxt)))
        {
            strcat(resTxt,bufTxt);
            strcat(resTxt," ");
            txtTmp+=strlen(bufTxt);
        }
    }
    cout << "\nDouble words: " << resTxt;
    delete []txt, txtTmp;
}

1 个答案:

答案 0 :(得分:1)

您必须简化代码,例如分配局部变量char *txt = new char[256];然后删除它是没用的,因为256是常量。在这种情况下,char txt[256];会更好。

您询问用户文本的时长,但您基本上忽略了该大小。假设256就够了。如果文本长度超过256,则不能使用txt,而是必须根据该大小动态分配。

您可以继续使用strtok,无需额外的工作。

const char sepTxt[] = ".,:;()!%^?<>- ";
char txt[256];
cin.getline(txt, sizeof(txt));

char *previous = nullptr;
char *token = strtok(txt, sepTxt);
while(token)
{
    token = strtok(nullptr, sepTxt);
    if(previous && token && strcmp(previous, token) == 0)
        cout << "duplicate " << token << endl;
    previous = token;
}

如果重复项不会彼此相邻,那么您必须阅读数组中的单词。如果txt长度为256个字节,那么可以安全地假设不会超过256个字,您可以声明char *arr[256]并将每个元素分配给标记值。例如:

char *arr[256] = { NULL };
int count = 0;
while(token)
{
    arr[count++] = token;
    token = strtok(nullptr, sepTxt);
    previous = token;
}

for(int i = 0; i < count; i++)
{
    for(int j = i + 1; j < count; j++)
    {
        if(strcmp(arr[i], arr[j]) == 0)
        {
            cout << "duplicate " << arr[i] << endl;
            break;
        }
    }
}