迭代结构中的char指针

时间:2016-07-10 02:55:52

标签: c loops struct

所以我试图将两个字符串组合在一起但是我得到str是第二个while循环的最后一行的只读值。他们是否可以在不更改功能标题的情况下执行此操作?

String也是我创建的一个结构,它有一个名为str。

的* char
String * String_Combine(String * tar, const String * src) {
//end of string
  while (* tar->str != '\0') {
    tar->str++;
  }
//int i = 0;
//copy string
  while (*source->str != '\0') {
    *tar->str = *src->str;
    *tar->str++;
    *src->str++;
    // i++;

  }
return tar;
}

2 个答案:

答案 0 :(得分:2)

在修改指针之前复制指针。我想修改tar->str也可能有害,因为它会破坏字符串开始的信息。

String * String_Combine(String * tar, const String * src) {
  char * tar_str = tar->str, * src_str = src->str;
  //end of string
  while (* tar_str != '\0') {
    tar_str++;
  }
  //int i = 0;
  //copy string
  while (*src_str != '\0') { /* assuming that "source" is a typo and it should be "src" */
    *tar_str = *src_str; /* with hope that there is enough writable buffer allocated */
    tar_str++;
    src_str++;
    // i++;

  }
  //terminate string
  *tar_str = '\0';
  return tar;
}

答案 1 :(得分:0)

两件事:

  1. 确保为tar分配足够的内存> strto同时保存tar-> str和src-> str
  2. 在本地存储一个指针tar / src-> str并迭代思考它们,这样你就不会松开指向原始str的指针;
  3. 我写了一个测试用例,让你轻松理解;)

    #include <iostream>
    #include <string.h>
    struct String {
        char* str;
    };
    using namespace std;
    String * String_Combine(String * tar, const String * src) {
    // take a local copy of strs
    char* tar_str = tar->str;
    char* src_str = src->str;
    //end of string
    while (* tar_str != '\0') {
        tar_str++;
    }
    
    //int i = 0;
    //copy src string to tar string
      while (*src_str != '\0') {
        *tar_str = *src_str;
        *tar_str++; 
        *src_str++;
        // i++;
    
      }
    return tar;
    }
    int main()
    {
        String* src = (String*) malloc(sizeof(String));
        src->str  = new char[20];
        strcpy(src->str, "World!");
    
        String* tar = (String*) malloc(sizeof(String));
        tar->str = new char[20];
        strcpy(tar->str, "Hello ");
        String* result = String_Combine(tar,src);
    
       cout << result->str << endl; 
    
       return 0;
    }