【问题标题】:scanf("%d",&s_ptr[i]); while string format is %d the result on file is char value - why?scanf("%d",&s_ptr[i]);虽然字符串格式是 %d,但文件上的结果是 char 值 - 为什么?
【发布时间】:2021-10-17 19:56:44
【问题描述】:
typedef struct info{            //main record
    int *id;
    unsigned char *name;
}student;

void create(){
    student *s_ptr;
    int num_of_student,i;
    FILE *f_ptr;
    f_ptr = fopen("studentdata.txt","w");

    printf("**How many student to record**\n");
    printf("Enter:");
    scanf("%d",&num_of_student);

    s_ptr = (student*)calloc(num_of_student,sizeof(student));  

    for(i=0;i<num_of_student;i++){
        printf("Enter student id: ");
        scanf("%d",&s_ptr[i]);//while string format is %d it prints char value to the file.  

        fflush(stdin);                                          
        printf("Enter student full name: ");
        scanf("%[^\n]",&(s_ptr+i)->name);                          

    fwrite(s_ptr+i,sizeof(struct info),1,f_ptr);
    }


} 

scanf("**%d**",&amp;s_ptr[i]) 在文件中打印其相对字符值,但在将字符串格式从 %d 更改为 %s 后,它会打印实际的 int 值。为什么?

【问题讨论】:

  • 循环中的两个scanf 语句和student 结构都是错误的。为什么你的结构包含指针?为什么不为这些指针分配任何内存指向?为什么第一个 scanf 使用结构本身的地址而不是结构中的变量?摆脱指针并修复第一个 scanf 以读入id 变量然后看看你有什么。
  • scanf格式字符串中的类型与参数不匹配。 name 应该是 char* 而不是 unsigned char*。最好从一个更简单的程序或最小的可重现示例开始,然后从那里扩展代码。
  • 我刚开始熟悉指针,所以我尝试了这种方式,但现在我知道数组更适合字符。感谢您的评论。

标签: c scanf structure


【解决方案1】:

scanf 与如何将数据写入文件无关。

fwrite 将数据写入文件,它会完全按照计算机内存中的数据写入数据。

int 以数字的二进制表示形式存在,即确切值(通常为 4 或 8 个字节长)。

如果您让fwrite 将这些字节存储在一个文件中,然后将它们视为文本,您将看到一些字符,但不会看到代表数字的十进制数字的字符。

这是因为你的文本编辑器无法知道这些字节属于C语言int类型,需要重新解释才能查看。

如果您希望将这些字节以人类可读的形式打印到文件中,请改用fprintf

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-28
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多