在C中附加到字符串

时间:2011-11-28 20:57:01

标签: c string

所以我有一个字符串,它具有以下粗略格式:string # more than one string here

我想做的是在#之后删除所有内容。我该怎么办?此外,如果我只想保留初始字符串,并取出空格后的所有内容和#

我有以下代码,但显然在NULL字符串中附加内容无法正常工作:

char *inst_ptr包含整个字符串。

char *lbl = NULL;
int len = 0;
size_t inst_len = strlen(inst_ptr);
for (int t = 0; t < inst_len; t++) {

    if (inst_ptr[t] == '#')
        break;

    else {
        printf("len %d\n", len);
        lbl[len] = inst_ptr[t];
        lbl[len+1] = '\0';
        len = strlen(lbl);
    }
}

编辑:

基本上,假设我有以下字符串: loop # hello world!

我只想在另一个字符串中提取loop。我上面所做的是将lbl作为NULL字符串,并在原始字符串上运行循环。只要该字符不是#,我就只用一个空终结符“追加”该字符,如上所示。

2 个答案:

答案 0 :(得分:1)

首先,你正在做

char *lbl = NULL;

然后你正在做

lbl[len]

您尝试取消引用NULL指针并导致未定义的行为。

首先,您需要为该字符串分配内存(calloc分配内存并将其全部设置为0,这将消除手动添加空终止符的需要):

char *lbl = calloc(inst_len + 1, 1);

然后你需要修复你的循环,一些事情是在错误的地方。它应该是

for (int t = 0; t < inst_len; t++) {
    if (inst_ptr[t] == '#') {
        len = t - 1; // strlen(lbl) is redundant
        break;
    } else
        lbl[t] = inst_ptr[t];
}

然后当你完成后,free你分配的内存,以免造成内存泄漏:

free(lbl);

答案 1 :(得分:1)

也许您应该查看the standard中的第7.21节获取一些灵感。

最佳方法取决于您的应用程序的其余部分。 如果您不关心原始数据,可以使用

strtok(inst_ptr, "#");

或者分配和复制您需要的数据可能更好:

char * temp = strchr(inst_ptr, '#');
char * lbl;

if (temp)
   lbl = strndup(inst_ptr, temp - inst_ptr);
else
   lbl = strdup(inst_ptr);

请注意,以上是我最初想到的最低限度的实现,不一定是最好的实现。