【问题标题】:I'm confused about declaring and using characters - for instance in this sscanf example我对声明和使用字符感到困惑——例如在这个 sscanf 示例中
【发布时间】:2019-04-13 10:50:47
【问题描述】:

以下示例运行良好:

char rc[20]="1,150";
char command[1];
int data1 = 0;
int data2 = 0;
int data3 = 0;
int count = sscanf(rc, "%c,%d,%d,%d", command, &data1, &data2, &data3); 

它给出: 计数 = 2;命令[0] = 1;数据1 = 150

但如果命令定义为: char command;char * command

【问题讨论】:

  • 在这种情况下,command 衰减为指向其第一个元素的指针,等效于 &command[0]
  • 您可以使用 char 变量,而不是声明一个 1 的数组。
  • 很难弄清楚您期望发生什么。您是否期望命令为“1”?如果是这样,逗号应该怎么办?你得到的结果是不是你所期望的?
  • 是的,结果如我所料(sscanf 使用格式字符串中的逗号来分隔参数并忽略逗号...我也可以使用 ' ' 或任何其他非-字母字符)。我的问题(已经回答)与使用 sscanf 将第一个字符复制到命令字符有关,而不必将命令定义为 char[]。

标签: c++ char scanf


【解决方案1】:

如果你有

char command;

那么你可以使用地址运算符&:

sscanf(..., &command, ...);

如果你有

char *command;

那么你首先需要使指针指向有效的地方:

command = malloc(1);

char actual_command;
command = &actual_command;

然后像您在问题中那样使用command


所有这些都应该在您的教科书中或在课堂上讲授。如果没有,那就换书或换课(或者在课堂上多注意,如果你错过了)。

【讨论】:

    【解决方案2】:

    如果命令定义为:char,我不知道如何使这项工作 命令;或 char * 命令。

    您始终需要确保将sscanf 传递给要在其中存储值的字符的地址。(最初您传入command,这是一个char的数组,相当于数组中第一个成员的地址。(唯一的成员,因为“你”声明了数组大小为1。)

    在第一种情况下,您的代码几乎是正确的。

    char command;
    int count = sscanf(rc, "%c,%d,%d,%d", &command, &data1, &data2, &data3); 
    

    第二种情况比较棘手。传递字符的地址很容易,因为command 就是那种类型。但是指针指向的是什么?您需要初始化它的值,使其指向您可以写入的char

    char comm_value = '?';
    char* command = &comm_value;
    int count = sscanf(rc, "%c,%d,%d,%d", command, &data1, &data2, &data3); 
    

    【讨论】:

    • 非常感谢。我确实尝试了第一个示例(char 命令;&command),但由于某种原因,编译器抛出了一个错误,指出命令参数的类型是 int 而不是 char*。但我又试了一次,它起作用了。我错过了需要分配字符的 char* 命令!
    猜你喜欢
    • 1970-01-01
    • 2016-01-16
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多