2015-01-24 17 views
-2

Я использую следующий код, чтобы разбить линию текста.C++ Хотя цикл работает неправильно

Строка текста, такая как "adduser john -u 2001 -g 1002 -p john123 -c Project Work" передается конструктору.

Я пытаюсь отделить текст с помощью команды «-u, -g, -p -c»

«джон» будет сохранено как имя, «2001» будет сохранен как UID, «1002» будет сохранен как GID и т.д.

AccountInfo::AccountInfo(char* line){ 
_line = line; 
char bufferLine[256]; 
unsigned int length1 = 0; 
unsigned int tempLength1 = 0; 

//find length of line of text 
while (_line[length1] != '\0'){ 
    length1++; 
} 
//separate the text by white space 
// start at 8 because adduser is not a command 
for (int i = 8; i < length1 + 1; i++){ 
    bufferLine[tempLength1 + 1] = '\0'; 
    printf(bufferLine); 
    if (_line[i] == ' ') 
    { 

     if (bufferLine[0] == '-') 
     { 
      //test only u and c commands for now 
      if (bufferLine[1] == 'u'){ 


       bufferLine[0] = '\0'; //clear contents of array 
       tempLength1 = 0; 

       while (!_line[i] == '-'){ 
        bufferLine[tempLength1] = _line[i]; 
        i++; 
        tempLength1++; 
       } 
       bufferLine[tempLength1] = '\0'; 
       printf(bufferLine); 
       printf("\n This is UID \n"); 
       setUID((unsigned int)bufferLine); 
      } 

      else if (bufferLine[1] == 'c'){ 

       bufferLine[0] = '\0'; 
       tempLength1 = 0; 

       while (!_line[i] == '\0'){ 
        bufferLine[tempLength1] = _line[i]; 
        i++; 
        tempLength1++; 
       } 

       bufferLine[tempLength1] = '\0'; 
       printf(bufferLine); 
       printf("\n this is gecos \n"); 
       setGecos(bufferLine); 
      } 

     } 

     else{ 
      //is name 
      bufferLine[tempLength1] = '\0'; 
      setName(bufferLine); 
      printf("\n I am the user's name\n"); 
      printf(bufferLine); 
      printf("\n"); 

     } 
     bufferLine[0] = '\0'; //reset buffer line 
     tempLength1 = 0; // reset incrementation for buffer line 

    } 

    else{ 
     bufferLine[tempLength1] = _line[i]; 
     tempLength1++; 
    } 
} 
} 

Я работаю на функциональности -u команды. Он достигает части кода if (bufferLine [1] == 'u'), но всегда обходит цикл while после него
while (! _line [i] == '-') Я попытался изменить ' - ', чтобы выйти из цикла while с' 'и даже с любой буквой' a '' g '' d ', однако ничего не работает, кроме' \ 0 '. Это приемлемо только для команды -c, поскольку все после нее должно быть напечатано.

Команда -c работает так, как должна, как и сохранение имени. Однако ни одна из других команд не будет работать, потому что она не попадает в цикл.

Я думал об этой проблеме некоторое время, и я считаю, что она должна работать, однако код никогда не проходит через цикл while. Есть ли проблема с синтаксисом? Или что-то мне не хватает в вложенных циклах?

Благодаря

ответ

3

Это выражение

while (!_line[i] == '-'){ 

вычисляется как (см operator precedence):

while ((!(_line[i])) == '-') { // because ! has higher precedence than == 
while (false == '-') {   // because _line[i] == ' ', !' ' is false 
while (false) { 

вероятно Вы имели в виду

while (_line[i] != '-') { 
+0

Спасибо за вашу помощь. Я новичок в C++ и никогда не предполагал, что приоритет будет причиной его работы. Однако теперь я получаю исключение Unhandled. Говорят, что <Ошибка чтения символов строки>, когда она попадает в -p – coracora

0

while (!_line[i] == '-') по существу while ((!_line[i]) == '-') (обратите внимание на operators precedence).

Возможно, что вы хотите while (! (_line[i] == '-')) { или, проще, while (_line[i] != '-'){.

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