很抱歉这个可能很荒谬的基本问题(我从十几岁起就没有用 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;
}
最佳答案
错误太多了...
永远不要使用
gets
。它已从 C 语言中删除,因为它无法安全使用。 (如果输入太长,您可能会遇到缓冲区溢出。)您可以使用例如改为fgets
。input()
返回局部变量的地址。当局部变量超出范围时,即当input
返回时,它们将被销毁。返回值总是垃圾。outp
缺少类型。看起来您正在从编译器中获取隐式int
(隐式int
已于 1999 年从 C 中删除)。字符串文字隐式以 NUL 结尾。
\0
在“END OF PROGRAM.THANK YOU!\0”
中没有太多作用(除了确保末尾有两个 NUL)。不能在 C 中对数组进行赋值。
inp = ...
无效。查看strcpy
和memcpy
。 (即使您可以分配给数组,inp = input()
也会出现类型错误,因为input
返回一个指针,而不是一个数组(但您不能返回数组) ).)inp == "END"
比较指针。inp
永远不会与字符串文字具有相同的地址。查看strcmp
。为什么
exe
存在?您可以直接break
跳出循环,而不是设置exe = 0
。
(#5 是您的问题所涉及的问题。)
关于c - tcc "lvalue expected"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50307865/