gpt4 book ai didi

c - 为什么 scanf() 无法过滤双引号,尽管将格式设置为 [A-Za-z]

转载 作者:行者123 更新时间:2023-11-30 15:26:21 24 4
gpt4 key购买 nike

我试图仅提取除句子中其他字符之外的字母单词。

为此,我使用两个 scanf() ,如下所示。

scanf("%s", word);
sscanf(word, "%[A-Za-z]", word);

问题是,尽管我将格式设置为 %[A-Za-z],但双引号未被删除然而奇怪的是,如果这个标记位于单词的最后一个位置,它就会被删除。

有谁知道原因吗?

测试用例
- “迪士尼乐园
- 左。”

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

#define MAX_WORD 128

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

/* Read all of contents */
while (EOF != scanf("%s", word)) {
printf("origin word: %s\n", word);
sscanf(word, "%[A-Za-z\"]s", word);
printf("transformed: %s\n", word);

}
}

最佳答案

由于句点而不是引号,它会删除第二行的末尾,因此它会同时删除句点引号。

您要求它扫描由字母 A-Za-z^" 组成的字符串,因此句点的存在会导致它在该点停止。

我不确定您是否完全理解它是如何工作的。它不会为您提供字符串中与您指定的字符匹配的所有字符,并丢弃其余字符。相反,它会接受第一个有效字符之前的字符,然后丢弃其他所有字符。如果您输入一些完全有效的字符,但中间有一个无效字符,您会看到这一点:

abcdefg.hijklmnop
origin word: abcdefg.hijklmnop
transformed: abcdefg

由此可见,它会停在第一个无效字符处,而不是仅仅删除无效字符。

如果您想要一个仅包含匹配字符的字符串,您可以使用类似以下内容的内容:

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

#define MAX_WORD 128

static void strip(char *word, char *allow) {
char *d = word;
while (*word != '\0') {
if (strchr (allow, *word) != NULL)
*d++ = *word;
word++;
}
*d = '\0';
}

int main (void) {
char word[MAX_WORD];

while (EOF != scanf ("%s", word)) {
printf("origin word: %s\n", word);
strip (word, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz^\"");
printf("transformed: %s\n", word);
}
}

并且,带有一组示例运行:

"Disneyland
origin word: "Disneyland
transformed: "Disneyland

Left."
origin word: Left."
transformed: Left"

dvsdhjshhvsdf6553785365^%%$$@@#*&*&mjdvsdddhvjhdfvb
origin word: dvsdhjshhvsdf6553785365^%%$$@@#*&*&mjdvsdddhvjhdfvb
transformed: dvsdhjshhvsdf^mjdvsdddhvjhdfvb

关于c - 为什么 scanf() 无法过滤双引号,尽管将格式设置为 [A-Za-z],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27396818/

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