简体   繁体   中英

C program that replace word in sentence to another word

I tried to replace a target word in sentence to another word but it doesn't work. Can you please help me with where I got wrong? It has a problem with strstr and strncopy. It says that *swap can be zero, which then makes strncpy stop. I tried to find way to solve this problem, but I couldn't. How can I fix this code?

 #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    char *swap (char* data, const char* original, const char* change);
    
    
    int main() {
        char string[100];
        char original[100];
        char change[100];
    
        printf("Input String : ");
        fgets(string, 100, stdin);
        printf("Find String : ");
        fgets(original, 100, stdin);
        printf("Replace String : ");
        fgets(change, 100, stdin);
        printf("%s", swap(string, change, original));
    
        return 0;
    }
    
    char *swap(char* data, const char* original, const char* change) {
        char* swap;
        swap = strstr(data, original);
        int num = strlen(change);
        if (num == 0 || swap==0) return 0;
    
        strncpy(swap, change, strlen(change));
    
        printf("Result : %s", data);
        return 0;
   }

I have fixed your code and added a few tests to avoid buffer overflow vulnerability in your swap function.

My version take car of change and original being of different lengths.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *swap(char* data, int size, const char* original, const char* change);

int main() 
{
    char string[100];
    char original[100];
    char change[100];

    printf("Input String : ");
    fgets(string, sizeof(string), stdin);
    string[strcspn(string, "\r\n")] = 0;    // Remove EOL
    printf("Find String : ");
    fgets(original, sizeof(original), stdin);              
    original[strcspn(original, "\r\n")] = 0;  // Remove EOL
    printf("Replace String : ");             
    fgets(change, sizeof(change), stdin);               
    change[strcspn(change, "\r\n")] = 0;    // Remove EOL

    printf("%s\n", swap(string, sizeof(string), original, change));

    return 0;
}

char *swap(char* data, int size, const char* original, const char* change) 
{
    if ((data == NULL) || (original == NULL) || (change == NULL))
        return data;     // Unspecified data 
    int datLen = strlen(data);
    int oriLen = strlen(original);
    if (oriLen == 0)
        return data;     // No original specified
    char *swap = strstr(data, original);
    if (swap == NULL)
        return data;     // Original not found in data
    int chgLen = strlen(change);
    if (size < (datLen + chgLen - oriLen))
        return data;     // Not enough space to store result
    if (chgLen != oriLen)
        memmove(swap + chgLen, swap + oriLen, 1 + datLen + oriLen - (swap - data));
    memmove(swap, change, chgLen);
    return data;
}

I have not changed that, but I think it is better to have swap return 0 or 1 if the swap took place or not. Returning data is not very useful as the swap is done in place.

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