【问题标题】:Do I need to define more strtok functions?我需要定义更多的 strtok 函数吗?
【发布时间】: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


【解决方案1】:

至少在 Linux 上 /etc/passwd 包含冒号分隔的字段登录名、密码、用户 ID、组 ID、用户名、主目录和 shell。您已致电 strtok() 询问要跳过的字段,但没有电子邮件字段:

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

int main(int argc, char *argv[]) {
    if (argc != 2) {
        printf("Usage: %s <username>
", 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;
    while ((ret_val = getline(&line, &max_length, passwd)) > 0) {
        if (strcmp(username, strtok(line, ":")) == 0) {
            strtok(NULL, ":"); // password
            strtok(NULL, ":"); // uid
            strtok(NULL, ":"); // grid
            char *name = strtok(NULL, ":");
            char *home_dir = strtok(NULL, ":");
            printf("user: %s
", username);
            printf("name: %s
", name);
            printf("home directory: %s
", home_dir);
        }
    }
    fclose(passwd);
}

【讨论】:

    猜你喜欢
    • 2018-03-06
    • 2014-01-21
    • 2011-04-08
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    相关资源
    最近更新 更多