将c-string中的单词复制到c-strings的二维数组中

时间:2014-11-21 01:40:09

标签: c++ computer-science c-strings

所以我需要将一个字符串(字母和空格)转换成一个二维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

2 个答案:

答案 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