c - 使用 scanf 分配指针的 char 数组

标签 c arrays string char scanf

我正在尝试使用 scanf 填充 char 指针数组,以将输入存储为字符串。变量 T 用于动态构建大小为 T 的数组。然后输入并显示 T 数量的字符串,但是当我填写数组时,例如如果 T = 2 第一行可以是 dog,第二行可以是 cat,它会打印出“cdog”和“cat”。所以第一个字符串的第一个字母然后是第二个字符串的所有字母。我不确定我使用 char* 的错误在哪里。任何帮助,将不胜感激。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main()
{
  int T;
  int i;
  scanf("%d",&T);


  char *new_array = (char*)malloc(T * sizeof(char));

  for (i = 0; i < T; ++i)
  {
    scanf("%s", new_array+i);

  }

  for (i = 0; i < T; i++)
  {
    printf("%s\n", new_array+i);
  }
}

最佳答案

  1. 始终检查 scanf() 的返回值。
  2. 你不是为指针分配空间,而是为字节分配空间,这是主要问题,你需要

    char **new_array = malloc(T * sizeof(char *));
    /*    ^                                   ^             */
    /* allocate pointer to poitners         sizeof(pointer) */  
    if (new_array == NULL)
        handleThisErrorAndDoNotTryToWriteTo_new_array();
    

    每个字符串还需要空格

    new_array[i] = malloc(1 + lengthOfTheString);
    if (new_array[i] == NULL)
        handleThisErrorAndDoNotTryToWriteTo_new_array_i();
    

    scanf() 之前,而不是 scanf("%s", new_array + i) 这样做

    scanf("%s", new_array[i]);
    

如果启用编译器警告,编译器应该警告您正在将不兼容的类型传递给 printf()

最好为 scanf() 使用长度修饰符以防止缓冲区溢出,并且不要忘记调用 free() 当你没有不再需要指点。

关于c - 使用 scanf 分配指针的 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29491530/

相关文章:

c - 如何从字符串中删除插入的字母?

java - 如何将java对象转换为Object[]?

ruby - 用 7n +1 填充 ruby​​ 中的数组

c++ - 字符串的哈希函数不适用于某些字符串?

java - 既然我们已经有了 StringBuilder,为什么还要使用 StringJoiner?

java - 用于指定空字符串的正则表达式

c - 为什么 k[5] 元素的值被实例化为 0?

C简单输入问题

c - 重用变量是好是坏?

python - 将所有非零值放在数组的右边