Что это за ошибка? невозможно преобразовать 'char **' в 'char *' для аргумента '1' в 'char * strcpy (char *, const char *) - PullRequest
0 голосов
/ 16 мая 2018
#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);
}

Я кореец.

И я сделал «код программы управления банком» для своей домашней работы.

Но в моем коде есть проблема (пожалуйста, игнорируйте Корею)

Когда я запускаю свой код, ошибка

не удалось преобразовать 'char **' в 'char *' для аргумента '1' в 'char * strcpy (char *, const char *)'.

Я не знаю об этой проблеме.

Поэтому я добавляю * к этой части.

Но проблема не решается.

Есть ли проблема в моем коде?

Пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 16 мая 2018
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*.

...