如何使用fscanf()扫描格式化的字符串?

时间:2017-12-07 13:20:28

标签: c io

我有多行这个文件。每行都遵循

的格式
`userID:$An Integer$$String:`

例如:

pyc1:$1$$Tnq7a6/C1wwyKyt0V/.BP/:
pyc2:$6$$Tnq7a6/C1wwyKyt0V/.BP/:

我应该如何使用fscanf()检索userID,整数以及$$和:?之间的字符串?

这就是我现在所拥有的,但它不起作用。

int main(){
    FILE * file = fopen("shadow.txt", "r");
    char line[256] = {0};
    char userID[30] = {0};
    int hashType;
    char hash[256] = {0};
    int result = fscanf(file, "%s :$ %d $$ %s :", userID, &hashType, hash);
    printf("%s\n", userID );
    printf("%d\n", hashType );
    printf("%s\n", hash );

}

我不太了解我应该为fscanf()指定的格式来实现这一目标。请帮忙。

2 个答案:

答案 0 :(得分:3)

尝试使用正则表达式,例如:

fscanf (file, "%[^:]:$%d$$%[^:]:", userID, &hashType, hash);

我创建了一个regex101链接,用于解释上面使用的正则表达式。

PS:不要忘记检查fscanf()的返回值,以确保正确读取所有内容。您想要解析三个元素,因此返回值应为3。

答案 1 :(得分:0)

试试这个:

while(ret = fscanf(file," %[^:] : $ %d $$ %[^:] :",userID,&hashtype,hash))
{

    if(ret == EOF)
    {
        break;
    }

    printf("value of ret: %d\n",ret);
    printf("%s , %d , %s",userid,id,str);

    // . . .

}

这里,int ret是:

  • EOF,如果指针到达文件末尾。
  • 0,如果没有输入与变量匹配
  • > 0,带文件输入的匹配变量数