c - C中的问题与重复元素的字符串数组
问题描述
我正在尝试获取未知数量的控制台输入行,使用 malloc 将每一行转换为字符串,然后通过每次动态重新分配内存将每个字符串添加到字符串数组中。我的目标是有一个数组,其中每个元素都是控制台输入的不同行(while 循环应该以 EOF 结尾)。
我的代码如下。
char * inputString = (char *)malloc(100);
char * aWord = (char *)malloc(1);
char ** listWords = (char **)malloc(1);
int wordCount = 0;
while (fgets(inputString, 100, stdin) != NULL)
{
wordCount++;
*(inputString + (strlen(inputString) - 1)) = '\0';
aWord = (char *)realloc(aWord, strlen(inputString) + 1);
aWord = inputString;
listWords = realloc(listWords, sizeof(char) * wordCount);
*(listWords + (wordCount - 1)) = aWord;
}
for (int i = 0; i < wordCount; i++)
printf("%s\n", listWords[i]);
如果我要在控制台中输入
abc\n
b\n
cad\n
^Z\n
理论上,我希望我的代码打印出来
abc\n
b\n
cad\n
每行控制台输入。相反,它打印
cad\n
cad\n
cad\n
最后一行输入。非常感谢帮助
解决方案
首先是这样的:
aWord = (char *)realloc(aWord, strlen(inputString) + 1);
aWord = inputString;
在这里您为 分配空间aWord
,然后用 中包含的地址覆盖返回的地址inputString
。因此,您读取的每个字符串最终都会覆盖前一个字符串。您还应该使用malloc
而不是realloc
因为您想获得一个新的缓冲区而不是重用现有的缓冲区。
更改对 strcpy 的realloc
调用malloc and instead of assigning one pointer to the other, use
以复制它。
aWord = malloc(strlen(inputString) + 1);
strcpy(aWord, inputString);
然后在这一行:
listWords = realloc(listWords, sizeof(char) * wordCount);
您只需为字符数组而不是字符指针数组分配足够的内存。这导致写入超过分配内存的末尾,调用undefined beahvior。
正确的分配是:
listWords = realloc(listWords, sizeof(char *) * wordCount);
推荐阅读
- excel - Power Pivot 2016 中的 DAX 计算度量
- python - Python3 不正确的 AES 密钥长度(256 字节)
- reactjs - Firebase 提取时间过长
- php - 这个文件操作真的是“原子的”和“安全的”吗?如果没有,我怎么能做到这一点?
- asp.net-core - 在 Docker Compose 环境中运行时,ASP.NET Core WebApplicationFactory CreateClient 在 GitLab CI 上启动服务器阻塞
- python - 如何以编程方式报告数据集中合理的局部最大值和最小值?
- c# - 如何将设置点转换为 GraphicsPath
- numpy - FutureWarning:不推荐使用非元组序列进行多维索引;使用 `arr[tuple(seq)]` 而不是 `arr[seq]`
- javascript - Vue测试无法触发点击
- django - 如何在 DJango 中获取 type=time 字段