【问题标题】:Using scanf to parse two variables使用scanf解析两个变量
【发布时间】:2021-01-08 02:30:57
【问题描述】:

我在将多个变量传递给scanf 时遇到了一些麻烦:

#include<stdio.h>

int main(void) {

    char *name;
    float weight;

    printf("Please enter your name, then weight separated by a comma: ");
    scanf("%s,%f", name, &weight);

    printf("%s, your weight is %.2f!\n", name, weight);

    return 0;

}

请输入您的姓名,然后用逗号分隔体重:Tommy,184
汤米,184,你的体重是 0.00!

这样做的正确方法是什么,为什么scanf 不检测逗号并在其变量中提取必要的值?

【问题讨论】:

  • 1. name 将存储在哪里? 2?如果到达 %f 位? 3. 为什么不检查scanf的返回值
  • char *name; 在没有有效内存的情况下读入此内容将是 UB。
  • @IrAM 我明白了,感谢您提供这些链接。所以改为做类似char name[10];...scanf("%9s", name) 的事情?
  • 也许scanf(%9[^,], %f"...)]
  • %s 作为格式说明符将读取所有内容直到下一个空格。包括名称、逗号和浮点数。

标签: c


【解决方案1】:

你的代码有两个错误:

  1. 野指针

char *name; 不是安全代码。 *name* 是一个野指针,它指向某个任意内存位置,可能会导致程序崩溃或表现不佳。您应该使用像char name[10] 这样的数组。可以参考这个link

  1. scanf 中的逗号

您可以查看thread了解更多详情

逗号不被视为空白字符,因此格式说明符“%s”将消耗 , 以及超出数组 sem 边界的行上的所有其他内容,从而导致未定义的行为

我刚刚尝试修改您的代码,您应该考虑删除逗号,并用空格替换它

printf("Please enter your name, then weight separated by a space: ");
scanf("%s %f", name, &weight); // your code should work properly

【讨论】:

  • 定义char * 变量不应被描述为“不安全的代码”。尝试取消引用未初始化的变量是不安全的,但定义它是完全有效且常见的。
【解决方案2】:

我认为你应该为 name 变量使用一个 char 数组,如果你想存储它的地址,你可以将它分配给一个指针,你写它的方式没有意义

float weight;
char[20] name;
scanf(" %s, %f", &name, &weight); 

【讨论】:

    【解决方案3】:

    你可以试试这个吗?

    int main()
    {
        int num; 
        char str[50];
        scanf("%49[^,],%d", str, &num); 
        printf("%s %d",str, num); 
        return 0; 
    }
    

    编辑

    说明: 我们可以使用%[^&lt;Your character(s)&gt;] 读取最多特定字符的输入。这里的数字 49 只是指您收到的字符串的长度,最后一个字符是null。添加特定长度取决于您;)这只是按照您要求的方式获取输入的一个示例。

    【讨论】:

    • if( scanf(...) == 2 ) { printf(...);}你必须经常检查scanf返回的值
    • 编程不是反复试验。为什么你相信这会奏效?这并不是一个反问句。你应该解释你的代码。
    • @WilliamPursell 谢谢,我同意。我在这里没有执行任何逻辑来处理输入,因为 OP 在获取输入时遇到问题。
    • @Deepak,我看到您已将 char *name; 更改为 char name[50];。这样做有特定的理由吗?还是它们是等效的陈述? (看到我的其他咆哮应该回答最后一个问题:-)
    • @Deepak 检查scanf 返回的值不是关于处理输入的逻辑,而是验证输入是否已接收。由于问题正在获得输入,因此最好将检查包含在最小解决方案中。
    猜你喜欢
    • 2011-07-09
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多