2013-12-18 4 views
3

Я не могу понять, почему сравнение строк не сравнивается правильно. Это для C.Сравнение строк не работает правильно. C

Это чтение из файла, который настроен так:

1 - ls    
2 - cd     
3 - history    

Если я типа с это предположить, чтобы захватить последнюю использованную строку, которая началась с «с» и запустить! команда. Тем не менее он никогда не переходит в строку if (strcmp (()) = 0).

Часть моего кода здесь:

char currLine[MAXINPUTLINE]; 

    else if (isalpha(input[1])){ 
     int count = 1; 
     fileRead = fopen(".simpleshell_history", "r"); 
     while(fscanf(fileRead, "%s\n", currLine) != EOF){ 
      printf(input+1); 
      printf(currLine); 
      if(strcmp((input+1), currLine) == 0){ 
       printf("%s\n", currLine); 
       parse(currLine); 
      } 
     } 
    } 

Это то, что Printf в отпечатках во время цикла, я не могу понять, как это исправить, и я застрял на нем некоторое время , Это когда я ввожу «! С»

c 
1c 
-c 
lsc 
2c 
-c 
cdc 
3c 
-c 
historyc 
4c 
-c 
!c!c 
+1

Что вы имеете на выходе? – klm123

+0

Что значит? Прямо сейчас, предположим, нужно пойти в оператор if и вывести currLine, но это только цикл через цикл while и не входит в оператор if. – user2318083

+1

у вас есть печатьf-s там. Что они печатают? – klm123

ответ

1

Если input является строка !c и вы хотите, чтобы соответствовать, что против линии 2 - cd, вы должны быть осторожны. strcmp определенно не будет работать, так как он только вернет успех, если две строки, которые он сравнивает, являются точными совпадениями.

Для того, чтобы проверить, начинается ли одна строка (cd) с другой строкой (c), вы хотите использовать strncmp(), который будет принимать ограничение на количество символов для сравнения.

Кроме того, вы должны быть осторожны, чтобы начать сравнение с второго символа input (обходя !) и с пятого характера currLine (обходя 2 - символов).

Это должно получить вас там:

while (fgets(currLine, sizeof currLine, fileRead) != NULL) { 
     printf(input+1); 
     printf(currLine); 
     if (strncmp(input + 1, currLine + 4, strlen(input)-1) == 0) { 
      printf("%s\n", currLine); 
      parse(currLine); 
     } 
    } 
+0

Пробовал ваше решение, однако оно все еще не входит в оператор if.В моих ответах я показал результат цикла while ниже. – user2318083

+1

Имеет ли 'input' символ задней строки, как это было предложено в другом месте? Если это так, попробуйте 'strlen (input) -2' вместо этого, чтобы он не пытался сравнивать новую строку с' input' с 'd' в' currLine'. –

+0

Да, вы правы, теперь, когда я печатаю, однако он печатает всю строку, включая номер, который мне не нужен, но я думаю, что это простое исправление. По крайней мере, я надеюсь, например, он печатает «3 - историю» вместо «истории» – user2318083

1

Одна возможность состоит в том, что вход может содержать завершающую строку, в то время как CurLine определенно не будет из-за спецификации Scanf.

+0

У вас правильный ввод имеет конечный '\ n' в конце строки, но разве это не только сравнение первой буквы? Значит, это не имеет значения? – user2318083

+1

Нет, strcmp будет сравнивать всю строку. если вы хотите сравнить первую букву, тогда сделайте (ввод [1] == curline [1]) –

+0

Хм, похоже, не работает, будет ли «1 -» вмешиваться в сравнение строк? – user2318083

1

Ваша проблема заключается в том, как вы получаете input. (уведомление при печати, у него есть строка). Он имеет задний конец \n, а ваш currLine - нет. Следовательно, сравнение терпит неудачу.

Предложить ОП использует fgets() для входа пользователя и файла.

Нечто подобное

char buf[MAXINPUTLINE]; 
while(fgets(buf, sizeof buf, fileRead) != NULL) { 
    int LineNo; 
    if (sscanf(buf, "%d - %s", &LineNo, currLine) != 2) Handle_UnexpectedInput(); 
    ... 
} 

Примечание: "%s\n" делает то же самое, как "%s " делает то же самое, как "%s\t": %s пропускает необязательные ведущие пробела, а затем сканирует непробельные. Пробел после s в "%s\n" сканирует дополнительные пробелы.

+0

Возможно, я должен был включить это, у меня также есть «while (fgets (input, sizeof (input), stdin)) {« перед всем этим кодом. Так что fgets() «input» – user2318083

+1

@ user2318083 Да, он получает «! C \ n». – chux

+0

Так что мне просто нужно либо вывести «\ n» из ввода, либо добавить его в currLine? – user2318083

2

Этот цикл:

while(fscanf(fileRead, "%s\n", currLine) != EOF) { 

будет читать пробельные delimeted маркерам currLine, а не линии. Итак, первая итерация будет 1, вторая -, 3-й ls и т. Д., Как вы видите с вашими printfs. В названии currLine предлагается читать строки, а не жетоны.

Затем вы сравниваете токены чтения с остальной частью вашей входной линии, которая, по-видимому, "c\n". Поскольку вы никогда не получаете токен с новой строкой, он никогда не совпадает. Даже если вы избавились от новой строки, она никогда не будет совпадать, так как ваш файл не содержит маркер c

редактировать

Вы говорите, что вы хотите сравнить остальную часть входной линии с префиксом команда на линия. Чтобы сделать это, вы хотите сначала выяснить, как долго префикс, а затем использовать strncmp. Вы также хотите проанализировать строку из файла, чтобы отделить команду от индекса.Таким образом, вы могли бы сделать что-то вроде:

else if (isalpha(input[1])){ 
    int count = 1; 
    int pfxlen = 1; 
    while (!isspace(input[pfxlen+1])) pfxlen++; 
    fileRead = fopen(".simpleshell_history", "r"); 
    while(fscanf(fileRead, "%d - %[^\n]", &index, currLine) == 2) { 
     if(strncmp((input+1), currLine, pfxlen) == 0) { 
      printf("%s\n", currLine); 
      parse(currLine); 
     } 
    } 
} 
+0

Вы правы, он делает это, пытаясь понять, как это сделать, но Я несколько невежественный. – user2318083

+0

Что вы пытаетесь выяснить, как это сделать? Вы просто говорите: «Это не работает правильно», но не говорите, что он должен делать. –

+0

Итак, мне нужно было бы получить «\ n» из ввода, а также как-то сравнить только первый символ вместо всего токена? – user2318083

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