我试图在c中创建一个字符串数组,如果我使用以下代码:

char (*a[2])[14];
a[0]="blah";
a[1]="hmm";

GCC给我“警告:来自不兼容的指针类型的赋值”。正确的做法是什么?

编辑:我很好奇为什么这应该给编译器警告,因为如果我做printf([1]);,它正确地打印“嗯”。


当前回答

我在某种程度上缺少了更动态的字符串数组,其中字符串的数量可以根据运行时的选择而变化,但字符串应该是固定的。

我最后的代码片段是这样的:

#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 ** ev获取数组字符串的指针,count使用_countof函数获取字符串的数量。(类似sizeof(arr) / sizeof(arr[0]))。

还有一个额外的Ansi到unicode的转换使用A2T宏,但对于你的情况可能是可选的。

其他回答

在ANSI C中:

char* strings[3];
strings[0] = "foo";
strings[1] = "bar";
strings[2] = "baz";

如果字符串是静态的,你最好使用:

const char *my_array[] = {"eenie","meenie","miney"};

虽然不是基本的ANSI C的一部分,但您的环境很可能支持该语法。这些字符串是不可变的(只读),因此在许多环境中使用的开销比动态构建字符串数组要少。

例如,在小型微控制器项目中,这种语法使用程序内存,而不是(通常)更宝贵的ram内存。AVR-C是一个支持这种语法的示例环境,但大多数其他环境也是如此。

如果你不想跟踪数组中字符串的数量,并且想要遍历它们,只需在最后添加NULL字符串:

char *strings[]={ "one", "two", "three", NULL };

int i=0;
while(strings[i]) {
  printf("%s\n", strings[i]);
  //do something
  i++;
};

你好,你可以试试这个:

 char arr[nb_of_string][max_string_length]; 
 strcpy(arr[0], "word");

这是一个很好的例子,在c语言中使用字符串数组

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

每个元素都是指向其第一个字符的指针

const char *a[2] = {"blah", "hmm"};