C语言 使用scanf读取字符串的问题



现在我读了一些东西:

scanf()转换%[n]将匹配换行符,while%[^n]将匹配到的所有字符一个换行符。

但在以下代码中:

#include<stdio.h>

int main() {
printf("Enter Something: ");
char name[100];   
scanf("%99[help]", name);
printf("%s",name);
}

输入help me没有问题,因为打印的字是help。然而,当我进入I need help它打印垃圾。请帮忙如何解决这个问题?我的目标是匹配沿着输入的任何位置输入的单词help,例如

"This is a test, i need help in this"

应该检测到help

需要检查scanf的结果。如果匹配失败,则不修改传入的指针。在您的特定情况下,name将包含任意数据。

检查scanf的输出后,您将看到它无法匹配该字符串。scanf不是正则表达式解析器。它只会尝试匹配它在输入流中看到的第一个"item"。

匹配说明符%99[help]表示"我要匹配任何包含字母h, e, l, p 的任意顺序,长度不超过99个字符"。这是所有。因此,它在输入的第一个字母("T")上失败,该字母不在集合中。

如果你想在另一个字符串中查找一个字符串,使用strstr为例。要读取整行,如果您的环境有的话,最简单的是使用getline

需要扫描集来识别可能输入的所有字符。您还需要检查scanf()的返回,看看它是否成功。

#include <stdio.h>
int main()
{
    printf("Enter Something: ");
    char name[100];   
    if (scanf("%99[Indhelp ]", name) != 1)
        fprintf(stderr, "scanf() failedn");
    else
        printf("%s",name);
    return 0;
}

它将识别"我需要帮助"和许多其他短语。C标准说:

如果-字符在扫描列表中并且不是第一个字符,也不是第二,如果第一个字符是^,而不是最后一个字符,则行为是实现定义。

在许多实现中,您可以使用诸如%[a-zA-Z ]之类的符号来拾取一串字母或空格。然而,这是实现定义的行为。这意味着它可以做任何实现选择的事情,但实现必须记录它的含义。

编写扫描集的可靠方法是:

%[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ]

当然,这给你留下了一些关于标点的问题,更不用说重音字符了;如果您愿意,可以将两者都添加到扫描集。

相关内容

  • 没有找到相关文章

最新更新