使用匹配替换随机字符串/字符数组字符

Posted

技术标签:

【中文标题】使用匹配替换随机字符串/字符数组字符【英文标题】:Replacement of random string/char array characters using match ups 【发布时间】:2010-07-22 02:22:28 【问题描述】:
while (1)

    char j;
    if (x[j] == y[j])

在这里,我试图启动一个循环,我希望能够将 char 数组“x”中的任何字符与 char 数组“y”匹配。如果字符确实从 x 到 y 匹配,那么我希望它们保持原样,如果它们不匹配,我希望能够用星号 '*' 替换它们。 (例如x = [a,p,f]y = [a,p,p,l,e] 等在匹配和替换后y = [a,p,p,*,*] 和当我cout 它拼写出app**

我不知道如何设置以及应该使用哪种类型的循环。我对编程很陌生,我知道基本的替换和切换功能。

【问题讨论】:

y 中的一个字母是否应该保持不变,只要它在 x 中的某个位置,或者 y 中的每个字母都必须与 x 中相同索引处的字母匹配? 【参考方案1】:

我认为这或多或少符合您的规定。

#include <string.h>

for (int j = 0; y[j] != '\0'; j++)

    if (strchr(x, y[j]) == 0)
        y[j] = '*';


测试程序

@LooneyTunes 询问发生了什么:x[] = "apcd"y[] = "abcd" - 你得到"a*cd"。 答案是是的。这是一个演示结果的测试程序。就我而言,它是纯 C 代码,尽管 G++ 对此也很满意。您可能需要在编译器上设置 GCC 的 C99 选项,例如“-std=c99”。如果 MSVC 将它编译为 C 代码,它不会喜欢它;在函数顶部声明j

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

static void doit(const char *x, char *y)

    printf("Before: x = %s, y = %s\n", x, y);
    for (int j = 0; y[j] != '\0'; j++)
    
        if (strchr(x, y[j]) == 0)
            y[j] = '*';
    
    printf("After:  x = %s, y = %s\n", x, y);


int main(void)

    const char x1[] = "apf";
    const char x2[] = "apcd";
    char       y1[] = "apple";
    char       y2[] = "abcd";

    doit(x1, y1);
    doit(x2, y2);
    return 0;

输出

Before: x = apf, y = apple
After:  x = apf, y = app**
Before: x = apcd, y = abcd
After:  x = apcd, y = a*cd

【讨论】:

如果这是 C++ 代码,我认为你应该“#include ”和“使用 std::strchr”而不是“#include 。另外,strchr() 搜索对于第一次出现的字符,如果未找到则返回 0。这不只是查看 y 中的每个字符是否在 x 中的某个位置,而不管其位置如何? @procrastinate:通过包含 ,我不必编写 'std::strchr' 或 'using std;'。不过,您是对的;最好使用 C++ 头文件。该代码查看我正在查看的 y (apple) 中的当前字符是否出现在 x (apf) 的列表中。一开始我被这个问题误导了('x[j] == y[j]' 位特别具有误导性),但是如果您查看预期的输出,我想您会发现实现的就是所要求的。 这个循环是否执行“如果 x=['a','b','c','d','\0'] 和 y=['a','p ','c','d','\0'] 结果会是 ['a','*','c','d','\0']" 函数吗? 这正是我需要的功能。非常感谢。【参考方案2】:

如果您使用的是 C++ 字符串类,这会更容易,但这里有一个 C 字符串的答案。

int i = 0;
while (x[i] != '\0' && y[i] != '\0') 
    if (x[i] != y[i]) 
        y[i] = '*';
    
    i++;

y[i] = '\0'; // C strings are terminated with the null character

编辑:我注意到您想更改 y 数组而不是创建一个新数组。

【讨论】:

随着 i 的增加,这不是一次只匹配一个索引的数组吗? 是的。你想要一些不同的行为吗?如果 x=['a','b','c','d','\0'] 和 y=['a','p','c','d','\0' ]?那么你想要结果 ['a','','c','d','\0'] 还是 ['a','',' ','','\0'],只保留匹配的开头字符? 在这个问题的解释下(这是我第一次通过它),您还需要删除额外的字符。您的代码在示例数据上生成“ap*”而不是“app**”。您需要在此之后添加一个循环来消除多余的字符。 是的,这就是我的意思。如果 x=['a','b','c','d','\0'] 和 y=['a','p','c','d','\0']结果将是 ['a','*','c','d','\0']。在这种情况下,我必须构建一个循环,检查 y 中的所有索引和 x 中的第一个索引,然后检查 y 中的所有索引和 x 中的第二个索引,依此类推。 @Jonathan Leffler,我觉得这需要一个循环中的循环而不是之后的循环。

以上是关于使用匹配替换随机字符串/字符数组字符的主要内容,如果未能解决你的问题,请参考以下文章

R将数据帧中的字符串匹配替换为来自另一个数据帧/数组的值

str_replace 字符串匹配替换 explode 拆分数组

nodejs 匹配字符串问题

VBA - 如何使随机化字符串数组工作?

java.lang.String 中 API 的使用

随机替换字符串中的单词