Проблема с попыткой скопировать строку char за char

Я пытаюсь перемещать массив символов по символам и копировать его в другой массив символов до тех пор, пока символ чтения не станет \, потому что я хочу создать каталоги адреса, если они не созданы, или получить доступ, если они созданы.

Например:

Adress: dir2/dir3/a

Мой алгоритм:

path = dir2
//if dir2 not created make dir2 and change actual directory to dir2
//if created then access dir2 changing the actual directory to dir2
//empty path with memset and keep storing the adress
path = dir3
//repeat...

Но когда я пытаюсь получить доступ к пути, я получаю последний символ, а не всю строку пути

Выход:

path0: d
path1: i //Should be di
path2: r //Should be dir
path3: 2 //Should be dir2
path: 2 //Should be dir2

Я не знаю, есть ли более эффективный способ сделать это, и я не знаю, как получить полную строку пути, а не последний символ, я вставлял '\ 0' в конце на всякий случай, если это был какой-то проблема с символом конца строки

имя и путь являются переменной типа char[256]
Код:

for (i = 0; i < strlen(name); i++) 
        {
            if (name[i] != '/')
            {
                path[j] = name[i];
                path[i+1] = '\0';
                printf("path%d: %s\n", i,path);
            }
            else
            {
                path[i] = '\0';
                printf("path: %s\n", path);
                n = chdir(path);
                if (n == ENOENT)
                {
                    n = mkdir(path, 0777);
                    if (n != 0) 
                    {
                        fprintf(stderr, "Failed to make the directory to extract: %s\n", strerror(errno));
                        close(fmypack);
                        return E_DIR1;
                    }
                    chdir(path);
                }
                else if (n == EACCES)
                {
                        fprintf(stderr, "Failed to access the directory: %s, %s\n", path, strerror(errno));
                        close(fmypack);
                        return E_DIR2;
                }
                else if (n != 0)
                {
                        fprintf(stderr, "Unknow error when try to access the directory: %s, %s\n", path, strerror(errno));
                        close(fmypack);
                        return E_DESCO;
                }
                memset(path, 0, sizeof path);
                j=0;
            }

Не делайте chdir()mkdir() вполне счастливо пойдет по пути, ссылаясь на подкаталог.

Jonathan Leffler 19.03.2022 15:30

printf("path%d: %s\n", i,path); после каждого символа — это неопределенное поведение без разделителя строки (как это сделано чуть ниже в else).

Weather Vane 19.03.2022 15:34

@WeatherVane: У него может быть memset() над петлей for.

Joshua 19.03.2022 15:34

@JonathanLeffler Да, но я делаю это, чтобы контролировать, создан ли каталог уже или нет.

JamesR 19.03.2022 15:35

Где и как инициализируются name, path и j? Выложите полный код.

SGeorgiades 19.03.2022 15:35

@SGeorgiades имя персонажа[256]; int i, j = 0; путь символа[256];

JamesR 19.03.2022 15:37

Также мне кажется, что эту задачу было бы намного проще использовать strtok

SGeorgiades 19.03.2022 15:37
j не увеличивается в коде, который вы показали... вот почему path всегда только один символ
SGeorgiades 19.03.2022 15:39

@SGeorgiades ты прав :(

JamesR 19.03.2022 15:43

Если вы сделаете это правильно, вы должны быть в порядке. Вы можете узнать, представляет ли имя файла каталог с stat(). Вы можете создать строку, содержащую "dir2", и создать этот каталог, если он не существует. Затем вы можете расширить эту строку до "dir2/dir3" и создать этот каталог, если он не существует. Промойте и повторяйте, пока не дойдете до конца пути. См. также Как я могу создать дерево каталогов в C++/Linux? (но этот ответ — код C, который можно вызывать из C++).

Jonathan Leffler 19.03.2022 15:52

В общем, если ваша программа использует chdir(), вы должны быть осторожны, потому что, если пользователь указывает имена файлов относительно текущего каталога при вызове программы, но вы меняете каталог в другом месте, вам нужно проделать большую работу, чтобы убедиться, что вы по-прежнему имеете доступ правильные файлы. Примечание fchdir().

Jonathan Leffler 19.03.2022 15:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
11
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Думаю, я нашел это.

                path[i] = '\0';

Но путь создается с использованием j в качестве индексатора.

                path[j] = '\0';

Должно быть правильно.

И вам не хватает приращения на j:

                path[j] = name[i];
                path[i+1] = '\0';

Должно быть:

                path[j++] = name[i];
                path[j+1] = '\0';

Что забавно, на самом деле делать этот компонент по одному с chdir() на является быстрее, но вероятность того, что вы это нашли, невелика. Когда вы получите пару сотен каталогов в глубину, вы сможете это измерить.

Да, я знал это, но я хотел контролировать, создан ли уже каталог пути или нет, если я могу получить эту информацию простым способом с помощью chdir()

JamesR 19.03.2022 15:43

У меня есть еще один вопрос, как я могу получить доступ к ошибкам флага chdir()? Если я проверяю, что n всегда равно -1, если возникает проблема, как я могу проверить, возникает ли ошибка EACCES?

JamesR 19.03.2022 15:48

@ДжеймсР: errno

Joshua 19.03.2022 15:49

Другие вопросы по теме