gpt4 book ai didi

c - 多个命令行参数 - 替换单词

转载 作者:行者123 更新时间:2023-11-30 15:22:41 25 4
gpt4 key购买 nike

我有一个程序,它从命令行参数中获取任意数量的单词,并将它们替换为单词“CENSORED”。我终于让程序处理传入的第一个参数,但我无法让程序审查仅以单个字符串输出的所有参数。该程序而是根据给定的参数单独运行,并且不会将它们全部考虑在内。我该如何修改这个?

如何集中使用/操作多个命令行参数?

我的代码如下。

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

char *replace_str(char *str, char *orig, char *rep, int j, int argc)
{
static char buffer[4096];
char *p;

for ( j = 1; j <= argc; j++ )
{

if(!(p = strstr(str, orig))) // Check if 'orig' is not in 'str'
{
if ( j == argc ) { return str; } // return str once final argument is reached
else { continue; } // restart loop with next argument
}

strncpy(buffer, str, p-str); // Copy characters from 'str' start to 'orig' str
buffer[p-str] = '\0';

if ( j == argc ) { return buffer; }
else { continue; }
}
sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig));
}

int main( int argc, char* argv[] ) //argv: list of arguments; array of char pointers //argc: # of arguments.
{
long unsigned int c, i = 0, j = 1;

char str[4096];

while ( (c = getchar()) != EOF )
{
str[i] = c; // save input string to variable 'str'
i++;
}
puts(replace_str( str, argv[j], "CENSORED", j, argc ) );

return 0;
}


i.e.
$ cat Hello.txt

Hello, I am me.

$ ./replace Hello me < Hello.txt

CENSORED, I am CENSORED.

最佳答案

有两个问题,您不能保证以 null 结尾的 str,其次,您没有迭代命令行上的单词来审查每个单词。在 getchar() 循环之后在 main 中尝试以下操作:

/* null-terminate str */
str[i] = 0;

/* you must check each command line word (i.e. argv[j]) */
for (j = 1; j < argc; j++)
{
puts(replace_str( str, argv[j], "CENSORED", j, argc ) );
}

注意:这会将每个 CENSORED 单词放在单独的行上。如注释中所述,将 puts (或者最好是 printf)移到循环之外以保持在单行上。

<小时/>

编辑

我道歉。您遇到的问题比上面提到的还要多。尝试检查修复后,很明显,根据在命令行上输入坏单词的顺序,您将继续难以解析单词。

虽然可以通过指针算术来复制/扩展/收缩原始字符串,而不管单词在命令行上出现的顺序如何,但简单地将提供的单词分离到数组中,然后进行比较要容易得多每个坏词与原始字符串中的每个词相对应。

使用 strtokstrsep 可以相对轻松地完成此操作。我整理了一个简单的示例来展示这种方法。 (注意:在传递给 strtok 之前复制字符串,因为它会改变原始字符串)。我相信这就是您试图做的事情,但您却没有能力比较每个单词(因此您使用 strstr 来测试匹配)。

查看示例,如果您还有其他问题,请告诉我。注意:我用 SMAX 定义替换了硬编码的 4096,并为在命令行输入的单词提供了单词最大值 WMAX。另外始终初始化字符串/缓冲区。它将使您始终能够轻松找到缓冲区中的最后一个字符,并确保缓冲区始终以空终止。

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

#define SMAX 4096
#define WMAX 50

char *replace_str (char *str, char **bad, char *rep)
{
static char buffer[SMAX] = {0};
char *p = buffer;
char *wp = NULL;
unsigned i = 0;
unsigned char censored = 0;

char *str2 = strdup (str); /* make copy of string for strtok */
char *savp = str2; /* and save start address to free */

if (!(wp = strtok (str2, " "))) /* get first word in string or bail */
{
if (savp) free (savp);
return str;
}

while (bad[i]) /* test against each bad word */
{
if (strcmp (wp, bad[i++]) == 0) /* if matched, copy rep to buffer */
{
memcpy (buffer, rep, strlen (rep));
censored = 1;
}
}

if (!censored) /* if no match, copy original word */
memcpy (buffer, wp, strlen (wp));

while ((wp = strtok (NULL, " "))) /* repeat for each word in str */
{
i = 0;
censored = 0;

memcpy (strchr (buffer, 0), " ", 1);
p = strchr (buffer, 0); /* (get address of null-term char) */

while (bad[i])
{
if (strcmp (wp, bad[i++]) == 0)
{
memcpy (p, rep, strlen (rep));
censored = 1;
}
}

if (!censored)
memcpy (p, wp, strlen (wp));
}

if (savp) free (savp); /* free copy of strtok string */
return buffer;
}

int main ( int argc, char** argv)
{
unsigned int i = 0;
char str[SMAX] = {0};
char *badwords[WMAX] = {0}; /* array to hold command line words */

for (i = 1; i < argc; i++) /* save command line in array */
badwords[i-1] = strdup (argv[i]);

i = 0; /* print out the censored words */
printf ("\nCensor words:");
while (badwords[i])
printf (" %s", badwords[i++]);
printf ("\n\n");

printf ("Enter string: "); /* promt to enter string to censor */

if (fgets (str, SMAX-1, stdin) == NULL)
{
fprintf (stderr, "error: failed to read str from stdin\n");
return 1;
}

str[strlen (str) - 1] = 0; /* strip linefeed from input str */

/* print out censored string */
printf ("\ncensored str: %s\n\n", replace_str (str, badwords, "CENSORED"));

i = 0; /* free all allocated memory */
while (badwords[i])
free (badwords[i++]);

return 0;
}

使用/输出

./bin/censorw bad realbad

Censor words: bad realbad

Enter string: It is not nice to say bad or realbad words.

censored str: It is not nice to say CENSORED or CENSORED words.

关于c - 多个命令行参数 - 替换单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29133210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com