在保留字符串的同时擦除char *

时间:2018-09-28 03:39:56

标签: c

我需要帮助弄清楚如何擦除或重置char*,但要将char*的值保留在struct中。

例如,如果我有

char* word;
struct test *person;
word = (char*)malloc(sizeof(char) * 50);
person = malloc(sizeof(struct test));

假设我使用函数将单词“ Jack”存储在单词中,因为我使用read函数从CSV中读取。

所以...

while (read(STDIN, buffer, 1) != 0) {
    add(word, *buffer);
}

void add(char* string, char c) {
    int size = strlen(string);
    string[size] = c;
    string[size + 1] = '\0';
}

person->name = word;
memset(word, 0, sizeof(word));

这样做会清空person-> name中的字符串以及单词。

如何将字符串保留在person->name中?

我尝试创建一个单独的字符串,但无法解决该问题。

char temp[size];
int i = 0;
while (word[i] != '\0') {
    temp[i] = word[i];
    i++;
}

这还将清除person->name中的字符串以及临时字符串。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

person->name = word;
memset(word, 0, sizeof(word));

如果要为word复制person->name,则必须先分配内存:

person->name = malloc(strlen(word) + 1);  // + 1 for the terminating '\0'

然后,您可以将word指向的字符串复制到person->name指向的内存中:

strcpy(person->name, word);

然后,您可以将word的长度设置为0

word[0] = '\0';

并重复使用word

请确保free()不再需要用malloc()分配的所有内存。


void add(char* string, char c) {
    int size = strlen(string);
    string[size] = c;
    string[size + 1] = '\0';
}

此函数不安全,因为它可能写入超出为string分配的内存范围。给它另一个参数来表示它的大小:

#include <stdbool.h>  // bool
#include <stddef.h>   // size_t
#include <string.h>   // strlen()

bool add(char* string, size_t size, char ch)
{
    size_t length = strlen(string);

    if (length + 2 > size)
        return false;

    string[length] = ch;
    string[length + 1] = '\0';
    return true;
}