Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将char*转换为字符串,然后分配给结构成员:初始化从指针生成整数_C_String_Pointers - Fatal编程技术网

将char*转换为字符串,然后分配给结构成员:初始化从指针生成整数

将char*转换为字符串,然后分配给结构成员:初始化从指针生成整数,c,string,pointers,C,String,Pointers,我将接收新用户的数据,并使用strtok()解析它,它返回一个char*。但是,我在将char*分配给我的结构成员(类型为char[])时遇到问题。我在第52行得到警告:初始化从指针生成整数而不进行强制转换。我不明白为什么编译器认为我在从指针生成整数。我以为我是在给字符串类型(char username[MAX\u username\u LEN+1])分配一个字符串(username) 有人能详细说明我的错误吗(也许能就如何达到我想要的结果提出建议)?提前谢谢 #include <stdi

我将接收新用户的数据,并使用strtok()解析它,它返回一个char*。但是,我在将char*分配给我的结构成员(类型为char[])时遇到问题。我在第52行得到警告:初始化从指针生成整数而不进行强制转换。我不明白为什么编译器认为我在从指针生成整数。我以为我是在给字符串类型(
char username[MAX\u username\u LEN+1]
)分配一个字符串(
username

有人能详细说明我的错误吗(也许能就如何达到我想要的结果提出建议)?提前谢谢

#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;
}

username
是指向某处某个字符的指针,
username
是字符数组。您不能仅仅通过
array=pointer
填充数组。您需要执行类似于strncpy(数组、指针、大小)的操作


请注意,我不知道使用
strtok
返回的
char*
有多安全,因为
strtok
会在字符串标记时修改字符串,所以我怀疑保存所有标记后得到的结果可能并不是您期望的结果。

在上述代码中,您已经将
numberOfUsers
增加了两次,即行号33,54。您正在根据for循环中的
numberOfUsers
打印
username
password
,因此会进行额外的打印,以保存垃圾值。因此,根据适当的上下文删除其中一个

约翰是对的。请记住,数组名是其中第一个元素的地址,因此,将其用作右值将生成第一个元素的地址(而不是值),即一个整数,您将使用该整数初始化结构中的数组。

谢谢,@John3136。使用
strncpy(用户[numberOfUsers].username、usernamePtr、MAX\u username\u LEN);strncpy(用户[numberOfUsers]。密码、密码ptr、最大密码长度)起作用。
USER = alice, PASS = 1234
USER = �, PASS = p