Условный цикл while никогда не оценивает true при сравнении с «>» - PullRequest
1 голос
/ 09 мая 2011

Я использую цикл while, чтобы обнаружить наличие символа «>» в ​​массиве.Условный цикл никогда не оценивается как true.Когда я показываю содержимое массива, символ «>» там сам по себе.В моем коде это не первый вызов strtok.Это также всего лишь фрагмент всего кода.Строка, которая будет разбита strtok, - это "ls> testfile.txt".Любая помощь будет оценена.

while (userArgs[k] != ">") {

    k++;

    userArgs[k] = strtok(NULL, " ");
    if(userArgs[k] == ">") {
        break;

    }
    if (userArgs[k] == NULL){
        break;
    }
}

Ответы [ 4 ]

2 голосов
/ 09 мая 2011

strtok возвращает char *, поэтому я думаю, что вы пытаетесь сравнить строки.

Вы не можете сравнивать строки, подобные этим в C, используйте strcmp.Сейчас вы сравниваете адреса, а не то, что вам нужно.

1 голос
/ 09 мая 2011

ЕСЛИ userArgs имеет тип char, тогда вы сравниваете строку с символьными константами while (userArgs[k] != ">") и if(userArgs[k] == ">") Таким образом, фактически адрес строк в двоичном файле программы сравнивается со значением символа.Обратите внимание, что ">" является строковой константой и представлена ​​некоторым адресом, где хранится строка. '>' является символьной константой и имеет значение.

IF userArgs равно char *, тогда высравнение адреса местоположения userArgs[i] в программном стеке или куче (если динамически выделено) с адресом строки ">", хранящейся в двоичном файле программы и загруженной ОС в память.Эти ячейки памяти будут время от времени меняться и не связаны с их содержимым.Чтобы сравнить содержимое воспоминаний, которые вы должны использовать while (strcmp (userArgs[k], ">") != 0).ИЛИ чтобы не звонить strcmp, возможно, вы захотите сделать следующее while ((userArgs[k][0] != '>') && (userArgs[k][1] == '\0')

Приведенные выше примеры потребуют изменений в соответствии с вашими потребностями.

1 голос
/ 09 мая 2011

Используйте '>' вместо ">".Первый - это символ, а второй - строка, или фактически указатель на символ, и сравнение указателей явно не то, что вам нужно.

0 голосов
/ 09 мая 2011

Вы сравниваете, если адрес userArgs [k] совпадает с адресом стека для "<".Это никогда не так.Вам нужно будет сопоставить <code>userArgs[k][0] == '>' // note the single quote., но это неправильно, если '>' не предшествует пробел.

...