我在执行 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/