我正在尝试编写一个c程序,它将从Linux管道和 将每个单词放到数组中遇到\ n时。然后输出单词。当数组包含少于3 \ n时,它可以工作但如果输入中有3 \ n,则它会给出分段错误。这是我写的代码,请帮忙。我是编程新手,所以请尽量使代码尽可能完整。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int out=0;
int in=0;
char **arr2D;
int i;
int flag = 1;
arr2D=(char**)malloc(out*sizeof(char*));
for(i=0;i<out;i++)
arr2D[i]=(char*)malloc(in*sizeof(char*));
while (!feof(stdin))
{
in = in +1;
arr2D[out]=(char*)realloc(arr2D[out],(in)*sizeof(char*));
scanf("%c",&arr2D[out][i]);
i=i+1;
if(arr2D[out][i-1]=='\n')
{
out=out+1;
arr2D=(char**)realloc(arr2D,out*sizeof(char*));
i=0;
in=0;
}
}
int out2=0;
int in2=0;
do
{
do
{
printf("%c",arr2D[out2][in2]);
in2++;
}
while(in2<=in-1);
out2++;
in2=0;
}
while(out2<=out);
printf("\n");
return 0;
}
答案 0 :(得分:2)
以下代码正常工作:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int out = 1;
int in = 1;
char **arr2D;
int i = 0;
arr2D = malloc(out * sizeof(char *));
for (i = 0; i < out; i++)
/* IMPORTANT */
arr2D[i] = malloc(in * sizeof(char));
while (!feof(stdin)) {
scanf("%c", &arr2D[out - 1][in - 1]);
in++;
if (arr2D[out - 1][in - 2] == '\n') {
arr2D[out - 1][in - 2] = '\0';
out++;
arr2D = realloc(arr2D, out * sizeof(char *));
/* IMPORTANT */
arr2D[out - 1] = NULL;
in = 1;
}
/* IMPORTANT */
arr2D[out - 1] = realloc(arr2D[out - 1],in * sizeof(char));
}
int out2 = 0;
do {
printf("%s\n", arr2D[out2++]);
} while(out2 < out);
printf("\n");
return 0;
}
答案 1 :(得分:0)
您尚未在i
循环中正确初始化变量while
。
int i;
scanf("%c",&arr2D[out][i]);
答案 2 :(得分:0)
首先为out
个元素分配一个缓冲区,然后继续使用arr2D[out]
访问第一行中超出范围的realloc()
。请记住,C中数组int arr[size]
的索引始终是从0
到size-1
,arr[size]
永远都不行。
供参考:分配线是第一个malloc()
电话:
arr2D=(char**)malloc(out*sizeof(char*));
并且具有第一个未定义行为的行是while()
循环中的第二行:
arr2D[out]=(char*)realloc(arr2D[out],(in)*sizeof(char*));
在第一个while()
循环中。这是调用未定义行为的点,之后允许发生任何事情。
答案 3 :(得分:0)
Parham的方法似乎有效,而且我找到了另一种方法,尽管我不确定这样做是否有问题,但它确实有效。
当我分配或重新分配的时候,我将* sizeof(char)乘以一个大数字的缓冲区大小。