2017-02-14 11 views
-1

Я работаю над простой программой c, которая берет команду и запускает простую функцию C, поэтому вам не придется составлять целую программу, чтобы увидеть ее работу. Он работал нормально до scanf, когда я попытался ввести ввод. Я хотел быть эффективным и сначала разделить входные данные по пространству, и я сделал функцию выше. Затем, если утверждения сравнивают первый элемент, который будет именем команды. Но всякий раз, когда я запускаю его, он ведет себя странно, когда он начинает создавать несколько новых строк и распечатывать введенный текст. Я хотел бы, чтобы он сохранял первый элемент разделенного текста в переменной и печатал первый элемент, но вместо этого он печатал каждый элемент последовательно. Вот код:C - scanf ведет себя странно

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

void displayHeader(){ 
    printf("SuperCMD version 1.3. \nType \"help\" for a list of commands.\n"); 
} 
char * strspltf(char * str, char * delim, int index){ 
    char * pch = strtok(str, delim); 
    int i = 0; 
    while(pch != NULL){ 
     if(i == index){ 
      return pch; 
     } 
     pch = strtok(NULL, delim); 
     i++; 
    } 
    return NULL; 
} 

int main(){ 
    displayHeader(); 
    char command[] = ""; 
    char dir[] = "C:\\"; 
    while(strcmp(command, "exit") != 0){ 
     printf("%s > ", dir); 
     scanf("%s", command); 
     char * res = strspltf(command, " ", 0); 
     printf("%s\n", strspltf(command, " ", 0)); 
    } 
    return 0; 
} 

Функция сверху вернет определенный индекс строки, разделенной другой строкой. Может кто-нибудь сказать мне, что я делаю неправильно, и как это исправить? Также, когда я набираю «exit», он падает. Почему это?

+0

эта строка: 'Команда символ [] =«»;' производит массив, который является только один символ в длину и содержит байт NUL. Чтобы работать правильно, эта строка должна быть похожа на: 'char command [100] = {'\ 0'};' которая создавала бы массив из 100 символов и инициализировала бы его всем NUL байтам – user3629249

+0

при вызове любого из 'scanf () 'family of functions, 1) всегда проверяйте возвращаемое значение (не значение параметра), чтобы убедиться, что операция прошла успешно. 2) при использовании спецификатора преобразования входного формата '% s' всегда включайте модификатор MAX CHARACTERS, который на 1 меньше длины входного буфера, поэтому входной буфер не может быть переполнен. Переопределение входного буфера приводит к неопределенному поведению и может привести к событию сбоя seg – user3629249

+0

Примечание: вызов 'scanf()' с спецификатором формата '% s' будет остановлен при первом« пробеле »(и пробел будет «пустое пространство»), поэтому пространство никогда не будет прочитано. Наверное, не то, что ты хочешь. Предложите, используя '[^ \ n]' или лучше 'fgets()' для ввода символов – user3629249

ответ

1

Это:

char command[] = ""; 

неправильно. Вы не выделили и не использовали пробел для массива, кроме одной пустой строки. Затем вы вызываете scanf("%s", command);, так как память не была выделена для хранения результата scanf, вы переписываете стек мусором. Изменить объявление на что-то вроде:

#define MAX_COMMAND 50 // or whatever size you need. 
char command[MAX_COMMAND]; 

...

+0

, также безопаснее использовать указанный 'scanf', чтобы не получить больше символов MAX_COMMAND-1', иначе он вызовет неопределенное поведение –

+0

Я использовал 'char command [50];' теперь, но он по-прежнему ведет себя странно. – Garhoogin

+0

Исправлено. Заменили его на 'fgets (command, 256, stdin);'. – Garhoogin

1

Ваша локальная переменная command массив состоит из одного элемента. Он недостаточно велик, чтобы удерживать введенную пользователем входную команду как входной сигнал scanf.

Redefine command как массив из 100 элементов.

char command[100];