Я работаю над простой программой 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», он падает. Почему это?
эта строка: 'Команда символ [] =«»;' производит массив, который является только один символ в длину и содержит байт NUL. Чтобы работать правильно, эта строка должна быть похожа на: 'char command [100] = {'\ 0'};' которая создавала бы массив из 100 символов и инициализировала бы его всем NUL байтам – user3629249
при вызове любого из 'scanf () 'family of functions, 1) всегда проверяйте возвращаемое значение (не значение параметра), чтобы убедиться, что операция прошла успешно. 2) при использовании спецификатора преобразования входного формата '% s' всегда включайте модификатор MAX CHARACTERS, который на 1 меньше длины входного буфера, поэтому входной буфер не может быть переполнен. Переопределение входного буфера приводит к неопределенному поведению и может привести к событию сбоя seg – user3629249
Примечание: вызов 'scanf()' с спецификатором формата '% s' будет остановлен при первом« пробеле »(и пробел будет «пустое пространство»), поэтому пространство никогда не будет прочитано. Наверное, не то, что ты хочешь. Предложите, используя '[^ \ n]' или лучше 'fgets()' для ввода символов – user3629249