0

从事交流项目,我遇到了障碍。我正在尝试打印点坐标样式,并且我已经包含了所有必要的代码来帮助你们帮助我!

//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]

如果我使用以下信息创建一个点:

Label: A
x: 2
y: 3

并运行 displayPoint 我得到这个输出:

R: (2, 3)

显然这是错误的,我不知道 R 是从哪里来的。我在这里想念什么?为什么C一定要这么固执,这在java、python等中就这么简单

4

3 回答 3

3

你在这里有几个问题:

  1. fgets获取缓冲区,而不是单个字符。我希望buff被声明为一个字符数组(char buff[MAX_LINE])。

  2. 您的结构为其标签声明了一个字符,但您正在将缓冲区分配给该字符。

  3. 您正在重用缓冲区。因为这只是指向一块内存的指针,所以您可能会破坏旧数据。您可能(阅读,可能会想要)在使用之间重置缓冲区。

鉴于此,我认为您的意图是:

point.label = buff[0];

我猜你只想为你的标签添加一个字符,在这种情况下这应该可以工作并且你不会破坏这个值。(我不知道你输入的其余部分。)

于 2013-10-06T20:26:43.293 回答
2

您不能执行这样的分配:

point.label = buff;

buff 是一个数组,label 是一个字符。您可以使用 memcopy,但如果您需要在结构中添加标签,请在此处放置一个数组,以便您可以将其存储在那里。在一个字符中,您只能存储 1 个字符。

于 2013-10-06T20:23:35.700 回答
1
 point.label = buff //I think this is the issue here

你看到那行末尾有一个分号吗?
C语句不以分号结尾吗?


同样在这里:

struct Point{
   char label;
   int x;
   int y;
}

结构声明应以分号结尾。

于 2013-10-06T20:19:09.640 回答