2011-11-14 131 views
0

我正在学习使用switch语句并使用rand()和srand()函数,但当我尝试运行此代码时,出现了分段错误,我从本书中获得了我正在从中学习C 。什么可能导致这种情况发生?为什么运行此代码时出现分段错误?

#include <stdio.h> 

int main(void) 
{ 

int iRandomNum = 0; 
srand(time()); 

iRandomNum = (rand() % 4) + 1; 

printf("\nFortune Cookie - Chapter 3\n"); 

    switch (iRandomNum) { 

    case 1: 
     printf("\nYou will meet a new friend today.\n"); 
     break; 
    case 2: 
     printf("\nYou will enjoy a long and happy life.\n"); 
     break; 
    case 3: 
     printf("\nOpportunity knocks softly. Can you hear it?\n"); 
     break; 
    case 4: 
    printf("\nYou'll be financially rewarded for your good deeds.\n"); 
     break; 

    } //end switch 

printf("\nLucky lotto numbers: "); 
printf("%d ", (rand() % 49) + 1); 
printf("%d ", (rand() % 49) + 1); 
printf("%d ", (rand() % 49) + 1); 
printf("%d ", (rand() % 49) + 1); 
printf("%d ", (rand() % 49) + 1); 
printf("%d\n", (rand() % 49) + 1); 

} //end main function 
+0

在seg故障之前控制台上是否出现了任何问题?基本上,你有没有得到任何printf语句显示? –

+1

确保你[编译调试标志](http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html)(通常是'-g'),然后使用['gdb']运行你的程序。 (http://www.gnu.org/s/gdb/)来找出究竟是哪一行seg故障发生。 –

+0

@adam在分段错误之前没有任何东西出现,我编译时没有错误,然后当我运行它时,它说分段错误。 – nastyn8

回答

2

你打电话time()没有参数。 time()函数有一个参数,它不是可选的。

添加

#include <time.h> 

到源文件的顶部,并更改srand()调用

srand(time(NULL)); 

编辑:

您还需要添加

#include <stdlib.h> 

得到srand()rand()的声明。

编辑2:

你可以经常(貌似)逃脱调用一个函数没有#include荷兰国际集团在它的声明的标题。

在C90中,如果你调用一个函数,没有可见的声明,编译器暗中为其创建一个声明,假设该函数返回int,并采取在调用中给出的参数。 srand()rand()确实返回int结果,因此可以调用它们。但time()采用类型time_t*的参数,并返回time_t类型的结果;如果你“幸运”,没有声明的电话可能会工作,否则它可能会炸毁你的脸。

1999年ISO C标准(C99)改变了规则,所以调用一个没有可见声明的函数是违反约束的,需要编译器的诊断。

即使在C90模式下,如果您给出正确的选项,也可以说服大多数编译器警告未声明的函数。底线:如果你要调用一个库函数,请阅读它的文档(手册页,不管),并为声明它的头添加一个#include。而不要指望编译器提醒你,如果你忘记这样做。

+0

你是正确的,这是我没有的#include 现在它运行良好 – nastyn8

+0

感谢基思,跆拳道是不对的这本书,为什么没有显示我的正确方法,它在2008年被做,这就是所谓的“ C为绝对初学者“。 – nastyn8

+0

但唯一的是我没有的#include 使用,它工作得很好,是正常的吗? – nastyn8

5

这是因为time()需要一个参数,东西,如果你打开所有的警告,如用gcc -Wall -Wextra ...编译器会告诉。

不包括time.h(意味着time()得到一个默认的原型),并调用它没有一种说法是你的具体问题相结合。

的使用higehr警告级别时,发现了问题的完整列表是:

  • time()srand()rand()有没有原型,你需要#includestdlib.htime.h
  • time()需要参数,如srand (time (0))
  • 您应该返回从main东西(不是绝对必要的非常语言的近期反复,但仍然很好的做法)。

以下罚款变化工作:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main (void) { 
    int iRandomNum = 0; 
    srand (time (0)); 

    iRandomNum = (rand() % 4) + 1; 

    printf("\nFortune Cookie - Chapter 3\n"); 

    switch (iRandomNum) { 
     case 1: 
      printf("\nYou will meet a new friend today.\n"); 
      break; 
     case 2: 
      printf("\nYou will enjoy a long and happy life.\n"); 
      break; 
     case 3: 
      printf("\nOpportunity knocks softly. Can you hear it?\n"); 
      break; 
     case 4: 
      printf("\nYou'll be financially rewarded for your good deeds.\n"); 
      break; 
    } //end switch 

    printf("\nLucky lotto numbers: "); 
    printf("%d ", (rand() % 49) + 1); 
    printf("%d ", (rand() % 49) + 1); 
    printf("%d ", (rand() % 49) + 1); 
    printf("%d ", (rand() % 49) + 1); 
    printf("%d ", (rand() % 49) + 1); 
    printf("%d\n", (rand() % 49) + 1); 

    return 0; 
} 
+0

我没有使用,但它仍然工作 – nastyn8

+1

@ nastyn8,它可能仍然有效,但您不会有'rand'或'srand'的原型。您应该_always_包含您使用的函数的相关头文件。 – paxdiablo

3

我以前gdb调试代码和你的段错误发生在这一行:

srand(time()); 

您正在使用time()不正确。你需要传递,将举行所产生的时间,但NULL会导致功能return时间的参数:

srand(time(NULL)); 

此外,从main()功能一定要总是return做。

此代码工作正常:

gcc -g -Wall -Wextra test.c -o test 

和:

#include <stdlib.h> 
#include <stdio.h> 
#include <time.h> 

int main(void) 
{ 

int iRandomNum = 0; 
srand(time(NULL)); 

iRandomNum = (rand() % 4) + 1; 

printf("\nFortune Cookie - Chapter 3\n"); 

    switch (iRandomNum) { 

    case 1: 
     printf("\nYou will meet a new friend today.\n"); 
     break; 
    case 2: 
     printf("\nYou will enjoy a long and happy life.\n"); 
     break; 
    case 3: 
     printf("\nOpportunity knocks softly. Can you hear it?\n"); 
     break; 
    case 4: 
    printf("\nYou'll be financially rewarded for your good deeds.\n"); 
     break; 

    } //end switch 

printf("\nLucky lotto numbers: "); 
printf("%d ", (rand() % 49) + 1); 
printf("%d ", (rand() % 49) + 1); 
printf("%d ", (rand() % 49) + 1); 
printf("%d ", (rand() % 49) + 1); 
printf("%d ", (rand() % 49) + 1); 
printf("%d\n", (rand() % 49) + 1); 

return 0; 
} //end main function 

万一你感兴趣,我如何调试你的代码,我有调试符号和每一个编译器警告可能编译它我开始gdb

gdb ./test 
(gdb) run 
Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff7ffba2c in time() 
(gdb) quit 
+0

我做了你说的,我仍然得到seg错误 – nastyn8

+1

你还是需要添加'#include ',所以'time()'函数的声明是可见的。 ''#include 'srand()'和'rand()'。 –

+0

你确定?起初,我包括它。但我省略了它,代码仍然编译。我会重新包含它以保证衡量。 – Blender

相关问题