首页 > 解决方案 > 初学者电话簿

问题描述

嘿,上周刚开始接触代码。谁能告诉我我的代码有什么问题?当我编译它时,它似乎可以工作,但是当我去那里的文件时,我只是一堆问号。前(姓名:D...)

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

int main(void)
{
    FILE *file= fopen("phonebook.csv", "a");

    if(file==NULL) 
    {
        return 1;
    }

    char* name= malloc(sizeof(char));
    printf("Enter your name:");
    scanf("%s", name);

    free(name);

    char* number= realloc(name, sizeof(char));
    printf("Enter your number:");
    scanf("%s", number);

    free(number);

    fprintf(file, "Name: %s\n, Number:%s\n", name, number );

    fclose(file);
}

标签: cpointers

解决方案


严重错误:

  • 您将需要多个字节来存储正长度字符串。另一方面,您只分配一个字节。
  • realloc()是改变现有缓冲区的长度。在这种情况下,您应该在这种情况下分配独立的另一个缓冲区。
  • 不得使用传递给free().

其他要点:

  • 您应该限制读取长度以避免缓冲区溢出。大小限制最多应为(buffer size) - 1-1用于终止空字符)。
  • 您应该检查malloc().
  • 您应该检查scanf().

固定代码:

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

int main(void)
{
    FILE *file= fopen("phonebook.csv", "a");

    if(file==NULL) 
    {
        return 1;
    }

    char* name= malloc(sizeof(char) * 129);

    if(name==NULL) 
    {
        fclose(file);
        return 1;
    }

    printf("Enter your name:");
    if(scanf("%128s", name)!=1)
    {
        fclose(file);
        free(name);
        return 1;
    }

    char* number= malloc(sizeof(char) * 129);

    if(number==NULL) 
    {
        free(name);
        fclose(file);
        return 1;
    }

    printf("Enter your number:");
    if(scanf("%128s", number)!=1)
    {
        free(name);
        free(number);
        fclose(file);
        return 1;
    }

    fprintf(file, "Name: %s\n, Number:%s\n", name, number );

    free(name);
    free(number);

    fclose(file);
}

固定代码(无错误检查):

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

int main(void)
{
    FILE *file= fopen("phonebook.csv", "a");

    if(file==NULL) 
    {
        return 1;
    }

    char* name= malloc(sizeof(char) * 129);
    printf("Enter your name:");
    scanf("%128s", name);

    char* number= malloc(sizeof(char) * 129);
    printf("Enter your number:");
    scanf("%128s", number);

    fprintf(file, "Name: %s\n, Number:%s\n", name, number );

    free(name);
    free(number);

    fclose(file);
}

推荐阅读