用 c 搜索和替换程序不起作用?

Search and replace programme with c doesn't work fine?

提问人:omar ghazi 提问时间:9/22/2023 最后编辑:Barmaromar ghazi 更新时间:9/22/2023 访问量:53

问:

大家好,我有一个问题要用 C 解决,但程序不能正常工作 这是主题:

编写一个名为 search_and_replace 的程序,它接受 3 个参数, 第一个参数是替换字母(第二个参数)的字符串 参数)由另一个(第三个参数)。如果参数数 不是 3,只需显示换行符。如果不包含第二个参数 在第一个(字符串)中,程序只需重写 字符串后跟换行符。

例子:

$>./search_and_replace "Papache est un sabre" "a" "o"
Popoche est un sobre

这是完整的代码;

#include <unistd.h>

int main(int argc, char **argv)
{
    int i;
    int j;
    int k;   
    int replace;

    i = 0;
    j = 0;
    if (argc == 4)
    {
        while(argv[1][i])
        {
            while(argv[2][j] != '\0' && argv[1][i] == argv[2][j])
            {
                while(argv[3][k])
                {
                    k = 0;
                    replace = argv[2][j];
                    argv[2][j] = argv[3][k];
                    argv[3][k] = replace;
                    k++;
                }
                argv[1][i] = argv[2][j];
                j++;
            }
            write(1, &argv[1][i], 1);
            i++;
        }
    }
}

我正在尝试更改循环中的变量声明,并在 juste 2 中设置所有条件,而

c argv argc

评论

1赞 Weather Vane 9/22/2023
"警告 C4700:使用了未初始化的局部变量“k”。请注意编译器警告。
0赞 omar ghazi 9/22/2023
你能解释更多吗?
0赞 Weather Vane 9/22/2023
在变量的第一次迭代中,变量具有不确定的值。您必须显式初始化局部(自动)变量,就像使用 一样。您在该循环中的错误位置,该循环确实如此,但下次会重置它。while(argv[3][k])ki = 0; j = 0;k = 0;k++;
0赞 omar ghazi 9/22/2023
你能为我写出正确的逻辑吗,我没有收到错误
1赞 Barmar 9/22/2023
如果您使用循环而不是循环,会更容易。然后,在适当的时间初始化变量几乎是自动的。forwhile

答:

1赞 Barmar 9/22/2023 #1

你有几个不必要的循环。第 2 个和第 3 个参数只是单个字符,而不是需要循环的字符串。您只需将出现的任何 替换为 。argc[2][0]argc[3][0]

您也不需要在找到匹配项之间和找到匹配项时交换字符。argv[2]argv[3]

#include <unistd.h>
#include <string.h>

int main(int argc, char **argv)
{
    if (argc == 4 && strlen(argc[2]) > 0 && strlen(argc[3]) > 0)
    {
        char *string = argc[1];
        char old = argc[2][0];
        char new = argc[3][0];

        for (int i = 0; string[i]; i++) {
            if (string[i] == old) {
                string[i] = new;
            }
        }
        write(STDOUT_FILENO, string, strlen(string));
    }
    write(STDOUT_FILENO, "\n", 1); // write a newline after the replacement
}