C 错误:应为声明说明符或'';字符串前常量[puts()和gets()语句错误
在编译掷骰子程序后,我遇到了这个错误。代码有什么问题 同样在我使用gets()而不是scanf()命令之前,但由于这个原因,我得到了一个错误-传递'gets'的参数1会使指针从整数变为不带强制转换的整数 因此,我删除了get()命令并使用了scanf,然后就没有关于scanf()的错误了 出现这两个错误的原因是什么?C 错误:应为声明说明符或'';字符串前常量[puts()和gets()语句错误,c,error-handling,compiler-errors,gets,puts,C,Error Handling,Compiler Errors,Gets,Puts,在编译掷骰子程序后,我遇到了这个错误。代码有什么问题 同样在我使用gets()而不是scanf()命令之前,但由于这个原因,我得到了一个错误-传递'gets'的参数1会使指针从整数变为不带强制转换的整数 因此,我删除了get()命令并使用了scanf,然后就没有关于scanf()的错误了 出现这两个错误的原因是什么? 好的,根据答案,我知道了我应该如何使用get()命令,以及为什么我不应该使用它,而是应该使用scanf()。因此,我做了一些更改。 虽然我遇到了两个新错误,但这次它与我使用的de
好的,根据答案,我知道了我应该如何使用get()命令,以及为什么我不应该使用它,而是应该使用scanf()。因此,我做了一些更改。 虽然我遇到了两个新错误,但这次它与我使用的delay()命令有关 错误:未定义对延迟的引用 |错误:ld返回了1个退出状态|
好的,我用windows.h库中的Sleep()命令而不是Delay()命令解决了上一个错误。程序已经编译好了。 但程序中仍然存在运行时错误,它在获得roll1之前运行良好,但随后它只打印下两条语句并终止程序,而不接受猜测输入 它跳过
printf(“它会更高/更低还是相同?(按H/L/S)\n”);
之后的所有代码,并直接终止程序
好的,我解决了上面的问题,在
scanf(“%c”,&nextGuess);
语句中的%c”
前面添加了一个空格
现在唯一的问题是我的toupper()
命令不起作用
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <windows.h>
int main()
{
int i, roll1=0, roll2=0, NumberOfRolls, RandomNUM1[50], RandomNUM2[50];
char nextGuess;
puts("Welcome to the Dice Roll Game");
puts("How many times do you want to roll a dice?");
scanf("%d", &NumberOfRolls);
for( i=1; i<=NumberOfRolls; i++ ) {
RandomNUM1[i] = ( rand()%6 ) + 1;
roll1 += RandomNUM1[i];
}
printf("\nYou Got %d in your first roll!\n", roll1);
Sleep(3000);
printf("\nLet's see if you can guess the value of next roll.\n");
printf("Will it be Higher/Lower or the same? (press H/L/S)\n");
scanf(" %c", &nextGuess);
toupper(nextGuess);
for( i=1; i<=NumberOfRolls; i++ ) {
RandomNUM2[i] = ( rand()%6 ) + 1;
roll2 += RandomNUM2[i];
}
if(nextGuess=='H'){
if(roll1<roll2){
printf("You are such a player, you guessed it right! It's %d", roll2);
}
else if(roll1>roll2){
printf("Uh-Oh! Bad Luck! First roll was higher, It's %d", roll2);
}
else if(roll1==roll2){
printf("Uh-Oh! Bad Luck! Both the rolls are same, It's %d", roll2);
}
}
if(nextGuess=='L'){
if(roll1>roll2){
printf("You are such a player, you guessed it right! It's %d", roll2);
}
else if(roll1<roll2){
printf("Uh-Oh! Bad Luck! First roll was lower, It's %d", roll2);
}
else if(roll1==roll2){
printf("Uh-Oh! Bad Luck! Both the rolls are same, It's %d", roll2);
}
}
if(nextGuess=='S'){
if(roll1==roll2){
printf("You are such a player, you guessed it right! It's %d", roll2);
}
else if(roll1>roll2){
printf("Uh-Oh! Bad Luck! First roll was higher, It's %d", roll2);
}
else if(roll1<roll2){
printf("Uh-Oh! Bad Luck! Second roll is higher, It's %d", roll2);
}
}
return 0;
}
#包括
#包括
#包括
#包括
int main()
{
int i,roll1=0,roll2=0,NumberOfRolls,RandomNUM1[50],RandomNUM2[50];
char nextGuess;
puts(“欢迎参加掷骰子游戏”);
puts(“你想掷多少次骰子?”);
scanf(“%d”和NumberOfRolls);
对于(i=1;i,get
函数从stdin
读取一个字符串(直到下一个换行符),因此它要求一个字符指针(char*
)到内存的一个区域,在该区域可以放置所有读取的字符,包括字符串终止符。您犯的错误是将指向int的指针传递给该函数,因此不仅因为您试图将int指针传递给get(没有隐式转换),所以会出现编译错误,但即使它编译,也不会像您预期的那样工作,因为它会将所有字符(大多数情况下大小为一个字节)放在编码为字符的内存区域中。这意味着,当您尝试使用指向int的指针解引用一个字符时,字符是“读起来就像是一个int”
有一个例子(假设1字节字符、4字节整数和一个小的尾数机器,并且有一个从int*到char*的隐式转换,它不存在,希望永远不会存在):
如果我在stdin
中输入123,则num
的内存区指针足够大,可以包含字符串,但它将包含(十六进制表示):
由于字符串长度为3个字符,“1”的ASCII码为0x31,“2”的ASCII码为0x32,“3”的ASCII码为0x33,以“\0”结尾!!
然后,当你尝试去引用它时,你会得到这个int(二进制表示——假设一个小小的endian机器):
它不是int值123,而是3224115. 这不是你想要的
当您使用scanf
函数时,您会向该函数传递一个格式字符串,告诉它如何解释传递给它的下一个参数,并在读取到指定的正确类型的字符串之间执行适当的转换。这意味着您仍应注意您对sc所说的内容当您编写格式字符串时,anf
函数(如果您告诉它读取字符串并向其传递指向int的指针,程序可能会崩溃),但如果您正确编写格式字符串,它将为您执行适当的转换
这就是为什么使用scanf
时,一切都能正常工作(您正在读取一个int,并将“%d”指定为格式字符串),而使用get
时,它无法编译以避免严重错误
我亦想就这项答覆提出几点意见:
- 该示例仅用于教学目的,提供的代码无法独立运行。我认为它编译的事实是出于教学目的;显然,该示例中提供的代码不编译
- 在该示例中,如果输入的字符串大于3个字符(如果包含空终止符,则为4个字符),或者int(char)类型包含的字节数小于(大于)4(1),则程序将崩溃,因为我们损坏了内存的其他区域
- 参考资料在技术方面比我更专业,因此这里是指向
gets
函数和scanf
函数的链接:,(而且也很有用)
- 您可以使用
gets
函数和atoi
函数来解析从gets
读取的字符串(使用指向足够大的内存空闲区域的字符指针,这很难将(*)分配给int
,但是scanf
是最好的方法
(*)请记住:如果您分配的内存区域包含20个字符,用户将输入21个字符。atoi函数失败,但最糟糕的是您的缓冲区溢出(如果您的程序在根权限下运行,则可能是一个高安全性问题)。您有一个错误的,
在main
的第二行,您声明char nextGuess,
而不是char nextGuess;
编译器告诉您它需要在
int num
gets(&num);
0x31|0x32|0x33|0x00
00000000|00110001|00110010|00110011
char tmp_NumberOfRolls[10];
gets(tmp_NumberOfRolls);
NumberOfRolls = atoi(tmp_NumberOfRolls);