【问题标题】:Input and output array don't match输入和输出数组不匹配
【发布时间】:2013-03-26 03:18:06
【问题描述】:

我正在为学校的一个班级编写程序,但我无法让程序打印出我输入的内容。

问题指出,第一行需要包含“考试”中的问题数量,后跟空格,然后是答案键。我想打印答案键以确保它被正确输入并且它永远不会与我输入的内容匹配。代码发布在下面。

这是开始运行的主文件,它从另一个文件调用一个方法我已经正确地制作了原型文件,所以我很确定它不是那个。

int main()
{
    int i;
    int noOfQuestions;
    scanf("%d ", &noOfQuestions);
    char * answerKeyPtr;

    answerKeyPtr = fgetAnswers(noOfQuestions);

    for(i = 0; i < noOfQuestions; i++){
        printf("%c",answerKeyPtr[i]);
    }
    printf("\n");

    return 0;
}

char *fgetAnswers(int noOfQuestions){
    int i;
    char * answerKeyPtr;
    char AnswerKey[noOfQuestions];
    answerKeyPtr = AnswerKey;

    for(i = 0; i < noOfQuestions; i++){
        scanf("%c",&AnswerKey[i]);
    }

    return answerKeyPtr;
}

【问题讨论】:

    标签: c arrays printing output


    【解决方案1】:

    这里是内存问题。

    您将数据存储到AnswerKey 数组中,该数组是fgetAnswers() 的本地数组。问题是您正在返回指向该局部变量的指针,并且一旦您的 fgetAnswers() 函数完成不应访问该内存,该变量的内存就不可靠。因此,当您尝试打印 main() 中的数据时,您正在访问您不应该访问的内存。

    要解决这个问题,请在 main 中创建 AnswersKey 数组,并将其作为参数传递给 fgetAnswers() 函数。

    【讨论】:

      【解决方案2】:

      在调用fgetAnswers 时,char 数组AnswerKey 被分配到堆栈上。当您从fgetAnswers 返回时,为该调用存储在堆栈帧中的数据不再有效。您需要传入数组或分配它,这样输入就不会存储在堆栈中。

      【讨论】:

      • 所以我在 main 函数的开头添加了 char answerKey[noOfQuestions]; 并在几行之后添加了 answerKeyPtr = &amp;answerKey[0];。你说的是这个吗?我仍然对指针有些困惑
      • 你还是有问题。在获得 noOfQuestions 值之前,不能使用 char answerKey[noOfQuestions] 分配数组。您应该在阅读问题数量后分配空间。您还可以定义一个 MAXQUESTIONS 常量并将数组声明为该大小,然后确保读入的数字
      • 分配数组来保存答案后,将其传递给 fgetAnswers 函数。 fgetAnswers(int noOfQustions, char *questionBuffer) 或者,使用 alloc() 为函数内部的字符数组分配空间。这样回去就安全了。稍后,您应该学习如何使用 free() 在完成后释放 alloc() 的空间。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多