c - tcc "lvalue expected"错误

标签 c lvalue tcc

很抱歉这个可能很荒谬的基本问题(我从十几岁起就没有用 C 编程过,现在我 39 岁了......),但是通过下面的代码我得到了 tcc 编译器的输出:

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

为什么第 26 行会发生这种情况?

感谢您的耐心等待,我这几天主要做web前后端的东西...

-----代码-----

#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. 永远不要使用gets。它已从 C 语言中删除,因为它无法安全使用。 (如果输入太长,您可能会遇到缓冲区溢出。)您可以使用例如改为 fgets

  2. input() 返回局部变量的地址。当局部变量超出范围时,即当 input 返回时,它们将被销毁。返回值总是垃圾。

  3. outp 缺少类型。看起来您正在从编译器中获取隐式 int(隐式 int 已于 1999 年从 C 中删除)。

  4. 字符串文字隐式以 NUL 结尾。 \0“END OF PROGRAM.THANK YOU!\0” 中没有太多作用(除了确保末尾有两个 NUL)。

  5. 不能在 C 中对数组进行赋值。inp = ... 无效。查看 strcpymemcpy。 (即使您可以分配给数组,inp = input() 也会出现类型错误,因为 input 返回一个指针,而不是一个数组(但您不能返回数组) ).)

  6. inp == "END" 比较指针。 inp 永远不会与字符串文字具有相同的地址。查看strcmp

  7. 为什么exe存在?您可以直接break 跳出循环,而不是设置exe = 0

(#5 是您的问题所涉及的问题。)

关于c - tcc "lvalue expected"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50307865/

相关文章:

c++ - 类、右值和右值引用

compiler-construction - 可以修改 TCC 以使用 Emscripten 编译吗?如果没有,我在哪里可以找到可以生成 x86 的 C 编译器?

C - strtod 似乎添加了数字

c++ - 有符号整数类型的最大值

c - 数组在通过 void 函数后没有改变

c - 将整数打印为字符、小数、 float

c++ - 如何为 LValue 和 RValue 编写不同的 operator[]?

c++ - 诠释一= 3;整数 *p=&a; decltype (a) k1; decltype (*p) k2; k1是int类型,k2是int&类型,为什么?

c - 解决 macOS 上的 TCC 警告

c - windows下编译win32 api c程序实例(命令行方式)