gpt4 book ai didi

c - 我想用指针将一些字符串放在动态二维数组中(C 编程)

转载 作者:行者123 更新时间:2023-11-30 16:35:16 26 4
gpt4 key购买 nike

嗨,我想从用户那里获取一些字符串,然后将它们放入二维数组中,然后最后打印数组中的每个字符位置进行测试。(我正在 Visual Studio 2017 上写作)但我得到的输出是这样的:

    marray[1][2]==   
marray[1][3]==
marray[1][3]==

我正在为所有单元格获取此信息。这是到目前为止我的代码:

#include <stdio.h>  
#include <stdlib.h>
void inputnames(char**, int, int);
void printitems(char**, int, int);
int main(void)
{
int m;
const int n = 30; //students name limit
printf("Enter Number of students:");
scanf_s("%d ", &m); //getting row size from user

//---------------------------------------------
char** p;
p = (char**)malloc(sizeof(char)*m);
for (int i = 0; i < m; i++)
{ //this part for allocating 2d array
p[i] = (char*)malloc(sizeof(char)*n);
}
//--------------------------------------------
inputnames(p, m, n); //filling 2D array
printitems(p, m, n); //print each character with position for test
getchar();
}
void inputnames(char** marray, int mm, int nn)
{
int i = 0, j = 0;
for (i = 0; i<mm; i++)
{
while (marray[i][j] != '\n' && j<nn)
{
scanf_s("%c", &marray[i][j]);
}
}//end of for i
}
void printitems(char** marray, int mm, int nn) //this function is for test
{
int i = 0, j = 0;
for (i = 0; i<mm; i++)
{
for (j = 0; j<nn; j++)
{
printf("marray[%d][%d]=%c\n",i,j,marray[i][j]);

}//end of for j
}//end of for i
}

最佳答案

您的代码中有几个错误。

Don't cast malloc 。并且您分配的字节数不正确两次。我建议你不要使用sizeof(<type>) ,很容易制作错误,最好调用malloc像这样:

int *arr = malloc(size * sizeof *arr);

无论 arr 的类型如何,您将分配正确的数量内存。

您必须检查是否 malloc返回NULL 。如果返回NULL你不能访问内存。

还要记住,字符串必须是 '\0' -终止,对于长度的字符串 n ,您需要n+1字节。您要么分配 n+1字符串的空格,或者在inputnames你应该检查是否 j < nn - 1 。另外你也没有设置 '\0' -inputnames中的终止字节.

正确的分配是:

char** p;
// calloc initializes the memory to 0,
// great initialization, helps you free the memory faster
// on error
p = calloc(m, sizeof *p);
if(p == NULL)
{
fprintf(stderr, "not enough memory\n");
return 1;
}

for (size_t i = 0; i < m; i++)
{
p[i] = calloc(1, n+1); // size of char is 1
if(p[i] == NULL)
{
fprintf(stderr, "not enough memory\n");
free_strings(p, m);
return 1;
}
}

您需要 free_strings功能:

void free_strings(char **strings, size_t len)
{
if(strings == NULL)
return;

for(size_t i = 0; i < len; ++i)
free(strings[i]);
free(strings);
}

而且你的阅读效率不高,我会使用fgets相反:

int inputnames(char** marray, size_t mm, size_t nn)
{
if(marray == NULL || mm == 0 || nn == 0)
return 0;

for(size_t i = 0; i < mm; ++i)
{
printf("Enter text #%d: ", i+1);
fflush(stdout);

if(fgets(marray[i], nn, stdin) == NULL)
{
fprintf(stderr, "cannot read anymore\n");
return 0;
}

// removing the newline
marray[i][strcspn(marray[i], "\n")] = 0;
}

return 1;
}

我忘了在答案中提及这一点:

for (i = 0; i<mm; i++)
{
while (marray[i][j] != '\n' && j<nn)
{
scanf_s("%c", &marray[i][j]);
}
}//end of for i

这会产生未定义的行为。你只分配内存但不分配初始化它,所以你实际上是在检查随机值是否等于新队。您也不增加 j ,你总是在同一个地方写作。您需要先阅读,然后再检查。

for(i = 0; i<mm; i++)
{
do {
if(scanf_s("%c", marray[i] + j) != 1)
{
fprintf(stderr, "Unable to read from stdin\n");
marray[i][j] = 0;
return;
}
} while(marray[i][j++] != '\n' && j<nn);

marray[i][j-1] = 0; // setting the \0-terminating byte
}

printitems应该看起来像这样:

void printitems(char** marray, size_t mm)
{
if(marray == NULL || mm == 0 || nn == 0)
return;

for(size_t i = 0; i < mm; ++i)
puts(marray[i]);
}

另外,当您不再需要内存时,请不要忘记释放它。

关于c - 我想用指针将一些字符串放在动态二维数组中(C 编程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48995636/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com