矩阵不保留多个值
Matrix doesn't keep more than one value
也就是代码:
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]
时程序关闭。我需要了解为什么会这样。
您需要先为您的字符串分配 space 才能读取它们!
使用 malloc()
这样做(例如在读取输入之前),或者声明 3D 数组,而不是 2D。
您要求 scanf
将字符串保存到指针中
未初始化。它指向任何地方。要解决此问题,您需要先分配
手动为您的字符串分配一些内存,然后设置指针。为了
示例:
#define MAX_LEN 101
char *names[10];
for (int i = 0; i < 10; i++)
names[i] = malloc(sizeof(char) * MAX_LEN);
我不确定你为什么在第一次使用时使用多维数组
维度的大小为 1。这些二维数组可以很容易地简化为一维。
如果您打算将其用作一维字符串数组(字符的二维),则使用
相反:
char names[10][MAX_LEN];
这里第一个维度是字符串的数量,第二个维度是
它们的大小。而且因为它是自动分配的,所以你不需要
自己做。
两条重要说明:
- 启用编译器警告。
- 小心缓冲区溢出:您可以限制字符串的大小
在格式字符串中由
scanf
读取(即 "%100s"
)
也就是代码:
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]
时程序关闭。我需要了解为什么会这样。
您需要先为您的字符串分配 space 才能读取它们!
使用 malloc()
这样做(例如在读取输入之前),或者声明 3D 数组,而不是 2D。
您要求 scanf
将字符串保存到指针中
未初始化。它指向任何地方。要解决此问题,您需要先分配
手动为您的字符串分配一些内存,然后设置指针。为了
示例:
#define MAX_LEN 101
char *names[10];
for (int i = 0; i < 10; i++)
names[i] = malloc(sizeof(char) * MAX_LEN);
我不确定你为什么在第一次使用时使用多维数组 维度的大小为 1。这些二维数组可以很容易地简化为一维。 如果您打算将其用作一维字符串数组(字符的二维),则使用 相反:
char names[10][MAX_LEN];
这里第一个维度是字符串的数量,第二个维度是 它们的大小。而且因为它是自动分配的,所以你不需要 自己做。
两条重要说明:
- 启用编译器警告。
- 小心缓冲区溢出:您可以限制字符串的大小
在格式字符串中由
scanf
读取(即"%100s"
)