c - 变量周围的堆栈被指针算法损坏



使用下面的代码,我总是会遇到"围绕变量'UserCode'的堆栈已损坏。

如果我没记错的话,当我做userCode = (char*)malloc(sizeof(char)*N);时,它不应该创建一个大小为 char*n 的"数组"吗?我猜我的问题要么是我的数组声明,要么是我的指针算术。

任何帮助将不胜感激。

#include "stdafx.h"
#include <math.h>
int userPrompt1() {
    int numOfAlphabets = 0;
    printf("Please enter a number from 1 to 8 to choose how many alphabets you wantn");
        scanf_s(" %d", &numOfAlphabets);
        if (numOfAlphabets > 8 || numOfAlphabets < 0) {
            printf("Sorry! Invalid number entered. Try again. n");
            numOfAlphabets = userPrompt1();
        }
        return numOfAlphabets;
}
int userPrompt2() {
    int numOfLetters = 0;
    printf("Please enter the number of letters you want to guessn");
    scanf_s(" %d", &numOfLetters);
    if (numOfLetters < 0) {
        printf("Sorry! Invalid number entered. Try again. n");
        numOfLetters = userPrompt2;
    }
    return numOfLetters;
}
int tryCalculator(int K, int N) {
    int tries = 0;
    tries = 1 + ceil(N * log2(K));
    return tries;
}
void codeGenerator(char codeGuessIn[], char letters[], int size) {
    for (int i = 0; i < size; i++) {
        int rando = rand() % size;
        codeGuessIn[i] = letters[rando];
        printf(" %c", codeGuessIn[i]);
    }
    printf("n");
}
void codeChecker(char codeGuessIn[], char generatedCode[], int size) {
    int correctAlphabets = 0;
    for (int i = 0; i < size; i++) {
        if (codeGuessIn[i] == generatedCode[i]) {
            correctAlphabets++;
        }
    }
    printf(" %d in correct place n", correctAlphabets);
}
void getUserCode(int size, char *userCode[]) {
    for (int i = 0; i < size; i++) {
        printf("Please enter letter #%d n", i+1);
        getchar();
        scanf_s(" %c", &userCode[i]);
    }
}

int main(void)
{
    char letters[8] = { 'A','B','C','D','E','F','G','H' };
    char *generatedCode;    //array to hold generated code
    char *userCode;         // array to hold generated code.
    int K = userPrompt1();  //how many different alphabets in code
    int N = userPrompt2();  //how many letters in code
    int tries = tryCalculator(K, N);
    //int gameEnd = 1;
    userCode = (char*)malloc(sizeof(char)*N);
    generatedCode = (char*)malloc(sizeof(char)*N);
    codeGenerator(generatedCode, letters, N);
    getUserCode(N, &userCode);
    //codeChecker(userCode, generatedCode, N);

    return 0;
}
void getUserCode(int size, char *userCode[]) {
    scanf_s(" %c", &userCode[i]);

在这里,userCode[i]是一个char *(指针到字符(,&userCode[i]是一个char **(指针到指针到字符(,scanf("%c")期望一个char *。一个好的编译器会警告这一点。

我想你在这里想做的是这样的:

void getUserCode(int size, char *userCode) {
    scanf_s(" %c", &userCode[i]);
}
int main(void) {
    char *userCode = malloc(N);
    getUserCode(N, userCode);
}

这里的printf()getchar()scanf()组合都散发着scanf造成的坏习惯:你丢弃了用户输入的第一个字符,因为你依赖于输入缓冲区中的额外字符。请参阅 http://c-faq.com/stdio/scanfprobs.html 并使用fgets()而不是使用 scanf() 阅读整行输入。

int userPrompt2() {
    int numOfLetters = 0;
    ...
        numOfLetters = userPrompt2;
}

您正在将函数指针分配给一个 int。 (普通编译器应该警告这一点。如果这里的想法是在用户输入愚蠢的内容时再次调用函数以重复提示,那么无论如何使用循环而不是递归调用可能是一个更好的主意。

最新更新