【问题标题】:Looping problem in CC中的循环问题
【发布时间】:2011-08-17 18:06:57
【问题描述】:

我正在用 c 编写一个简单的程序,这样我可以更好地理解该语言,但我遇到了一个奇怪的问题。 正如您从下面的代码中看到的那样,当我将 255 作为值插入时,我只有一个循环退出。问题是,当我选择第一个(插入选项)并插入名称后,程序会开始循环,并一直给我选择屏幕...

#include<stdio.h>
#include<stdlib.h>
struct student{
    char *name;
    int id;
    };
void insertStudent(void);
struct student * init(void);    

int main(){
    struct student *p;
    int selectionCode=0;

    while(selectionCode!=255){
        printf("\nInsert students:1");
        printf("\nDisplay students:2");
        printf("\nExit:255");
        printf("\n\nEnter selection:");
        scanf("%d",&selectionCode);

        p=init();

        switch(selectionCode){
            case 1:
            insertStudent();
            //printf("1\n");
            break;
            case 2:
            //printf("2\n");
            break;
            case 255:
            break;
            }
        }

    //p->name="stelios";
    //p->id=0;
    //printf("Name:%s ID:%d",p->name,p->id);
    //free(p);
    //p=NULL;

    return 0;
}
struct student *init(void)
{
    struct student *p;
    p=(struct student *)malloc(sizeof(struct student));
    return p;
}
void insertStudent(void){
    struct student *p;
    p=init();
    printf("Enter Name:");
    scanf("%s",p->name);//return 1;
    printf("Enter ID:");
    scanf("%d",&p->id); 
    //printf("test");
    }

【问题讨论】:

  • 是的,这将是。但是您不想每次都获得选择屏幕?
  • @Doug T.Nope 这不是家庭作业。我知道 Java,现在我正在学习 c...

标签: c loops struct


【解决方案1】:

部分问题可能是代码没有为结构中的name 字段分配内存。 init 函数分配一个新结构,但不初始化name 字段。然后insertStudent 函数使用scanf 读入那个未初始化的指针。这会导致写入“随机”内存,并可能导致任何数量的问题,包括访问冲突。

【讨论】:

  • 你是对的,我将指针更改为数组(名称 [30])并且它起作用了。但是如果我想使用指针,我怎么能在结构内分配内存呢?
  • @Stelios:要使用指针,您需要在分配结构本身后对 malloc 进行第二次调用。 p-&gt;name = malloc(30);。如果您坚持使用固定大小,则使用数组(名称 [30])可能更简单/更好。但是,如果您以后可能想更改大小,那么使用 malloc 将是可行的方法(然后可以再次释放和 malloc 或使用 realloc)。
【解决方案2】:

看起来你有内存泄漏,我会将 p 传递给 insertStudent()。

在 insertStudent() 调用中间还有一个return 1;,所以它会在完成工作之前返回。

【讨论】:

    【解决方案3】:

    你有“return 1;”在您扫描名称后。从逻辑上讲,您当时不应该返回,因为您想输入 ID。此外,您将函数声明为返回“void”,因此返回一个是错误的。

    编辑:真正的问题是您从未为名称字符串分配空间。

    【讨论】:

      【解决方案4】:

      尝试:

      struct student *insertStudent(void){
      struct student *p;
      p=init();
      printf("Enter Name:");
      scanf("%s",p->name);
      printf("Enter ID:");
      scanf("%d",&p->id); 
      //printf("test");
       return p;
      }
      

      主线

       case 1:
      free(p);
          p=insertStudent();
          //printf("1\n");  
      

      在初始化时,您必须为名称分配空间。

      【讨论】:

      • 我出现分段错误,可能是因为 p 未初始化。即使初始化它也在循环..
      • 关于init函数你如何为name分配内存?
      【解决方案5】:

      真是一团糟... :-) 您永远不会 malloc() 用于 p->name 的缓冲区,但您正在使用 scanf() 填充。 那会破坏程序的内存。 此外......在您的函数中,您正在使用变量 p 并且在您的主程序中也是如此。 这不是同一个变量,但您似乎认为它是。 另一个问题:return 1;在 scanf() 中止 insertStudent() 函数之后,因此永远不会执行“输入 ID”。 顺便说一下,它是一个 void 函数,所以它不应该返回一个值。编译器可能已对此发出警告。

      它可能还有更多错误,但这是我快速浏览一遍后发现的。

      【讨论】:

        【解决方案6】:

        你需要去掉“return 1;”来自insertStudent,否则无法编译。

        你应该用 malloc 初始化 p->name 并更改 "scanf("%s",p->name);"到 "scanf("%s", &p->name);",因为你需要一个指向 *char 的指针。

        【讨论】:

        • 您对退货的看法是对的,只是我忘记评论了。 &p->name 是不正确的,因为如果我想使用 & 我应该有这种形式 &*p->name。我已经运行它以防万一,我是对的。
        猜你喜欢
        • 1970-01-01
        • 2021-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多