[英]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"
; 然后,您可以使用strtok
或strchr
在字符串列表中查找單個字符串。
是的,可以,但是必須使用一個指針數組:
#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.