- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试解析按以下方案格式化的帧:
$[number],[number],[number],<string>;[string]~<string>
用'[]'包围的参数是可选的,用'<>'包围的参数总是存在定义的:
因此,下面的帧都是正确的:
$0,0,0,thisIsFirstString;secondString~thirdOne
$0,,0,firstString;~thirdOne
$,,,firstString;~thirdString
目前,当所有元素都存在时,我可以使用以下代码解析框架
int main() {
char frame[100] = "$1,2,3,string1;string2~string3";
char num1[10], num2[10], num3[10], str1[100], str2[100], str3[100];
printf("frame : %s\n", frame);
sscanf(frame,"$%[^,],%[^,],%[^,],%[^;];%[^~]~%s", num1, num2, num3, str1, str2, str3);
printf("Number 1 : %s\n", num1);
printf("Number 2 : %s\n", num2);
printf("Number 3 : %s\n", num3);
printf("String 1 : %s\n", str1);
printf("String 2 : %s\n", str2);
printf("String 3 : %s\n", str3);
return 0;
}
结果如下
frame : $1,2,3,string1;string2~string3
Number 1 : 1
Number 2 : 2
Number 3 : 3
String 1 : string1
String 2 : string2
String 3 : string3
但是,如果缺少一个参数,前面的参数会被很好地解析,但缺少参数后面的参数不会被解析。
frame : $1,,3,string1;string2~string3
Number 1 : 1
Number 2 :
Number 3 :
String 1 :��/�
String 2 : �\<��
String 3 : $[<��
frame : $1,2,3,string1;~string3
Number 1 : 1
Number 2 : 2
Number 3 : 3
String 1 : string1
String 2 : h�v��
String 3 : ��v��
我如何向 sscanf
指定帧中可能缺少某些参数,以便在这种情况下将丢弃它们?
最佳答案
猜测最好的还是自己写解析器函数:
#define _GNU_SOURCE 1
#define _POSIX_C_SOURCE 1
#include <stdio.h>
#include <stddef.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#define __arraycount(x) (sizeof(x)/sizeof(x[0]))
// from https://stackoverflow.com/a/3418673/9072753
static char *mystrtok(char **m,char *s,char c)
{
char *p = s ? s : *m;
if (!*p)
return NULL;
*m = strchr(p, c);
if (*m)
*(*m)++ = '\0';
else
*m = p + strlen(p);
return p;
}
static char getseparator(size_t i)
{
return i <= 2 ? ',' : i == 3 ? ';' : i == 4 ? '~' : 0;
}
int main()
{
char ***output = NULL;
size_t outputlen = 0;
const size_t outputstrings = 6;
char *line = NULL;
size_t linelen = 0;
size_t linecnt;
for (linecnt = 0; getline(&line, &linelen, stdin) > 0; ++linecnt) {
if (line[0] != '$') {
printf("Lines not starting with $ are ignored\n");
continue;
}
// alloc memory for new set of 6 strings
output = realloc(output, sizeof(*output) * outputlen++);
if (output == NULL) {
fprintf(stderr, "%d Error allocating memory", __LINE__);
return -1;
}
output[outputlen - 1] = malloc(sizeof(*output[outputlen - 1]) * outputstrings);
if (output[outputlen - 1] == NULL) {
fprintf(stderr, "%d Error allocating memory", __LINE__);
return -1;
}
// remove closing newline
line[strlen(line)-1] = '\0';
//printf("Read line `%s`\n", line);
char *token;
char *rest = &line[1];
char *state;
size_t i;
for (i = 0, token = mystrtok(&state, &line[1], getseparator(i));
i < outputstrings && token != NULL;
++i, token = mystrtok(&state, NULL, getseparator(i))) {
output[outputlen - 1][i] = strdup(token);
if (output[outputlen - 1][i] == NULL) {
fprintf(stderr, "%d Error allocating memory", __LINE__);
return -1;
}
//printf("Read %d string: `%s`\n", i, output[outputlen - 1][i]);
}
if (i != outputstrings) {
printf("Malformed line: %s %d %p \n", line, i, token);
continue;
}
}
free(line);
for (size_t i = 0; i < outputlen; ++i) {
for (size_t j = 0; j < outputstrings; ++j) {
printf("From line %d the string num %d: `%s`\n", i, j, output[i][j]);
}
}
for (size_t i = 0; i < outputlen; ++i) {
for (size_t j = 0; j < outputstrings; ++j) {
free(output[i][j]);
}
free(output[i]);
}
free(output);
return 0;
}
对于输入:
$0,0,0,thisIsFirstString;secondString~thirdOne
$0,,0,firstString;~thirdOne
$,,,firstString;~thirdString
产生结果:
From line 0 the string num 0: `0`
From line 0 the string num 1: `0`
From line 0 the string num 2: `0`
From line 0 the string num 3: `thisIsFirstString`
From line 0 the string num 4: `secondString`
From line 0 the string num 5: `thirdOne`
From line 1 the string num 0: `0`
From line 1 the string num 1: ``
From line 1 the string num 2: `0`
From line 1 the string num 3: `firstString`
From line 1 the string num 4: ``
From line 1 the string num 5: `thirdOne`
From line 2 the string num 0: ``
From line 2 the string num 1: ``
From line 2 the string num 2: ``
From line 2 the string num 3: `firstString`
From line 2 the string num 4: ``
From line 2 the string num 5: `thirdStrin`
关于c - sscanf - 带有可选/空格式说明符的解析帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50856696/
我得到以下声明: // file MadaPacket.h class MadaPacket { // .... public: inline static bool word_is_header
目录 1.语法 2.关键词decltype 1.语法 decltype ( 实体 ) (1) (C++11 起) decltype
由于某些原因,我一直认为演绎指南必须相同noexcept -它们所引用的构造函数的性质。例如: template struct clazz { clazz(const T &) noexcep
我不确定成员 var isMouseOverYard 的正确访问说明符。在代码片段中,我没有从 House 继承的计划。选项 1 与基类更一致(如果我要从任一类继承,我可以检查鼠标是否在对象/院子上)
我可以声明 foo(const T& var) 这样我就知道 var 不会被改变。 指针的等效格式为 foo(const T* var)? 过去我尝试过那些,与 iterator/const_iter
我已经为这个问题搜索了几个小时,但仍然无法解决。 #include using namespace std; enum color { brown, green, orange, red, yell
我有用户定义的数据类型 typedef Unsigned int8 COMMAND_TYPE[6]; 现在我有类似的功能 ConnectCommand(COMMAND_TYPE const comm
说明符 %[^s] 有什么用? s 是一个变量。 在什么情况下我可以使用这个说明符? 最佳答案 scanf 的 %[ 格式说明符将匹配一系列字符,这些字符与 [ 和 ]< 之间列出的字符相匹配。如果第
#include int main() { char a[8]; printf("%d\n",a) ; return 0; } 对于上面的代码,输出是这
很抱歉这个“另一个”sscanf 问题,但我无法通过实验找到任何解决方案。 这是一个字符串,我想解析并提取 2 个由“:”分隔的子字符串: char *str = "tag:R123:P1234";
所以我在维基百科的一篇文章(粗略翻译)中遇到了以下定义: Modifier (programming) - element of source code being a phrase of given
[basic.link]/6 (我的重点): The name of a function declared in block scope and the name of a variable dec
我正在尝试定义我自己的数据类型(称为 sfloat),它类似于 float ,但使用不同数量的尾数位和指数位以更好地适应我的数据范围和精度。目标是定义一种新的数据类型,可以替代现有应用程序中的 flo
请看下面的代码: #include struct A { A(int, int) {} }; struct tag {}; template struct is_noexcept { st
如果这是一个无知的问题,请原谅我,但我仍在思考何时以及如何使用 constexpr 说明符。 (使用 msvc 14 编译)。我正在研究一个简单的基类,它允许您将任意对象包装到“constexpr 对
考虑以下函数: // Declaration in the .h file class MyClass { template void function(T&& x) const; }; /
以下面的示例代码为例: void test(const Item& item = Item()) { ... } 假设一旦 item 被传递给函数,this 就不能抛出。 问题是:函数应该标记为
我听说 noexcept 关键字更像是“它永远不应该抛出异常”而不是“它不会”。 如果我不确定是否抛出异常,我认为使用 noexcept 关键字不是很好,但是 noexcept 关键字有时
最近,我在阅读API of boost::optional 时发现: T const& operator *() const& ; T& operator *() & ; T&&
如果覆盖 ToString在一个类型中 type TestMe ()= override __.ToString() = null 然后我通过 "%A" 输出它说明符 printfn "*%A
我是一名优秀的程序员,十分优秀!