c - 替换C中字符串中的单词

标签 c string

我正在寻找一种方法来替换字符串中的单词。 假设我使用这样的函数:

changewords("Hello I'm Number One","Number One","Zero");

输出将是这样的:“你好,我是第一”->“你好,我是零”

但更多的时候我也只能替换一个词

changewords("Hello I'm Number One","One","Four");

像这样:“你好我是一号”->“你好我是四号”

在我的代码中,我将句子拆分为单词,并将每个单词与我需要更改的单词进行比较,但我只能以这种方式更改一个单词,有人可以建议如何正确执行吗? 谢谢。 这是我的代码,它使用矩阵(表)中的一行作为句子,行号是 sentenceToChange 变量。

int changewords (char table[][MAX_SENTENCE_LENGTH], int numOfSentences, int sentenceToChange, char subString[],char replaceWith[]){
int slen,i=0,q=0,c=0;
char wordlist[100][100];
char final[1][100];
slen=strlen(table[sentenceToChange]);
for(i=0;i<slen;i++) {
    if(table[sentenceToChange][i]!=' '){
        wordlist[q][c]=table[sentenceToChange][i];
    c++;
    }
    else { 
        wordlist[q][c]='\0';
        c=0;
        q++;
    }
}
for(i=0;i<q;i++) {
if (!strcmp(wordlist[i],subString)) {
strcpy(wordlist[i],replaceWith);
}
}
final[0][0]='\0';
for(i=0;i<=q;i++) {
strcat(final[0],wordlist[i]);
if(i!=q) strcat(final[0]," ");
}
final[0][slen-1]='\0';
strcpy(table[sentenceToChange],final[0]);

最佳答案

有几种不同的策略,如有必要,都可以进一步调整。

  1. 一次复制一个字符到目标位置,向前扫描find,找到后插入replace,找不到则插入原字符;
  2. 每次复制一个单词到目标位置,向前扫描find,找到时插入replace,找不到时插入原文-- 你将需要它来替换整个单词,而不是仅替换文字 find 文本;
  3. 使用库函数扫描查找文本。

使用哪种策略取决于进一步(未提及的)要求,例如

  1. 区分大小写?
  2. 整个单词?
  3. 只替换一次,还是全部替换?
  4. findreplace 能否以空格开头和/或结尾,这些重要吗?

比较困难的事情之一是评估新字符串所需的必要内存。下面,我假设总能找到并替换一个字符串。为了迎合“任何”新字符串长度,无需预先扫描findchange,更安全的做法是假定句子 中的每个字符可能可以用 replace 替换;也就是说,目标将占用的最大内存量是 strlen(sentence)*strlen(replace)+1(+1 一如既往地用于存储终止零)。

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

char *changewords_1 (char *sentence, char *find, char *replace)
{
    char *dest = malloc (strlen(sentence)-strlen(find)+strlen(replace)+1);
    char *destptr = dest;

    *dest = 0;

    while (*sentence)
    {
        if (!strncmp (sentence, find, strlen(find)))
        {
            strcat (destptr, replace);
            sentence += strlen(find);
            destptr += strlen(replace);
        } else
        {
            *destptr = *sentence;
            destptr++;
            sentence++;
        }
    }
    *destptr = 0;
    return dest;
}

char *changewords_2 (char *sentence, char *find, char *replace)
{
    char *dest = malloc (strlen(sentence)-strlen(find)+strlen(replace)+1);
    char *destptr = dest;

    *dest = 0;

    while (*sentence)
    {
        if (!strncmp (sentence, find, strlen(find)) &&
            (sentence[strlen(find)] == 0 || sentence[strlen(find)] == ' '))
        {
            strcat (destptr, replace);
            sentence += strlen(find);
            destptr += strlen(replace);
        } else
        {
            while (*sentence && *sentence != ' ')
            {
                *destptr = *sentence;
                destptr++;
                sentence++;
            }
            while (*sentence == ' ')
            {
                *destptr = *sentence;
                destptr++;
                sentence++;
            }
        }
    }
    *destptr = 0;
    return dest;
}

char *changewords_3 (char *sentence, char *find, char *replace)
{
    char *dest = malloc (strlen(sentence)-strlen(find)+strlen(replace)+1);
    char *ptr;

    strcpy (dest, sentence);

    ptr = strstr (dest, find);
    if (ptr)
    {
        memmove (ptr+strlen(replace), ptr+strlen(find), strlen(ptr+strlen(find))+1);
        strncpy (ptr, replace, strlen(replace));
    }

    return dest;
}


int main (void)
{
    char *result;

    result = changewords_1 ("Hello I'm Number One","Number","Index");
    printf ("[%s]\n", result);
    free (result);

    result = changewords_2 ("Here Is The Onerous Number One ...","One","Four");
    printf ("[%s]\n", result);
    free (result);

    result = changewords_3 ("Here Is Number One Again","One","Fourty-Five Hundred");
    printf ("[%s]\n", result);
    free (result);

    return 0;
}

.. 显示输出:

[Hello I'm Index One]
[Here Is The Onerous Number Four ...]
[Here Is Number Fourty-Five Hundred Again]

关于c - 替换C中字符串中的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27160073/

相关文章:

c++ - 为什么可以在 C++ char* 中放入多个字符

c++ - 从字符串中提取整数

c - VSTforward_call 在非标准调用约定上失败

c - 为什么 C/C++ 中缺少逻辑运算符(&&= 和 ||=)的赋值?

C: 如何使用 getc 来避免产生非 UTF-8 字符?

c - 在c中使用指针打印Char数组

c - 使用 YAJL 解析 JSON 数组

C++ 将一个字符串的索引与另一个字符串进行比较?

Javascript - 如何知道有多少字符串与另一个字符串匹配?

C++ 用指针反转字符串中单词的顺序