Scanf_s错误与数组

时间:2016-01-25 10:03:35

标签: c arrays pointers scanf

我的代码有问题。实际上,当编译器执行以下行

scanf_s("%c", macchina[i].marca, 50);

Visual Studio让我犯了这个错误。它给我带来了与函数get_s相同的问题。

我无法理解代码有什么问题。感谢您的支持

这是我的代码

#include <stdio.h>

int main(void) {

    struct automobile{
        char *marca;
        int modello;
        int vendute;
    };

    struct automobile macchina[5];

    for (int i = 0; i < 5; i++){
        printf("Inserisci marca: ");
        scanf_s("%c", macchina[i].marca, 50);
    }
}

3 个答案:

答案 0 :(得分:1)

您遇到的问题是,您没有为macchina[i].marca分配内存。

作为一个单元化指针,目前它指向一些随机存储器位置,可能无法从您的应用程序访问。因此,该位置几乎无效

访问无效内存会调用undefined behavior

要解决:要么

  1. marca定义为数组,例如char marca[50];或类似

  2. 在使用之前使用malloc()或系列分配动态内存。

  3. 也就是说,您应该将格式说明符更改为%s以扫描字符串。如果没有宽度说明符,%c只需要一个char

答案 1 :(得分:0)

macchina[i].marca是一个单位指针。如果不分配内存,就无法读入它。

由于您想要将50个字符读入其中,您可能需要使用%s(C字符串)并将结构的定义更改为:

  struct automobile{
        char marca[50];
        int modello;
        int vendute;
    };

并将scan_f()称为:

    scanf_s("%s", macchina[i].marca, sizeof(macchina[i].marca) );

如果您希望大小是动态的,则需要使用malloc()

答案 2 :(得分:0)

macchina[i].marca

是未初始化的char指针。您需要分配内存以指向它,或者您可以使用数组。

E.g。要使用一个能够容纳50个字符的数组,请将代码更改为:

#include <stdio.h>

int main(void) {

    struct automobile{
        char marca[51];  // 50 chars + '\0' terminator
        int modello;
        int vendute;
    };

    struct automobile macchina[5];

    for (int i = 0; i < 5; i++){
        printf("Inserisci marca: ");
        scanf_s("%s", macchina[i].marca, 50); // %c is only for reading single char values, use %s for strings.
    }
}