鱼C论坛

 找回密码
 立即注册
查看: 3990|回复: 22

(问题更改)图的创建scanf()使用出现的问题

[复制链接]
发表于 2020-8-23 09:04:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Justin1 于 2020-8-23 14:52 编辑

读《大话数据结构》的时候,有一个
  1. scanf
复制代码
的细节,有点疑惑,没有传统的转换说明,单纯读入一个地址。就不大明白,这样操作真的可以吗?我试了试好像有点问题。自己去官方文档上看也没看个所以然来。
Annotation 2020-08-22 222510.png

我更改并且补齐了代码,想要试着打印一边矩阵和顶点数组。
现在,我想每次顶点上读入的是一个字符,a,b,c,d但是出现了问题,程序中只能读取两个a,b

  1. #include<stdio.h>
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #pragma warning(disable:4996)
  4. typedef char VertexType; /* 顶点类型应由用户定义 */
  5. typedef int EdgeType; /* 边上的权值类型应由用户定义 */
  6. #define MAXVEX 100 /* 最大顶点数,应由用户定义 */
  7. #define INFINITY 65535/* 用65535代表正无穷*/
  8. typedef struct
  9. {
  10.     VertexType vexs[MAXVEX]; /* 顶点表 */
  11.     EdgeType arc[MAXVEX][MAXVEX];/* 邻接矩阵,可看作边表 */
  12.     int numNodes, numEdges; /* 图中当前的顶点数和边数 */
  13. }MGraph;

  14. /* 建立无向网图的邻接矩阵表示 */
  15. void CreateMGraph(MGraph* G)
  16. {
  17.     int i, j, k, w;
  18.     printf("输入顶点数和边数:\n");
  19.     scanf("%d,%d", &G->numNodes, &G->numEdges); /* 输入顶点数和边数 */
  20.     for (i = 0; i < G->numNodes; i++) /* 读入顶点信息,建立顶点表 */
  21.     {
  22.         printf("the value of Node\n");
  23.         scanf("%c", &(G->vexs[i]));
  24.     }

  25.     for (i = 0; i < G->numNodes; i++)
  26.         for (j = 0; j < G->numNodes; j++)
  27.             G->arc[i][j] = INFINITY; /* 邻接矩阵初始化 */
  28.     for (k = 0; k < G->numEdges; k++) /* 读入numEdges条边,建立邻接矩阵 */
  29.     {
  30.         printf("输入边(vi,vj)上的下标i,下标j和权w:\n");
  31.         scanf("%d,%d,%d", &i, &j, &w); /* 输入边(vi,vj)上的权w */
  32.         G->arc[i][j] = w;
  33.         G->arc[j][i] = G->arc[i][j]; /* 因为是无向图,矩阵对称 */
  34.     }
  35. }

  36. //这一部分是我自己加的,没有写完整,大致为了采用for循环读取矩阵的值从而检验程序是否正常运行
  37. //为了方便,我默认输入顶点数为4,所以有 i < 4
  38. int main(void)
  39. {
  40.     int i, j;
  41.     MGraph G;
  42.     CreateMGraph(&G);
  43.     printf("========区分函数和主函数打印==========\n");
  44.     for (i = 0; i < 4; i++) {
  45.         printf("%c\n", G.vexs[i]);
  46.         printf("=====区分顶点数组和矩阵=====\n");
  47.         for (j = 0; j < 4; j++)
  48.         {
  49.             printf("%d\n", G.arc[i][j]);
  50.         }
  51.     }
  52.     return 0;
  53.     getchar();
  54. }
复制代码


图2020-08-23 143408.png
想要这样的结果,还是出现了问题

这个是运行截图
很明显看到我的测试输出
  1. printf("the value of Node\n");
复制代码

在循环中直接打印了两次才录入一个信息,这点我不太明白,希望有想法的鱼酱们帮忙解答下
Untitled.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-23 09:19:44 | 显示全部楼层
这样用是错的吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-23 09:43:47 | 显示全部楼层
麻烦把 MGragh 的代码也发一下。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-23 11:06:52 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-23 09:43
麻烦把 MGragh 的代码也发一下。

补上书上代码啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-23 11:07:37 | 显示全部楼层
zltzlt 发表于 2020-8-23 09:19
这样用是错的吧

我也感觉,不过自己补上补充说明,尝试测试了下,结果也有问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-23 11:09:47 | 显示全部楼层
Justin1 发表于 2020-8-23 11:07
我也感觉,不过自己补上补充说明,尝试测试了下,结果也有问题

