C 错误:应为声明说明符或'';字符串前常量[puts()和gets()语句错误

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

在编译掷骰子程序后,我遇到了这个错误。代码有什么问题

同样在我使用gets()而不是scanf()命令之前,但由于这个原因,我得到了一个错误-传递'gets'的参数1会使指针从整数变为不带强制转换的整数 因此,我删除了get()命令并使用了scanf,然后就没有关于scanf()的错误了

出现这两个错误的原因是什么?


好的,根据答案,我知道了我应该如何使用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);