Моя программа C падает по невидимой причине

Итак, моя программа предназначена для небольшой командной строки, но она продолжает падать:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>    

void main()
{    
    char cmd;
    for(;;)
    {
        fgets(cmd,255,stdin);
        if (strstr(cmd,"CD")!=NULL )
        {
            cmd +=2;
            SetCurrentDirectory(cmd);
        }
        else
        {
            system(cmd);
        }
    }
}

ожидается вывод компилятора lvalue.

Включить предупреждения компилятора. Или исправить те, которые вы получаете.

Andrew Henle 11.04.2019 00:30

Он успешно скомпилировался?

Pavan Chandaka 11.04.2019 00:32

возможно, вы хотели бы, чтобы cmd был массивом символов. char cmd[255];

liamcomp 11.04.2019 00:32

Предупреждения компилятора говорят вам, где вы допустили ошибки, которые здесь

liamcomp 11.04.2019 00:34

если я использую [255], это вызывает ошибки в строке 15

darrenthebozz 11.04.2019 00:35

Почему cmd +=2; И как вы планируете выходить из цикла?

Pavan Chandaka 11.04.2019 00:36

я использую +=2, чтобы избавиться от компакт-диска и оставить пример /users\username

darrenthebozz 11.04.2019 00:37

Отредактируйте вопрос, чтобы показать фактический код и добавьте вывод компилятора.

tum_ 11.04.2019 00:38
Стоит ли изучать 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
8
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Возможно, вы хотите сделать что-то вроде этого:

void main()
{    
    char cmd[255]; // this allocate a character array to store the command in
    for(;;)
    {
        fgets(cmd,255,stdin); // get the characters from stdin and store them in the cmd character array with a max length of 255
        if ( strncmp(cmd, "CD ", 3) == 0 ) // check if the first three characters are "CD "
        {
            SetCurrentDirectory(&cmd[3]); // pass the string not including the first 3 charcters, which should be "CD "
        }
        else
        {
            system(cmd);
        }
    }
}

Спасибо за ваш отзыв. :)

darrenthebozz 11.04.2019 00:52

Рад помочь. Если вы хотите изучить C, вы должны потратить время и попытаться выяснить, что делает каждая строка и почему. Это было бы очень полезно для вас. Почему использование char cmd; не сработало, а использование char cmd[255]; сработало? Какая разница?

liamcomp 11.04.2019 00:57

@darrenthebozz: подумайте также об использовании fgets( cmd, sizeof(cmd), stdin ) ;. Также имейте в виду, что пользователь может ввести дополнительный пробел между командой и ее аргументом.

Clifford 11.04.2019 01:16

Поскольку это Windows, пользователь мог ввести CD, cd, Cd или cD, опубликованный код обрабатывает только CD Кроме того, в Windows пользователь мог не помещать пробел между cd и новым именем каталога.

user3629249 11.04.2019 01:39

Множество улучшений, которые вы могли бы сделать, чтобы сделать его похожим на окна, основанные на OP. Я думаю, что лучше сделать его простым, чтобы OP мог сосредоточиться на таких вещах, как различие между char cmd; и char cmd[255];, и пока не беспокоиться о лишних пробелах и тому подобном.

liamcomp 11.04.2019 02:05

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