ANSI C中的单维数组中是否可以有多个字符串?

时间:2015-09-17 16:19:31

标签: c arrays string ansi-c

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

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

4 个答案:

答案 0 :(得分:4)

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

例如,你可以这样做:

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对象。

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

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

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

答案 1 :(得分:1)

是的,只有当你能将记忆想象成一个原始的连续单位并确切知道你在做什么时才有可能。

例如,

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

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

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

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

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

例如,假设我将复制第3行中的字符串

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

唯一的问题是保持这个原始区域比平时稍微复杂,此外还有使用上的优点。

答案 2 :(得分:1)

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

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

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

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

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

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';
...

如果你想跟踪单个字符串在1-D序列中的开始和结束位置,那么你需要添加某种分隔符,比如

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

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

答案 3 :(得分:1)

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

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