2016-09-17 2 views
2

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

package main 

import "fmt" 

var st [100]int 
var top int 

func main() { 
    top = -1 
    ch := 0 
    temp := 0 
    for true { 
     fmt.Println("Enter you choice:") 
     fmt.Println("1. PUSH\n2. POP\n3. PRINT\n4. EXIT") 
     fmt.Scanf("%d", &ch) 
     switch ch { 
     case 1: 
      fmt.Println("Enter the value...") 
      fmt.Scanf("%d", &temp) 
      push(temp) 
     case 2: 
      temp = pop() 
      if temp != -1 { 
       fmt.Println("The popped value is ", temp) 
      } 
     case 3: 
      print() 
     case 4: 
      break 
     default: 
      fmt.Println("Please enter a valid choice") 
     } 
    } 
} 

func print() { 
    i := 0 
    if top == -1 { 
     fmt.Println("First insert elements into the stack") 
    } else { 
     fmt.Printf("The values are as follows") 
     for i <= top { 
      fmt.Println(st[i]) 
      i++ 
     } 
    } 
} 

func pop() int { 
    if top == -1 { 
     fmt.Println("Please push values before popping") 
     return -1 
    } 
    temp := st[top] 
    top-- 
    return temp 
} 

func push(n int) { 
    top++ 
    st[top] = n 
} 

Снимок экрана выхода:

enter image description here

ответ

1

Проблема заключается в том, что вы хотите, чтобы работать, как вы вводите значение и нажмите Enter, который генерирует символ новой строки, и вы пытаетесь для сканирования с использованием fmt.Scanf(). Цитата из его документа:

Новые строки ввода должны соответствовать новым строкам в формате.

Так что, если вы хотите использовать fmt.Scanf(), строка формата должна включать в себя символ новой строки \n. Но поскольку ваш нет, новая строка не будет потребляться, поэтому следующая строка для чтения значения будет автоматически продолжена.

Легко исправить: добавить \n в формат строки:

fmt.Println("Enter you choice:") 
fmt.Println("1. PUSH\n2. POP\n3. PRINT\n4. EXIT") 
fmt.Scanf("%d\n", &ch) 

И:

fmt.Println("Enter the value...") 
fmt.Scanf("%d\n", &temp) 

Альтернативой является просто использовать fmt.Scanln(), который автоматически анализирует всю строку:

fmt.Println("1. PUSH\n2. POP\n3. PRINT\n4. EXIT") 
fmt.Scanln(&ch) 

// ... 

fmt.Println("Enter the value...") 
fmt.Scanln(&temp) 

Также fmt.Scanf() и fmt.Scanln() возвращает количество успешно отсканированных значений и ошибку. Обязательно проверьте их, чтобы проверить, удалось ли выполнить сканирование.

Еще одна ошибка, которую вы имеете в своем коде, - это функциональность выхода: вы использовали оператор break в ветке case 4. break ранит только switch, а не for! Поэтому использовать return вместо break:

case 4: 
     return 

может быть Другой затруднительное использовать метки, также отмечают, что for true { ... } эквивалентна for { ... } (вы можете опустить true):

mainloop: 
    for { 
     // ... 
     switch ch { 
     // ... 
     case 4: 
      break mainloop 
     // ... 
     } 
    } 
+1

Это работало и спасибо давая мне знать об этом. – star

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