2015-02-20 3 views
2

Я пишу простую оболочку с использованием C++. Вот мой код. Он будет работать нормально всего за один раунд и перестанет работать со второго раунда в этом цикле while(1). Я действительно выяснил причину этого, это моя переменная char *command будет продолжать расти. Например, первый раунд, который я набираю в ls, тогда моя команда «ls». Тогда все, что я набираю во втором раунде, добавит к ls, поэтому, если я снова наберу ls, тогда моя переменная команды будет lsls. Таким образом, он перестает нормально работать. Поэтому мне интересно, есть ли способ инициализировать мою команду или удалить содержимое моей команды?Как инициализировать переменную char * в c

#include <iostream> 
#include <string.h> 
#include <stdlib.h> 
#include <stdio.h> 
using namespace std; 

int main(){ 
int i=0; 
char c; 
char *command; 
while (1){ 
     cout<< "#?: -> "; 
     while ((c = getchar()) != '\n'){ 
     command[i++] = c;} 


     if (strcmp(command, "exit") == 0){ 
       break; 
     } 
     if (strcmp(command, "date")==0){ 
       system("date"); 
     } 
     else if (strcmp(command, "vim")==0){ 
       system("vim"); 
     } 
     else if (strcmp(command,"top")==0){ 
       system("top"); 
     } 
     else if (strcmp(command,"ps")==0){ 
       system("ps"); 
     } 
     else if (strcmp(command,"ls")==0){ 
       system("ls"); 
     } 
     else if (strcmp(command,"man")==0){ 
       system("man"); 
     } 
     for (int j=0;j<100;j++){ 
     command[j]='/0'; 
     } 
     cout<<command; 

     //cin>>command; 
} 

return 0; 
} 
+1

Ваша инициализация 'int i = 0;' происходит вне цикла. Итак, 'i' только увеличивается и никогда не возвращается в 0, так что да, ваши команды будут просто добавляться один за другим. Теперь подумайте о том, что вы должны сделать, чтобы исправить это. Кроме того, вы никогда не выделяете какую-либо память для 'command', поэтому разыменованием является неопределенное поведение. –

+1

Это все равно не сработает. 'command' просто указывает куда-то в пустоту. Я предлагаю вам использовать массив. – EJP

+0

Ваше название говорит C. В вашем тексте написано C++. Ваш код выглядит как C, но вам нужен компилятор C++ для его компиляции. Выберите язык и придерживайтесь его. C и C++ принципиально разные. –

ответ

1

Добавить i=0; в начале вашего цикла в то время как

char *command= new char[100]; 
while (1){ 
     i=0; 
     cout<< "#?: -> "; 
     while ((c = getchar()) != '\n'){ 
     command[i++] = c;} 

При входе во второй тур, i имеет значение от предыдущего раунда, который вызывает вашу ошибку. Поэтому просто инициализируйте i как ноль внутри цикла while. Вы также не даете command адрес, из-за которого все, что вы пытались, просто вызывает неопределенное поведение.

Существует также ошибка здесь

command[j]='/0'; 

должно быть

command[j]='\0'; 

Null характер \0 и не /0.

+0

Большое вам спасибо – perryfanfan

+0

Всегда рад помочь ...... –

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