簡體   English   中英

C 將句子中的單詞替換為另一個單詞的程序

[英]C program that replace word in sentence to another word

我試圖將句子中的目標詞替換為另一個詞,但它不起作用。 你能幫我解決我哪里出錯了嗎? 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;
   }

我已經修復了您的代碼並添加了一些測試以避免您的swap function 中的緩沖區溢出漏洞。

我的版本是changeoriginal車長短不一。

#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。 由於交換已就地完成,因此返回數據不是很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM