我试图在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]);,它正确地打印“嗯”。
当前回答
如果你不想跟踪数组中字符串的数量,并且想要遍历它们,只需在最后添加NULL字符串:
char *strings[]={ "one", "two", "three", NULL };
int i=0;
while(strings[i]) {
printf("%s\n", strings[i]);
//do something
i++;
};
其他回答
Ack !常量字符串:
const char *strings[] = {"one","two","three"};
如果我没记错的话。
对了,你要用strcpy来赋值,而不是=运算符。strcpy_s更安全,但在C89和C99标准中都没有。
char arr[MAX_NUMBER_STRINGS][MAX_STRING_SIZE];
strcpy(arr[0], "blah");
更新:托马斯说strlcpy是正确的选择。
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");
}
来试试这个!!
如果您不想更改字符串,那么您可以简单地这样做
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个字符,然后静态字符串的内容将被复制到其中。
字符串字面量是const char *。
你用圆括号也很奇怪。你的意思可能是
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;