在c项目上工作,我遇到了障碍。我正在尝试打印点坐标样式,并且我已经包含了帮助大家帮助我的所有必要代码!
//point.h
struct Point{
char label;
int x;
int y;
};
//point.c
displayPoint(struct Point p){
char label = p.label;
int x = p.x;
int y = p.y;
// label: (x, y)
printf("(%c: (%d, %d)", label, x, y);
}
//build point from standard input
readPoint(){
struct Point point;
printf("Enter label (character): ");
fgets(buff, MAX_LINE, stdin);
point.label = buff; //I think this is the issue here
printf("Enter x:");
fgets(buff, MAX_LINE, stdin);
point.x = (int) strtol(buff, NULL, MAX_LINE);
printf("Enter y:");
fgets(buff, MAX_LINE, stdin);
point.y = (int) strtol(buff, NULL, MAX_LINE);
编译后,我收到以下错误:
points.c: In function 'displayPoint':
points.c: warning: initialization makes pointer from integer without a cast [enabled by default]
points.c: warning: format '%c' expects argument of type 'int', but argument 2 has type 'char *' [-Wformat]
points.c: In function 'readPoint':
points.c: warning: assignment makes integer from pointer without a cast [enabled by default]
如果我使用以下信息创建一个Point:
Label: A
x: 2
y: 3
并运行displayPoint我得到这个输出:
R: (2, 3)
显然这是错的,我不知道R来自哪里。我在这里错过了什么?为什么C必须如此顽固,这在java,python等中是如此简单
答案 0 :(得分:3)
你在这里遇到了一些问题:
fgets
获取缓冲区,而不是单个字符。我希望buff
被声明为字符数组(char buff[MAX_LINE]
)。
您的struct为其标签声明了一个字符,但您要将缓冲区分配给该字符。
您正在重复使用缓冲区。因为这只是指向一块内存的指针,所以你可能会破坏旧数据。您可以(阅读,可能会想要)在使用之间重置缓冲区。
鉴于此,我认为你的意思是:
point.label = buff[0];
我猜你只想为你的标签添加一个字符,在这种情况下这应该有用,你不会破坏那个价值。 (我不知道你的其他意见。)
答案 1 :(得分:2)
您无法执行此类对象:
point.label = buff;
buff是一个数组,标签是一个字符。您可以使用memcopy,但如果您需要在结构中添加标签,请在其中放置一个数组,以便将其存储在那里。在角色中,您只能存储1个角色。
答案 2 :(得分:1)
point.label = buff //I think this is the issue here
你看到那条线的末端有一个分号吗? C语句不以分号结尾吗?
同样在这里:
struct Point{
char label;
int x;
int y;
}
结构声明应以分号结尾。