这个肯定是错了。这个 scanf 什么也读不进来。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-23 11:10:45 | 显示全部楼层
以我的想法,应该不需要%d。这是格式输入,即把输入的部分当作此格式填入某地址处。或者,读取输入的符合格式的部分,填入地址处。如果没有限定此格式,那么应该是原封不动的填入所有输入的东西到某地址处。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-23 11:16:01 | 显示全部楼层
405794672 发表于 2020-8-23 11:10
以我的想法,应该不需要%d。这是格式输入,即把输入的部分当作此格式填入某地址处。或者,读取输入的符合格 ...

1.scanf 必须提供格式化字符串。
2.这里根本没有提供“某地址”。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-23 11:32:33 | 显示全部楼层
405794672 发表于 2020-8-23 11:10
以我的想法,应该不需要%d。这是格式输入,即把输入的部分当作此格式填入某地址处。或者,读取输入的符合格 ...

强行理解是按照你这样来的,不过运行不出来。 很奇怪的是就算加了
  1. %c
复制代码
,还是会有问题,什么堆栈溢出之类的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-23 12:22:33 | 显示全部楼层
Justin1 发表于 2020-8-23 11:32
强行理解是按照你这样来的,不过运行不出来。 很奇怪的是就算加了,还是会有问题,什么堆栈溢出之类的


你加%C当然不行。因为你那个地址里天知道存了多大的内容。%C只能取一个字符。如果你知道那个地址有多大,可以以相同的大小的格式进行试试。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-23 12:25:00 | 显示全部楼层
本帖最后由 405794672 于 2020-8-24 09:35 编辑

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-23 12:30:57 | 显示全部楼层
405794672 发表于 2020-8-23 12:25
我不知道1对不对,你可以试试。但2,这里提供了地址。那个&符号我看见了。


那个地址是第一个参数,是格式化字符串的位置。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-23 13:57:18 | 显示全部楼层
本帖最后由 405794672 于 2020-8-24 09:35 编辑

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-23 14:27:20 | 显示全部楼层
405794672 发表于 2020-8-23 13:57
是啊,是地址就行了啦!你可能无法理解。希望你好好理解我的想法吧,还可以试验一下。我的想法不是一般 ...

对,所以你说,填入输入的东西去哪了呢?
理解了错误的思维贻害无穷吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-23 14:38:38 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-23 14:27
对,所以你说,填入输入的东西去哪了呢?
理解了错误的思维贻害无穷吧。

我又改了一下,想输入字符,得到书上的图的结果,但还是有些问题。。希望有时间能帮忙看看啊,如果表达不清晰的地方也多多指正,记住了下次发贴就知道了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-23 14:40:04 | 显示全部楼层
405794672 发表于 2020-8-23 13:57
是啊,是地址就行了啦!你可能无法理解。希望你好好理解我的想法吧,还可以试验一下。我的想法不是一般 ...

额,我感觉你说的是直接修改地址上的值,但试了下不行,官方文档也没找到类似的。我改了下程序,希望有时间帮忙看看哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-23 14:53:20 | 显示全部楼层
zltzlt 发表于 2020-8-23 09:19
这样用是错的吧

大佬再看看呗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-23 19:58:28 | 显示全部楼层
本帖最后由 405794672 于 2020-8-24 09:37 编辑

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-23 20:00:36 | 显示全部楼层
Justin1 发表于 2020-8-23 14:40
额,我感觉你说的是直接修改地址上的值,但试了下不行,官方文档也没找到类似的。我改了下程序,希望有时 ...

很对,我就是这个想法。至于是对是错,完全取决于函数。我这个想法是从你的那个程序上面得来的。这是建立在正确的情况下而想

这段程序究竟能不能运行呢?放进编译器编一下运行一下就知道了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-23 20:17:12 | 显示全部楼层
模拟一下你这张图上的代码,并简化一下:
  1. void main()
  2. {
  3.      struct p{
  4.                  int p1;
  5.                  int p2;
  6.                  int p3[10];
  7.                 } a;//结构体可能要在main外定义
  8.     int i;
  9.    printf("请输入10个数:\n");
  10.    for(i=0;i<10;i++)
  11.    {
  12.         scanf(&a.p3[i]);
  13.     }
  14.   printf("输入的数分别为:\n");
  15.   for(i=0;i<10;i++)
  16.   {
  17.       printf("%d\t",a.p3[i]);
  18.   }
  19. }
复制代码


我觉得已经很像图片上的程序了。运行一下,看看是否有问题。
如果错误,并提示scanf的错误,那说明该图片很可能有问题

另外,现在新版vs中scanf会有警告,要用它,必须预处理忽略警告,具体可以百度
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-12 21:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表