分享
三行代码  ›  专栏  ›  技术社区  ›  Daniel Hong

意外登录fprintf,fscanf[重复]

  •  1
  • Daniel Hong  · 技术社区  · 10 月前

    这个问题已经有了答案:

    我接收到的数据流使用 scanf() 并把它送到 client.txt 使用fprintf():

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        system("clear");
        int servicestart;
        char tmp1[100], tmp2[100], tmp3[100], tmp4[100], tmp5[100];
    
        puts(">>Library Service<<\n1.Register 2.Log in 3.Exit Program");
        scanf("%d", &servicestart);
    
        switch (servicestart)
        {
        case 1:
        {
            system("clear");
            FILE* fp1 = fopen("client.txt", "w");
    
            if (fp1 == NULL)
            {
                puts("Write Error!!");
                return 0;
            }
    
            puts("You selected Register");
            puts("Enter Student ID | Password | Name | Address | Phonenumber");
            puts("ex)2018|ssu|DanielHong|Gaepo-dong|01031414473");
            printf("\n\n");
    
            scanf("%s|%s|%s|%s|%s", tmp1, tmp2, tmp3, tmp4, tmp5);
            fprintf(fp1, "%s %s %s %s %s", tmp1, tmp2, tmp3, tmp4, tmp5);
            fclose(fp1);
        }
    
        return 0;
    }
    

    但是,当我进入 2018|asdf1234|danielhong|gaepo-dong|01023232323

    2018|asdf1234|danielhong|gaepo-dong|01023232323 p \ ���� 在里面 客户机 .

    我没有进去 p \ ���� 很清楚。

    我对此很痛苦,但对解决办法一无所知。

    有人能帮我解决这个问题吗?

    1 回复  |  直到 10 月前
        1
  •  3
  •   jxh    10 月前

    格式说明符 "%s" 读到下一个空格。输入的下一个空格是换行符( '\n' )在队伍的尽头。使用

    scanf("%99[^|]|%99[^|]|%99[^|]|%99[^|]|%99s", tmp1, tmp2, tmp3, tmp4, tmp5);
    

    相反。 %[] 是匹配括号中所有字符的扫描集。如果字符前面有 ^ 它们被排除在外。

    请不要用 “%s” 或者扫描集,而不指定转换说明符的宽度以限制字符的最大读取量。因为您的数组有100个字符长,所以请指定99,这样就有空间用于终止 '\0' 性格。

    在继续处理输入之前,还应该检查scanf是否成功。 scanf() 返回成功执行的转换数。因此,在您的案例中,您可以将返回值与5进行比较:

    if (scanf("%99[^|]|%99[^|]|%99[^|]|%99[^|]|%99s", tmp1, tmp2, tmp3, tmp4, tmp5) != 5) {
        ; // handle error
    }