我试图仅提取除句子中其他字符之外的字母单词。
为此,我使用两个 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/