使用 scanf 分配指针的 char 数组
Assigning char array of pointers with 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);
}
}
- 始终检查
scanf()
的 return 值。
你不是为指针分配space,而是为字节分配,这是主要问题,你需要
char **new_array = malloc(T * sizeof(char *));
/* ^ ^ */
/* allocate pointer to poitners sizeof(pointer) */
if (new_array == NULL)
handleThisErrorAndDoNotTryToWriteTo_new_array();
每个字符串还需要 space 所以
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()
。
在您的代码中,new_array
是 char *
类型,这不是您想要的。您必须将定义更改为
char *new_array[T] = malloc(T * sizeof(char*));
然后,您可以按照您之前的代码使用 scanf()
。
改为执行此操作,以及 body:
的其余部分
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
是指定一个字符串可以有多大。
更多提示:
- 当你用 C 编写时,不要强制转换由
malloc
和 realloc
生成的 void*
。
你应该de-allocate反向使用的内存:
for (i = 0; i < T; ++i)
{
free(new_array[i]);
}
free(new_array);
始终检查内存分配过程是否(不)成功:
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.
}
检查用户是否通过scanf
提供了有效值。
谢谢大家。 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]);
}
我正在尝试使用 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);
}
}
- 始终检查
scanf()
的 return 值。 你不是为指针分配space,而是为字节分配,这是主要问题,你需要
char **new_array = malloc(T * sizeof(char *)); /* ^ ^ */ /* allocate pointer to poitners sizeof(pointer) */ if (new_array == NULL) handleThisErrorAndDoNotTryToWriteTo_new_array();
每个字符串还需要 space 所以
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()
。
在您的代码中,new_array
是 char *
类型,这不是您想要的。您必须将定义更改为
char *new_array[T] = malloc(T * sizeof(char*));
然后,您可以按照您之前的代码使用 scanf()
。
改为执行此操作,以及 body:
的其余部分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
是指定一个字符串可以有多大。
更多提示:
- 当你用 C 编写时,不要强制转换由
malloc
和realloc
生成的void*
。 你应该de-allocate反向使用的内存:
for (i = 0; i < T; ++i) { free(new_array[i]); } free(new_array);
始终检查内存分配过程是否(不)成功:
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. }
检查用户是否通过
scanf
提供了有效值。
谢谢大家。 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]);
}