Hello stackoverflow社区, 我是编码的新手,刚刚参加了为期2周的课程。 我们必须做一个项目,我选择的项目是刽子手。 一切都工作到目前为止,但在添加一个循环(for或while)输出找到的字母之后,执行在输入字母后停止(因此在第68行之后)并且idk为什么。 我在赢得7胜的cygwin上。 非常感谢你的帮助。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
unsigned sleep( unsigned seconds );
void Welcome()
{
printf(" WELCOME\n");
//sleep(1);
}
void showLogo()
{
printf(" TO\n");
//sleep(2);
printf("-------------------------------------------- _______\n");
printf("| H H A N N GGGG M M A N N | |/ | \n");
printf("| H H A A NN N G MM MM A A NN N | |/ | \n");
printf("| HHHH AAAAA N N N G GG M M M AAAAA N N N | | O \n");
printf("| H H A A N NN G G M M A A N NN | | \\|/\n");
printf("| H H A A N N GGG M M A A N N | | | \n");
printf("-------------------------------------------- | / \\\n");
printf(" __|_________\n\n");
}
void RandomWords()
{
//sleep(2);
FILE *h = fopen("words.txt","r");
int zeichen = 0;
int anzahl_worte = 0;
if( fscanf(h, "%d\n", &anzahl_worte)!=1) //anzahl_worte(= number of words) been read out of words.txt
{
printf("No valid word file. Missing number of words.");
}
char** var = calloc(anzahl_worte, sizeof(char*));
for(int i = 0; i < anzahl_worte; i++)
{
var[i] = calloc(30, sizeof(char)); //every array has now 20 places free
fscanf(h,"%49s", var[i]); //arrays are being filled with words
}
int zufall = rand() % anzahl_worte;
strcpy(var[0], var[zufall]);//arrays been chosen by random
zeichen = strlen(var[0]);
printf("Anzahl der gesuchten Buchstaben: %d\n", zeichen);
printf("Das gesuchte Wort ist übrigens : %s\n", var[0]);
fflush(stdout);
char strich[30];
char* p[30];
for(int i = 0; i < zeichen; i++) //"_" for every letter
{
strich[i] = '_';
p[i] = &strich[i];
printf("%c ", strich[i]);
//every "_" has a Pointer
//should later be replaced with a letter
}
//printf("\n%c\n", *p[0]);
char* letter[1]; //found letter will be saved here
int k = 0; //position of the found letter in the word
//char** position = calloc(zeichen, sizeof(char**));
char* lpointer; //Addresse of the found letter
printf("\nGeben Sie bitte Ihren Buchstaben ein\n");
scanf("%s", letter[0]); //Your chosen letter
lpointer = strpbrk(var[0], letter[0]); //letters been searched in the word
if(lpointer != NULL)
{
while (lpointer != NULL)
{
k = lpointer - var[0];
printf ("An der %d. Stelle gefunden\n",k+1);
*p[k] = *lpointer;
lpointer = strpbrk(lpointer+1, letter[0]);
}
}
for(int w = 0; w < zeichen; w++)
{
printf("found letters: %c ", *p[w]);
}
/*printf("Gefundene Buchstaben %c ", *p[0]);
fflush(stdout);
printf("%c ", *p[1]);
fflush(stdout);
printf("%c ", *p[2]);
fflush(stdout);
printf("%c ", *p[3]);
fflush(stdout);
printf("%c ", *p[4]);
fflush(stdout);*/
fflush(h);
fclose(h);
}
int main (void)
{
srand(time(NULL));
Welcome();
showLogo();
RandomWords();
}
答案 0 :(得分:0)
你可能想要这个:
...
char letter[2]; //found letter will be saved here
int k = 0; //position of the found letter in the word
//char** position = calloc(zeichen, sizeof(char**));
char* lpointer; //Addresse of the found letter
printf("\nGeben Sie bitte Ihren Buchstaben ein\n");
scanf("%c", letter[0]); //Your chosen letter
letter[1] = 0; // NUL terminator
lpointer = strpbrk(var[0], letter); //letters been searched in the word
if (lpointer != NULL)
{
while (lpointer != NULL)
{
k = lpointer - var[0];
printf("An der %d. Stelle gefunden\n", k + 1);
*p[k] = *lpointer;
lpointer = strchr(lpointer + 1, letter[0]);
}
}
...
但其他地方最有可能出现更多问题。
顺便说一句:你应该只提交&#34;所有英语&#34;程序,你可能会得到更多的关注。但至少你的变量名和评论是英文的。在这里你应该检查fopen
是否成功:
FILE *h = fopen("words.txt","r");
if (h == NULL)
{
printf("Can't open words file\n");
exit(1);
}
答案 1 :(得分:0)
这封信的result = [23,15,46,76,45,43,32,49,10]
会调用未定义的行为。
scanf
声明一个{1}}的unitinitialised数组。然后,您的char* letter[1];
会尝试将用户输入放在char*
指向的位置。它是未初始化的,因此您可以将用户输入放在内存中的任何位置。
实际上,它可能是一个低数字甚至是NULL,或指向尚未分配给您的进程的一些内存。无论哪种方式,可能的结果都是分段错误。
您需要为要输入的字符串分配一些存储空间。
scanf
letter[0]
可以在char letter[2]; // Room for one letter and a '\0'
scanf("%1s", letter); // Only scan one letter
用作字符串的任何地方使用,例如:
letter
答案 2 :(得分:0)
由于你只是在一个角色中阅读,你可以这样做而不是
char letter;
scanf("%c", &letter); //Your chosen letter
if(isalpha(letter))
{
lpointer = strchr(var[0], letter); //letters been searched in the word
添加isalpha()
条件将确保仅检查字母表中的字母。
答案 3 :(得分:0)
感谢有这么多人试图帮助我!
所以我尝试了你们所说的(除了克里斯·特纳提出的建议)。但没有任何成功。 现在我想通了如果我缩短了数组p和strich的长度(strich对于单词的每个字母都是下划线)我可以使用更多的printfs而且我不会得到分段错误等。 但循环仍然不想工作 如果我添加多个printfs而不是循环该过程,但只要我使用循环来缩短该代码,执行就会在字母输入后停止(scanf字母)。