1

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

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

4 回答 4

5

是的,但不是您尝试这样做的方式。

例如,您可以这样做:

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

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

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

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

在您的示例中:

char array[];

这是无效的;如果要定义数组对象,则必须指定元素的数量。

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

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

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

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

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

于 2015-09-17T16:35:16.930 回答
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]);
    }
}   
于 2015-09-17T16:57:37.167 回答
1

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

例如,

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

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

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

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

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

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

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

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

于 2015-09-17T16:37:43.127 回答
1

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

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在字符串列表中查找单个字符串。

于 2015-09-17T16:49:17.727 回答