Scanf分隔符和空字符串

时间:2014-10-16 06:02:58

标签: c

我在使用带分隔符的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:没有

4 个答案:

答案 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进行多次单独调用,即使上一次失败也会继续调用
  • 不要使用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);
}