简体   繁体   中英

Trying to delete a specific character from a string in C?

I'm trying to delete a specific character (?) from the end of a string and return a pointer to a string, but it's not removing it at all at the moment. What am I doing wrong? Is there a better way to go about it?

char * word_copy = malloc(strlen(word)+1); 

strcpy(word_copy, word); 

int length = strlen(word_copy);

int i = 0; 
int j = 0; 

for (i = 0; word_copy[i] != '\0'; i++) {
    if (word_copy[length - 1] == '?' && i == length - 1){
        break; 
    }
}
       
for (int j = i; word_copy[j] != '\0'; j++) {
    word_copy[j] = word_copy[j+1];  
}
            
word = strdup(word_copy);

I'm immediately seeing a couple of problems.

The first for loop does nothing. It doesn't actually depend on i so it could be replaced with a single if statement.

if (word_copy[length - 1] == '?') {
    i = length - 1;
} else {
    i = length + 1;
}

The second for loop also acts as an if statement since it starts at the end of the string and can only ever run 0 or 1 times.

You could instead do something like this to remove the ? . This code will return a new malloced string with the last character removed if its ? .

char *remove_question_mark(char *word) {
    unsigned int length = strlen(word);

    if (length == 0) {
        return calloc(1, 1);
    }

    if (word[length - 1] == '?') {
        char *word_copy = malloc(length);

        // Copy up to '?' and put null terminator
        memcpy(word_copy, word, length - 1);
        word_copy[length - 1] = 0;

        return word_copy;
    }

    char *word_copy = malloc(length + 1);
    memcpy(word_copy, word, length + 1);
    return word_copy;
}

Or if you are feeling lazy, you could also just make the last character the new null terminator instead. Its essentially creates a memory leak of 1 byte, but that may be an acceptable loss. It should also be a fair bit faster since it doesn't need to allocate any new memory or copy the previous string.

unsigned int length = strlen(word);

if (length > 0 && word[length - 1] == '?') {
    word[length] = 0;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM