【问题标题】:Scanf_s error with array数组的 Scanf_s 错误
【发布时间】:2016-01-25 10:03:35
【问题描述】:

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

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);
    }
}

【问题讨论】:

    标签: c arrays pointers scanf


    【解决方案1】:

    您的问题是,您没有将内存分配给macchina[i].marca

    作为一个未初始化的指针,目前它指向某个随机内存位置,您的应用程序可能无法访问这些位置。因此,该位置几乎是无效

    访问无效内存调用undefined behavior

    解决:要么

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

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

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

    【讨论】:

    • 注意,scanf 格式字符串也是错误的; %c -> %s.
    • 我注意到了,但我放了它只是为了尝试一下,然后我忘了回去(即使使用 %s 也无法正常工作)
    • 所以我必须在 marca 上分配内存?
    【解决方案2】:

    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()

    【讨论】:

      【解决方案3】:
      macchina[i].marca
      

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

      例如要为此使用能够容纳 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.
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-02-02
        • 2013-09-21
        • 2014-11-09
        • 1970-01-01
        • 2014-02-21
        • 1970-01-01
        • 2010-10-04
        • 2015-03-17
        • 1970-01-01
        相关资源
        最近更新 更多