C 将字符串作为输入到指向字符串的指针数组中并显示它们

C 将字符串作为输入到指向字符串的指针数组中并显示它们,c,arrays,pointers,string,C,Arrays,Pointers,String,我打算将字符串存储到指向字符串的指针数组中,然后按如下方式显示它们: 字符*方向[3]; fori=0;i您所拥有的只是指向字符串的指针。在尝试使用scanf读取之前,需要使这些指针指向有效的内存位置 您所拥有的只是指向字符串的指针。在尝试使用scanf读取之前,需要使这些指针指向有效的内存位置 您有一个大小为3的字符指针数组。这些指针不指向任何有效内存,您可以在其中存储正在读取的某些字符串。尝试写入无效内存会调用UB。在这里,UB以分段错误的形式出现,很可能是因为您试图写入无法控制的位置 首

我打算将字符串存储到指向字符串的指针数组中,然后按如下方式显示它们:

字符*方向[3];
fori=0;i您所拥有的只是指向字符串的指针。在尝试使用scanf读取之前,需要使这些指针指向有效的内存位置


您所拥有的只是指向字符串的指针。在尝试使用scanf读取之前,需要使这些指针指向有效的内存位置


您有一个大小为3的字符指针数组。这些指针不指向任何有效内存,您可以在其中存储正在读取的某些字符串。尝试写入无效内存会调用UB。在这里,UB以分段错误的形式出现,很可能是因为您试图写入无法控制的位置

首先试着分配一些内存:比如说一个足够大的缓冲区,可以读取整行或你认为会遇到的最大字符串。读入,分配一个方向数组成员,然后按如下方式将其复制出来:

char *directions[ 3 ];
const MAX_LINE_SIZE = 256;
char line[ MAX_LINE_SIZE ];

for (size_t nstr = 0; nstr < 3; ++nstr) {
      if (fgets( line, MAX_LINE_SIZE, stdin ) != NULL) {
           directions[ nstr ] = malloc( strlen( line ) );
           strcpy( directions[ nstr ], line );
      }
      printf( "%s\n", directions[ nstr ] );
}

您有一个大小为3的字符指针数组。这些指针不指向任何有效内存,您可以在其中存储正在读取的某些字符串。尝试写入无效内存会调用UB。在这里,UB以分段错误的形式出现,很可能是因为您试图写入无法控制的位置

首先试着分配一些内存:比如说一个足够大的缓冲区,可以读取整行或你认为会遇到的最大字符串。读入,分配一个方向数组成员,然后按如下方式将其复制出来:

char *directions[ 3 ];
const MAX_LINE_SIZE = 256;
char line[ MAX_LINE_SIZE ];

for (size_t nstr = 0; nstr < 3; ++nstr) {
      if (fgets( line, MAX_LINE_SIZE, stdin ) != NULL) {
           directions[ nstr ] = malloc( strlen( line ) );
           strcpy( directions[ nstr ], line );
      }
      printf( "%s\n", directions[ nstr ] );
}

您不需要标准C中的强制转换。此外,sizeofchar==1(按定义),因此被乘数是冗余的。您不需要标准C中的强制转换。此外,sizeofchar==1(按定义),因此被乘数是冗余的。我还尝试将字符串存储在二维数组中,即char directions[100][15],并且可以成功地存储和打印它们,但是如何在switch case语句中使用它呢?我的意思是当我这样做时:charp=dir[I][0];switchp{caseNorth…}然后我得到一个错误,从char到char的转换无效,并且开关数量不是一个应该工作的整数1。可能15对于字符串来说太小了,因此会导致崩溃。请记住,第一维度100基本上是长度为15的字符串的数量。你是说15根长度为100的弦吗?在这种情况下,交换标注值。2不能打开字符串。案例标签必须在编译时可计算。您可以使用整型常量表达式,即整型和/或枚举。对于字符串,可以使用传统的if-else。如果fgets返回NULL,则第行的内容未定义!mallocstrlenline应该在strcpy上崩溃,is必须是mallocstrlenline+1@戈东盖科:是的。if was copy paste error:P BTW:fgets的size参数包含空终止符。我还尝试将字符串存储在二维数组中,即char directions[100][15],并可以成功地存储和打印它们,但如何在switch case语句中使用它?我的意思是当我这样做时:charp=dir[I][0];switchp{caseNorth…}然后我得到一个错误,从char到char的转换无效,并且开关数量不是一个应该工作的整数1。可能15对于字符串来说太小了,因此会导致崩溃。请记住,第一维度100基本上是长度为15的字符串的数量。你是说15根长度为100的弦吗?在这种情况下,交换标注值。2不能打开字符串。案例标签必须在编译时可计算。您可以使用整型常量表达式,即整型和/或枚举。对于字符串,可以使用传统的if-else。如果fgets返回NULL,则第行的内容未定义!mallocstrlenline应该在strcpy上崩溃,is必须是mallocstrlenline+1@戈东盖科:是的。if was复制粘贴错误:P顺便说一句:fgets的大小参数包括空终止符。
char *directions[ 3 ];
const MAX_LINE_SIZE = 256;
char line[ MAX_LINE_SIZE ];

for (size_t nstr = 0; nstr < 3 && fgets( line, MAX_LINE_SIZE, stdin ); ++nstr) {
  strcpy(directions[ nstr ] = malloc( strlen( line )+1 ),line);
  puts(directions[ nstr ]);
}