Matrix不会保留多个值

时间:2017-11-02 19:57:08

标签: c arrays string for-loop codeblocks

这就是代码:

int qtd_alunos, qtd_temas;
char* tnome[1][10];
char* anome[1][10];

printf("\nPra distribuir os temas me diga quantos alunos vao participar e aperte enter, depois a quantidade de temas.");
scanf("%d%d", &qtd_alunos, &qtd_temas);
printf("Agora vai escrevendo o nome de cada tema\n");

for(int j = 0; j<qtd_temas; j++){
    printf("Tema %d\n", j+1);
    scanf("%s", tnome[0][j]);
    printf("%s ok!\n",tnome[0][j]); }
return 0; }

当我运行代码时,程序只保存位置"tnome[0][0]",但当"int j"更改为[0][1]时程序将关闭。我需要了解它为什么会发生。

2 个答案:

答案 0 :(得分:1)

在阅读之前,您需要为字符串分配空间!

使用malloc()执行此操作(例如,在读取输入之前),或声明3D数组,而不是2D。

答案 1 :(得分:1)

您要求scanf将字符串保存到指针中 初始化。它没有任何意义。要解决这个问题,你需要先分配 一些内存手动为你的字符串,然后设置指针。对于 例如:

#define MAX_LEN 101

char *names[10];

for (int i = 0; i < 10; i++)
    names[i] = malloc(sizeof(char) * MAX_LEN);

我不确定为什么你在第一个时使用多维数组 尺寸为1.这些2D阵列可以轻松减少到1D。 如果您打算将它用作一维字符串数组(2D字符),请使用 代替:

char names[10][MAX_LEN];

这里第一个维度是字符串的数量,第二个维度是 它们的大小。由于它是自动分配的,因此您不需要 自己动手。

两个重要的评论:

  • 启用编译器警告。
  • 注意缓冲区溢出:您可以限制字符串的大小 由scanf以格式字符串(即"%100s"
  • 读取