附加两个没有str函数的字符串

时间:2015-06-21 07:42:06

标签: c string struct append

我在尝试弄清楚如何将char指针c附加到现有Struct String时遇到问题。我希望能够接受输入(考虑预定义的Struct,其中stuff的值为“Hello”)append(test,"world")当我尝试使用strcatstrcpy时,我得到了一个错误,因为结构String不是与此函数一起使用的有效类型。

如何在不使用str函数的情况下追加?

我目前有代码声明一个结构并将东西设置为结构内容的值,在这种情况下 hello 我输入我的函数并检查该人传递的数据是否不是空值。我创建了一个名为append和realloc内存的新String Struct,用于前一个“stuff”的新大小加上* c的值。我应该使用for循环来获取点[i]中* c的内容到追加的末尾吗?

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <memory.h>

typedef struct strstf {
    char  * stuff;
    size_t  length;
} String;

String * append(String * b, const char * c) {
    String * append;
    if (c != NULL) {
        /* creates memory the size of the original string buffer and the added string */
        b->stuff realloc(strlen(c) + strlen(b->stuff) + 1);
        strcpy(append, b->stuff);
        strcat(append, c);
        return append;  
    }
    if (append->stuff == NULL) {
        free(append);  
        return NULL;
    }
    return append;
}

1 个答案:

答案 0 :(得分:3)

您的代码中有很多错误的内容。这就是我注意到的正确的蝙蝠:

  1. 您在名为append的函数中使用了变量名append,这是一种错误的形式。我甚至不确定是否会编译。
  2. 实际需要=时使用==运算符。前者是为了 任务,因此条件总是如此。
  3. realloc()用于b->stuff,即char*,但您将其投放到String*。这可能在技术上有效,但它的形式非常糟糕。
  4. realloc()上使用b->stuff之后,您仍然使用指针b->stuff,即使realloc()使传递的指针无效并返回一个新指针。
  5. strcpystrcat指向struct strstf的指针,当它们都需要char*
  6. 以下代码有效。您只需要记住释放指针result result->stuff。这对于内存泄漏来说非常容易。

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    typedef struct strstf {
        char   *stuff;   
        size_t  length;   
    } String;
    
    String *append(String *b, const char *c){
        String* result = malloc(sizeof(String)); /* allocate memory for the resulting string */
    
         if (c != NULL && b != NULL && b->stuff != NULL) { /* make sure nothing is NULL */
            result->length = strlen(c) + b->length; /* calculate the length of the new string */
            result->stuff = malloc(result->length + 1); /* allocate the memory for the char array (plus '\0' char) */
            strcpy(result->stuff, b->stuff); /* copy the first to the result */
            strcat(result->stuff, c); /* append the second to the first */
            return result;  /* return the result */
        }
        return NULL; /* something went wrong */
    }
    
    int main(int argc, char* argv[]) {
        String first;
        String* result;
        if (argc != 3) {
            printf("The syntax of the command was incorrect.\n");
            return 1;
        }
    
        first.stuff = argv[1];
        first.length = strlen(argv[1]);
    
        result = append(&first, argv[2]);
    
        printf("Result: %s\n", result->stuff);
    
        free(result->stuff); /* DON'T FORGET THIS */
        free(result);
    
        return 0;
    }