使用下面的代码,我总是会遇到“变量‘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 want\n");
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 guess\n");
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。 (普通的编译器应该对此发出警告。)如果这里的想法是再次调用该函数以重复提示,以防用户输入一些愚蠢的内容,那么无论如何使用循环而不是递归调用可能是更好的主意。
关于c - 变量周围的堆栈被指针算术损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44477945/