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

标签 c string scanf standard-library

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

为此,我使用两个 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/

相关文章:

c - 是否可以在 C 中使用 switch case 和 操作

c# - 如何将字符串拆分为 double 并将它们添加到数组 C#

C++ 读取长的非分隔整数,将它们分开并放入二维数组中

你能解释一下这个C代码吗? (创建守护程序)

低冗长的 C 泛型继承

c - 这是整数提升吗?它是如何工作的?

python:如何计算两个单词列表的余弦相似度?

c++ - 如何在此代码中正确使用 strcmp() ?

c - 在 C 中使用 scanf 的正则表达式

c - scanf() 将换行符保留在缓冲区中