【问题标题】:Taking strings as input into an array of pointers to strings and displaying them将字符串作为输入到字符串指针数组中并显示它们
【发布时间】:2010-08-18 03:13:58
【问题描述】:

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

char *directions[3]; for(i=0;i<3;i++) scanf("%s",directions[i]); for(i=0;i<3;i++) printf("%s",directions[i]);

但是当我运行这段代码时,它给了我分段错误,有人可以纠正我吗?

【问题讨论】:

    标签: c arrays pointers string


    【解决方案1】:

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

    先尝试分配一些内存:说一个足够大的缓冲区以读取整行(或您认为会遇到的最大字符串)。读入,分配一个direction数组成员,然后复制出来如下:

    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 ] );
    }
    

    【讨论】:

    • 我也尝试将字符串存储在二维数组中,即字符方向[100][15] 并且可以成功存储和打印它们,但是我如何在 switch case 语句中使用它?我的意思是当我这样做时: char p = dir[i][0]; switch(p){ case("North") ...} 然后我得到错误“从 char 到 char 的无效转换并且切换数量不是整数”
    • 1) 这应该可以。可能 15 对您的字符串来说太小了,因此您遇到了崩溃。请记住,第一个维度 (100) 基本上是您拥有的长度为 15 的字符串的数量。你的意思是说 15 个长度为 100 的字符串?在这种情况下,交换维度值。 2) 你不能在字符串上switchcase 标签必须在编译时可评估。您可以使用integral constant expressions,即整数类型和/或枚举。对于字符串,您可以使用传统的if-else
    • 如果 fgets 返回 NULL 则行中的内容未定义! malloc(strlen(line)) 应该在 strcpy 上崩溃,必须是 malloc(strlen(line)+1) !!
    • @gordongekko:是的。 if 是复制粘贴错误:P BTW:fgets 的大小参数包括空终止符。
    【解决方案2】:

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

    // allocate memory.
    for(i=0;i<3;i++)
        directions[i] = (char*)malloc(sizeof(char) * SUITABLE_MAX);
    
    // now read.
    for(i=0;i<3;i++)
        scanf("%s",directions[i]);
    

    【讨论】:

    • 您不需要标准 C 中的强制转换。此外,sizeof(char) == 1 根据定义,因此被乘数是多余的。
    【解决方案3】:
    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 ]);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-04
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多