为啥这个程序不允许我在需要时输入信息? [复制]

Posted

技术标签:

【中文标题】为啥这个程序不允许我在需要时输入信息? [复制]【英文标题】:Why isn't this program allowing me to enter information when I need too? [duplicate]为什么这个程序不允许我在需要时输入信息? [复制] 【发布时间】:2013-11-12 21:21:49 【问题描述】:

好的,首先我将解释我的任务。对于这个任务,我必须使用我没有问题的动态内存分配。我遇到的问题是找出完成任务的正确方法。对于我的作业,我需要创建一个程序,提示用户输入他们有多少学生,然后询问以下信息;学生证、生日和电话号码。我需要使用循环来提示用户输入所有学生信息。我需要创建一个循环来扫描所有学生 ID,并使用他们的生日找到年龄最大的学生(循环必须能够扫描超过 3 个学生)。

这是我的代码,我从你们那里得到了一些建议,甚至是一些代码,但是当它进入 for 循环时它不允许我输入学生信息,它只是结束程序。帮助

谢谢。

#include <stdio.h>
#include <stdlib.h>

struct studentDataType

    int studentID;
    int year;
    int month;
    int day;
    long long phone;
;

int main (void)

    int * studentData= NULL;
    int * studentDataType;
    int students;
    int studentID;
    int year;
    int month;
    int day;
    long long phone;

    printf("How many students are you entering records for:\n");
    scanf("%d", &students);

    studentData= malloc((sizeof(int)*students));

    struct studentDataType *studentRecords = malloc(sizeof(struct studentDataType) * students);

    for (int i = 0 ; i != students ; ++i)  
        printf("Enter information for student %d\n", i+1);
        struct studentDataType * s = &studentData[i];
        scanf("%d%d%d%d%d", &(s->studentID), &(s->year), &(s->month), &(s->day), &(s->phone));
    

【问题讨论】:

一方面,所写的struct studentDataType * s = &amp;studentData[i]; 甚至不会编译,因为studentData 是一个指向int 的指针,显然s 是不是。所以标题中你的问题的直接答案是:“因为代码不会编译。”并且输入格式字符串中的最后一个%ds-&gt;phone 的数据类型不匹配,后者是long long,因此假设您修复了损坏的编译,您在那里有未定义的行为。 如果你不能说我对此很陌生,那么请你给我一个解决方案。 由于代码无法编译,请查看错误输出以了解有关错误的信息。 从 for 循环中删除整数 i 的声明,并使其高于 for 循环(您已声明其他变量的地方),这些类型的初始化仅在 C99 标准中允许。 “给我一个解决方案” - 嗯.. 如果你想要解决的唯一“新”问题就是向人们寻求解决方案,我想我可以做到。我相当肯定这不是你所学课程的既定目标。我已经指出了两个重要问题。处理这些。在this, question、this question 和当前问题之间,你已经吃到了大部分的勺子。 【参考方案1】:
struct studentDataType

    int studentID;
    int year;
    int month;
    int day;
    long long phone;
;

int _tmain(int argc, _TCHAR* argv[])

    int students;

      printf("How many students are you entering records for:\n");
    scanf("%d", &students);

    struct studentDataType *studentRecords = (struct studentDataType *)malloc(sizeof(struct studentDataType) * students);
    struct studentDataType *student = studentRecords;

    for (int i = 0; i < students; i++)
    
        printf("Enter information for student #%d\n", i+1);

        scanf("%d#%d#%d#%d#%d", &(student->studentID),
                                &(student->year),
                                &(student->month),
                                &(student->day),
                                &(student->phone));
        student++; // move pointer to next student
    

    // print info
    student = studentRecords;

    for (int i = 0; i < students; i++)
    

        printf("%d#%d#%d#%d#%d\n", student->studentID,
                                   student->year,
                                   student->month,
                                   student->day,
                                   student->phone);
        student++; // move pointer to next student
    

    getchar();
    return 0;

【讨论】:

【参考方案2】:

您当前的代码中存在许多问题。 struct member phone(即 long long 不会正确保存电话号码,例如 555-5555),以及为学生数量分配内存的方式只是其中两个问题。我做了一些更改,以说明如何循环一些学生,并将这些信息收集到结构中。

#include <stdio.h>
#include <stdlib.h>

typedef struct 

    int studentID;
    int year;
    int month;
    int day;
    char phone[20];//this size should accommodate local, long dist, and intn'l 
studentDataType;
studentDataType s, *studentRecords;

int main (void)

   // int * studentData= NULL;
    //int * studentDataType;
    int students;
    //int studentID;
    //int year;
    //int month;
    //int day;
    //long long phone;



    printf("How many students are you entering records for:\n");
    scanf("%d", &students);

    studentRecords = malloc(sizeof(s)*students);



    //studentData= malloc((sizeof(int)*students));

    //struct studentDataType *studentRecords = malloc(sizeof(struct studentDataType) * students);

    for (int i = 0 ; i != students ; i++)  
        printf("Enter information for student %d\n", i);
        //struct studentDataType * s = &studentData[i];
        scanf("%d%d%d%d%s", &studentRecords[i].studentID, 
                            &studentRecords[i].year, 
                            &studentRecords[i].month, 
                            &studentRecords[i].day, 
                            studentRecords[i].phone);

   
    getchar();

【讨论】:

【参考方案3】:

编辑:更改了记录迭代器并在 malloc() 结果上添加了一些错误检查。

您的代码中有几个问题,所以我只是发布一些我认为应该可行的内容,如果您愿意,可以提出具体问题。 请尝试以下操作:

#include <stdio.h>
#include <stdlib.h>

struct studentDataType

    int studentID;
    int year;
    int month;
    int day;
    long long phone;
;

int main (void)

    struct studentDataType *studentRecords=NULL;
    unsigned int students;
    unsigned int studentID;
    unsigned int year;
    unsigned int month;
    unsigned int day;
    unsigned long phone;

    printf("How many students are you entering records for:\n");
    scanf("%d", &students);

    studentRecords = malloc(sizeof(struct studentDataType) * students);

    // Check whether malloc succeeded.
    if(studentRecords != NULL)
           
        struct studentDataType *current_record = &studentRecords[0];
        for (int i = 0 ; i < students ; ++i, current_record++)  
            printf("Enter information for student %d\n", i+1);              
            scanf("%u %u %u %u %u", &(current_record->studentID), &(current_record->year), &(current_records->month), &(current_record->day), &(current_records->phone));
        
        free(studentRecords);
    

【讨论】:

我仍然遇到无法输入任何学生信息的问题。我在这里做错了什么? 没关系,我想通了,谢谢 很高兴你解决了它!我修正了一个错字:对于“i 如何创建一个循环来搜索学生并返回最年长学生的 ID? @djbuijs - 一旦执行流程离开 for 块, s 就会消失。它应该根据学生的数量在 for 块之前定义和分配。

以上是关于为啥这个程序不允许我在需要时输入信息? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在这里看到“Access-Control-Allow-Origin 不允许来源”错误? [复制]

为啥我在这里看到“Access-Control-Allow-Origin 不允许来源”错误? [复制]

为啥 MySQL 不允许这个外键? [复制]

为啥 Rust 不允许在一种类型上复制和删除特征?

为啥复制构造函数不需要检查输入对象是不是指向自身?

为啥输入 12 位数字时以下代码会崩溃? [复制]