这里我有一个角色arrray,其中有一些分离器。
字符数组是char sentence []="abc_12.22.32.42";
我想使用sscanf从句子中读取abc,12,22,32,42。
我尝试使用sscanf,但它的输出不同。
我在这里发布了两个代码,其工作正常。
如果我用abc = 12
阅读%s = %s
,那么它就可以了。为什么我们必须在分离器之间留出空间。
实现这一目标的任何方式。
不工作代码:
#include <stdio.h>
int main ()
{
char sentence []="abc_12.22.32.42";
char str [20];
char str1 [20];
char str2 [20];
char str3 [20];
sscanf (sentence,"%s_%s.%s.%s.%s",str,str1,str2,str3);
printf ("%s --> %s --> %s --> %s --> %s\n",str,str1,str2,str3);
return 0;
}
输出:
abc_12.22.32.42--> -- � -->�Tl�s --> (null)
预期产出:
abc --> 12 --> 22 --> 32 --> 42
工作代码:
/* sscanf example */
#include <stdio.h>
int main ()
{
char sentence []="abc = 12";
char str [20];
char str1 [20];
char str2 [20];
char str3 [20];
if(sscanf(sentence,"%s = %s",str,str1) < 5) ;
printf ("%s--> %s\n",str,str1);
return 0;
}
输出:
abc--> 12
答案 0 :(得分:3)
当指定格式为%s_%s.%s.%s.%s
时,您的程序无法知道第一个字符串不能包含字符'_'
和'.'
。这就是sscanf(sentence,"%s_%s.%s.%s.%s", str0, str1, str2, str3, str4);
导致整个句子存储在str0
中的原因。
如果您希望与sscanf
保持联系,则必须更改您期望的格式:
char sentence[] = "abc_12.22.32.42";
char str0[20], str1[20], str2[20], str3[20], str4[20];
sscanf (sentence,"%19[^_]_%19[^.].%19[^.].%19[^.].%19[^.]",
str0, str1, str2, str3, str4);
printf ("%s --> %s --> %s --> %s --> %s\n",
str0, str1, str2, str3, str4);
%19[^_]
会导致str0
包含最多19个字符(20个'\0'
}并阻止字符'_'
成为str0
的一部分。因此,输出根据需要变为abc --> 12 --> 22 --> 32 --> 42
。
或者您可以使用strtok
。
答案 1 :(得分:1)
使用strtok
功能。这是分割字符串的最佳方式
答案 2 :(得分:0)
用''替换','和' - ',还需要一个数组str4
#include <stdio.h>
#include <string.h>
int main ()
{
char sentence []="abc_12.22.32.42";
char str [20];
char str1 [20];
char str2 [20];
char str3 [20];
char str4 [20];
int i;
for (i=0; i<strlen(sentence); i++) {
if (sentence[i] == '_') sentence[i] = ' ';
if (sentence[i] == '.') sentence[i] = ' ';
}
sscanf (sentence,"%s %s %s %s %s",str,str1,str2,str3, str4);
printf ("%s--> %s --> %s -->%s --> %s\n",str,str1,str2,str3, str4);
return 0;
}