функция snprintf не объявлена? - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь использовать функцию snprintf, которая основана на прочитанном руководстве, кроме заголовка <stdio.h>, однако я получаю сообщение об ошибке, которое неявно объявлено. Вот мой код:

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

struct users {
    char* user_id;
};
    typedef struct users users_t;

int save_user_detail(user_t);

int main() {
    users_t users;
    save_user_detail(users);
    return 0;
}

int save_user_detail(users_t users)
{

    printf("Type the filename = ");
    scanf("%s", users.user_id);
    char* extension = ".txt";
    char fileSpec[strlen(users.user_id)+strlen(extension)+1];
    FILE *file;
    snprintf(fileSpec, sizeof(fileSpec), "%s%s", users.user_id, extension);
    file = fopen(fileSpec, "w");
    if(file==NULL) 
    {
        printf("Error: can't open file.\n");
        return 1;
    }
    else 
    {
        printf("File written successfully.\n");
        fprintf(file, "WORKS!\r\n");
    }
    fclose(file);
    return 0;
 }

Error

1 Ответ

0 голосов
/ 17 мая 2018

Вы, похоже, используете gcc, но этот компилятор не обязательно использует glibc, который соответствует стандарту C и поддерживает snprintf.

В архитектуре Windows вы можете использовать библиотеку Microsoft C, которая в более старых версиях не имела snprintf или переименовала ее в _snprintf.

Вот два способа обойти вашу проблему:

  • попробуйте использовать _snprintf вместо snprintf.
  • определить snprintf вручную после включения <stdio.h> как

    int snprintf(char *buf, size_t size, const char *fmt, ...);
    

Компилятор должен прекратить жаловаться на отсутствующий прототип, и если у библиотеки времени выполнения есть символ для snprintf с соответствующим соглашением о вызовах, он будет ссылаться на него, и программа должна вести себя так, как ожидается.

...