c - 使用 scanf 解析字符串时的奇怪行为

标签 c scanf

我在执行 sscanf 时遇到了相当奇怪的行为。目前正在使用 c 语言在 Windows 7 机器上工作。

我有以下内容:

if( sscanf( str, "%1[a-zA-Z]%31[a-zA-Z+.-]%n", &scheme[ 0 ], &scheme[ 1 ], &num_chars ) >= 1 )
  {
  return( num_chars );
  }

str 变量是一个大输入字符串,可能大于 32 个字符。 scheme 变量被声明为包装函数调用的参数,它是一个 32 个字符的数组。

我可以使用几个 scanfs 或两个单独的变量轻松地做到这一点。我很好奇为什么这不能按原样工作。

编辑:
在我执行此操作时发生错误 str 包含“tel-net”(正在测试“-”),这导致方案字符串基本上没有可用字符。

解决方案:
我弄清楚问题出在哪里,实际上根本不是 scanf 问题。

这就是我声明方案变量的方式:

IOP_uri_scheme_type   * scheme_str;

IOP_uri_scheme_type 声明如下:

typedef char    IOP_uri_scheme_type[ IOP_URI_MAX_SCHEME_SZ ];  // Size = 32

问题是索引,scheme[1] 实际上是跳转整个 block (所有 32 个字节)而不是像我期望的那样跳转一个字符。所以从技术上讲,scanf 的开头是正确的(减去 %n 东西)。

我可以解决这个问题的一种可能方法是首先将 scheme 转换为 (char *) 或直接操纵指针值,取消引用它,或者不使用我不需要的指针。

感谢大家的帮助。

最佳答案

看来您正在尝试在 sscanf 中使用正则表达式。据我所知,sscanf 不支持正则表达式。

关于c - 使用 scanf 解析字符串时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23666424/

相关文章:

c - 从 GSL 库中获取 C gsl_fit_linear() 函数中线性回归的 p 值

c - 不兼容的指针类型错误

c - valgrind 地址 0x421688c 是为具有整数数据的链表分配的大小为 4 的 block 之后的 0 字节

python - Python中的sscanf

C 指针 - 作为数组的结构

c - 对 switch 语句使用不同的语法时,优化是否有任何可能的变化?

C: 如果用户使用 fflush(stdin) 输入字符,程序不会再次询问用户

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

c - 由 fscanf 引起的 fscanf 分析器错误

C程序从用户那里获取联系并将其添加到文件中