gpt4 book ai didi

c - sscanf - 如果遇到特定字符则提前停止扫描

转载 作者:太空宇宙 更新时间:2023-11-04 03:18:45 25 4
gpt4 key购买 nike

我正在尝试扫描可能以“评论”结尾的字符串。

例如,假设我有以下字符串:

char *str = "first john last smith# example";

目前,我执行以下操作以从字符串中扫描我需要的内容:

  1. 删除注释 + 尾随空格(例如 "first john last smith")。
  2. 扫描“修剪过”的字符串(例如使用first %10s last %10ssscanf)。
  3. "john""smith" 已成功扫描! :)

这行得通,但是是否有一种标准方法可以避免在遇到“#”时让 sscanf 提前终止来修剪字符串?理想情况下,扫描诸如 "first john last smith""first john last smith# example" 之类的字符串会在给定相同格式字符串的情况下产生相同的结果。

最佳答案

如果您有理由确定您不必处理不完整的信息(注释可能存在,但如果不存在也没关系),那么您只需阻止 sscanf()使用“扫描集”解析 # 符号,如下所示:

#include <stdio.h>

int main(void)
{
char *str = "first john last smith# example";
char fname[11] = "";
char lname[11] = "";
int rc = sscanf(str, "first %10[^# ] last %10[^ #]", fname, lname);

printf("rc = %d, fname = [%s], lname = [%s]\n", rc, fname, lname);

return 0;
}

输出是:

rc = 2, fname = [john], lname = [smith]

如果注释字符出现在姓氏之前,那么您只会读到 john(当然,除非它出现在姓氏之前)。 sscanf() 不需要担心尾随 Material ;它仍然在字符串中,但根本不需要查看它。

我同意评论员的观点,即这可能不是最可靠的工作方式。

请注意使用 char fname[11];%10[…] 来使字符串长度正常工作。差一个是令人讨厌的,但在标准中是神圣的,基于标准前的传统。如果您是从头开始设计它,则不会在长度上出现“逐个不同”的情况。还有一种动态指定字段长度的方法,类似于 printf() 中的 %*.*f 符号。遗憾的是,scanf() 和 friend 们没有提供。

关于c - sscanf - 如果遇到特定字符则提前停止扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48700546/

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