2012-12-04 90 views
0

我是C语言的初学者。在阅读里奇书的最初章节后,我编写了一个程序来生成随机数字和字母。执行时出错:分割错误

该程序编译与gcc罚款。然而,在运行它时,它会给出一个错误“分段错误”,这对我有限的知识来说是难以理解的。我很乐意了解我写错了什么。

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


long int genrandom(int,int); 
void randAlph(void); 
char letterize(int); 

int main (void) { 
//  char full[9]; 
//  char part_non[4]; 
    srand(time(0));   

    int i; 
    for (i=0;i<50;++i) { 
     randAlph(); 
    }; 

} 

long int genrandom(int mino,int maxo) { 
    int val=mino+rand()/(RAND_MAX/(maxo-mino)+1); 
    return val; 
} 

void randAlph(){ 
    int val; 
    char text; 
val=genrandom(0,26); 
// return val; 
text=letterize(val); 
printf("%s ,",text); 

} 

char letterize(int num) { 
    char letter='A'+num; 
    return letter; 
} 
+0

'printf(“%c,”,text);' – UmNyobe

+1

将'-Wall'标志传递给gcc,它会给你一个关于这个问题的警告。 – interjay

+0

要在间隔中生成数字,可以使用公式:'int val = mino + rand()%(maxo + 1);' – banuj

回答

4

printf("%s ,",text);是错误的 - 它说,text是字符的空终止数组。使用

printf("%c ,", text); 

改为打印您的单个字符。

+0

美丽。谢谢。我不记得看到%c格式化字符。我现在知道了。我想如果我想用字符串代替,我必须添加'\ 0'作为终端字符? – Droidzone

+0

@Droidzone是的。您还需要将'text'设置为char数组而不是单个char来为终止'\ 0'字符提供存储。 – simonc

1

为什么使用%stextchar。你不需要函数中的字符串类型。只是一个字符会做。变更功能:void randAlph()

printf("%s ,",text); 

printf("%c ,", text); 
2
#include <stdio.h> 
#include <stdlib.h> 
#include "conio.h" 
#include <time.h> 


int genrandom(int,int); 
void randAlph(void); 
char letterize(int); 

int main (void) { 
//  char full[9]; 
//  char part_non[4]; 
    srand(time(0));   

    int i; 
    for (i=0;i<50;++i) { 
     randAlph(); 
    }; 

} 

int genrandom(int mino,int maxo) {//changed function return type to int 
    int val=mino+rand()/(RAND_MAX/(maxo-mino)+1); //Be careful when you are using '/' operator with integers 
    return val; //returning int here why set return type to long int? 
} 

void randAlph(){ 
    int val; 
    char text; 
    val=genrandom(0,26); 
    // return val; 
    text=letterize(val); 
    printf("%c ,",text);//Replace %s with %c 

} 

char letterize(int num) { //No bound checking on num eh? 
    char letter='A'+num; 
    return letter; 
} 

这就是我说的话。 :)

+1

要求OP扫描40多行代码,寻找您更改/评论的代码不是最有帮助的方法。你也复制了两个以前的答案。用附加信息发布新答案可能会有所帮助;在没有任何解释和难以理解的形式下提供相同的答案时,难以看到太多价值。 – simonc

+0

我感谢您的关注,但请再看一遍。我不只是给OP的问题提供解决方案,而是一个工作代码和一些建议OP应该考虑审查。我想,我无法做得更好。 – askmish

+2

啊,我现在看到了。在这种情况下,我撤回了以前的评论,并将其替换为建议您开始发布此类帖子,并发表评论,说明您已经整理了示例代码,并在内部评论有趣的更改。我(也可能是其他读者)一点都不清楚你是否遇到过很多麻烦。 – simonc