【问题标题】:Matrix doesn't keep more than one value [closed]矩阵不保留多个值[关闭]
【发布时间】:2017-11-02 19:57:07
【问题描述】:

那是代码:

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] 时,程序关闭。我需要了解为什么会这样。

【问题讨论】:

  • here 是答案,this 答案就足够了。
  • 在询问运行时问题时,就像这个问题一样,发布minimal reproducible example
  • 在调用任何scanf() 系列函数时: 1) 始终检查返回值(而不是参数值)以确保操作成功。 2) 当使用 '%s' 或 '%[...]' 输入转换说明符时,始终包含比输入字段长度小 1 的 MAX CHARACTERS 修饰符。少一个,因为scanf() 总是为这些说明符附加一个 NUL 字节。

标签: c arrays string for-loop codeblocks


【解决方案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。 如果您打算将其用作一维字符串数组(二维字符),则使用 而是:

char names[10][MAX_LEN];

这里第一个维度是字符串的数量,第二个维度是 它们的大小。而且由于它是自动分配的,所以你不需要 自己做吧。

两个重要的说明:

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

【讨论】:

  • 我删除了 MAX_LEN 并改为: tnome[j] = malloc(sizeof(char));现在它工作得很好,我使用的是一维数组。
  • @ThiagoBarboza 你为单个字符分配了空间。示例MAX_LEN 只是字符串的大小。使用适合您需要的任何内容。
  • 我明白了。如果我需要在控制台写一个更大的单词,程序可能会返回一个错误。感谢您的提示。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-05-06
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 2016-06-09
    相关资源
    最近更新 更多