繁体   English   中英

是否可以在ANSI C的一维数组中包含多个字符串?

[英]Is it possible to have multiple strings in a single dimensional array in ANSI C?

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

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

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

例如,您可以这样做:

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对象,但是我们可以使用该指针来访问整个字符串。

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

例如,

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

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

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

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

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

比如说我要在第三行复制一个字符串

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

唯一的问题是,除了使用方面有优势之外,保持该原始区域的复杂性也比平常少。

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM