我还在和我的叔叔一起学习C,我还遇到了另一个障碍,试图编写我们一起写的Rock Rock Scissors程序。我还有更多关于该计划的事情,但我甚至无法让大部分东西正常工作。
我使用Make命令从编译器接收的错误
main.c: in function 'start_play':
main.c:79:7: error: format '%s' expects argument type 'char *', but argument 2 has type 'int' [-werror=format=]
scanf("%1s", human_hand[0]);
main.c:82:11: error: format '%s' expects argument of type 'char *', but argument 3 has type 'int' [-Werror=format=]
fprintf( stderr, "Player 1 has entered an invalid hand choice, %s.", player_1);
main.c:104:1: error: ISO C forbids nested functions [-Werror=pedantic]
int choice_to_int(const char a)
main.c:104:1: error: ISO C90 forbids mixed declarations and code [-Werror=pedantic]
main.c 132:1: error: expected declaration or statement at end of input
}
main.c:132:1: error: expected declaration or statement at end of input
main.c:60:6: error: unused variable 'choice' [-Werror=unused-variable]
enum choices choice;
这是main.c文件的内容,我似乎无法做到。
/*
Programmer: Tim Bowen
Creation Date: 2014/05/26
Last Updated: 2014/05/27
Project Name: RPS(Rock/Paper/Scissors)
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int gen_hand( );
void start_play();
int choice_to_int(const char a);
int main ( int argc, char *arga[], char **env)
{
start_play( );
return 0;
} /*end main*/
/*
Precondition: Srand must but initialized before usage of gen_hand
Post condition: function returns either 0, 1 or 2.
*/
int gen_hand( ) {
return((rand() % 3 ));
}
void start_play( ) {
enum choices { ROCK, PAPER, SCISSORS };
enum choices choice;
const char *rps[] = {"Rock", "Paper", "Scissors"};
int player_1, player_2;
char answer[2];
char human_hand[2];
srand(time(NULL));
printf("%s\n", "This program plays Rock, Paper, Scissors.");
printf("%s\n", "Version 0.2");
do{
printf("%s\n", "Do you want to play against the computer? (Y/N):");
printf("%s\n", "Any other character to quit.:");
scanf("%1s", answer);
printf("%s\n", answer);
break;
if(answer[0] == 'y' || answer[0] == 'Y')
{
printf( "%s\n", "Please enter your hand(R/P/S):");
scanf("%1s", human_hand[0]);
player_1=choice_to_int(human_hand[0]);
if(player_1==3){
fprintf( stderr, "Player 1 entered an invalid hand choice, %s", player_1 );
/* err_hand();
break;} */
player_2=gen_hand( );
printf( "Player one => %d\n %2s", player_1, rps[player_1]);
printf( "player two => %d\n %2s", player_2, rps[player_2]);
}
else if (answer[0] == 'n' || answer[0] == 'N' )
{
player_1=gen_hand( );
player_2=gen_hand( );
printf( "Player one => %d\n %2s", player_1, rps[player_1]);
printf( "player two => %d\n %2s", player_2, rps[player_2]);
}
else {
break;
}
while (1);
return;
}
/*
precondition: user passes in either, Rr, Pp, Ss, or another incorrect response.
post condition: function returns either 0, 1, or 2 for correct responses, or 3 for erroneous ones.
*/
int choice_to_int(const char a)
{
int r;
switch ( r ) {
case 'R':
case 'r':
r=0;
break;
case 'P':
case 'p':
r=1;
break;
case 'S':
case 's':
r=2;
break;
default:
r=3;
break;
}
return (r);
}
我为几乎过多的额外行道歉,但我这样做是为了(希望)可以更容易阅读。我不确定这次我做错了什么,因为我几乎完全从我上课的笔记中复制了这个。我无法继续尝试添加我应该添加的部分,因为我无法获得我们编码在一起的部分甚至可以正常工作。当我的叔叔编译它时,这些错误都没有出现。
编辑:到目前为止,所提供的答案有助于消除所涉及的大多数错误,但新错误除外:
main.c:58:5错误:格式&#39;%s&#39;类型&#39; char &#39;的预期参数,但参数2的类型为&#39; char()[2]&#39; [-Werror =格式]
我还在抱怨我没有使用变量&#39;选择&#39;但说实话,我不确定如何使用选择。 我可能不清楚这一点,但我并没有直接写过&#39;这个。我建议在我的叔叔写的时候,然后我在我的机器上重写了这个&#39; class&#39;已经完了。我并不是真的要完全理解我在这里所做的事情......这个程序应该是显而易见的(对于那些有很多编码经验的人来说......)但我想我没有得到它
它应该选择播放摇滚/纸/剪刀,并选择让计算机自己玩(else if语句),我们使用枚举来指定选择,然后选择_to_int获取用户输入并将其转换回与enum匹配的值,并允许我创建“赢/输/抽奖”#39;基于这些比较的陈述。我可能会提出一些愚蠢的方法来实现这个想法,但这就是这个想法。我仍然没有达到我可以创建赢/输/画声明的程度,或者如果用户决定放入不适合游戏格式的东西(Say,Z或其他东西),则处理错误。
到目前为止,感谢您的帮助,并对此提出了许多不必要的复杂岩石/纸/剪刀的实施......
答案 0 :(得分:0)
我不擅长C但可能是这个字符串
fprintf( stderr, "Player 1 entered an invalid hand choice, %s", player_1 );
应该是
fprintf( stderr, "Player 1 entered an invalid hand choice, %d", player_1 );
您需要将变量为int的所有字符串更改为%d。
你忘记了结束括号:
if(player_1==3){
fprintf( stderr, "Player 1 entered an invalid hand choice, %s", player_1 );
}
错误main.c:104:1: error: ISO C forbids nested functions [-Werror=pedantic] int choice_to_int(const char a)
也与缺少括号有关,因为编译器认为它仍然在以前的函数中(start_play())
答案 1 :(得分:0)
除了已经说过的话:
好好看这个:
int choice_to_int(const char a)
{
int r;
switch ( r ) { ... }
/* .... */
}
您正在启用未初始化的变量!删除int r;
并将功能更改为
int choice_to_int(const char r) {...}
你也忘记了正确关闭功能(缺少'}')
void start_play( )
答案 2 :(得分:0)
一些一般的建议:不要编写100行代码和数十个问题,而是一次只写一小段,检查一切是否正常,然后转到下一篇。
其他答案尚未提及的问题:
int gen_hand( );
void start_play();
应该是:
int gen_hand(void);
void start_play(void);
void
表示该函数不带参数;空括号意味着我们不知道它需要多少(如果你没有正确的话,你的程序可能搞砸了。)
接下来,scanf("%1s", answer);
和scanf("%1s", human_hand[0]);
。使用scanf
,您必须告诉它在哪里写下您阅读的字符。相反,你告诉它这些东西的当前价值。使用&
运算符获取目标位置的地址。
在此代码中:
if(player_1==3){
fprintf( stderr, "Player 1 entered an invalid hand choice, %s", player_1 );
/* err_hand();
break;} */
你永远不会关闭{
,因为你注释了结束}
。你不应该注释掉break;}
,因为这意味着你继续使用3
作为超出界限的数组索引。
在printf( "player two => %d\n %2s", player_2, rps[player_2]);
中,2
表示:至少打印2个字符。你的所有字符串都比2长,所以这没有效果。你想做什么?