2013-09-19 6 views
2

Моя программа должна иметь возможность создавать новые структуры и хранить их в массиве, однако команды для хранения и отображения сложностей представляют собой сложность.C - разделительные строки во входном потоке

  • Чтобы создать новую переменную структуры в массиве, то пользователь вводит «набор VarName varcontents
  • Чтобы отобразить содержимое переменной, пользователь вводит„набор VarName“
  • Чтобы отобразить все переменные, пользователь вводит «набор»

Я не могу достаточно выяснить, как проверить, если есть несколько строк («установить» «перем» «varcontents») или, если есть только «набор»

char command[2][5] = { "set", "clear"}; 

    printf("prompt> "); 
    scanf("%s",inputString); 

    if(strncmp(inputString,command[0],5) == 0) 
    { 
     //code to create new struct, display structs etc... 
    } 
    else if(strncmp(inputString,command[1],5) == 0) 
    { 
     //code to clear struct 
    } 

Прямо сейчас цикл if проходит только в том случае, если пользователь вводит «установлен». Я мог бы, вероятно, сравнить первые несколько букв, а затем взять полное сравнение и вычесть первые несколько символов, чтобы сгенерировать имя новой структуры, но это кажется слишком сложным, должно быть более простое решение.

Любая помощь приветствуется!

+0

использовать 'malloc()/calloc()' в блоке if требуемого типа –

+3

Не было бы намного проще, если бы вы разобрали строку сначала, используя что-то вроде 'strtok'? – Duck

+0

Предоставьте больше примеров ожидаемого ввода. – chux

ответ

0

Вы можете разделить предложение на множество слов, и вы можете сравнить эти слова и запустить свои функции. Попробуйте, и если вы хотите, я могу опубликовать код.

0

В коде есть некоторые проблемы. Прежде всего, scanf не будет читать «set variablename variablevalue», потому что он пропускает пробелы. В любом случае, это не считается безопасным, так как позволяет переполнение буфера легко - специально новички должны скорее использовать fgets(). Но главная проблема заключается в другом месте - Рассмотрим следующий фрагмент кода:

scanf("%s", inputString); 

Что произойдет, если вы ввели: «установить хуг 12»? scanf будет просто читать «set», а другой Input будет проигнорирован. Поэтому нет смысла проверять другие параметры «xyz» и «12». Может быть, вы хотите использовать что-то вроде

scanf("%s %s %s", inputString1, inputString2, inputString3); 

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

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

int main(){ 
    char* command[] = { "set", "clear"}; 
    char input[256], varName[256], varContents[256]; 
    char* pointer = input; 
    int i = 0; 
    printf("prompt>"); 
    fgets(input, 255, stdin); 
    if(strncmp(pointer, command[0], strlen(command[0])) == 0){ 
    pointer += strlen(command[0]) + 1; 
    while(*pointer != ' ' && *pointer != '\n'){ 
     varName[i] = *pointer; 
     pointer++; 
     i++; 
    } 
    if(*pointer == '\n'){ printf("Not enough arguments"); return 1; } 
    varName[i] = '\0'; 
    pointer++; 
    i = 0; 
    while(*pointer != ' ' && *pointer != '\n'){ 
     varContents[i] = *pointer; 
     pointer++; 
     i++; 
    } 
    varContents[i] = '\0'; 
    //code to create new struct, display structs etc... 
    printf("Set VarName: %s VarContents: %s\n", varName, varContents); 
    }else if(strncmp(pointer, command[1], strlen(command[1])) == 0){ 
    //code to clear struct 
    } 
    return 0; 
} 
0

Вы только читаете одну строку, вы должны использовать два Scanf, чтобы прочитать два

char arg0[30], arg1[30]; 
while (scanf("%s %s", arg0, arg1) < 2); 

Это будет читать, пока обе строки не будут введены.

Надеюсь, это поможет.

Смежные вопросы