【问题标题】:Is it possible to have multiple strings in a single dimensional array in ANSI C?ANSI C中的一维数组中是否可以有多个字符串?
【发布时间】:2015-09-17 16:19:30
【问题描述】:

我知道如何使用二维数组制作字符串数组,但我可以这样做:

char array[];
array[1]="bob";
array[2]="cat";

【问题讨论】:

  • 我读过那篇文章,但我没有尝试使用多维数组或指针
  • 你已经这样做了。猜猜"bob" 是什么?如果你不想,答案是“不”!自己想想应该如何工作。
  • 你可以,不管重点是什么,但你必须索引每个,或者计算有多少,这样你就知道'\0'是否表示字符串的结尾或所有数组的末尾。
  • 您可以存储到一维数组中,但是如果不对字符串进行硬编码或至少暂时存储到指针数组中,我想不出一种有用的方法。我的意思是,您可以使用argv 从命令行获取字符串,但这也是一个指针数组。

标签: c arrays string ansi-c


【解决方案1】:

是的,但不是您尝试的方式。

例如,您可以这样做:

char arr[] = "bob\0cat";

arr 包含两个字符串,"bob"arr[0] 开始,"cat"arr[4] 开始。这不是特别方便,因为您必须遍历数组才能找到字符串,但它确实有效地使用了内存。

arr的每个元素都是一个char,所以不能在每个元素中存储一个字符串,但是可以连续存储多个字符串。

还有其他存储字符串列表的方法。最常见的是定义一个char* 指针数组,每个指针都指向一个在别处分配的字符串(的第一个字符)。 mainargv 参数是这种方法最常见的示例。

在你的例子中:

char array[];

这是无效的;如果你想定义一个数组对象,你必须指定元素的数量。

array[1]="bob";
array[2]="cat";

这些分配都是无效的。 array[1]array[2] 都是单个 char 对象。您不能将字符串分配给单个 char。实际上,表达式 "bob" 已隐式转换为 char* 指针 - 您仍然无法将其分配给 char 对象。

如果您将array 定义为char* 指针数组,则这些分配将是有效的,实际上这是表示字符串列表的常用方法:

char *array[2];  /* an array of pointers */
array[0] = "bob";
array[1] = "cat";

字符串本身分配在数组之外;该数组包含指向它们的指针。每个指针实际上都指向一个 char 对象,但我们可以使用该指针来访问整个字符串。

【讨论】:

    【解决方案2】:

    可以,但必须使用指针数组:

    #include<stdio.h>
    #include<conio.h>
    int main()
    {
        char *ar[]={"one","two","three"};//array of pointer
        for(int i=0;i<3;i++)
        {
            printf("%s\n",ar[i]);
        }
    }   
    

    【讨论】:

      【解决方案3】:

      是的,只有当您可以将内存想象为一个原始的连续单元并且确切地知道您在做什么时才有可能。

      例如,

      让我们考虑一个 25 字节的内存块,如下所示

      00                        04 
      +----+----+----+----+----+
      |    |    |    |    |    |
      +----+----+----+----+----+ 09
      |    |    |    |    |    |
      +----+----+----+----+----+ 14
      |    |    |    |    |    |
      +----+----+----+----+----+ 19
      |    |    |    |    |    |
      +----+----+----+----+----+ 24
      |    |    |    |    |    |
      +----+----+----+----+----+ 29
      

      让我们考虑一下我的分配是这样的

      void *p = malloc( 5 * 5 * sizeof( char ) );
      

      我可以用纯指针算术访问大小为 5 的行

      例如,假设我将在第三行复制一个字符串

      memcpy ( p+(5*3) , "Hello", 5 );
      

      唯一的问题是维护这个原始区域比平时稍微复杂一点,而且在使用方面也有优势。

      【讨论】:

      • 哎呀,这会将字符串复制到第 4 行,因为在 C 中,偏移量从 0 开始,而不是 1
      【解决方案4】:

      如果您正在谈论将 指针 存储到字符串,那么是的:

      const char *strings[SIZE];
      strings[0] = "bob";
      strings[1] = "cat";
      ...
      

      请注意,我们仅将字符串文字"bob""cat"地址 存储在strings 数组中;字符串文字的内容存储在其他地方。

      strings 被声明为 const char * 的数组,因为尝试修改字符串文字的内容会导致未定义的行为。

      如果要将多个字符串的 内容 存储在单个一维数组中,则需要将它们连接在一起,例如:

      char dest[SIZE] = {0}; // want to make sure at least the first element is 0
      strcat( dest, "bob" );
      strcat( dest, "cat" );
      

      之后dest 包含字符串"bobcat",其中"bob" 从索引0 开始,"cat" 从索引3 开始。请注意不能使用= 运算符分配字符串内容;您必须使用库函数,例如 strcat,或者您必须单独分配每个字符,例如

      dest[0] = 'b';
      dest[1] = 'o';
      dest[2] = 'b';
      ...
      

      如果您想跟踪单个字符串在该一维序列中的开始和结束位置,则需要添加某种分隔符,例如

      strcat( dest, "bob" );
      strcat( dest, "$" );
      strcat( dest, "cat" );
      

      给你字符串"bob$cat";然后您可以使用strtokstrchr 在字符串列表中查找单个字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-06
        • 2014-04-05
        • 1970-01-01
        • 1970-01-01
        • 2021-08-08
        • 2015-03-17
        • 1970-01-01
        相关资源
        最近更新 更多