很抱歉这可能是一个荒谬而基本的问题(我从十几岁开始就没有用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;
}
答案 0 :(得分:2)
有太多错误......
永远不要使用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
存在?不是设置exe = 0
,而是可以break
退出循环。
(#5是你的问题所在。)