【问题标题】:sscanf with colon delimeter带有冒号分隔符的 sscanf
【发布时间】:2019-02-22 09:26:47
【问题描述】:

我是 C 编程的新手。我想从输入缓冲区字符串中提取值。我看到了sscanf 的几个示例,它适用于空格分隔符,但不适用于冒号或逗号。

我尝试在 sscanf 中使用一些正则表达式,但似乎仍然不起作用。

#include <stdio.h>

int main() {

char buffer[] = "T:192.164.7.1:22:user:pass:empty:test.txt";
char cmdChar;
char ipAddress[100];
int port;
char username[100];
char password[100];
char folder[100];
char fileName[100];
char fileExtension[100];

sscanf(buffer, "%1c:%[^:]%d:%s:%s:%s:%s.%s", cmdChar, ipAddress, &port, username, password, folder, fileName, fileExtension);
printf("%c \n\n", cmdChar);

}

尝试打印第一个字符cmdChar,但它返回为NULL。有人可以指出我做错了什么。谢谢!

【问题讨论】:

  • 您需要将&amp;cmdChar 传递给sscanf
  • "%1c" 相当没用,因为 char 无论如何都只是一个字符。限制对于防止缓冲区溢出的字符串更有意义。
  • [^:]%d 将一直读取到 :: 在字符串中省略,因此您的 port 将具有 : ascii 值。

标签: c regex gcc scanf stdio


【解决方案1】:

我发现您的格式存在一些问题:

  • "%[^:]%d" - 第一部分会一直读取,直到碰到冒号,但它不会读取冒号本身,这意味着后面的整数将无法正确读取,字符串的其余部分将被错误解析(如果有的话)。你需要"%[^:]:%d"

  • "%s.%s" 用于字符串 "test.txt"%s 格式读取 空格分隔 字符串,这意味着第一个 "%s" 会将整个 "test.txt" 读入 fileName。如果要拆分为名称和后缀,则需要使用%[ 格式作为int "%[^.].%s"

正如评论中提到的,您需要将指针传递给cmdChar

【讨论】:

  • : 是冒号,不是分号。分号是;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
相关资源
最近更新 更多