【问题标题】:Structure not storing values and scanf failing结构不存储值和 scanf 失败
【发布时间】:2015-04-22 14:59:06
【问题描述】:

我正在尝试使用一些输入运行以下代码,当程序结束时,它显示scanf 失败并且我的结构除了零之外没有保存任何内容。怎么了?

代码:

#include <stdio.h>
#include <stdlib.h>

#define INF 2147483647;

typedef struct info{
    int u, v, w;
    struct info *next;
}*Vertex;

Vertex vertex;
int n, c, sede; 
int *distarr;

int main(){
    int i;

    if(scanf("%d %d\n%d", &n, &c, &sede) < 0)
        printf("first scanf failed\n");

    distarr = malloc(sizeof(int) * (n + 1));
    vertex = malloc(sizeof(struct info));

    for(i=0; i<c; i++){

        if(scanf("%d %d %d", &vertex->u, &vertex->v, &vertex->w) < 0)
            printf("second scanf failed\n");

        vertex->next = malloc(sizeof(struct info));
        vertex = vertex->next;

        printf("u: %d v: %d w: %d\n", vertex->u, vertex->v, vertex->w);
    }

    return 0;
}

输入:

10 15
6
6 2 5
6 7 -1
8 5 0
8 3 2
5 10 0
10 3 0
3 4 4
3 8 -1
2 5 4
2 10 5
2 3 1
2 9 3
1 6 -1
1 8 0
1 10 3

输出:

u: 0 v: 0 w: 0
u: 0 v: 0 w: 0
u: 0 v: 0 w: 0
u: 0 v: 0 w: 0
u: 0 v: 0 w: 0
u: 0 v: 0 w: 0
u: 0 v: 0 w: 0
u: 0 v: 0 w: 0
u: 0 v: 0 w: 0
u: 0 v: 0 w: 0
u: 0 v: 0 w: 0
u: 0 v: 0 w: 0
u: 0 v: 0 w: 0
u: 0 v: 0 w: 0
u: 0 v: 0 w: 0

编辑:我看到我的 scanf 条件错误我已经更改了它,但我仍然不明白仅存储 0 发生了什么(代码和输出已编辑)

【问题讨论】:

  • if(scanf("%d %d\n%d", &amp;n, &amp;c, &amp;sede) != 1) -> if(scanf("%d %d %d", &amp;n, &amp;c, &amp;sede) != 3)?
  • 阅读更多关于 scanf 的信息,尤其是它返回的内容。
  • @chux 我编辑了问题,也许我应该再次输入错误,对此感到抱歉。我已经知道 scanf 返回错误的部分。我的问题是它只存储 0,正如您在输出中看到的那样

标签: c struct scanf


【解决方案1】:

错误排序的代码:使用vertex = vertex-&gt;next; 打印然后提前指针。

    // Add
    printf("u: %d v: %d w: %d\n", vertex->u, vertex->v, vertex->w);

    vertex->next = malloc(sizeof(struct info));
    vertex = vertex->next;
    // printf("u: %d v: %d w: %d\n", vertex->u, vertex->v, vertex->w);

【讨论】:

  • 为什么这会改变我的输出。我知道第一行不会被打印,但打印全部为 0 我不明白
  • @Miguel 您的代码正在打印新分配的vertex 中的vertex-&gt;u,而不是前面scanf() 中的vertex。 0 的打印恰好是新分配的数据中的内容,它可能是任何 int - 这是未定义的行为。
【解决方案2】:

scanf("%d %d\n%d", &amp;n, &amp;c, &amp;sede) 将在成功扫描时返回3,当然还有3 != 1。 scanf("%d %d %d", &amp;vertex-&gt;u, &amp;vertex-&gt;v, &amp;vertex-&gt;w) 也是如此。

【讨论】:

  • 是的,我明白了,0 呢?
  • @Miguel;我会回答这个问题,但如果你问-1、-2、4、5 怎么办?
  • 我不明白你的问题。前三个数字始终为正数。唯一可能是负数的是 w,因为它是边的长度。
猜你喜欢
  • 2017-08-26
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多