Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中创建字符串数组?_C_Arrays_String - Fatal编程技术网

如何在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中,

我正在尝试用C创建字符串数组。如果我使用以下代码:

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;
}