Вопрос:

Преобразование char * в строку, затем присвоение члену структуры: инициализация делает целое число из указателя

c string pointers

53 просмотра

3 ответа

1 Репутация автора

Я буду получать данные для новых пользователей и анализировать их с помощью strtok (), который возвращает символ *. Однако у меня возникают проблемы с назначением char * моим членам структуры, которые имеют тип char []. Я получаю предупреждение в строке 52: инициализация делает целое число из указателя без приведения. Я не понимаю, почему компилятор считает, что я делаю целое число из указателя. Я думал, что я назначаю строку ( username) для типа строки ( char username[MAX_USERNAME_LEN + 1]).

Может ли кто-нибудь рассказать о моей ошибке (и, возможно, дать предложение о том, как достичь желаемого результата)? Заранее спасибо.

#include <stdio.h>  /* for printf() and fprintf() */
#include <sys/socket.h> /* for socket(), bind(), and connect() */
#include <arpa/inet.h>  /* for sockaddr_in and inet_ntoa() */
#include <stdlib.h> /* for atoi() */
#include <string.h> /* for memset() */
#include <unistd.h> /* for close() */

#define MAXPENDING 5    /* Maximum outstanding connection requests */
#define MAX_MSGS 25 /* Maximum number of messages a user can have in his/her
               inbox = maximum number of messages a user can have in
               his/her Sent folder */
#define MAX_MSG_LEN 500 /* Maximum message length in characters */
#define MAX_USERS 50    /* Maximum number of users that can exist */
#define SERVER_PORT 8000/* The server port number */
#define MAX_RCV_LEN 2048    /* Buffer size in bytes for messages received by socket */
#define MAX_USERNAME_LEN 32
#define MAX_PASSWORD_LEN 32


struct user{
    char username[MAX_USERNAME_LEN + 1];
    char password[MAX_PASSWORD_LEN + 1];
};

/* Array of users */
struct user users[MAX_USERS];
int numberOfUsers;

int main(void) {
    /* THIS WORKS */
    struct user alice = { .username = "alice", .password = "1234"};
    users[0] = alice;
    numberOfUsers ++;

    /* 
     * I will be receiving data for new users and parsing it using
     * strtok(), which returns a char*, so this is why I hoped to be
     * able to add new users in the following manner: */
    char recvBuffer[MAX_RCV_LEN + 1] = "03::billy::1234::";
    char* opCodePtr = strtok(recvBuffer, "::");
    char* usernamePtr = strtok(NULL, "::");
    char* passwordPtr = strtok(NULL, "::");

    char username[MAX_USERNAME_LEN + 1];
    strncpy(username, usernamePtr, MAX_USERNAME_LEN);

    char password[MAX_PASSWORD_LEN + 1];
    strncpy(password, passwordPtr, MAX_PASSWORD_LEN);

    /* The following line gives me the Warning: initialization makes
       integer from pointer without a cast */
    struct user newUser = {.username = username, .password = password};
    users[numberOfUsers] = newUser;
    numberOfUsers ++;

    for (int i = 0; i < numberOfUsers; i ++)
        printf("USER = %s, PASS = %s\n", users[i].username, users[i].password);

    return 0;
}

Выход:

USER = alice, PASS = 1234
USER = �, PASS = p 
Автор: ArtVandelay Источник Размещён: 05.03.2017 06:10

Ответы (3)


0 плюса

25144 Репутация автора

usernameэто указатель на некоторые символы где-то, .usernameэто массив символов. Вы не можете просто заполнить массив через array = pointer. Вам нужно сделать что-то вроде strncpy(array, pointer, size).

Обратите внимание, что я не знаю, насколько безопасно использовать char*возвращаемые значения strtokas, strtokизменяющие строку по мере ее токенизации, поэтому я подозреваю, что результаты, которые вы получите от накопления всех токенов, могут на самом деле не оказаться ожидаемыми.

Автор: John3136 Размещён: 05.03.2017 06:24

0 плюса

1090 Репутация автора

В приведенном выше коде, Вы numberOfUsersувеличили в два раза, т.е. в строке номера 33,54. И вы печатаете usernameи на passwordоснове numberOfUsersцикла for, поэтому создается дополнительная печать, которая содержит значения мусора. Итак, удалите один из них на основе соответствующего контекста.

Автор: sreepurna Размещён: 05.03.2017 06:32

0 плюса

1 Репутация автора

Джон прав. Помните, что имя массива - это адрес первого элемента в нем, поэтому, используя его в качестве значения r, вы получите адрес (а не значение) первого элемента, то есть целое число, которое вы используете для инициализации массивов в структура.

Автор: Javo R. Размещён: 05.03.2017 07:40
32x32