所以我需要将一个字符串(字母和空格)转换成一个二维c字符串数组。 2D数组的每个“行”必须由字母和仅字母组成。从本质上讲,我需要用句子的话来形成一个数组。
例如:“我很不高兴,因为我的全新bmw lis被盗”应该变成2d c-string数组,如:“im”,“upset”,“that”,“on”,“nov” , “日”, “我的”, “崭新”, “宝马”, “三里屯”, “中”, “偷”。 (请注意,“th”和“my”之间有两个空格字符&“my”和“brandnew”)
以下代码在我的控制台中给了我一些有趣的输出...
char document[201] = "im upset that on nov th my brandnew bmw lis were stolen";
char documentArray[13][201];
for (int i, k, j = 0;document[k] != '\0';)
{
if (isspace(document[k]))
{
cout << "found a space" << endl;
k++;
while (isspace(document[k]))
{
k++;
}
i++;
j = 0;
}
if (isalpha(document[k]))
{
documentArray[i][j] = document[k];
k++;
j++;
}
}
for (int i = 0; i < maxWords +1; i++)
{
cout << documentArray[i] << endl;
}
产生的输出中有一些奇怪的东西。我不知道这意味着什么(如果你能告诉我那将是非常棒的)。你能帮我解决这个问题吗?
这是控制台输出:
im\203\377
upset
that
on
nov
th
my\3261
brandnew
bmw_\377
lis
were
stolen\301$r\377
\377
答案 0 :(得分:0)
尝试在复制到2D数组时将终止空字符添加到C字符串的末尾。
在C字符串中由以&#39; \ 0&#39;终止的字符数组表示。字符。您看到的奇怪代码很可能是&#39; \ 0&#39;没有遇到和字符数组末尾的打印运行。
答案 1 :(得分:0)
在j++;
行之后插入以下内容
if (j < 201) {
documentArray[i][j+1] = '\0'; # terminate the c string
} else {
documentArray[i][j] = '\0'; # cannot terminate the c string, overwrite the last char to terminate the string
}
但请确保每次读写操作都不会超过数组尺寸。
您的数组限制是documentArray [0..12] [0..200]。 请一定要检查一下。 =&GT; http://en.wikipedia.org/wiki/Buffer_overflow