这是我第一次来stackoverflow。我希望我的问题适合.我们这学期开始在大学里学习C语言编程。遗憾的是,只有一些在线讲座。但我们还是要解决任务。
我们这次应该编程一种杭人。换句话说,就是猜一个隐藏的单词。我有以下问题。我得到一个char,但输入后,谜语数组的内容发生了变化。如果我不输入,它就能正常工作。我不明白为什么会发生这种情况,因为scanf并没有真正访问riddle.我自己也不知道该怎么做。我希望有人能告诉我代码有什么问题。
//sry some variables and texts are in german
char* createRiddle(char const* const str){
int laenge = strlen(str);
char temp[laenge+1];
char *t = temp;
strcpy(temp, str);
int te = strcmp(temp, str);
if (te != 0){
printf("ERROR: Bei der Speicherreservierung ist ein Fehler aufgetreten");
exit(0);
}
int i;
for (i=0; i < (int)strlen(temp);i++){
if (str[i] > 65 && str[i] < 90){ //ASCII Großbuchstaben-Bereich prüfen
char verdeckt = '*';
temp[i] = verdeckt;
} else {
temp[i] = str[i];
}
}
return t;
}
//----------------------------
int uncoverLetter(char *riddle, const char *solution, char letter){
printf("RD3: %s\n",riddle);
letter = toupper(letter);
int i;
int treffer = 0;
for (i=0; i < (int)strlen(solution); i++) {
if (letter == solution[i]) { // Buchstabe im Wort?
if (letter != riddle[i]) { //Buchstabe schon aufgedeckt?
riddle[i] = solution[i];
treffer = treffer + 1;
}
}
}
return treffer;
}
//----------
int gamingLoop(const char* solution){
int punkte; //points
printf("Lets GO!\n\n");
char *riddle = createRiddle(solution);
printf("Gesuchtes Wort: %s\n\n",riddle); //Word: *-******* ( = C-Compiler )
int highscore = 0;
while ((strcmp(riddle, solution)) != 0) {
printf("RD1: %s\n",riddle); //Test: What does Riddle look like?
printf("Bitte geben Sie einen Buchstaben ein: "); // pls enter letter
char eingabe;
scanf(" %c", &eingabe); //-----!!Here is the point where things go wrong!!------
printf("RD2: %s\n",riddle); //Test2
int treffer = uncoverLetter(riddle, solution, eingabe);
//----------- probably unimportant for the problem ----------------
//Zufallszahl
int zufz = (rand() % 11) + 1;
int ii = 1;
for (ii=1; ii < 11 ; ii++){
if ( zufz == ii) {
punkte = zufz*100;
}
}
//------------
if (treffer != 0) {
printf("Du hast %d richtige Treffer.\n", treffer);
highscore = highscore + (treffer*punkte);
printf("Punkte: %i\n\n", highscore);
} else {
printf("Du hast leider keinen Treffer.\n");
highscore = highscore - punkte;
printf("Punkte: %d\n\n", highscore);
}
printf("%s\n\n",riddle);
}
return highscore;
}
OUTPUT。Sry no pic because I dont have 10 rep:(
/ R3 in funktion uncoverLetter
我强烈怀疑自己犯了一个很愚蠢的错误,可惜我自己还看不出来.期待得到建议和帮助。
谢谢你的帮助。
你的问题是在 createRiddle
,在这里您可以创建 ***
模式。
char* createRiddle(char const* const str){
int laenge = strlen(str);
char temp[laenge+1];
char *t = temp;
// ... create pattern ...
return t;
}
你返回一个本地数组。(t
只是数组的别名 temp
.) 当函数退出时,该数组将超出范围,因此无效。
有几种可能的解决方案。
让调用者提供空间
传入一个数组,调用者可以填充。
void createRiddle(char *temp, char const* const str)
{
// ... create pattern in temp ...
}
然后像这样调用它
char riddle[MAX];
createPattern(riddle, solution);
你不需要在这里返回数组,因为它和你提供的数组是一样的,只是被填充了。(如果能使调用更容易,你可以返回它。你也可以返回一个错误代码。使用你的良好判断。)
当然,函数和调用者需要同意必须提供多少空间。这可以是另一个函数参数或一个全局常数)。
动态分配内存
动态内存是在堆上分配的,保证不被别人使用。
char *createRiddle(char const* const str)
{
int laenge = strlen(str);
char *temp = malloc(laenge + 1);
// ... create pattern in temp ...
return temp;
}
那就像这样使用它。
char *riddle = createRiddle(char const* const str);
// ... play the game ...
free(riddle); // be nice and clean up
静态数组
使数组 static
.
static char temp[laenge+1];
在这里, static
关键字意味着只有一个数组会在调用之间保留其值。这实际上就像你在函数外声明了全局数组,但附加的是它的名字只有你的函数知道。
这是一个快速而简单的解决方案,但是当你的函数是递归的,或者当你的代码的其他部分使用同一个函数时,它就会失败。(不过你的游戏中可能不是这种情况。)