【问题标题】:Error while executing: Segmentation fault执行时出错:分段错误
【发布时间】:2012-12-04 13:32:41
【问题描述】:

我是 C 语言的初学者。在阅读了 Ritchie 书的最初章节后,我编写了一个程序来生成随机数和字母表。

程序用 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;
}

【问题讨论】:

  • -Wall 标志传递给gcc,它会给你一个关于这个问题的警告。
  • 要生成区间内的数字,可以使用公式:int val=mino+rand()%(maxo+1);
  • @banuj,根据this 文章,不建议这样做。
  • @interjay,感谢您提供有关 -Wall 的提示。

标签: c


【解决方案1】:

printf("%s ,",text); 是错误的 - 它说 text 是一个以 nul 结尾的字符数组。使用

printf("%c ,", text);

而不是打印您的单个字符。

【讨论】:

  • 美丽。谢谢你。我不记得看到 %c 格式化字符。我现在知道了。我想如果我想改用字符串,我必须添加 '\0' 作为终端字符?
  • @Droidzone 是的。您还需要将 text 设为 char 数组而不是单个 char,以便为终止 '\0' 字符提供存储。
【解决方案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;
}

这就是我要说的。 :)

【讨论】:

  • 要求 OP 扫描 40 多行代码以查找您更改/注释的代码并不是最有用的方法。您还重复了之前的两个答案。发布带有其他信息的新答案可能会有所帮助;仅提供相同的答案而没有任何解释且可读性较差,很难看到有多大价值。
  • 感谢您的关注,但请再看一遍。我不仅提供了 OP 问题的解决方案,还提供了一个工作代码和一些建议 OP 应该考虑审查。我想我不可能做得更好。
  • 啊,我现在明白了。在这种情况下,我撤回了我之前的评论,并用一个建议替换它,即您在开始此类帖子时添加一条评论,说明您已经整理了示例代码,内联评论了有趣的更改。我(可能还有其他读者)根本不清楚你遇到了这么多麻烦。
  • @askmish,您的 cmets 最有用。谢谢!
【解决方案3】:

为什么在textchar 时使用%s。您不需要函数中的字符串类型。只是一个字符就可以了。功能变化:void randAlph ()

printf("%s ,",text);

printf("%c ,", text);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    相关资源
    最近更新 更多