我正在编写一个小型C代码,用于播放具有已输入名称的Hangman。一节要求我允许输入短语的输出带*代替所有字母,而不是标点符号。类似地,在短语的末尾,用户的名字放在括号中并且意图按原样打印。代码的第一部分工作正常,第一个while循环放置星号,但第二个while循环似乎每次都失败,似乎每次运行程序时都存储无意义和随机字符。这是我到目前为止的程序。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int guesses = 3;
int limit = 41;
char quote[42] = "I just wrote this game in C! (Josh Masher)";
char strArr[42];
char *quoP;
quoP = "e[0];
char *strP;
strP = &strArr[0];
while (*quoP != '.' && *quoP != '!' && *quoP != '?') {
if (isalpha(*quoP)) {
*strP = '*';
} else if (*quoP == ' ' || *quoP == ',') {
*strP = *quoP;
}
strP++;
quoP++;
}
while (*quoP != NULL) {
*strP = *quoP;
strP++;
quoP++;
}
}
任何想法?
修改
我稍微重写了代码,并删除了随机字符问题,但现在它更复杂了。
int main()
{
int guesses = 3;
int limit = 41;
char quote[42] = "I just wrote this game in C! (Alex Butler)\0";
char strArr[42];
char *quoP;
quoP = "e[0];
char *strP;
strP = &strArr[0];
int counter = 0;
while (*quoP != '\0') {
if (*quoP == '.' || *quoP == '!' || *quoP == '?' || counter == 1) {
counter = 1;
}
if (isalpha(*quoP)) {
if (counter == 0) {
*strP = '*';
} else if (counter == 1) {
*strP = *quoP;
}
} else {
*strP = *quoP;
}
printf("%c", *strP);
strP++;
quoP++;
}
}
答案 0 :(得分:1)
在最后一个while循环后添加* strP ='\ 0'以终止字符串。
另外,(* quoP!= NULL)应该是(* quoP!='\ 0')。 NULL的类型是指针,* quoP的类型是字符。你的程序仍然有效,但这会产生误导。
也可能想要包含ctype.h
祝你项目的其余部分好运。
答案 1 :(得分:0)
第一个循环不能正常工作。如果它遇到未处理的标点符号(例如&
),它将跳过并在那里留下垃圾。
你也没有空字符串终止字符串,正如其他人在评论中指出的那样。您最好首先复制字符串(使用strncpy
),然后在您认为合适时使用*
标记字符。这意味着你只有一个循环,它会更简单:
strncpy( strArr, quote, sizeof(strArr) );
for( char *s = strArr; !strchr(".!?", *s); s++ )
{
if( isalpha(*s) ) *s = '*';
}
此外,NULL
是一个指针。空终止是一个不幸的名称。您可以写出值0
或'\0'
,但不能写NULL
。