我正在尝试将以下字符串分成三个单独的变量,即a,b和c:
" mov/1/1/1,0 STR{7}, r7"
每个人都需要保持字符串的不同部分,例如:
a = "mov/1/1/1,0"
b = "STR{7}"
c = "r7"
每个命令之间可能有空格或标签;这使得这段代码变得更加复杂。
我尝试使用strtok
进行字符串操作,但它没有用完。
char command[50] = " mov/1/1/1,0 STR{7}, r7";
char a[10], b[10], c[10];
char * ptr = strtok(command, "\t");
strcpy(a, ptr);
ptr = strtok(NULL, "\t");
strcpy(b, ptr);
ptr = strtok(NULL, ", ");
strcpy(c, ptr);
但这会让事情变得非常混乱,因为变量a, b
和c
会保留更多的值,这会导致程序崩溃。
输入可能会有所不同:
" mov/1/1/1,0 STR{7}, r7"
"jsr /0,0 PRTSTR"
"mov/1/1/0,0 STRADD{5}, LASTCHAR {r3} "
其中a,b和c的值变为给定字符串的不同部分。
我被告知使用sscanf比strtok更安全,但我不确定为什么以及它如何帮助我。
我很高兴听到您的意见!
答案 0 :(得分:1)
这应该可以解决问题:
sscanf(command, "%s,%s,%s", &a, &b, &c)
从scanf联机帮助页,%s
吃空格,无论是空格还是标签:
s:匹配一系列非空白字符;下一个指针 必须是一个指向字符数组的指针,该数组足够长以容纳 输入序列和添加的终止空字节('\ 0') 自动。输入字符串在空格处或在空格处停止 最大字段宽度,以先到者为准。
答案 1 :(得分:0)
您可能知道可以使用sscanf()
与scanf()
相同的方法,区别在于sscanf扫描字符串,而scanf来自标准输入。
在此问题中,您可以指定scanf,其中一组字符为“始终跳过”,如this link中所示。
由于您有不同的约束条件来扫描所有三个字符串,因此您可以使用%*[^...]
在sscanf()内的每个%s
之前指定这些约束。
答案 2 :(得分:0)
我对使用strtok()
有所保留,但使用它的代码似乎可以满足您的需求。正如我在评论中所指出的那样,示例字符串"jsr /0,0 PRTSTR"
会在工作中抛出一个扳手;它在第二个字段中有一个重要的逗号,而在另外两个示例字符串中,第二个字段中的逗号并不重要。如果需要删除尾随逗号,可以在基于空格的分割后执行此操作 - 如此代码所示。第二个循环测试zap_trailing_commas()
函数,以确保它在退化情况下运行,切换尾随逗号,但不会使缓冲区的开始或任何可怕的内容下溢。
#include <stdio.h>
#include <string.h>
static void zap_trailing_commas(char *str)
{
size_t len = strlen(str);
while (len-- > 0 && str[len] == ',')
str[len] = '\0';
}
static void splitter(char *command)
{
char a[20], b[20], c[20];
char *ptr = strtok(command, " \t");
strcpy(a, ptr);
zap_trailing_commas(a);
ptr = strtok(NULL, " \t");
strcpy(b, ptr);
zap_trailing_commas(b);
ptr = strtok(NULL, " \t");
strcpy(c, ptr);
zap_trailing_commas(c);
printf("<<%s>> <<%s>> <<%s>>\n", a, b, c);
}
int main(void)
{
char data[][50] =
{
" mov/1/1/1,0 STR{7}, r7",
"jsr /0,0 PRTSTR",
"mov/1/1/0,0 STRADD{5}, LASTCHAR {r3} ",
};
for (size_t i = 0; i < sizeof(data)/sizeof(data[0]); i++)
splitter(data[i]);
char commas[][10] = { "X,,,", "X,,", "X,", "X" };
for (size_t i = 0; i < sizeof(commas)/sizeof(commas[0]); i++)
{
printf("<<%s>> ", commas[i]);
zap_trailing_commas(&commas[i][1]);
printf("<<%s>>\n", commas[i]);
}
return 0;
}
示例输出:
<<mov/1/1/1,0>> <<STR{7}>> <<r7>>
<<jsr>> <</0,0>> <<PRTSTR>>
<<mov/1/1/0,0>> <<STRADD{5}>> <<LASTCHAR>>
<<X,,,>> <<X>>
<<X,,>> <<X>>
<<X,>> <<X>>
<<X>> <<X>>
我还用逗号代替X来测试了一个变体,并且只留下了单个逗号。