Как вы запускаете команду cmd в программе C

avatar
John O'Meara
8 апреля 2018 в 03:27
13595
4
0

Кажется, я не мог понять, как запустить программу cmd в программе C.

Это мой код:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char educode[100];
    printf("Welcome To ACE-IT Edu Software!\n");
    printf("\nPlease Type An Educator Code and then press enter.");
    printf("\nEducator Code: ");
    gets(educode);
    if(educode == 5678){
        system("mkdir test");
    } else {
    printf("\nSorry, thats not a valid Educator Code. To buy an Educator Code, go to https://www.ace-it.edu");
    }


    return 0;
}
Источник
Pablo
8 апреля 2018 в 03:42
1

Никогда не используйте gets, это устаревшая опасная функция, которая не проверяет размер места назначения. Вместо этого используйте fgets.

Roflcopter4
8 апреля 2018 в 07:49
0

Кроме того, не используйте printf для литеральных строк. Это бессмысленно.

Ответы (4)

avatar
JohnH
8 апреля 2018 в 03:36
4

Из-за плохого сравнения if (вы не можете сравнивать строки с целыми числами) ваш системный вызов никогда не выполняется.

Неверно:

gets(educode);
if(educode == 5678){

Попробуйте:

gets(educode);
if(strcmp(educode, "5678") == 0 ){

Не забудьте также добавить #include <string.h> сверху.

Кроме того, никогда не используйте gets() — он был удален из стандарта C в 2011 году.

Попробуйте fgets() после прочтения о том, как его использовать.

JohnH
8 апреля 2018 в 03:54
2

Мне не хотелось перефразировать ответы «всегда использовать-fgets()» с информацией об исправлении завершения строки. Но да, gets() представляет собой угрозу безопасности, поскольку пользователь может ввести произвольное количество символов, переполнив буфер (в данном случае educode) — и поэтому использование gets() всегда неправильно.

avatar
Tanner Babcock
8 апреля 2018 в 03:37
2

Проблема с этим кодом заключается в том, что вы сравниваете указатель на строку и целое число в этой строке.

if (educode == 5678)

5678 — это тип int, и вы определяете, равен ли он указателю на строку chars. C — это язык с явной типизацией, поэтому подобные сравнения не работают. Вместо этого вы захотите использовать это.

if (atoi(educode) == 5678)
    system("mkdir test");

Используйте функцию stdlib atoi(), чтобы преобразовать строку в целое число.

Примечание: Использование функции system() — это одинаковый способ запуска команд оболочки на всех платформах (Windows, Linux, Mac). Однако не все эти команды одинаковы. Например, то, что del делает в среде на основе DOS, rm в Linux/Unix. В Windows вы должны использовать rename или move для того же действия, что и mv в Linux. Эта программа достаточно проста, вы можете просто использовать пакетный файл, если уверены, что этот код предназначен только для Windows.

avatar
Free Url
8 апреля 2018 в 03:34
0

Попробуйте решение по этой ссылке:

Вызов 'ls' с помощью execv

Внесите следующие изменения:

args[0] = "/bin/mkdir" 
args[1] = "new_directory"
avatar
Roushan
8 апреля 2018 в 03:30
0

Я полагаю, вы запрашиваете платформу Win

вы можете использовать функцию system(), доступную в process.h, для запуска команд.

//Программа для запуска команд dos через программу C.

#include <stdio.h>
#include <process.h>

int main()
{
    int choice=0;

    printf("\n***************************************\n");
    printf("1. Open Notepad...\n");
    printf("2. Get Ip Address...\n");
    printf("3. Shut down the computer...\n");

    printf("** Enter your choice :");
    scanf("%d",&choice);

    switch(choice)
    {
        case 1:
            system("notepad");
            break;
        case 2:
            system("ipconfig");
            system("pause");
            break;
        case 3:
            system("SHUTDOWN -S");
            system("pause");
            break;
        default:
            printf("\n Invalid choice !!!");
    }

    return 0;
}
Free Url
8 апреля 2018 в 03:37
0

'@Roushan45 и др. вы должны отметить, что этот код редактирования применим только к системам Windows... и я думаю, что мой код ниже только для Linux...

Roushan
8 апреля 2018 в 03:39
0

я считаю, что он столкнулся с проблемой для окон

Roflcopter4
8 апреля 2018 в 07:51
0

Я не мог точно сказать, верю ли я в это, но clang действительно не любит использовать scanf для разбора целого числа. Он не проверяет отказ. strtol более грубый.

Ratul Hasan
23 августа 2020 в 09:44
0

прокомментировал #include <process.h>. все еще работал на меня. Можете ли вы сказать мне, зачем мне нужен process.h ??