【问题标题】:Scanf for a two strings and a float number扫描两个字符串和一个浮点数
【发布时间】:2011-10-12 02:12:28
【问题描述】:

我正在创建一个需要从用户那里获取三个输入的菜单。

    char *fullname;
    char *date;
    float sal;
    printf("\nEnter full name: ");

第92行

scanf("%s", &fullname);
printf("\nEnter hire date: ");

第 94 行

scanf("%s", &date);
printf("\nEnter salary: ");

第 96 行

scanf("%d", &sal);

这些是我收到的错误

Employee.c:92: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char **’
Employee.c:94: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char **’
Employee.c:96: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘float *’

我能否解释导致这些问题的原因?

【问题讨论】:

    标签: c scanf


    【解决方案1】:

    有几个问题:

    第一:

    当您将scanf 用于字符串时,您不会使用&。所以只需scanf("%s", fullname);

    第二:

    您的指针未初始化。试试这个:

    char fullname[256];
    char date[256];
    

    只要您输入最多 255 个字符,这将起作用。

    第三:

    您最后输入的 scanf 不匹配。当您在格式字符串中指定 int 时,您将传入 float。试试这个:

    scanf("%f", &sal);
    

    【讨论】:

    • 这似乎摆脱了警告,但是当你输入代码时它会自动出现在我身上
    • 你能追踪它在哪一行出现段错误吗?
    • 好的,我认为它出现了段错误,因为我做错了什么。我希望能够输入全名“John Doe”,但由于空间原因,它出现了段错误。有没有办法输入这样的字符串
    • 我不知道会读取整行的 C 函数。请参阅此问题:(stackoverflow.com/questions/2600528/c-readline-function)
    • 谢谢你的帮助,我走了不一样的路
    【解决方案2】:

    警告是不言自明的。当您使用 %s 格式说明符调用 scanf 时,您需要为其提供指向 char 数组的第一个元素的指针,该字符串可以复制到该元素。你没有这样做,而是给它一个指向 char 的指针的地址。

    char[100] fullname;
    scanf( "%s", fullname );
    

    日期也存在同样的问题。另外,请注意,使用上面的代码,如果用户输入长度等于或超过 100 个字符的字符串,则会发生缓冲区溢出。

    如果您使用的是 MSVC,则可以使用 scanf_s 函数,而这需要您输入缓冲区的长度。但是,此功能是 Microsoft 特定的,因此不可移植。

    scanf_s( "%s", fullname, 100 );
    

    对于薪水,问题在于格式说明符是%d,它用于读取整数,而不是浮点数。使用

    scanf( "%f", &sal );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-30
      • 2013-06-08
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多