Ошибка "lvalue Ожидается" - PullRequest
0 голосов
/ 12 мая 2018

Извините за, возможно, смешной и простой вопрос (я не программировал на C с тех пор, как был подростком, а сейчас мне 39 лет), но с помощью приведенного ниже кода я получаю вывод из компилятора tcc:

test.c:15: warning: assignment makes pointer from integer without a cast
test.c:26: error: lvalue expected

Почему это происходит в строке 26?

Спасибо за ваше терпение, я в основном занимаюсь веб-интерфейсом и бэк-эндом ...

---- КОД -----

#include <stdio.h>
// needed for gets() and puts()

char* input() {

    char inp[256];

    gets(inp);

    return inp;
}

void output(outp) {

    puts(outp);
}

int main() {

    int exe = 1;
    char inp[256];
    char exit_msg[] = "END OF PROGRAM. THANK YOU!\0";

    while(exe) {

        inp = input(); // line 26
        output(inp);

        if (inp == "END"){

            exe = 0;
        }
    }
    puts(exit_msg);

    return 0;
}

1 Ответ

0 голосов
/ 12 мая 2018

В этом так много неправильного ...

  1. Никогда не используйте gets, никогда.Он был удален из C, потому что его невозможно безопасно использовать.(Если ввод слишком длинный, у вас переполнение буфера.) Вместо этого вы можете использовать, например, fgets.

  2. input() возвращает адрес локальной переменной.Локальные переменные уничтожаются, когда они выходят из области видимости, т.е. когда возвращается input.Возвращаемое значение всегда является мусором.

  3. outp отсутствует тип.Похоже, вы получаете неявное int от вашего компилятора (неявное int было удалено из C в 1999 году).

  4. Строковые литералы неявно заканчиваются на NUL.\0 мало что делает в "END OF PROGRAM. THANK YOU!\0" (за исключением того, что в конце есть два NUL).

  5. Вы не можете назначить массивы в C. inp = ... недопустимо,Проверьте strcpy и memcpy.(Даже если бы вы могли назначать массивы, inp = input() будет ошибкой типа, потому что input возвращает указатель, а не массив (но вы не можете вернуть массивы).)

  6. inp == "END" сравнивает указатели.inp никогда не будет иметь тот же адрес, что и строковый литерал.Проверьте strcmp.

  7. Почему существует exe?Вместо установки exe = 0 вы могли бы просто break выйти из цикла.

(# 5 - это вопрос, о котором ваш вопрос.)

...