我在使用带分隔符的sscanf()读取值时遇到问题。
sscanf(line, "%15[^:]:%20[^:]:%d:%d:%50[^:]:%25[^:]:%25[^\n]",
string1, string2, &value1, &value2, string3, string4, string5);
当行类似于:
时,只有一个问题abc:defg:1:2::hijk:no
当我打印出字符串/值时,一切都正常,直到'字符串3'。它输出一些奇怪的字符,然后'string4'输出一个空格,string5输出一个类似的奇怪字符。
任何人都知道如何扫描正确的值?
编辑:我的意思是abc:defg:1:2 :: hijk:不,不是abc:defg:1:2 :: hijk:lm:没有
答案 0 :(得分:2)
您需要检查scanf()
来电
errno = 0;
int chk = sscanf(line, "%15[^:]:%20[^:]:%d:%d:%50[^:]:%25[^:]:%25[^\n]",
string1, string2, &value1, &value2, string3, string4, string5);
switch (chk) {
case 7: /* all ok */;
break;
case 6:
case 5:
case 4:
case 3:
case 2:
case 1:
case 0: /* not enough variabes were assigned a value */;
break;
case EOF: /* error reading data */;
/* use ferror() and/or feof() and errno to determine cause of error */;
break;
default: /* no other cases are possible */;
break;
}
答案 1 :(得分:2)
问题是[
说明符会导致匹配失败,如果它与任何字符都不匹配。发生匹配失败时scanf
函数停止读取。
你看到的垃圾是因为你正在打印出未初始化的变量(扫描从来没有填写过那些变量)。
如果您想为字符字段添加零个或多个字符,则不能使用带有%[
的字符串,后跟其他一些字符。
替代方案包括:
scanf
进行多次单独调用,即使上一次失败也会继续调用正则表达式库可能是最简单的选择。
答案 2 :(得分:1)
试试这个..(扫描&
)
int
sscanf(line, "%15[^:]:%20[^:]:%d:%d:%50[^:]:%25[^:]:%25[^\n]",
string1, string 2, &value1, &value2, string3, string4, string5);
答案 3 :(得分:0)
使用strsep
,如下所示
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *strsep(char **sp, const char *sep);
int main(){
char line[] = "abc:defg:1:2::hijk:no\n";
int value1, value2;
char string1[16];
char string2[20];
char string3[51];
char string4[26];
char string5[26];
char *p = line;
/*
sscanf(line, "%15[^:]:%20[^:]:%d:%d:%50[^:]:%25[^:]:%25[^\n]",
string1, string2, &value1, &value2, string3, string4, string5);
*/
strcpy(string1, strsep(&p, ":"));//or strncpy, etc.
strcpy(string2, strsep(&p, ":"));
value1 = atoi(strsep(&p, ":"));
value2 = atoi(strsep(&p, ":"));
strcpy(string3, strsep(&p, ":"));
strcpy(string4, strsep(&p, ":"));
strcpy(string5, strsep(&p, ":\n"));
printf("%s %s %d %d \"%s\" %s %s\n",
string1, string2, value1, value2, string3, string4, string5);
return 0;
}
请参阅strsep
的以下链接
strsep
strsep
不是标准功能
如果不存在,则按如下方式实施(例如):
char *strsep(char **sp, const char *sep){
char *p, *s;
if (sp == NULL || *sp == NULL || **sp == '\0') return(NULL);
s = *sp;
p = s + strcspn(s, sep);
if (*p != '\0') *p++ = '\0';
*sp = p;
return(s);
}