2

我的作业有一个小问题。整个程序是关于树数据结构的,但我对此没有任何问题。

我的问题是关于一些基本的东西:从用户输入中读取字符串,然后将它们存储在数组列表中

char str[1000];

fgets(str, 1000, stdin);

int x = 0;
int y = 0;
int z = 0;

char **list;
list = (char**)malloc((x+1)*sizeof(char));
list[x] = (char*)malloc((y+1)*sizeof(char));

while(str[z] != '\n')
{
    list[x][y] = str[z];
    z++;

    if(str[z] == ',')
    {

        x++;
        y = 0;

        list = (char**)realloc(list, (x+1) * sizeof(char*));
        list[x] = (char*)malloc((y + 1)*sizeof(char));

        z++;
        if(str[z] == ' ') // Skips space after the comma
        {
            z++;
        }

    }
    else if(str[z] == '\n')
    {
        break;
    }
    else
    {
        y++;
        list[x] = (char*)realloc(list[x], (y+1)*sizeof(char));

    }

}

我将此列表数组传递给另一个函数。例如,输入可能类似于

Abcde, Fghijk, Lmnop, Qrstu

我正在尝试将这些单词中的每一个拆分到数组列表中

Abcde
Fghijk
Lmnop
Qrstu

当我尝试输出字符串时,有时会感到奇怪,过多的字符,例如倒置的问号和数字。

printf("%s ", list[some_number]);

得到我

Fghijk¿

或者

Fghijk\200

我的所有程序都按预期工作,除了这个我无法解决的小问题。即使使用相同的确切输入,错误也可能会出现,也可能不会出现。我猜它与内存分配有关?

谢谢你的帮助!

4

3 回答 3

3

您需要将 '\0' 放在新字符串的末尾。

于 2013-06-04T15:11:15.860 回答
2

请参阅大多数C库函数,例如printfstrlen处理假设\0为所有结束字符的字符串。否则,他们会继续越界读取内存,要么造成内存违规,要么获取一些值0和停止的位置,并且内存中的所有字节都被解释为它们的extended ascii等价物,因此你会遇到这种奇怪的行为。

因此,为字符分配一个额外的字节\0并将其分配给最后一个字节。

于 2013-06-04T15:15:56.707 回答
0

要么将你的变量初始化为空,要么像番茄所说的那样,在新字符串的末尾放置一个空字符。

在内存管理方面,C 缺乏程序员现在认为理所当然的许多奢侈品。你在正确的道路上,malloc但该功能只分配内存......它不会清除它。结果,您的变量将具有正确的空间量(对于减少内存泄漏和溢出错误至关重要),但将被垃圾填充。这种垃圾可以是任何东西,在你的情况下,它是一个颠倒的问号。合适,你不觉得吗?

我可能弄错了,因为没有更多信息我无法自己运行代码,但是在你

char **list;
list = (char**)malloc((x+1)*sizeof(char));
list[x] = (char*)malloc((y+1)*sizeof(char));

陈述,你会想做这样的事情:

list = NULL;

之类的清理垃圾。

此外,您可能需要使用该strlen()函数(包含在 中string.h)来确定您需要分配多少内存块。

清除用于变量的空格是学习 C 语言的好习惯。很高兴看到您也学习它。

于 2013-06-04T15:23:06.740 回答