这个错误是什么?参数'1'的'char **'转换为'char *'为'char * strcpy(char *,const char *)

时间:2018-05-16 08:39:54

标签: c point strcpy

#define NAME_LEN 20 
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#pragma warning(disable:4996)

typedef struct bank
{ 
    char *name[NAME_LEN];
    int id; 
    int money; 
    struct bank *next;
} bank;

bank *head, *tail; // 노드의 처음과 끝

void Init_account(FILE *fp); // 노드의 처음과 끝에 메모리 할당하고, 파일에서 입력을 받도록 하는 함수
void Make_account(FILE *fp); // 계좌를 생성하는 함수
void Deposit(FILE *fp); // 입금 함수
void WithDraw(FILE *fp); // 출금 함수
void WriteAccount(FILE *fp); // 계좌의 정보를 저장하는 함수
void Account_inquire(void); // 계좌를 조회하는 함수
void ReadAccount(int id, char *name, int money); // 텍스트 파일에서 입력을 받는 함수

void Init_account(FILE *fp)
{
    int id;
    char name[NAME_LEN];
    int money;

    head = (bank *)malloc(sizeof(bank));
    tail = (bank *)malloc(sizeof(bank));
    head->next = tail;
    tail->next = tail;

    while (fscanf(fp, "%d %s %d", &id, name, &money) == 3){ // 정수형, 문자형, 정수형 3개일 때만 입력을 받음
        ReadAccount(id, name, money);
    }
}

void ReadAccount(int id, char *name, int money)
{
    bank *t;
    t = (bank *)malloc(sizeof(bank));
    t->id = id;
    strcpy(t->name, name);
    t->money = money; // this code has problem //
    t->next = head->next; // 다음 노드를 가리킴
    head->next = t; // 노드의 처음을 가리킴
}

void Make_account(FILE *fp)
{
    int id;
    char name[NAME_LEN];
    int money;
    bank *t;
    t = (bank *)malloc(sizeof(bank));
    printf("\n*********계좌 생성*********\n");
    printf("계좌번호 : "); scanf("%d", &id);
    printf("예 금 주 : "); scanf("%s", name);
    printf("입 금 액 : "); scanf("%d", &money);
    t->id = id;
    strcpy(t->name, name);
    t->money = money;
    t->next = head->next;
    head->next = t;
    WriteAccount(fp); // 저장하는 함수로 파일 포인터를 넘겨줌
}

void Deposit(FILE *fp)
{
    int id;
    int money;
    bank *t;
    printf("계좌번호 : "); scanf("%d", &id);
    printf("입 금 액 : "); scanf("%d", &money);

    for (t = head->next; t != tail; t = t->next)
    {
        if (t->id == id)
        {
            t->money += money; // 잔액에 입금할 금액을 더해서
            WriteAccount(fp); // 저장
            return;
        }
    }
    printf("없는 계좌번호입니다.\n");
}

void WithDraw(FILE *fp)
{
    int id;
    int money;
    bank *t;
    printf("계좌번호 : "); scanf("%d", &id);
    printf("출 금 액 : "); scanf("%d", &money);

    for (t = head->next; t != tail; t = t->next)
    {
        if (t->id == id)
        {
            if (t->money
            {
                printf("출금액이 잔액을 초과할 수 없습니다.\n");
                return;
            }
            else
            {
                t->money -= money; // 잔액에서 출금액을 빼서
            }

            WriteAccount(fp); // 저장
            return;
        }
    }

    printf("없는 계좌번호입니다.\n");
}

void Account_inquire(void)
{
    bank *t;
    for (t = head->next; t != tail; t = t->next)
    {
        printf("\n*********잔액 조회*********\n");
        printf("계좌번호 : %d\n", t->id);
        printf("예 금 주 : %s님\n", t->name);
        printf("잔 액 : %d원\n\n", t->money);
    }
}

void WriteAccount(FILE *fp)
{
    bank *t;
    rewind(fp); // 파일 읽는 포인터 지점을 맨 첨으로 돌리는 함수

    for (t = head->next; t != tail; t = t->next)
    {
        fprintf(fp, "%d %s %d\n", t->id, t->name, t->money);
    }
}

int main()
{
    int input;
    FILE *fp;
    fp = fopen("data.txt", "r+"); // 파일모드가 r+일 경우 읽고쓰기를 동시에 수행 합니다.
    Init_account(fp);

    do
    {
        printf("계좌 생성&관리 프로그램입니다. 원하시는 번호를 입력하세요.\n");
        printf("*********************************************\n");
        printf("1)계좌 생성 2)계좌 조회 3)입금 4)출금 5)종료\n");
        printf("*********************************************\n");
        printf("입력 >");
        scanf("%d", &input);

        switch (input){
            case 1:
                Make_account(fp);
                break;
            case 2:
                Account_inquire();
                break;
            case 3:
                Deposit(fp);
                break;
            case 4:
                WithDraw(fp);
                break;
            case 5:
                input = 0;
                free(head); // 종료하면서 메모리 반환
                free(tail);
                break;
            default:
                printf("잘못 입력하셨습니다. \n");
                return main();
        }
    }
    while (input != 0);
}

我是韩国人。

我为我的作业制作了“银行管理程序代码”。

但我的代码中存在问题。(请忽略韩国)

当我运行我的代码时,错误

无法将参数'1'的'char **'转换为'char *',发生'char * strcpy(char *,const char *)'。

我不知道这个问题。

所以我在那部分添加*。

但问题没有解决。

我的代码有问题吗?

请帮帮我。

1 个答案:

答案 0 :(得分:2)

char * name[NAME_LEN];
 ^   ^  ^   ^
 |   |  |   |
 |   |  |  is an array of NAME_LEN
 |   | name
 |  pointers to
char

您必须将其更改为:

char name[NAME_LEN];
 ^    ^   ^
 |    |   |
 |    |  is an array of NAME_LEN
 |   name
char

char *name[NAME_LEN];是一个指针数组,而不是字符数组。因此,当您致电strcpy(t->name, name); t->name时,char**类型将变为char*而不是awk。< / p>