我试图在c中创建一个字符串数组,如果我使用以下代码:
char (*a[2])[14];
a[0]="blah";
a[1]="hmm";
GCC给我“警告:来自不兼容的指针类型的赋值”。正确的做法是什么?
编辑:我很好奇为什么这应该给编译器警告,因为如果我做printf([1]);,它正确地打印“嗯”。
我试图在c中创建一个字符串数组,如果我使用以下代码:
char (*a[2])[14];
a[0]="blah";
a[1]="hmm";
GCC给我“警告:来自不兼容的指针类型的赋值”。正确的做法是什么?
编辑:我很好奇为什么这应该给编译器警告,因为如果我做printf([1]);,它正确地打印“嗯”。
当前回答
你好,你可以试试这个:
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"};
或者你可以声明一个结构类型,它包含一个字符数组(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;
字符串字面量是const char *。
你用圆括号也很奇怪。你的意思可能是
const char *a[2] = {"blah", "hmm"};
它声明了一个包含两个指向常量字符的指针的数组,并将它们初始化为指向两个硬编码的字符串常量。
如果您不想更改字符串,那么您可以简单地这样做
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个字符,然后静态字符串的内容将被复制到其中。
我在某种程度上缺少了更动态的字符串数组,其中字符串的数量可以根据运行时的选择而变化,但字符串应该是固定的。
我最后的代码片段是这样的:
#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宏,但对于你的情况可能是可选的。