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