user-0 提问: 函数中有scanf程序却无法输入 求解

回复:
user: user-1
content: 应该没问题，VS2015 C++环境

user: user-2
content: 请问这个问题解决了吗，我也遇到了

user: user-3
content: http://bbs.csdn.net/topics/390471779

user: user-4
content: #include<stdio.h> #include<stdlib.h>  #define VERTEX_MAX 26   //图的最大顶点数 #define MAXVALUE 32767 //最大值(可设为一个最大整数)  typedef struct {     int Vertex[VERTEX_MAX]; //保存顶点信息(序号或字母)     int Edges[VERTEX_MAX][VERTEX_MAX]; //保存边的权     int isTrav[VERTEX_MAX]; //遍历标志     int VertexNum; //顶点数量     int EdgeNum;//边数量     int GraphType; //图的类型(0:无向图，1:有向图) }MatrixGraph; //定义邻接矩阵图结构  void Createlin(MatrixGraph *G);//创建邻接矩阵图 void Outlin(MatrixGraph *G); //输出邻接矩阵  void Createlin(MatrixGraph *G)//创建邻接矩阵图 {     int i, j, k, weight;     int s, e;//边的起始顶点      printf("输入各顶点信息\n");     for (i = 0; i<G->VertexNum; i++) //输入顶点     {          printf("第%d个顶点:", i);         scanf("%d", &(G->Vertex[i])); //保存到各顶点数组元素中     }     printf("输入构成各边的两个顶点及权值(用逗号分隔):\n");     for (k = 0; k<G->EdgeNum; k++)  //输入边的信息     {          printf("第%d条边：", k + 1);         printf("Please input three wight separated by comma(,): ");         scanf("%d,%d,%d", &s, &e, &weight);         for (i = 0; s != G->Vertex[i]; i++); //在已有顶点中查找始点         for (j = 0; e != G->Vertex[j]; j++); //在已有顶点中查找结终点         printf("i = %d, j = %d\n", i, j);         G->Edges[i][j] = weight; //对应位置保存权值，表示有一条边         if (G->GraphType == 0)  //若是无向图             G->Edges[j][i] = weight;//在对角位置保存权值     } }  void Outlin(MatrixGraph *G)//输出邻接矩阵 {     int i, j;     for (j = 0; j<G->VertexNum; j++)         printf("\t%d", G->Vertex[j]);          //在第1行输出顶点信息     printf("\n");     for (i = 0; i < G->VertexNum; i++)     {         printf("%d", G->Vertex[i]);         for (j = 0; j < G->VertexNum; j++)         {             if (G->Edges[i][j] == MAXVALUE) //若权值为最大值                 printf("\t∞");          //输出无穷大符号             else                 printf("\t%d", G->Edges[i][j]); //输出边的权值         }         printf("\n");     } }  int main() {     MatrixGraph G; //定义保存邻接矩阵结构的图     int i, j;     printf("输入生成图的类型(0:无向图,1:有向图):");     scanf("%d", &G.GraphType); //图的种类      printf("输入图的顶点数量和边数量:(separated by comma(,): )");     scanf("%d,%d", &G.VertexNum, &G.EdgeNum); //输入图顶点数和边数      for (i = 0; i<G.VertexNum; i++)  //清空矩阵         for (j = 0; j<G.VertexNum; j++)             G.Edges[i][j] = MAXVALUE; //设置矩阵中各元素的值为最大值     Createlin(&G); //创建用邻接表保存的图     printf("邻接矩阵数据如下:\n");     Outlin(&G);     //getch();     return 0; }  需要注意两个方面：1）输入时注意需要加逗号，因为你的scanf中要求输入逗号了，类似这样输入1，2才可以； 2）看到你的程序出现段错误了。出现在 G->Edges[i][j] = weight;这行，原因是越界。有向图和无向图，我也不懂，我随便输入的，就出现了数组越界。我通过这句上面加的一句调试信息，看到i,j已经超出26了。你自己注意看一下。对于非法的输入，建议你做判断校验，另外，对i,j超出做判断，这样不会越界出现段错误。

user: user-0
content: 引用 5 楼 qq423399099 的回复:你的编译器有问题吧。 我这里VS是可以正确输入的 http://blog.csdn.net/cometnet/article/details/19551125。。。。。。。。。。。。。。。。。。。。。。。。。。。。。你不说我倒没想起来 这个东西我前几周写过  运行是对的  我一般对的程序和错的程序有分类   今天第一次试是对的  然后就一直奔溃！！

user: user-5
content: 你的编译器有问题吧。 我这里VS是可以正确输入的 http://blog.csdn.net/cometnet/article/details/19551125

user: user-0
content: 引用 3 楼 qq423399099 的回复:不明白什么叫无法输入，自己检查： 1.可以查看scanf的返回值，看看成功读取了几个变量 2.scanf("%d,%d"这样的写法意味着你输入的时候必须用逗号来分隔2个数字（不能用空格） 3.可能是别的地方的错误导致了你得不到正确的结果（单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。）就是scanf本来是我要在键盘上输入值的  但是现在程序运行时根本不给我输入的机会  没办法看返回值啊

user: user-5
content: 不明白什么叫无法输入，自己检查： 1.可以查看scanf的返回值，看看成功读取了几个变量 2.scanf("%d,%d"这样的写法意味着你输入的时候必须用逗号来分隔2个数字（不能用空格） 3.可能是别的地方的错误导致了你得不到正确的结果（单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。）

user: user-3
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

user: user-3
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。