我在尝试弄清楚如何将char指针c附加到现有Struct String
时遇到问题。我希望能够接受输入(考虑预定义的Struct,其中stuff的值为“Hello”)append(test,"world")
当我尝试使用strcat
和strcpy
时,我得到了一个错误,因为结构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;
}
答案 0 :(得分:3)
您的代码中有很多错误的内容。这就是我注意到的正确的蝙蝠:
append
的函数中使用了变量名append
,这是一种错误的形式。我甚至不确定是否会编译。=
时使用==
运算符。前者是为了
任务,因此条件总是如此。realloc()
用于b->stuff
,即char*
,但您将其投放到String*
。这可能在技术上有效,但它的形式非常糟糕。realloc()
上使用b->stuff
之后,您仍然使用指针b->stuff
,即使realloc()
使传递的指针无效并返回一个新指针。strcpy
和strcat
指向struct strstf
的指针,当它们都需要char*
时以下代码有效。您只需要记住释放指针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;
}