【问题标题】:C - scanf object's argumentsC - scanf 对象的参数
【发布时间】:2020-07-14 07:04:13
【问题描述】:

我是 C 新手。我正在尝试创建一个像这样的 addStudent() 函数:

我目前遇到两个问题:

  1. 无论我输入什么,对象的名称、中间和最终仍然是空的或为零。
  2. 如果我将name 参数更改为*name,它只需要第一个字符。即如果输入"James",则只取“J”。

更新:我一开始以为是scanf的问题,但是即使我删除它并初始化变量,对象std仍然是空的。我仍然想知道将参数传递给新对象的正确方法是什么,比如这个例子。

void addStudent(struct Student array[SIZE], int *currentSize){
    char name[20];
    int mid, final;
    printf("Enter name: ");
    scanf("%s", name);
    printf("Enter midterm grade: ");
    scanf("%d", &mid);
    printf("Enter final grade: ");
    scanf("%d", &final);
    struct Student std = {*name, mid, final};
    array[0] = std;
    ++*currentSize;
}

学生结构:

struct Student{
    char name[20];
    int midterm;
    int final;
};

固定: 如果我直接将变量传递给scanf,一切正常。

void addStudent(struct Student array[], int *currentSize){
    printf("Enter name: ");
    scanf("%s", array[*currentSize].name);
    printf("Enter midterm grade: ");
    scanf("%d", &array[*currentSize].midterm);
    printf("Enter final grade: ");
    scanf("%d", &array[*currentSize].final);
    
    ++*currentSize;
}

【问题讨论】:

  • Student的定义在哪里?
  • 对不起。我忘了包含 Student 构造函数
  • 除非您检查返回,否则您无法正确使用任何用户输入功能。尤其适用于scanf 系列函数。
  • 您无法初始化std = {name, mid, final},因为在访问时name 被转换为指向第一个元素的指针。它不是字符串文字,也不再是数组。你需要struct Student std = {"", mid, final}; strcpy (std.name, name);
  • 非常感谢@David。这对我的代码非常有效。你能解释一下这些行对我的代码有什么作用吗?为什么它也适用于中期和决赛?如果我删除 strcpy (std.name, name),mid 和 final 将为零。

标签: c object parameter-passing scanf


【解决方案1】:

%s 格式说明符和scanf() 读取以空格分隔的输入。换句话说,它无法读取包含空格的“完整”输入。

引用C11,第 7.21.6.2 章

s

匹配一系列非空白字符。 [....]

您应该使用fgets() 来读取输入,然后对其进行处理。

也就是说,将参数更改为 %s*name 无论如何都是不正确的,因为它会在预期(指向字符数组的指针)和实际(字符)之间造成不匹配 - 创建 undefined behaviour

【讨论】:

  • 我什至在“名称”中都没有空格。我尝试扫描变量并使用 printf 打印出来;一切正常。当我将它们传递给 Student 对象时,就会出现问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 2020-01-22
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多