【问题标题】:Segmentation Fault in C in my code in linux [duplicate]我在linux中的代码中的C中的分段错误[重复]
【发布时间】:2016-10-12 15:11:33
【问题描述】:

我现在只是在学习 C 中的指针,我对它们在我的代码中的工作方式感到困惑:

    #include <stdio.h>
    #include <string.h>


    #define MAX_ARR  64
    #define MAX_STR  32

    typedef enum { COMEDY, DRAMA, HORROR, SCIFI 
    } GenreType;

    typedef struct {
      char title[MAX_STR];
      char director[MAX_STR];
      int  year;
      GenreType genre;
    } MovieType;

    void initMovie(char*, char*, int*, GenreType, MovieType*);
    void printMovies(MovieType*, int);
    void readString(char*);
    void readInt(int*);


    int main()
    {
       MovieType movie;
       MovieType movieArr[MAX_ARR];
       MovieType *pMovie;
       char t = movie.title;
       int arrSize = 0;

       printf("Please enter the tile of the movie: ");
       readString(t);
       printf("The title of the movie is: %c\n", (t));

       return 0;
    }

void initMovie(char *t, char *d, int *y, GenreType gentype, MovieType *movType)
{

}

void readString(char *str)
{
  char tmpStr[MAX_STR];

  fgets(tmpStr, sizeof(tmpStr), stdin);
  tmpStr[strlen(tmpStr)-1] = '\0';
  strcpy(str, tmpStr);
}

void readInt(int *x)
{
  char str[MAX_STR];

  readString(str);
  sscanf(str, "%d", x);
}

我试图让用户填写电影类型的所有数据,例如titledirectoryear 它出来了等等。如您所见,我当前的方法产生了一个@ 987654325@,很明显我做错了什么。 main 函数之外的所有内容都不能更改,initMovie 函数和 printMovies 函数除外(尚未制作)。

任何提示和指示,双关语,将不胜感激!让我知道我做错了什么以及如何解决它!

【问题讨论】:

  • 语句tmpStr[strlen(tmpStr)-1] = '\0' 没有意义,strlen 通过搜索 0 来计算字符串的长度,然后在已经有 1 的地方放置一个 0。也许你的意思是tmpStr[MAX_STR-1] = '\0'
  • 那不是我做的,而是教授做的。我无法改变它
  • @KarstenKoop 实际上它正在剥离 fgets() 将存储的尾随 \n。所以它确实是有道理的,尽管它很丑。
  • 请不要破坏自己的帖子。
  • char t = movie.title; 是一个错误。您的编译器应该对此有所说明。在运行程序之前修复编译器报告的所有消息非常重要。

标签: c pointers pass-by-reference


【解决方案1】:

您将char t = movie.title; 传递给readString(t);。这是不正确的。 readString 需要一个指针 char*

【讨论】:

  • +1,然后格式字符串需要为%s 而不是%c,并且可变参数不需要像Python那样放在括号中。
【解决方案2】:

知道了。 所以基本上有两个不同的问题。

  1. 就像第一个人说你在使用 char t = movie.title; 时应该使用 char* t = movie.title;

  2. 在:printf("The title of the movie is: %c\n", (t)); 你应该使用%s 而不是%c。所以像这样:printf("The title of the movie is: %s\n", (t));

祝你的任务好运。我使用 Mac OS X 编译,但它应该可以在 linux 上运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    相关资源
    最近更新 更多