我们可以通过以下方式声明字符串数组:
char *words[] = { "abc", "def", "bad", "hello", "captain", "def", "abc", "goodbye" };
现在我有一个现有的字符串数组:
char strings[4][20];
strcpy(strings[0], "foo");
strcpy(strings[1], "def");
strcpy(strings[2], "bad");
strcpy(strings[3], "hello");
我想做这样的事情:
char *words[4];
for ( j = 0; j < 4; j++)
{
words[j] = &strings[j];
}
因此,单词的结构与我在开头时定义的结构相同。你们知道怎么做吗?
答案 0 :(得分:3)
无需地址:
char *words[4];
for ( j = 0; j < 4; j++)
{
words[j] = strings[j];
}
答案 1 :(得分:0)
char *words[] = { "abc", "def", "bad", "hello", "captain", "def", "abc", "goodbye" };
和
char *words[8];
words[0] = "abc";
words[1] = "def";
words[2] = "bad";
words[3] = "hello";
words[4] = "captain";
words[5] = "def";
words[6] = "abc";
words[7] = "goodbye";
是相同的事情。
在这两种情况下,words
都是指向字符的指针数组。在C中,字符串是字符串指向字符的指针。同样的事情。
char *a[] = { "abc", "def", "bad", "hello", "captain", "def", "abc", "goodbye" };
char *b[8];
int i;
for (i = 0; i < 8; i++)
b[i] = a[i];
也应该工作得很好。
您只需要记住那些是字符串文字,因此它们是只读的。它不是你可以修改的缓冲区。
即使你使用缓冲区,还有另外一点要注意:
char a[4][20];
char *b[4];
int i;
strcpy(a[0], "foo");
strcpy(a[1], "def");
strcpy(a[2], "bad");
strcpy(a[3], "hello");
for (i = 0; i < 4; i++)
b[i] = a[i];
strcpy(b[0], "not foo");
printf("%s", a[0]);
// prints "not foo"
通过修改b
中的字符串,您修改了a
中的字符串,因为当您执行b[i] = a[i]
时,您没有复制字符串,只有指针,内存地址在其中存储