当我尝试执行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;
}
答案 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;
}
}
}