为什么这个结构数组会覆盖 char * 而不是 int?

程序员c3981143

我编写了一个程序,它利用结构数组来维护一种具有不同选项的“数据库”程序,这些选项可用于操作“数据库”。

该程序有 4 种操作模式,如果用户输入:

  1. 'i' 数据可以插入到“数据库”中。
  2. 's' 在“数据库”中搜索具有项目零件编号的零件。
  3. 'u' 根据项目的零件号更新数据库中的某些内容。
  4. 'p' 打印整个“数据库”。

这是由3个文件组成的代码:

数据库.h

#ifndef DATABASE
#define DATABASE

struct db
{
       int  part_number;
       char *part_name;
       int  part_quantity;
};

extern struct db database[50];

extern void insert(int i);

extern int search(int i);

extern int update(int i);

extern int print(int i);

#endif

数据库.c

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

struct db database[50];    

void insert(int i)
{
     char name_of_part[21], c; 
  
     printf("%p\n", &database[i].part_name);     

     printf("\n");
     printf("Enter a part number: ");
     scanf("%d", &database[i].part_number);
     
     while((c = getchar()) != '\n' && c != EOF); // flush stdin
 
     printf("Enter a part name: ");
     fgets(name_of_part, 20, stdin);      
    
     printf("Enter quantity of part: ");
     scanf("%d", &database[i].part_quantity);     
     
     database[i].part_name = name_of_part;

     printf("\n");
}

int search(int i)
{    
     int input;
     printf("\n");
     printf("Enter a part number: ");
     scanf("%d", &input);
     
     for (int j = 0; j <= i; j++)
     {    
         if (database[j].part_number == input)
         {
            printf("Part name: %s\n", database[j].part_name);
            printf("Quantity on hand: %d\n", database[j].part_quantity);
            return 0;
         }         
     }
     printf("Part not found.\n"); 
}    

int update(int i)
{ 
    int input, quantity;
  
    printf("\n"); 

    printf("Enter part number: "); 
    scanf("%d", &input);
    
    for (int j = 0; j <= i; j++)
    {
        if (database[j].part_number == input)
        {
           printf("Enter part quantity: ");
           scanf("%d", &quantity);
          
           database[j].part_quantity = quantity;             
           return 0;
        }   
    }
    printf("Part number not found.");            
}    

int print(int i)
{
    for (int j = 0; j < i; j++)
    {
         printf("Part number: %d\n Part name: %s\n Part quantity: %d\n", database[j].part_number, database[j].part_name,database[j].part_quantity);
    } 
}

主文件

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

int main()
{   
     int i = 0;  
     char code;   
 
     while (1)
     {         
         printf("Enter a function code: ");
         scanf(" %c", &code);       

         switch (code)
         {      
                case 'i':
                     insert(i);
                     i += 1;
                     break;
               
                case 's':
                     search(i);
                     break;

                case 'u':
                     update(i);
                     break;
                case 'p':
                     print(i);
                     break;     
         }      
          
     }      
     
     return 0;
}

我遇到的问题是,当我插入“数据库”时,每个结构中的名称都会被覆盖。例如:

Enter a function code: i

Enter a part number: 111
Enter a part name: 111
Enter quantity of part: 111

Enter a function code: i

Enter a part number: 222
Enter a part name: 222
Enter quantity of part: 222

Enter a function code: p
Part number: 111
Part name: 222
Part quantity: 111

Part number: 222
Part name: 222
Part quantity: 222

Enter a function code: 

正如您首先看到的,我在“数据库”中插入了一些新内容,记下“零件名称”,即“111”。

接下来,这次我将其他内容插入数据库,“零件名称”是“222”。

最后,我打印了整个“数据库”,我感到困惑的是为什么零件名称现在重叠了。但这是为什么呢?所有其他成员(例如 part_number 和 part_quantity)在两个插入操作中都保持不变,那么为什么 char *part_name 保持不变?我该如何解决这个问题?

灌木丛

您将part_name成员声明为 achar *并为它分配insert函数中本地数组的地址当函数返回时,该数组超出范围并且存储的指针无效。随后尝试使用该指针会触发未定义的行为

改变part_name是一个数组:

struct db
{
       int  part_number;
       char part_name[21];
       int  part_quantity;
};

并直接写入:

 printf("Enter a part name: ");
 fgets(database[i].part_name, 21, stdin);      

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么const int需要extern而不是const char *

为什么我可以在函数后返回“ int”而不是“ char *”?

为什么我可以将值大于127的int传递给char数组,而不是直接传递给char数组?

为什么对于char,编译器为什么更喜欢int重载而不是varargs char重载?

为什么 strcpy 返回 char * 而不是 char

为什么编译器将“ char”与“ int”而不是“ short”匹配?

为什么在使用CHAR类型的参数调用时构造函数选择INT类型而不是SHORT?

为什么const char * foo =“ Hello”; 编译但不是const int * foo = 5 ;?

内存浪费?如果main()应该只返回0或1,为什么main是用int而不是short int甚至char声明的?

为什么打印出char指针会产生整个数组,而不是指针的内存addr?

解散 int/char 数组

为什么要返回这个值?C ++ int / char混淆

为什么接口内的 Int 不是 Int?

如果字符文字总是 int 类型,为什么我们在 C 中有 char 类型?C 中的整个 char 类型不是多余的吗?

为什么要使用Char而不是String?

为什么strtok使用char *而不是const char *?

如何将int和double用作输入而不是char?

当char输入而不是int时发生C无限循环

从char数组到int数组

将int数组转换为char数组时,获取笑脸而不是0和1s

需要将字符串值存储到int中,而不是4字节大小的char数组中

char和int数组的区别

将 int 与 char 数组相加

为什么将int []视为对象而不是对象数组

为什么char *和int *表现不同

为什么在C语言中(char)+(char)=(int)?

为什么 type(((),)[0]) 是元组而不是 int?

为什么默认为“ int”而不是“ byte”?

为什么构造Instance <Integer>而不是int