如何在C中创建字符串数组?
我正在尝试用C创建字符串数组。如果我使用以下代码:如何在C中创建字符串数组?,c,arrays,string,C,Arrays,String,我正在尝试用C创建字符串数组。如果我使用以下代码: char (*a[2])[14]; a[0]="blah"; a[1]="hmm"; gcc给出“警告:来自不兼容指针类型的赋值”。正确的方法是什么 编辑:我很好奇为什么这会给编译器一个警告,因为如果我做printf(a[1]),它正确地打印“嗯”。确认!常量字符串: const char *strings[] = {"one","two","three"}; 如果我没记错的话 哦,你想用来赋值,而不是=运算符。更安全,但它既不在C89中,
char (*a[2])[14];
a[0]="blah";
a[1]="hmm";
gcc给出“警告:来自不兼容指针类型的赋值”。正确的方法是什么
编辑:我很好奇为什么这会给编译器一个警告,因为如果我做printf(a[1])代码>,它正确地打印“嗯”。确认!常量字符串:
const char *strings[] = {"one","two","three"};
如果我没记错的话
哦,你想用来赋值,而不是=运算符。更安全,但它既不在C89中,也不在C99标准中
char arr[MAX_NUMBER_STRINGS][MAX_STRING_SIZE];
strcpy(arr[0], "blah");
更新:说strlcpy
是正确的选择。字符串文本是const char*
s
你使用括号很奇怪。你可能是说
const char *a[2] = {"blah", "hmm"};
它声明了一个由两个指向常量字符的指针组成的数组,并将它们初始化为指向两个硬编码字符串常量。在ANSI C中:
char* strings[3];
strings[0] = "foo";
strings[1] = "bar";
strings[2] = "baz";
您的代码正在创建函数指针数组。试一试
char* a[size];
或
相反
请参见wikibooks to和,如果您不想更改字符串,那么您只需更改即可
const char *a[2];
a[0] = "blah";
a[1] = "hmm";
当您这样做时,您将为const char
分配一个包含两个指针的数组。然后,这些指针将被设置为静态字符串“blah”
和“hmm”
的地址
如果您确实希望能够更改实际的字符串内容,则必须执行以下操作
char a[2][14];
strcpy(a[0], "blah");
strcpy(a[1], "hmm");
这将分配两个连续的数组,每个数组包含14个字符,之后静态字符串的内容将被复制到其中。以下是一些选项:
char a1[][14] = { "blah", "hmm" };
char* a2[] = { "blah", "hmm" };
char (*a3[])[] = { &"blah", &"hmm" }; // only since you brought up the syntax -
printf(a1[0]); // prints blah
printf(a2[0]); // prints blah
printf(*a3[0]); // prints blah
a2
的优点是,您可以使用字符串文本执行以下操作
a2[0] = "hmm";
a2[1] = "blah";
对于a3
,您可以执行以下操作:
a3[0] = &"hmm";
a3[1] = &"blah";
对于a1
,即使在分配字符串文本时,也必须使用strcpy()
(更好的是strncpy()
)。原因是a2
和a3
是指针数组,您可以使它们的元素(即指针)指向任何存储,而a1
是一个“字符数组”数组,因此每个元素都是一个“拥有”自己存储的数组(这意味着它在超出范围时会被销毁)-您只能将内容复制到其存储中
这也给我们带来了使用a2
和a3
的缺点,因为它们指向静态存储(存储字符串文字),其内容无法可靠更改(即未定义的行为),如果要将非字符串文字分配给a2
或a3
的元素,首先必须动态分配足够的内存,然后让它们的元素指向该内存,然后将字符复制到该内存中,然后必须确保完成后释放内存
我已经错过了C++了。p>
p、 如果您需要示例,请告诉我。有几种方法可以在C中创建字符串数组。如果所有字符串的长度相同(或至少具有相同的最大长度),您只需声明一个二维字符数组,并根据需要分配:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1];
...
strcpy(strs[0], aString); // where aString is either an array or pointer to char
strcpy(strs[1], "foo");
您还可以添加初始值设定项列表:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1] = {"foo", "bar", "bletch", ...};
这假设初始值设定项中字符串的大小和数量与数组维度匹配。在这种情况下,每个字符串文本(它本身是一个以零结尾的字符数组)的内容被复制到分配给str的内存中。这种方法的问题是内部分裂的可能性;如果您有99个长度不超过5个字符的字符串,但有1个长度为20个字符的字符串,那么99个字符串将至少有15个未使用的字符;那是浪费空间
您可以存储指向char的指针的一维数组,而不是使用char的二维数组:
char *strs[NUMBER_OF_STRINGS];
注意,在本例中,您只分配了内存来保存指向字符串的指针;字符串本身的内存必须分配到别处(作为静态数组或使用malloc()
或calloc()
)。您可以像前面的示例一样使用初始值设定项列表:
char *strs[NUMBER_OF_STRINGS] = {"foo", "bar", "bletch", ...};
您只需存储指向字符串常量的指针,而不是复制字符串常量的内容。请注意,字符串常量可能不可写;可以重新指定指针,如下所示:
strs[i] = "bar";
strs[i] = "foo";
但您可能无法更改字符串的内容;i、 e
strs[i] = "bar";
strcpy(strs[i], "foo");
可能是不允许的
您可以使用malloc()
为每个字符串动态分配缓冲区并复制到该缓冲区:
strs[i] = malloc(strlen("foo") + 1);
strcpy(strs[i], "foo");
顺便说一句
将声明为指向char的14个元素数组的指针的2元素数组 或者您可以声明一个包含字符arry(1个字符串)的结构类型,它们创建一个结构数组,从而创建一个多元素数组
typedef struct name
{
char name[100]; // 100 character array
}name;
main()
{
name yourString[10]; // 10 strings
printf("Enter something\n:);
scanf("%s",yourString[0].name);
scanf("%s",yourString[1].name);
// maybe put a for loop and a few print ststements to simplify code
// this is just for example
}
与任何其他方法相比,这种方法的优点之一是允许您直接扫描字符串,而无需使用strcpy
一个好方法是自己定义一个字符串
#include <stdio.h>
typedef char string[]
int main() {
string test = "string";
return 0;
}
#包括
typedef字符字符串[]
int main(){
string test=“string”;
返回0;
}
其实就这么简单。如果字符串是静态的,那么最好使用:
const char *my_array[] = {"eenie","meenie","miney"};
虽然不是基本ANSI C的一部分,但您的环境可能支持该语法。这些字符串是不可变的(只读),因此在许多环境中使用的开销比动态构建字符串数组少
例如,在小型微控制器项目中,这种语法使用程序内存,而不是(通常)更宝贵的ram内存。AVR-C是支持这种语法的示例环境,但其他大多数环境也是如此。char name[10][10]
char name[10][10]
int i,j,n;//here "n" is number of enteries
printf("\nEnter size of array = ");
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<1;j++)
{
printf("\nEnter name = ");
scanf("%s",&name[i]);
}
}
//printing the data
for(i=0;i<n;i++)
{
for(j=0;j<1;j++)
{
printf("%d\t|\t%s\t|\t%s",rollno[i][j],name[i],sex[i]);
}
printf("\n");
}
inti,j,n//这里的“n”是肠道数量
printf(“\n数组输入大小=”);
scanf(“%d”和“&n”);
对于(i=0;i如果您不想跟踪数组中字符串的数量并希望对其进行迭代,只需在末尾添加NULL字符串:
char *strings[]={ "one", "two", "three", NULL };
int i=0;
while(strings[i]) {
printf("%s\n", strings[i]);
//do something
i++;
};
我缺少了更动态的字符串数组,其中字符串的数量可以根据运行时选择的不同而变化,但字符串的数量不同
char name[10][10]
int i,j,n;//here "n" is number of enteries
printf("\nEnter size of array = ");
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<1;j++)
{
printf("\nEnter name = ");
scanf("%s",&name[i]);
}
}
//printing the data
for(i=0;i<n;i++)
{
for(j=0;j<1;j++)
{
printf("%d\t|\t%s\t|\t%s",rollno[i][j],name[i],sex[i]);
}
printf("\n");
}
char *strings[]={ "one", "two", "three", NULL };
int i=0;
while(strings[i]) {
printf("%s\n", strings[i]);
//do something
i++;
};
#define INIT_STRING_ARRAY(...) \
{ \
char* args[] = __VA_ARGS__; \
ev = args; \
count = _countof(args); \
}
void InitEnumIfAny(String& key, CMFCPropertyGridProperty* item)
{
USES_CONVERSION;
char** ev = nullptr;
int count = 0;
if( key.Compare("horizontal_alignment") )
INIT_STRING_ARRAY( { "top", "bottom" } )
if (key.Compare("boolean"))
INIT_STRING_ARRAY( { "yes", "no" } )
if( ev == nullptr )
return;
for( int i = 0; i < count; i++)
item->AddOption(A2T(ev[i]));
item->AllowEdit(FALSE);
}
char arr[nb_of_string][max_string_length];
strcpy(arr[0], "word");
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]){
int i, j, k;
// to set you array
//const arr[nb_of_string][max_string_length]
char array[3][100];
char temp[100];
char word[100];
for (i = 0; i < 3; i++){
printf("type word %d : ",i+1);
scanf("%s", word);
strcpy(array[i], word);
}
for (k=0; k<3-1; k++){
for (i=0; i<3-1; i++)
{
for (j=0; j<strlen(array[i]); j++)
{
// if a letter ascii code is bigger we swap values
if (array[i][j] > array[i+1][j])
{
strcpy(temp, array[i+1]);
strcpy(array[i+1], array[i]);
strcpy(array[i], temp);
j = 999;
}
// if a letter ascii code is smaller we stop
if (array[i][j] < array[i+1][j])
{
j = 999;
}
}
}
}
for (i=0; i<3; i++)
{
printf("%s\n",array[i]);
}
return 0;
}