C 将指针数组分配给字符串

C 将指针数组分配给字符串,c,arrays,pointers,2d,C,Arrays,Pointers,2d,我试着在网上搜索,但没有找到我想要做的。希望你能帮助我 问题:我有两个字符数组,即string和string2。两者最初都是空的。然后我在这些字符串中输入2个。我想使用字符串2的指针在字符串中赋值 这是我的密码: int main(void) { char string[2][MAXLEN]; char string2[2][MAXLEN]; char *pointer[2]; pointer[0] = &string2[0]; pointer[1

我试着在网上搜索,但没有找到我想要做的。希望你能帮助我

问题:我有两个字符数组,即
string
string2
。两者最初都是空的。然后我在这些字符串中输入2个。我想使用字符串2的指针在字符串中赋值

这是我的密码:

int main(void) {
    char string[2][MAXLEN];
    char string2[2][MAXLEN];
    char *pointer[2];
    pointer[0] = &string2[0];
    pointer[1] = &string2[1];
    scanf("%s", string[0]); //Assume i scan in "ab"
    scanf("%s", string[1]); //assume i scan in "cd"

    //Now string[0] contains "ab" and string[1] contains "cd"
    //I want to deferences the pointer and assign "cd" to it, so string2[0] will contain "cd"

    *pointer[0] = string[0];
    printf("%s", string2[0]); //but this does not print "cd"
}
*编辑
我知道我可以使用strcpy,但我正在努力学习使用指针。这方面的任何帮助都将是巨大的

因为您没有复制编译器可以理解的整个信息结构,所以需要单独复制数组的每个元素。通常这是通过for循环检查NUL或size来完成的,但我是在作弊,只是向您展示了可以实现您想要的复制的语法:

#define MAXLEN 10

int main(void) 
{
    char string[2][MAXLEN];
    char string2[2][MAXLEN];
    char *pointer[2];
    pointer[0] = &string2[0];
    pointer[1] = &string2[1];

    // Replace scanf for simplicity
    string[0][0] = 'a'; string[0][1] = 'b'; string[0][2] = '\0';
    string[1][0] = 'c'; string[1][1] = 'b'; string[1][2] = '\0';

    // For loop or strcpy/strncpy/etc. are better, but showing array method of copying
    pointer[0][0] = string[1][0];
    pointer[0][1] = string[1][1];
    pointer[0][2] = string[1][2];

    printf("%s", string2[0]);

    return 0;
}
对于指针,您可以执行以下操作:

#define MAXLEN 10

int main(void) {
  char string[2][MAXLEN];
  char string2[2][MAXLEN];
  char *pointer[2];
  pointer[0] = &string2[0];
  pointer[1] = &string[1];  // changed this

  string[0][0] = 'a'; string[0][1] = 'b'; string[0][2] = '\0';
  string[1][0] = 'c'; string[1][1] = 'd'; string[1][2] = '\0';

  *pointer[0]++ = *pointer[1]++;
  *pointer[0]++ = *pointer[1]++;
  *pointer[0]++ = *pointer[1]++;

  printf("%s", string2[0]);

  return 0;
}
上面的指针变为:

  char temp = *pointer[1];  // Read the char from dest.
  pointer[1]++;  // Increment the source pointer to the next char.
  *pointer[0] = temp;  // Store the read char.
  pointer[0]++;   // Increment the dest pointer to the next location.
我做了三次,每输入一个字符一次。通过对sourcePtr=='\0'进行while()检查,基本上将其转换为strcpy()

还有一个有趣的示例,其中解引用可能会达到您的预期效果:

typedef struct foo
{
    char mystring[16];
} FOO;

FOO a,b;

// This does a copy
a = b;

// This also does a copy
FOO *p1 = &a, *p2=&b;
*p1 = *p2;

// As does this
*p1 = a;

// But this does not and will not compile:
a.mystring = b.mystring;

// Because arrays in 'C' are treated different than other types.
// The above says: Take the address of b.mystring and assign it (illegally because the array's location in memory cannot be changed like this) to a.mystring.

因为您没有复制编译器可以理解的全部信息结构,所以需要单独复制数组的每个元素。通常这是通过for循环检查NUL或size来完成的,但我是在作弊,只是向您展示了可以实现您想要的复制的语法:

#define MAXLEN 10

int main(void) 
{
    char string[2][MAXLEN];
    char string2[2][MAXLEN];
    char *pointer[2];
    pointer[0] = &string2[0];
    pointer[1] = &string2[1];

    // Replace scanf for simplicity
    string[0][0] = 'a'; string[0][1] = 'b'; string[0][2] = '\0';
    string[1][0] = 'c'; string[1][1] = 'b'; string[1][2] = '\0';

    // For loop or strcpy/strncpy/etc. are better, but showing array method of copying
    pointer[0][0] = string[1][0];
    pointer[0][1] = string[1][1];
    pointer[0][2] = string[1][2];

    printf("%s", string2[0]);

    return 0;
}
对于指针,您可以执行以下操作:

#define MAXLEN 10

int main(void) {
  char string[2][MAXLEN];
  char string2[2][MAXLEN];
  char *pointer[2];
  pointer[0] = &string2[0];
  pointer[1] = &string[1];  // changed this

  string[0][0] = 'a'; string[0][1] = 'b'; string[0][2] = '\0';
  string[1][0] = 'c'; string[1][1] = 'd'; string[1][2] = '\0';

  *pointer[0]++ = *pointer[1]++;
  *pointer[0]++ = *pointer[1]++;
  *pointer[0]++ = *pointer[1]++;

  printf("%s", string2[0]);

  return 0;
}
上面的指针变为:

  char temp = *pointer[1];  // Read the char from dest.
  pointer[1]++;  // Increment the source pointer to the next char.
  *pointer[0] = temp;  // Store the read char.
  pointer[0]++;   // Increment the dest pointer to the next location.
我做了三次,每输入一个字符一次。通过对sourcePtr=='\0'进行while()检查,基本上将其转换为strcpy()

还有一个有趣的示例,其中解引用可能会达到您的预期效果:

typedef struct foo
{
    char mystring[16];
} FOO;

FOO a,b;

// This does a copy
a = b;

// This also does a copy
FOO *p1 = &a, *p2=&b;
*p1 = *p2;

// As does this
*p1 = a;

// But this does not and will not compile:
a.mystring = b.mystring;

// Because arrays in 'C' are treated different than other types.
// The above says: Take the address of b.mystring and assign it (illegally because the array's location in memory cannot be changed like this) to a.mystring.

请参阅,并提供所需信息。你的问题是什么?注意:数组不是指针!删除运算符的地址。是否询问如何使用
strcpy
函数?您可能需要
strcpy(string2[0],string[0])
而不是
*指针[0]=字符串[0]。。。。你没有两个字符数组,但是你有两个字符数组。编译器告诉你你正在给一个整数分配一个指针,不是吗?在
*pointer[0]=string[0]
中?注意你的编译器警告;他们指出了你代码中的错误<代码>*指针[0]
是单个字符<代码>字符串[0]是指向数组的指针。请参阅,并提供所需信息。你的问题是什么?注意:数组不是指针!删除运算符的地址。是否询问如何使用
strcpy
函数?您可能需要
strcpy(string2[0],string[0])
而不是
*指针[0]=字符串[0]。。。。你没有两个字符数组,但是你有两个字符数组。编译器告诉你你正在给一个整数分配一个指针,不是吗?在
*pointer[0]=string[0]
中?注意你的编译器警告;他们指出了你代码中的错误<代码>*指针[0]
是单个字符<代码>字符串[0]是指向数组的指针。您好,谢谢您的回答。我可以问一下,什么是*指针[0]+=*指针[1]++*指针[0]++=*指针[1]++*指针[0]++=*指针[1]++;做比如我该怎么读。我的第二个问题是,我是否必须将指针[1]更改为&string[1]?我是否无法通过字符串[1]分配它?谢谢,这有点难。这是系统编程中常见的习惯用法。我会在我的回答中为你再细分一点。好的,谢谢你。我想我的主要问题是,是否有必要将指针[1]指定给&string[1]。这样一个接一个地分配是唯一的方法吗?所以我不能通过分配整个字符串来完成它?以变量指针为例。char string=“你好”。char*pointer=string2。差异指针:*指针=字符串。这应该分配string2 hello,对吗?我可以对我的情况做同样的操作吗?No-*pointer=string不会分配整个字符串,也不会编译,因为您告诉它将指针放入字符中。除此之外,它无法工作,因为在编译时,它不知道实际字符串有多大——分配数组的整个大小是“C”无法做到的——可能是出于效率原因。让我再添加一个非字符串副本的例子,这可能会使它更清晰。嗨,谢谢你的回答。我可以问一下,什么是*指针[0]+=*指针[1]++*指针[0]++=*指针[1]++*指针[0]++=*指针[1]++;做比如我该怎么读。我的第二个问题是,我是否必须将指针[1]更改为&string[1]?我是否无法通过字符串[1]分配它?谢谢,这有点难。这是系统编程中常见的习惯用法。我会在我的回答中为你再细分一点。好的,谢谢你。我想我的主要问题是,是否有必要将指针[1]指定给&string[1]。这样一个接一个地分配是唯一的方法吗?所以我不能通过分配整个字符串来完成它?以变量指针为例。char string=“你好”。char*pointer=string2。差异指针:*指针=字符串。这应该分配string2 hello,对吗?我可以对我的情况做同样的操作吗?No-*pointer=string不会分配整个字符串,也不会编译,因为您告诉它将指针放入字符中。除此之外,它无法工作,因为在编译时,它不知道实际字符串有多大——分配数组的整个大小是“C”无法做到的——可能是出于效率原因。让我再添加一个非字符串副本的示例,这可能会更清楚。