使用scanf分配char数组指针

时间:2015-04-07 12:24:18

标签: c arrays string char scanf

我正在尝试使用scanf来填充一个char指针数组,以将输入存储为字符串。变量T用于动态构建大小为T的数组。然后输入并显示T量的字符串,但是当我填写数组时,例如如果T = 2,第一行可能是狗,第二行是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);
  }
}

4 个答案:

答案 0 :(得分:1)

  1. 始终检查scanf()
  2. 的返回值
  3. 您没有为指针分配空间,但对于字节,这是主要问题,您需要

    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]);
    
  4. 如果启用编译器警告,编译器应警告您将不兼容的类型传递给printf()

    使用scanf()的长度修饰符来防止缓冲区溢出也不错,并且在不再需要指针时不要忘记调用free()

答案 1 :(得分:0)

在您的代码中,new_array的类型为char *,这不是您想要的。您必须将您的定义更改为

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

然后,您可以按照之前的代码使用scanf()

答案 2 :(得分:0)

与身体的其他部分一起改为:

int string_size;
//this begins just after reading T
scanf("%d", &string_size);
char **new_arrays = malloc(T * sizeof(char*));
for(i = 0; i < T; i++)
{
    new_arrays[i] = malloc(string_size * sizeof(char));
}

第一个malloc用于指定所需的字符串数,第二个malloc用于指定字符串的大小。

进一步提示:

  1. 当您使用C语言写作时,请不要投放由void*malloc制作的realloc
  2. 您应该反向分配使用的内存:

    for (i = 0; i < T; ++i)
    {
        free(new_array[i]);
    }
    free(new_array);
    
  3. 始终检查内存分配过程是否成功:

    char **new_arrays = malloc(T * sizeof(char*));
    if(new_arrays == NULL)
       exit(0) //e.g.
    for(i = 0; i < T; i++)
    {
        new_arrays[i] = malloc(string_size * sizeof(char));
        if(new_arrays[i] == NULL)
            exit(0) //e.g.
    }
    
  4. 检查用户是否通过scanf提供了有效值。

答案 3 :(得分:0)

谢谢大家。 char *数组中字符串的长度不能超过1000个字符,因此硬编码。这是最终的工作代码......

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

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


  char **new_array = malloc(T * sizeof(char*));
  for (i = 0; i < T ; i++)
  {
    new_array[i] = malloc(1000 * sizeof(char));
    scanf("%s", new_array[i]);
  }

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