【发布时间】:2023-02-07 14:00:24
【问题描述】:
我想运行命令行参数来解释用户名、姓名、电子邮件和主目录。我得到了正确的用户名部分,但其余部分不合适。我不知道我是否将 strtok 函数放在正确的位置,每次编译时,它都会出错“变量未使用。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("Usage: %s <username>\n", argv[0]);
return 1;
}
char *username = argv[1];
FILE *passwd = fopen("/etc/passwd", "r");
if (!passwd) {
perror("fopen");
return 1;
}
char *line = NULL;
size_t max_length = 0;
ssize_t ret_val = 0;
char line_copy[1000];
while ((ret_val = getline(&line, &max_length, passwd)) > 0) {
strncpy(line_copy, line, 999);
char *user = strtok(line_copy, ":");
if (strcmp(user, username) == 0) {
char *name = strtok(NULL, ":");
char *email = strtok(NULL, ":");
char *home_dir = strtok(NULL, ":");
printf("user: %s\n", user);
printf("name: %s\n", name);
printf("email: %s\n", email);
printf("home directory: %s\n", home_dir);
}
}
fclose(passwd);
passwd = NULL;
return 0;
}
【问题讨论】:
-
“变量未使用”不是错误;这是一个警告。
-
它说什么变量未使用?
-
/etc/passwd中的字段为username:password:uid:gid:name:homedir:shell。您将密码放入name,uid 放入email,gid 放入home_dir。您需要额外调用strtok()来跳过您不关心的字段。 -
strtok从不返回零长度标记,但零长度字段在/etc/passwd中是正常的,所以使用strtok可能不是最好的主意。 -
对于一般的 POSIX 使用,您可能希望使用 getpwent 而不是直接读取 /etc/passwd。如果您从其他地方获取条目,则可以使用 fgetpwent。
标签: c