首页 > 解决方案 > 将句子中的单词替换为另一个单词的C程序

问题描述

我试图将句子中的目标词替换为另一个词,但它不起作用。你能帮我解决我哪里出错了吗?strstr 和 strncopy 有问题。它说 *swap 可以为零,然后使 strncpy 停止。我试图找到解决这个问题的方法,但我做不到。如何修复此代码?

 #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;
   }

标签: c

解决方案


我已经修复了您的代码并添加了一些测试,以避免您的swap函数中存在缓冲区溢出漏洞。

我的版本带车,change长度original不同。

#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;
}

我没有改变这一点,但我认为swap如果交换发生与否,最好返回 0 或 1。由于交换已就地完成,因此返回数据不是很有用。


推荐阅读