Как сделать так, чтобы значения массива строк не менялись? - PullRequest
0 голосов
/ 13 января 2019

В следующем фрагменте моего кода:

 while((grp = getgrent()) != NULL)
        {
                if(belong_to(username,grp->gr_mem) || strcmp(username,grp->gr_name) == 0)
                {
                        ugs[counter] = grp->gr_name;
                        printf("%s",ugs[counter]);
                        counter++;
                        putchar('\n');
                }

        }

После завершения цикла while я получаю массив строк ugs равным grp->gr_name value, который разрушает всю идею, которую я пытаюсь выполнить, пытаясь в основном заполнить массив ugs на основе условия.

Как я могу это исправить? Так что я просто одно значение grp->gr_name на тот момент условия условия.

1 Ответ

0 голосов
/ 13 января 2019

ОК - вот полный пример, который может помочь с этим, и ваш другой пост :

test.c:

#include <stdio.h>
#include <stddef.h>
#include <string.h>
#include <sys/types.h>
#include <grp.h>
#include <pwd.h>

char * list_members(char **members, char *buff);

int main()
{
        int n_grentries = 0, n_pwentries = 0;
        struct group *group;
        struct passwd *passwd;
        char buff[80];

        while((group = getgrent()) != NULL) {
            n_grentries++;
            printf("Group name: %s, ID: %d, members: %s\n",
                group->gr_name, group->gr_gid, list_members(group->gr_mem, buff));
        }
        endgrent();

        while((passwd = getpwent()) != NULL) {
            n_pwentries++;
            printf("User name: %s, UID: %d, shell: %s\n",
                passwd->pw_name, passwd->pw_uid, passwd->pw_shell);
        }
        endpwent();

        printf("There are  %d groups and %d users on the system.\n",
            n_grentries, n_pwentries);
        return 0;
}

char * list_members(char **members, char *buff)
{
    buff[0] = '\0';
    while (members && *members) {
        if (*buff)
          strcat (buff, ", ");
        strcat (buff, *members);
        members++;
    }
    return buff;
}

Пример вывода:

Group name: root, ID: 0, members: paulsm, 
Group name: daemon, ID: 1, members: 
Group name: bin, ID: 2, members:
Group name: adm, ID: 4, members: syslog, paulsm, 
...
User name: root, UID: 0, shell: /bin/bash
User name: daemon, UID: 1, shell: /usr/sbin/nologin
User name: bin, UID: 2, shell: /usr/sbin/nologin
User name: sys, UID: 3, shell: /usr/sbin/nologin
...
There are  72 groups and 45 users on the system.
...