gpt4 book ai didi

c - tempWord[0] ='\0' 不以某种方式重置字符串

转载 作者:太空狗 更新时间:2023-10-29 16:10:40 24 4
gpt4 key购买 nike

我用C写了一个程序,预期的结果应该是:

$ cat poem.txt

Said Hamlet to Ophelia,
I'll draw a sketch of thee,
What kind of pencil shall I use?
2B or not 2B?

$ ./censor Ophelia < poem.txt

Said Hamlet to CENSORED,
I'll draw a sketch of thee,
What kind of pencil shall I use?
2B or not 2B?

但是我得到了这个:

$ ./censor Ophelia < poem.txt

Said Hamlet tomlet CENSORED,
I'lllia drawlia arawlia sketcha ofetcha theecha,
Whatcha kindcha ofndcha pencila shallla Ihallla usellla?
2Bsellla orellla notllla 2Botllla?

我使用 tempWord 来存储每个单词,并将其与需要审查的单词进行比较。然后我使用 tempWord[0]='\0' 重置临时字符串,以便我可以进行另一次比较。但它似乎不起作用。谁能帮忙?

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

int compareWord(char *list1, char *list2);
int printWord(char *list);

int main(int argc, char *argv[]) {

int character = 0;

char tempWord[128];
int count = 0;

while (character != EOF) {
character = getchar();

if ((character <= 'z' && character >= 'a') ||
(character <= 'Z' && character >= 'A') ||
character == 39) {
tempWord[count] = character;
count++;
} else {
if (count != 0 && compareWord(tempWord, argv[1])) {
printf("CENSORED");
count = 0;
tempWord[0] = '\0';
}

if (count != 0 && !compareWord(tempWord, argv[1])) {
printWord(tempWord);
count = 0;
tempWord[0] = '\0';
}

if (count == 0) {
printf("%c", character);
}
}
}
return 0;
}

int printWord(char *list) {

// print function
}

int compareWord(char *list1, char *list2) {
// compareWord function
}

最佳答案

您的代码中存在多个问题:

  • 您没有在正确的位置测试文件结尾:if getc()返回 EOF , 你应该立即退出循环而不是处理 EOF并在下一次迭代中退出。执行此操作的经典 C 习惯用法是:

    while ((character = getchar()) != EOF) {
    ...
  • 为了可移植性和可读性,您应该使用 isalpha()来自 <ctype.h>检查字节是否为字母并避免将撇号的值硬编码为 39 , 使用 '\''相反。

  • 将字节存储到 tempWord 时可能会出现缓冲区溢出大批。您应该将偏移量与缓冲区大小进行比较。

  • 你没有终止tempWord ,因此 compareWord()函数无法确定第一个字符串的长度。行为未定义。

  • 您没有检查是否提供了命令行参数。

  • 第二个测试是多余的:您可以只使用 else条款。

  • 打印 tempWord[] 的内容时出现未定义行为因为缺少空终止。这解释了意外行为,但您可能会产生更糟糕的后果。

  • printWord只打印一个 C 字符串,使用 fputs() .

  • compWord功能与strcmp(a, b) == 0 基本相同.

这是一个经过简化和更正的版本:

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

int main(int argc, char *argv[]) {
char tempWord[128];
size_t count = 0;
int c;

while ((c = getchar()) != EOF) {
if (isalpha(c) || c == '\'') {
if (count < sizeof(tempWord) - 1) {
tempWord[count++] = c;
}
} else {
tempWord[count] = '\0';
if (argc > 1 && strcmp(tempWord, argv[1]) == 0) {
printf("CENSORED");
} else {
fputs(tempWord, stdout);
}
count = 0;
putchar(c);
}
}
return 0;
}

编辑: chux 正确地评论说上面的代码没有处理 2 种特殊情况:

  • 太长的词在输出中被截断。
  • 如果最后一个词恰好位于文件末尾,则省略它。

我还意识到该程序无法处理命令行中传递的长单词的情况。

这是一种不带缓冲区的不同方法,可以解决这些缺点:

#include <ctype.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
const char *word = (argc > 1) ? argv[1] : "";
int count = 0;
int c;

for (;;) {
c = getchar();
if (isalpha(c) || c == '\'') {
if (count >= 0 && (unsigned char)word[count] == c) {
count++;
} else {
if (count > 0) {
printf("%.*s", count, word);
}
count = -1;
putchar(c);
}
} else {
if (count > 0) {
if (word[count] == '\0') {
printf("CENSORED");
} else {
printf("%.*s", count, word);
}
}
if (c == EOF)
break;
count = 0;
putchar(c);
}
}
return 0;
}

关于c - tempWord[0] ='\0' 不以某种方式重置字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41906918/

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