嘿伙计们我试图删除字符串的特定部分...具体当用户输入字符串时如果字符串是旧字符串的一部分我删除它...这是一个假设输入和预期输出: string:“/ hello / world / iamsleepy” 被删除:“/ world” 输出:“/ hello / iamsleepy”
我尝试使用strstr执行此操作,下面是我正在使用的代码...但它不起作用...让我知道我做错了什么......还是有其他方法可以解决此?
char* string_delete(char* oldstr, char* str_to_remove){
char* newstr = malloc(strlen(oldstr) - strlen(str_to_remove)+1);
char* address = strstr(oldstr, str_to_remove);
memcpy(newstr, oldstr, address - oldstr);
memcpy(newstr + address - oldstr, address+strlen(str_to_remove), strlen(newstr)- strlen(str_to_remove));
return newstr;
}
答案 0 :(得分:0)
请尝试以下代码:
char* string_delete(char* oldstr, char* str_to_remove){
char* address = strstr(oldstr, str_to_remove);
if (NULL == address) {
return NULL;
}
int new_len = strlen(oldstr) - strlen(str_to_remove);
char* newstr = (char *)malloc(new_len+1);
memcpy(newstr, oldstr, address - oldstr);
memcpy(newstr + (address - oldstr), address+strlen(str_to_remove), strstr(oldstr) - strlen(str_to_remove));
newstr[new_len] = '\0';
return newstr;
}
strlen(newstr)
不正确,应为strlen(oldstr)
。您需要在newstr
的末尾添加'\ 0'。
编辑:以下函数将删除oldstr中的所有字符串str_to_remove,并将“a”返回给string_delete(“aaaa”,“aaa”)。但它的缺陷在于每次它都会将相同大小的oldstr内存分配给newstr,然后将其重新分配给真实内存。也许这不是很有效率。如果在调用此函数后不再关心oldstr,则可以返回已更改的oldstr,无需分配新内存。我希望它有所帮助。
char* string_delete(char* oldstr, char* str_to_remove){
int len_to_remove = strlen(str_to_remove);
int len_old = strlen(oldstr);
char *newstr = (char *)malloc(len_old + 1);
memcpy(newstr, oldstr, len_old + 1);
char *pos = newstr;
while ( ( pos = strstr(newstr, str_to_remove) ) != NULL ) {
int cnt = strlen(pos + len_to_remove);
memmove(pos, pos + len_to_remove, cnt + 1);
}
newstr = (char *)realloc(newstr, strlen(newstr) + 1);
return newstr;
}
顺便说一句,如果我的英文快递不清楚或不对,请告诉我,我正在练习英语。 THX
答案 1 :(得分:0)
我在您的代码中看到以下问题。
未正确处理源字符串中未删除字符串的情况。
在它是空终止字符串之前使用strlen(newstr)
会导致未定义的行为。
表达式newstr + address - oldstr
不好,因为它是从左到右进行评估的。 newstr + address
不是有效的表达式。您需要使用newstr + (address - oldstr)
。
返回的字符串不会以空值终止。
这是解决问题的函数版本。
char* string_delete(char* oldstr, char* str_to_remove){
size_t len_old = strlen(oldstr);
size_t len_rem = strlen(str_to_remove);
char* address = strstr(oldstr, str_to_remove);
size_t len_new;
char* newstr = NULL;
if ( address == NULL )
{
newstr = malloc(len_old+1);
strcpy(newstr, oldstr);
}
else
{
len_new = len_old-len_rem;
newstr = malloc(len_new+1);
memcpy(newstr, oldstr, address - oldstr);
memcpy(newstr + (address - oldstr),
address + len_rem,
len_new - (address - oldstr) + 1);
}
return newstr;
}