2015-10-01 5 views
-1

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

  • самый первый scanf,
  • везде ссылающихся char* переменных,
  • и в конечном итоге указатель стека (Я назвал его towerIndicator) не меняется вообще.
  • И тогда каждый введенный ввод каким-то образом ввернут: если я наберу «+314», чтобы добавить 314 в стек, он в конечном итоге добавит 3144, если вся проблема выше была каким-то образом предотвращена при компиляции.

gcc не сообщает мне какое-либо полезное сообщение об ошибке, поэтому я не понимаю, куда идти. Отчаянно требуется помощь здесь.

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

int main() { 
    const int towerHeight = 32; 
    int tower[towerHeight]; 
    int towerIndicator = 0; 
    /* 
    printf("%i개의 정수를 담을 수 있는 스택을 만들었습니다.\n", towerHeight); 
    printf("- '+'를 붙여서 정수를 담습니다.\n"); 
    printf("- '-'를 입력해 정수를 빼냅니다.\n"); 
    printf("- '?'를 입력해 스택을 확인합니다.\n"); 
    printf("- '0'를 입력해 작업을 종료합니다.\n"); 
    printf("명령을 입력해주세요.\n================================\n"); 
    */ 
    char* command; 
    char* kindOfCommand[1]; 
    char* actualCommand; 
    while(1) { 
     printf("> "); 
     scanf("%s", command); 
     printf("%s", command); 
     strncpy(*kindOfCommand, command, 1); kindOfCommand[1] = '\0';puts("#"); 
     strncpy(actualCommand, command+1, strlen(command)-1);puts("$"); 

     switch(**kindOfCommand) { 
       int i; 
      case '+': 
       if(towerIndicator<towerHeight) { 
        tower[towerIndicator] = atoi(actualCommand); 
        towerIndicator++; 
        printf("현재 %i개의 값이 있습니다.\n", towerIndicator); 
       } else printf("더 이상 넣을 곳이 없습니다.\n"); 
       break; 
      case '-': 
       if(towerIndicator>0) { 
        towerIndicator--; 
        printf("%i\n", tower[towerIndicator]); 
        printf("현재 %i개의 값이 있습니다.\n", towerIndicator); 
       } else printf("더 이상 빼낼 값이 없습니다.\n"); 
       break; 
      case '?': 
      default: 
       printf("["); 
       for(i=0; i<towerIndicator; i++) { 
        if(i==towerIndicator) printf("[%i]", tower[i]); 
        else printf("%i", tower[i]); 
        if(i!=towerIndicator-1) printf(" "); 
       } 
       printf("]\n"); 
       break; 
     } 

     if(**kindOfCommand=='0') break; 
    } 

} 
+3

У вас есть много неопределенных действий * в вашем коде, потому что у вас есть указатели, которые не указывают нигде. Когда вы определяете локальную переменную и не инициализируете ее, ее значение будет * неопределенным *, используя эту неинициализированную переменную, приводящую к указанному UB. Например, давайте возьмем вызов 'scanf ("% s ", command)' call. * Где * будет 'scanf' писать строку, которую он читает? Где «командные» точки, конечно, но если 'command' не указывает нигде, где будут записываться данные? –

+0

Поэтому я попытался инициализировать их как «NULL», я тоже об этом заблуждаюсь. Скоро добавят эту ошибку в вопросе. – Dinir

+2

Думаю, вам нужно сделать пару шагов назад и пройти курс указателя и массива. –

ответ

1

Там требуется довольно много модификаций здесь

свободно фиксированной может быть на много больше исправлений

// char* command; // <-- initialize this, failure in scanf other wise 
     char command[120] ; 

предполагается, что вы ищете один символ, не усложнять код

// char* kindOfCommand[1]; pointer not required 
      char kindOfCommand; 

, так как вы используете strncpy вниз где-то

// char* actualCommand; // <-- initialize this 
    char actualCommand[126]; 

и изменение kindOfCommand код

//  strncpy(kindOfCommand, command, 1); 
      kindOfCommand = *command;// since you are taking single character 
      puts("#"); 

еще немного на коммутаторе

switch(kindOfCommand) { 

и, разбивая

if(kindOfCommand == '0') break; 

также вернуться до конца

return 0; 
+0

Попробуй эти изменения как можно скорее и отредактировав вопрос. Благодарю. – Dinir

0

Я применил изменения из ответа kkk, и получение ввода теперь работает хорошо.

char command[11]; 
char kindOfCommand; 
char actualCommand[10]; 
while(1) { 
    printf("> "); 
    scanf("%s", command); 
    kindOfCommand = *command; 
    memset(actualCommand,0,sizeof(actualCommand)); 
    strncpy(actualCommand, command+1, strlen(command)-1); 

    switch(kindOfCommand) { ... } 
    ... 
    if(kindOfCommand=='0') break; 
} 
return 0; 

}

мне нужно решить вход получения болтов. Это произошло потому, что когда actualCommand получает новую строку от command и она короче, чем предыдущая принятая строка, последние несколько символов строки все еще оставались в actualCommand. Поэтому я помещаю memset для сброса переменной каждый раз, когда петли цикла while. Это не указатель, так что sizeof() может выполнить эту работу. В противном случае мне следовало бы использовать strlen(), чтобы сообщить длину memset.

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