Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: [swu]fscanf函数

回复:
user: user-1
content: ret 是 fscanf 的返回值，即能够从文件中 成功读取的 整形 数据的个数，u是字符型数据，所以无法读取，能读取的数据个数为0，所以返回0赋予ret ，故你输出的结果是0

user: user-2
content: http://bbs.csdn.net/topics/360055953

user: user-2
content: 请判断fscanf的返回值！

user: user-3
content: fscanf(p, "%d", &n); 哦，有错误， fscanf，scanf 的格式化串以后的参数（...），即省略号部分， 除了 *星号格式对应的参数，是个整型数据外，其他参数。。全部形参都是指针，实参应该是地址，指针。

user: user-3
content: fscanf(p, "%d", &n); fscanf，scanf 的格式化串以后的参数（...），即省略号部分，全部形参都是指针，实参应该是地址，指针。

user: user-4
content: 文件管理这章都忘记完了。。

user: user-5
content: 你从文本中读取%d，只会读取文本中的数字，而不会读取字符的

user: user-6
content: 还有就是你输入的是一个u字符，但是要读取一个int值，所以没有读取到，所以返回0，如果你想读取u的ASC2码，要改是使用%c来读取，然后打印的时候使用%d。

user: user-6
content: 引用 楼主 u012789847 的回复:1 #include <stdio.h>   2   3 int main()   4 {   5         FILE *p;   6         int n, ret;   7         p       = fopen("data.in", "r");   8         ret     = fscanf(p, "%d", n);   9         printf("%d\n", ret);  10 } 我在data.in的文件中输入的数据是u  ，运行的结果是0  请问我该如何买书这种错误情况？ 使用fscanf时一定谨记取地址符&要加上  ret     = fscanf(p, "%d", &n);

user: user-7
content: 和scanf一样，如果你%d期待一个整数，你输入一个u，也会是0. 把%d改成%c
user-0 提问: 刚学c新手求教，为什么一运行程序就停止

回复:
user: user-1
content: 单步调试下，另外可以再程序中加一些异常打印的函数，这样也好定位问题

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。

user: user-0
content: 引用 1 楼 user-4 的回复:s数组越界：s[j] = t[i]; 为什么初始化t的时候，我删除一个'\t'或者'\n'，程序就正确执行了？

user: user-3
content: 引用 楼主 weiryou10 的回复: /*编写一个函数escape(s,t)，将字符串t复制到字符串s中，并在复制过程中将换行符、制表符等不可见字符分别转换为  * \n,\t等相应的可见的转义字符序列。要求使用switch语句。再编写一个具有相反功能的函数，在复制过程中将转义字符序列  * 转换为实际字符*/ #include<stdio.h> void escape(char[], char[]);  int main() { 	char t[] = { '1', '2', '3', '4', '\n', '\t', '5', '\0' }; 	char s[] = { '\0' }; 	escape(s, t); 	return 0; }  void escape(char s[], char t[]) { 	int i, j,c; 	for (i = 0; t[i] != '\0'; i++) { 		printf("%c", t[i]); 	} 	printf("\n"); 	for (i = j = 0; t[i] != '\0'; i++, j++) { 		c = t[i]; 		printf("%c",c); 		switch (c) { 		case '\n': 			s[j++] = '\\'; 			s[j] = 'n'; 			break; 		case '\t': 			s[j++] = '\\'; 			s[j] = 't'; 			break; 		default: 			s[j] = t[i]; 			break; 		} 	} 	s[j] = '\0'; 	for (i = 0; s[i] != '\0'; i++) { 		printf("%c ", s[i]); 	} } 为什么一运行程序就停止 首先程序存在写缓冲越界的问题，这个#1已经指出。 另外，如果LZ的“一运行就停止”指的是控制台窗口一闪即过，那就是是没加“暂停功能”。  修改了下LZ的代码，所有带“// added"的行都是添加的，带”// changed“的行是做出了改变的，供参考：  /*编写一个函数escape(s,t)，将字符串t复制到字符串s中，并在复制过程中将换行符、制表符等不可见字符分别转换为 * \n,\t等相应的可见的转义字符序列。要求使用switch语句。再编写一个具有相反功能的函数，在复制过程中将转义字符序列 * 转换为实际字符*/ #include <stdio.h>  void escape(char[], char[]);  #define N 8 // added  int main() { 	char t[N] = { '1', '2', '3', '4', '\n', '\t', '5', '\0' }; // changed 	char s[N*2 + 1] = { '\0' }; // changed 	escape(s, t);  	getchar(); // added 	return 0; }  void escape(char s[], char t[]) { 	int i, j, c; 	for (i = 0; t[i] != '\0'; i++) { 		printf("%c", t[i]); 	} 	printf("\n"); 	for (i = j = 0; t[i] != '\0'; i++, j++) { 		c = t[i]; 		printf("%c", c); 		switch (c) { 		case '\n': 			s[j++] = '\\'; 			s[j] = 'n'; 			break; 		case '\t': 			s[j++] = '\\'; 			s[j] = 't'; 			break; 		default: 			s[j] = t[i]; 			break; 		} 	} 	s[j] = '\0'; 	for (i = 0; s[i] != '\0'; i++) { 		printf("%c ", s[i]); 	} }

user: user-4
content: s数组越界：s[j] = t[i];
user-0 提问: Linux下ＧＣＣ编译ＨＥＬＬＯ　ＷＯＲＬＤ失败。。。

回复:
user: user-0
content: 引用 1 楼 user-2 的回复:首先，不能写在同一行中，其次，哪个$ 是干嘛用的？  换行，，，

user: user-1
content: #include <stdio.h> int main(void){printf("hello world!");return 0;} 预处理的内容，写在同一行上，会把该行所有的内容都当作预处理的内容，这样程序已经没有main函数入口了，会有链接错误，因为程序默认需要一个main入口函数。

user: user-2
content: 首先，不能写在同一行中  其次，哪个$ 是干嘛用的？

user: user-2
content: 首先，不能写在同一行中，其次，哪个$ 是干嘛用的？
user-0 提问: 超小程序问题，如何使用fread？

回复:
user: user-1
content: 引用 2 楼 tuzhutuzhu 的回复:第6行定义了一个指针，但是指针指向哪里呢？到底指向哪里，谁都不知道 这种情况下最好定义一个字符指针 不好意思，说错了。最好定义一个字符数组

user: user-1
content: 第6行定义了一个指针，但是指针指向哪里呢？到底指向哪里，谁都不知道 这种情况下最好定义一个字符指针

user: user-2
content: int *part; fread(part,sizeof(int),1,file); --〉 int part; fread(&part,sizeof(int),1,file);
user-0 提问: 双向循环链表

回复:
user: user-1
content: 引用 4 楼 u010328107 的回复:空间为什么为O(1)呢？ 因为节点全部没有改变。不用占用任何空间。 双向链表，任何一个节点，可以找到前向和后向节点。 双向链表从任何一个节点，都可以遍历链表。 双向循环链表，任何一个节点都可以当作头结点。    画个图就可以理解了      +---------------------<--------------------------------------------------------------------+      |           1                      2                                           n-1                 n                 |      + ---> [ next  ] ----> [ next  ]  ---->   ............-----> [ next  ] ----> [ next  ]  --->-+                 [ data  ]         [ data ]              ............         [ data ]         +<----[  pre  ] <---- [ pre   ] <-----    .............<---[   pre   ] <---- [ pre   ] <——— +        |                                                                                                                                  |       +-------------------------------------------------------->---------------------------------------+          每次插入尾部就可以了，初始化 r = h->pre，q=h,p=q->next; 当 p 或者q =r 即结束p=r 要做一次插入。                                         h(1)   q(3)                           r(n)      r->next =p ( 2), p->next =r=next            第一次    2 取下插入尾部  1345.。。。。。。。n 2        h=1 ,q=5                          r=n                               r (n)      r->next =p ( 4), p->next =r->next(2)               第二次     4 取下插入尾部  1345.。。。。。。。n  4 2                                  插入结束，就得到奇数正序，偶数反序的链表了     当节点数为奇数的时候，查找到奇数节点是原尾节点，即可结束     当节点数为奇数的时候，查找到偶数节点是原尾节点，做一次插入，即可结束。     总之只要查到原尾节点，就可以结束操作了。     整个过程中，没有占用额外空间,用于储存节点和节点数据。仅仅使用了一些指针。    所以空间为 O(1)

user: user-1
content: 可以分成两个函数做 1）每隔一个节点 取出，反向插入另一个链表时间 O(N)空间O(1)  2） 连接两个链表 时间 2=O(1)  空间 0  =O(1) 当你分成两个函数可以写好的时候，合并成一个函数也不成问题。

user: user-0
content: 我是菜鸟。。。

user: user-2
content: 这个会很难吗

user: user-0
content: 空间为什么为O(1)呢？

user: user-0
content: 恩是的只要求时间

user: user-3
content: 没有空间复杂度的要求么，那最简单的就是牺牲空间了~
user-0 提问: 用文本模式和二进制模式打开一个二进制文件有区别吗？

回复:
user: user-1
content: 对，csdn 那段时间把我blog中的几乎所有的“\”都转了个方向

user: user-0
content: 引用 2 楼 user-1 的回复:可以看看这个：小小换行符乱谈(文本文件vs二进制文件) http://blog.csdn.net/user-1/article/details/6430280 我有个问题，你文章中的/r/n什么的我认为应该是\r \n吧？

user: user-1
content: 可以看看这个：小小换行符乱谈(文本文件vs二进制文件) http://blog.csdn.net/user-1/article/details/6430280

user: user-1
content: 在传统的unix系统下没有区别。
user-0 提问: 什么时候要用到二进制I/O函数（fread,fwrite)？

回复:
user: user-1
content: 很多文件本身就是二进制的，只能用二进制I/O去读 ， 比如说我写过一个工具，对exe文件进行处理，你就不可能用fscanf去读文件
user-0 提问: 文本模式与二进制模式

回复:
user: user-1
content: 引用 楼主 u014320490 的回复:具体资料我已经查过，但还想确认一些事 另外，我的问题都是建立在排除这两个模式的存储空间以及执行速度的差别上的，回答时就不用考虑了！~~~~~~~~ 本来就和这两个没多大关系吧？  引用 楼主 u014320490 的回复:在UNIX中，用文本模式和二进制模式打开文件没区别吗？这两个模式与文本I/O函数（fscanf,fprintf)以及二进制I/O函数（fread，fwrite）没有联系吗？ 对，没有联系  引用 楼主 u014320490 的回复:在WINDOWS中，用文本和二进制模式打开文件会产生不同的显示结果吗？  取决于你的文件内有没有换行。
user-0 提问: 锯齿数组

回复:
user: user-1
content: 仅供参考//n=1, //1 //n=2, //12 //34 //n=3, //126 //357 //489 //n=4, //  1  2  6  7 //  3  5  8 13 //  4  9 12 14 // 10 11 15 16 //n=5, //  1  2  6  7 15 //  3  5  8 14 16 //  4  9 13 17 22 // 10 12 18 21 23 // 11 19 20 24 25 //之字形 //模仿蚂蚁爬的过程 #include <stdio.h> #define MAXN 9 int m[MAXN][MAXN]; int i,x,y,dx,dy,n,n2,k; void main() {     for (i=1;i<=MAXN;i++) {         n2=i*i;         k=1;         if (n2>9) k=3;         x=0;         y=0;         dx=1;         dy=-1;         n=1;         m[y][x]=n;         while (1) {             if (n>=n2) break;             n++;             x=x+dx;             y=y+dy;             if (y>=i) {                 x=x+2;                 y=i-1;                 dx=1;                 dy=-1;             }             if (x>=i) {                 y=y+2;                 x=i-1;                 dx=-1;                 dy=1;             }             if (y<0) {                 y=0;                 dx=-1;                 dy=1;             }             if (x<0) {                 x=0;                 dx=1;                 dy=-1;             }             m[y][x]=n;         }         for (y=0;y<i;y++) {             for (x=0;x<i;x++) {                 printf("%*d",k,m[y][x]);             }             printf("\n");         }         printf("-------------%d--------------\n",i);     } } //1 //-------------1-------------- //12 //34 //-------------2-------------- //126 //357 //489 //-------------3-------------- //  1  2  6  7 //  3  5  8 13 //  4  9 12 14 // 10 11 15 16 //-------------4-------------- //  1  2  6  7 15 //  3  5  8 14 16 //  4  9 13 17 22 // 10 12 18 21 23 // 11 19 20 24 25 //-------------5-------------- //  1  2  6  7 15 16 //  3  5  8 14 17 26 //  4  9 13 18 25 27 // 10 12 19 24 28 33 // 11 20 23 29 32 34 // 21 22 30 31 35 36 //-------------6-------------- //  1  2  6  7 15 16 28 //  3  5  8 14 17 27 29 //  4  9 13 18 26 30 39 // 10 12 19 25 31 38 40 // 11 20 24 32 37 41 46 // 21 23 33 36 42 45 47 // 22 34 35 43 44 48 49 //-------------7-------------- //  1  2  6  7 15 16 28 29 //  3  5  8 14 17 27 30 43 //  4  9 13 18 26 31 42 44 // 10 12 19 25 32 41 45 54 // 11 20 24 33 40 46 53 55 // 21 23 34 39 47 52 56 61 // 22 35 38 48 51 57 60 62 // 36 37 49 50 58 59 63 64 //-------------8-------------- //  1  2  6  7 15 16 28 29 45 //  3  5  8 14 17 27 30 44 46 //  4  9 13 18 26 31 43 47 60 // 10 12 19 25 32 42 48 59 61 // 11 20 24 33 41 49 58 62 71 // 21 23 34 40 50 57 63 70 72 // 22 35 39 51 56 64 69 73 78 // 36 38 52 55 65 68 74 77 79 // 37 53 54 66 67 75 76 80 81 //-------------9--------------

user: user-2
content: 哇，更期待代码或上图了

user: user-0
content: 引用 2 楼 zhangbencheng 的回复:你的画张图说明下，长什么样哦！要不然，怎么搞啊！你意象啊有点像二维数组，但是每一行的长度都不同

user: user-3
content: 你的画张图说明下，长什么样哦！要不然，怎么搞啊！你意象啊

user: user-4
content: 这个名词比较新颖啊，以前怎么没听过。
user-0 提问: 读取串口程序--老是提示这个错误--已解决 【但（不想每次打开都加hid.lib）】

回复:
user: user-1
content: 将错误信息中出现的标识符放在google里面搜一下，看其在哪个.lib中，然后在本地硬盘上搜索该.lib,如果没有，在网上搜索相关库或模块下载安装，然后将其所在目录填写到“附加依赖库所在目录”中，将其名字添加到“附加依赖库”中，重新连接。 VC6： 工程、设置、Link、分类：Input、附加库路径：填写附加依赖库所在目录 分号间隔多项 工程、设置、Link、分类：Input、对象/库模块：填写附加依赖库的名字.lib 空格间隔多项 VS20xx： 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项

user: user-2
content: 引用 2 楼 iamkconghua 的回复:#pragma comment(lib, "hid.lib")正确！

user: user-3
content: #pragma comment(lib, "hid.lib")

user: user-4
content: #include
user-0 提问: 一段简单的C程序的疑问

回复:
user: user-0
content: 实在是对人， 非常感谢！

user: user-1
content: ((unsigned long)addr % 2048) < 2048  --->不是恒成立吗？

user: user-2
content: (((unsigned long)addr % 2048) < 2048) 这个不是必然成立的吗？
user-0 提问: 请教gViim问题

回复:
user: user-1
content: 引用 7 楼 u014311679 的回复:[quote=引用 4 楼 my_live_123 的回复:] 和vim差不多 ：！gcc 。。。不就妥了 ：help 帮助文档 但显示的是“！gcc...”不是外部命令或内部命令，还有别的指令吗？ [/quote] 我是省略的写的 比如编译main.c gcc -o main main.c 生成可执行文件main gcc 是在终端编译程序的命令，前提是你已经安装了gcc。

user: user-2
content: 不能。win里安心用gvim写程序然后开个visual studio cmd窗口用vc编译

user: user-1
content: 和vim差不多 ：！gcc 。。。不就妥了 ：help 帮助文档

user: user-3
content: gvim是个编辑器。你需要的是 编译器，链接器，调试器

user: user-0
content: 就是windows下的gVim7.4运行vi用的，现在就是变写完程序不知道如何运行

user: user-4
content: gdb吧，gvim只是GUI界面的一个文本编辑工具

user: user-0
content: 引用 4 楼 my_live_123 的回复:和vim差不多 ：！gcc 。。。不就妥了 ：help 帮助文档 但显示的是“！gcc...”不是外部命令或内部命令，还有别的指令吗？

user: user-0
content: 请问cmd可以模拟linux里的终端吗？

user: user-5
content: gvim是个类vim的文本编辑器。如此而已，即便在linux里面，你还不得用gcc,g++等编译器来编译么？
user-0 提问: 如何在c中获取bash的输出

回复:
user: user-1
content: 有种东西叫管道 		dup2(sock, 0); 		dup2(sock, 1); 		execl(shell,"/bin/sh",(char *)0);

user: user-2
content: 单就"如何在c中获取bash的输出 " man popen 你要的是这个?

user: user-3
content: 为何要山寨，vim都有源码。
user-0 提问: 同一C语言程序在VC和codeblocks上运行结果不同，原因是什么？

回复:
user: user-1
content: 求回文数这些写太复杂啦，把数字转字符串，倒序输出即可...

user: user-2
content: 1-检查自己的程序的逻辑性 2.-采用GCC吧

user: user-3
content: 双精度数转成整数时损失了精度，转换之前加个0.5就好了

user: user-4
content: 从工具上找原因不如从程序上找。
user-0 提问: 这个两种写法有什么不同？把i--放在while循环体内和把i--放在条件判段中

回复:
user: user-1
content: while(i < j && a[j--] >= pivot) 主要是：第二中情况是a[j--] >= pivot条件不满组时，j还多自减了一次。

user: user-0
content: 引用 9 楼 lm_whales 的回复:JiMoKuangXiangQu 的回复是正确的；  JiMoKuangXiangQu 好像是大神级别的。  shimachao 只有不会吧？三个字加一个问号，是错误的。 理解的是和JiMoKuangXiangQu一样的。 不过，不知道为什么会问出这个“不会吧？”。  [quote=引用 1 楼 JiMoKuangXiangQu 的回复:] j--和i++在前一种情况下，要同时满足 i < j && a[j] >= pivot 或 i < j && a[i] < pivot才会被执行； 后一种情况下，只要i < j，j--和i++都会被执行。 ++[/quote] 进入思维定式了

user: user-2
content: 引用 5 楼 fuyongming 的回复:第二种写法不管后面的条件成不成立，i,j的值都会变。第一种写法只有整个条件成立才变化。  正解，本人也是小白，学习了。。。。

user: user-3
content: 条件成为才执行

user: user-4
content: 不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

user: user-5
content: JiMoKuangXiangQu 的回复是正确的；  JiMoKuangXiangQu 好像是大神级别的。  shimachao 只有不会吧？三个字加一个问号，是错误的。 理解的是和JiMoKuangXiangQu一样的。 不过，不知道为什么会问出这个“不会吧？”。  引用 1 楼 JiMoKuangXiangQu 的回复:j--和i++在前一种情况下，要同时满足 i < j && a[j] >= pivot 或 i < j && a[i] < pivot才会被执行； 后一种情况下，只要i < j，j--和i++都会被执行。 ++

user: user-6
content: 同意fuyongming的说法  第二种写法不管后面的条件成不成立，i,j的值都会变。第一种写法只有整个条件成立才变化。

user: user-7
content: 引用 2 楼 shimachao 的回复:[quote=引用 1 楼 JiMoKuangXiangQu 的回复:] j--和i++在前一种情况下，要同时满足 i < j && a[j] >= pivot 或 i < j && a[i] < pivot才会被执行； 后一种情况下，只要i < j，j--和i++都会被执行。 不会吧？ while(i < j && a[j--] >= pivot)条件判断应该是i < j为假的话 后面的a[j--]>=pivot也不会执行了。 判断被短路了。  也就是说  A && B ，A为真的情况下才会去判断B。难道不是吗？ [/quote] 请仔细看回复：后一种情况下，只要i < j，j--和i++都会被执行。[/

user: user-7
content: j--和i++在前一种情况下，要同时满足 i < j && a[j] >= pivot 或 i < j && a[i] < pivot才会被执行； 后一种情况下，只要i < j，j--和i++都会被执行。

user: user-8
content: 这二种是j无条件减一，第一种是条件成立才减一，楼上说得对

user: user-9
content: 第二种写法不管后面的条件成不成立，i,j的值都会变。第一种写法只有整个条件成立才变化。

user: user-10
content: 引用 3 楼 user-10 的回复:while(i < j && a[j--] >= pivot)在跳出循环时后j = j - 1 而while(i < j && a[j] >= pivot)跳出循环后j不变 以前在写strcpy()、strcmp()时也碰到这种问题

user: user-10
content: while(i < j && a[j--] >= pivot)在跳出循环时后j = j - 1 而while(i < j && a[j] >= pivot)跳出循环后j不变

user: user-0
content: 引用 1 楼 JiMoKuangXiangQu 的回复:j--和i++在前一种情况下，要同时满足 i < j && a[j] >= pivot 或 i < j && a[i] < pivot才会被执行； 后一种情况下，只要i < j，j--和i++都会被执行。 不会吧？ while(i < j && a[j--] >= pivot)条件判断应该是i < j为假的话 后面的a[j--]>=pivot也不会执行了。 判断被短路了。  也就是说  A && B ，A为真的情况下才会去判断B。难道不是吗？
user-0 提问: 刚学数据结构，为何程序老是停止运行

回复:
user: user-1
content: typedef struct Node { unsigned char Element; struct Node * Next; } Node, *List;

user: user-1
content: Node *head;  Node *create()//建立链表，这是第一步； { 	Node *p,*q; 	head=NULL; 	int temp; 	cout<<"Now create the list,Input the data,end by -1:"<<endl; 	cin>>temp; 	while(temp!=-1) 	{ 		p=new Node; 		p->Element=temp; 		if(head==NULL) 			head=p; 		else 		{ 			q->Next=p; 		} 		q=p; 		cin>>temp; 	} 	if(head!=NULL) 		q->Next=NULL; 	return head; }  void PrintList(List L){  	int i = 0;  	Node *p = L; 	 	if (p == NULL){ 		printf("此表为空表\n"); 		return; 	} 	 	while (p!=NULL) 	{ 		printf("第%d个元素为%d\n", ++i, p->Element); 		p = p->Next; 	} }

user: user-0
content: 引用 5 楼 wanren13 的回复:LZ把结构体也发一下吧，一般来说一个类或结构体就够了，你又有List 又有Node 头文件List.h #ifndef _List_H  struct Node; typedef struct Node *Node; typedef Node List;  List CreatList(int n); void Insert(int x, List L, int i); void PrintList(List L);  #endif

user: user-0
content: 引用 5 楼 wanren13 的回复:LZ把结构体也发一下吧，一般来说一个类或结构体就够了，你又有List 又有Node 我发一下我的程序吧，麻烦您看看，谢谢了 主程序test.c #include "List.h" #include <stdio.h>  void main(){ 	List L = CreatList(5);         PrintList(L); }

user: user-0
content: 引用 5 楼 wanren13 的回复:LZ把结构体也发一下吧，一般来说一个类或结构体就够了，你又有List 又有Node  我的node和list都是指向一个结构体的，我用的c，没有用c++的

user: user-2
content: LZ把结构体也发一下吧，一般来说一个类或结构体就够了，你又有List 又有Node

user: user-3
content: 我觉得你是不是应该检查下你定义的结构体，和你传到这里void PrintList(List L)的参数之类的有没有问题，   printf("第%个元素为%\n", ++i, p->Element); 这个printf 编译过了？

user: user-4
content: L和L->next是不一样的。 L如果为空，L->next就是非法操作，程序就会终止。

user: user-0
content: 引用 1 楼 u012033027 的回复:你是不是应该先判一下L是否为空？ 我这里List L是指向的链表的头结点（我定义的链表有头结点的），在函数最开始我不是判定了L->next是否为空了么？

user: user-4
content: 你是不是应该先判一下L是否为空？
user-0 提问: GDB如何调试带参数可执行文件？

回复:
user: user-1
content: gdb --args ./a.out ff 或者  gdb ./a.out r ff

user: user-0
content: 你这样的不行的吧，不然我早弄出来了  引用 1 楼 Enter_ 的回复:gdb ./a.out ff

user: user-2
content: 囧……哪里来的 ./

user: user-2
content: gdb ./a.out ff
user-0 提问: 问个将结构体写入文件然后读取的问题！

回复:
user: user-1
content: 引用 8 楼 abcdql520 的回复:问题都解决了，原因是有几处地方写成了 w 模式  文件都呗清空了 恭喜

user: user-0
content: 问题都解决了，原因是有几处地方写成了 w 模式  文件都呗清空了

user: user-0
content: 引用 6 楼 lm_whales 的回复:1）用2进制编辑器，打开文件，看看写入的信息有没有问题. 2）有没有正确关闭文件. 3）文本方式（Text） 打开，要文本方式（Text） 读写 fscanf,fprintf，二进制（Binary） 打开要 二进制（Binary）  写 read,write.  目测，你用文本方式打开，用二进制在读写 文本方式 加"t",二进制方式加“b”,两者都不加，等同于加"t" "rt","r"文本方式 “rb” 二进制方式  PS: 读写方式，和打开方式不一致，不能保证结果正确。  我试试，谢谢回答

user: user-1
content: 1）用2进制编辑器，打开文件，看看写入的信息有没有问题. 2）有没有正确关闭文件. 3）文本方式（Text） 打开，要文本方式（Text） 读写 fscanf,fprintf，二进制（Binary） 打开要 二进制（Binary）  写 read,write.  目测，你用文本方式打开，用二进制在读写 文本方式 加"t",二进制方式加“b”,两者都不加，等同于加"t" "rt","r"文本方式 “rb” 二进制方式  PS: 读写方式，和打开方式不一致，不能保证结果正确。

user: user-0

user: user-0
content: 原谅我的代码都在Linux系统下面，win7下面没有，所以不能贴太多代码 注册：fread (  temp ,sizeof(user_t) ,1, fp);     //user_t是那个结构类型，temp是 user_t  类型的临时存放的变量

user: user-0
content: 引用 2 楼 user-2 的回复:读写文件的过程不会有问题吧，你就调试看看，写入文件的和读出来的是否一样。  我运行程序，注册登录都没问题  但是一但我退出了程序，然后启动程序，这时候，就只有注册可以了，不能登录

user: user-2
content: 读写文件的过程不会有问题吧，你就调试看看，写入文件的和读出来的是否一样。

user: user-0
user-0 提问: 关于【更新保存在文件中的结构类型的数据】的问题，文件读写的一点问题，求教各位！！！！！！！

回复:
user: user-0
content: 这个好像是需要fseek 这个函数的  但是不知道具体怎么操作  这些个东西也是周五从学的，这个是老师布置的作业

user: user-1
content: static?坐等大牛
user-0 提问: 问两个问题

回复:
user: user-1
content: http://bbs.csdn.net/topics/390676437

user: user-2
content: 还是没看懂。。为什么输出不是2.。。虽然平时不会这样做。。但是知道其中奥秘是 一件有意义的事

user: user-3
content: 引用 7 楼 kzh125 的回复:[quote=引用 5 楼 PDD123 的回复:] int __cdecl printf( char * _Format, ...); 上面的是printf的申明，你看其形参，逗号后面是一段省略号，表示可以带一串实参。 这种类型的函数，前面的参数中要有指明后面参数格式的数据。在传递参数的时候，后面的参数并不会转化类型，而是直接入栈。  而普通的函数，比如四楼的函数： [quote=引用 4 楼 u012538549 的回复:] func(int a)；     int  main(void) {        float  a=2.5;          func(a)； }  func(a)；相当于是 func(int(a))；  所以：          float  a=2.5;                  printf("%d\n",a);  a是作为一个float传进去的，而没有经过类型转换[/quote]     那作为float入栈之后呢。。输出是怎么取的啊[/quote] 输出就是按照第一个参数"%d\n"，来输出的，%d表示按照整型数来输出，具体你看资料。

user: user-3
content: int __cdecl printf( char * _Format, ...); 上面的是printf的申明，你看其形参，逗号后面是一段省略号，表示可以带一串实参。 这种类型的函数，前面的参数中要有指明后面参数格式的数据。在传递参数的时候，后面的参数并不会转化类型，而是直接入栈。  而普通的函数，比如四楼的函数： 引用 4 楼 u012538549 的回复:func(int a)；     int  main(void) {        float  a=2.5;          func(a)； }  func(a)；相当于是 func(int(a))；  所以：          float  a=2.5;                  printf("%d\n",a);  a是作为一个float传进去的，而没有经过类型转换

user: user-0
content: 引用 5 楼 PDD123 的回复:int __cdecl printf( char * _Format, ...); 上面的是printf的申明，你看其形参，逗号后面是一段省略号，表示可以带一串实参。 这种类型的函数，前面的参数中要有指明后面参数格式的数据。在传递参数的时候，后面的参数并不会转化类型，而是直接入栈。  而普通的函数，比如四楼的函数： [quote=引用 4 楼 u012538549 的回复:] func(int a)；     int  main(void) {        float  a=2.5;          func(a)； }  func(a)；相当于是 func(int(a))；  所以：          float  a=2.5;                  printf("%d\n",a);  a是作为一个float传进去的，而没有经过类型转换[/quote]     那作为float入栈之后呢。。输出是怎么取的啊

user: user-4
content: 同样的二进制码用不同的指令去取就能得到不同的数据：定义float a=2.5  那么a中的数据就用浮点指令去取   得到2.5   输出的时候使用的是整数指令去取数据然后输出 func(int a)；     int  main(void) {        float  a=2.5;          func(a)； } 这个和传参不同    传参等同于赋值，是字面值的赋值      是把a的值取出来然后赋值给形参     像这样int a=2.5   截断后 a=2    不涉及从地址用指令取值       置于为什么是0    我也不清楚     我用int* pa=(int*)&a  然后*pa和1<<31与  来打印二进制码   得到0100 0000 0010  0000 0000 0000 0000 0000

user: user-5
content: float类型不能用%d输入，也不能用%d输出

user: user-6
content: 第一个问题，我调试了一下，发现也是零。可能这与float和int转换有关系。

user: user-7
content: 输入小数的时候循环直接跳过 是因为你残留在输入缓冲区里的小数部分不符合 scanf("%d",&a);的标准，实际上scanf函数是返回失败的，你可以查看下scanf的返回值

user: user-4
content: 第一个问题我认为也是2    我这边不好测试     第二个问题：比如你输入3.1    缓冲区中就放入3.1   scanf第一次读取数据，是整数就读  不是就放回   所以第一次读取到3    遇到.就把.返回到缓冲区函数直接返回  实际a中第一次保存的是3  所以打印1    以后每次冲缓冲区读取数据都会读取到.  每次读取发现不在0-9之间  就把数据放回到缓冲区  函数直接返回
user-0 提问: 一个结构体问题

回复:
user: user-1
content: 你把打印的改下吧 printf("address = %x\n",t [0].next);     printf("address = %x\n",t[1].next); 试试

user: user-0
content: 问题发现了，我还定义了一个Lnode[B]，同样在for循环之后想给最后一个节点的next设置为NULL。但是实际代码却写的是：B[i].next = NULL; 然而B[i]对应的地址和A[0]的地址是一样的。我想这应该和程序运行时的堆栈有关吧，但是自己对其中的原理还是不太明白，是否有可以帮我解答的，谢谢！下面是我打印的数组各成员的地址：A数组有6个成员，B数组有4个成员，先定义了A然后定义B。 初始化：address = 22fde0 初始化：address = 22fdf0 初始化：address = 22fe00 初始化：address = 22fe10 初始化：address = 22fe20 初始化：address = 22fe30 add of B is 22fda0 add of B is 22fdb0 add of B is 22fdc0 add of B is 22fdd0

user: user-0
content: 不好意思，粘贴的时候少了。 typedef struct node Lnode;

user: user-2
content: Lnode 是什么  你弄错了吧  我这里是正常的

user: user-3
content: 结构体名字叫node，函数参数却是Lnode，LZ怎么编译过去的？ 改为Lnode后，我这运行正常，MinGW  初始化：address = 22ff18 初始化：address = 22ff20 初始化：address = 22ff28 初始化：address = 22ff30 初始化：address = 22ff38 初始化：address = 22ff40 address = 0  address = 22ff18 address = 22ff20 node 0 is 5     node 1 is 10    node 2 is 15    node 3 is 20    node 4 is 25 The last node is 30==0 请按任意键继续. . .
user-0 提问:  关于文件读写的一点问题，求高人解答！

回复:
user: user-0

user: user-0

user: user-0
content: 上面那个结果图截的有问题，可能不能正确表示我的问题 充值前： qian  aaaaaa      0.00   0  充值后，比如我充值4： qian  aaaaaa      0.00   0 qian  aaaaaa      4.00   0  充值后并没有改变原来的数据，只是新加了个数据
user-0 提问: #define 公用引脚  应该写在哪里

回复:
user: user-0
content: 感谢！ 原来globals.h里是这样的： #ifdef GLOBALS  #define EXT #else #define EXT extern  #endif ......//EXT  函数原型  然后我在下面写了这个就没问题了： #ifndef COMMON_DEFS_H #define COMMON_DEFS_H #define Pin_DianJi1             GPIO_Pin_3  //... #endif // COMMON_DEFS_H

user: user-1
content: 如果把这句话写在app.c 或者 app.c 和A.c都包含的includes.h  你这个方法是错的， 宏应该放在includes.h中而不是app.c中。

user: user-2
content: 写一个头文件CommonDefs.h：  #ifndef COMMON_DEFS_H #define COMMON_DEFS_H  #define Pin_DianJi1	    	 GPIO_Pin_3  //...  #endif // COMMON_DEFS_H  然后 app.c 和A.c都： #include "CommonDefs.h"
user-0 提问: Oj上的一道题。为什么错了。。测试数据正常呀。。。

回复:
user: user-1
content: 5) 班级贡献奖，每人850元，班级评议成绩高于80分（>80）的学生干部均可获得； if((head->averScore >80) && (head->stuCadre=='Y'))

user: user-0
user-0 提问: C 讀入txt

回复:
user: user-1
content: fgetc()

user: user-2
content: 用文件操作函数 fopen(filename, "r"); //打开文件 fgetc() //读取一个字节

user: user-3
content: 查看编译器词法分析以及有限自动机相关知识！

user: user-4
content: C:\>findstr /? 在文件中寻找字符串。  FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/F:file]         [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]         strings [[drive:][path]filename[ ...]]    /B         在一行的开始配对模式。   /E         在一行的结尾配对模式。   /L         按字使用搜索字符串。   /R         将搜索字符串作为一般表达式使用。   /S         在当前目录和所有子目录中搜索匹配文件。   /I         指定搜索不分大小写。   /X         打印完全匹配的行。   /V         只打印不包含匹配的行。   /N         在匹配的每行前打印行数。   /M         如果文件含有匹配项，只打印其文件名。   /O         在每个匹配行前打印字符偏移量。   /P         忽略有不可打印字符的文件。   /OFF[LINE] 不跳过带有脱机属性集的文件。   /A:attr    指定有十六进位数字的颜色属性。请见 "color /?"   /F:file    从指定文件读文件列表 (/ 代表控制台)。   /C:string  使用指定字符串作为文字搜索字符串。   /G:file    从指定的文件获得搜索字符串。 (/ 代表控制台)。   /D:dir     查找以分号为分隔符的目录列表   strings    要查找的文字。   [drive:][path]filename              指定要查找的文件。  除非参数有 /C 前缀，请使用空格隔开搜索字符串。 例如: 'FINDSTR "hello there" x.y' 在文件 x.y 中寻找 "hello" 或 "there"。'FINDSTR /C:"hello there" x.y' 文件 x.y  寻找 "hello there"。  一般表达式的快速参考:   .        通配符: 任何字符   *        重复: 以前字符或类别出现零或零以上次数   ^        行位置: 行的开始   $        行位置: 行的终点   [class]  字符类别: 任何在字符集中的字符   [^class] 补字符类别: 任何不在字符集中的字符   [x-y]    范围: 在指定范围内的任何字符   \x       Escape: 元字符 x 的文字用法   \<xyz    字位置: 字的开始   xyz\>    字位置: 字的结束  有关 FINDSTR 常见表达法的详细情况，请见联机命令参考。

user: user-5
content: 引用 楼主 hydra0305 的回复:大一下學期要我們寫一個PROJECT 讀入一個input.txt 並判斷內容的字元 Identifier 字串 符號 並記錄他的[X,Y]位置  想請問要如何讀入那個TXT並一個一個讀入字元? 並跳過'   ', '\n' 这是要写词法分析器的节奏啊，呵呵。 果真如此，网络上有太多资源。
user-0 提问: 数组引用出问题了，晕了

回复:
user: user-1
content: c语言里局部变量定义必须在函数的头部

user: user-2
content: 引用如果把*p=str[index];改成*p=str[1];就正常了  问题应该在其他地方。

user: user-3
content: str越界，导致栈内存中的数据被破坏，index的值应该不是1，不仅index, 连p的指针变量都危险。

user: user-4
content: *p=str[index];需要访问栈; *p=str[1];不需要访问栈. 说不定是栈的问题. 谁知道在进入当前函数之前,你的各个段寄存器和程序布局是咋弄的.单凭这一个函数,搞不清楚滴.

user: user-5
content: 怀疑index != 1，改改代码试一下就知道了

user: user-6
content: 这个应该没有问题吧？？另外这个str是越界了，加上最后面的0，一共要4个的。但是为什么会造成这种现象，实在不得而知。。。待大牛解释。

user: user-5
content: int index=1; if(index == 1) ...  试试，肯定是str[3]越界了

user: user-7
content: 在使用Turbo Debuger在DosBox中运行和调试。

user: user-1
content: char str[3]="Int"; 越界了, 字符串算上结尾的'\0'有4个字符

user: user-4
content: 引用 2 楼 truelance 的回复:c语言里局部变量定义必须在函数的头部 你说的是哪年月的事情啊？快睡醒吧，这都C11啦！
user-0 提问: 绝对地址赋值问题

回复:
user: user-1
content: 指针的实质是地址，表示这个指针变量是存放的是变量地址，但是你要搞清楚为什么会有不同类型的指针，不同类型指针的差异就在于你如何去解释你所指向的这段内存地址的含义。单纯一个地址没有任何意义，需要转换这是语法的规定，不是你想象的那样

user: user-2
content: 要是不加强制转换的话  0x67a9就是一个整数，可以赋值给int，但是不能赋值给指针 所以要用int*把它转为指针

user: user-0
content: OK, 我了解了,谢谢各位. 4楼的,你让我下午又看了一下午资料....

user: user-3
content: *(int *)0x67A9 = 0xaa55; 强制转换,是必要的。其他都不是必要的。  ptr这个指针变量，没有必要存在。有他也不为错。

user: user-0
content: 问题是 （int *） 这东西就瞬间变地址了呢, int后面跟一个* 是什么意思?

user: user-4
content: ptr本身是一个指针，给他赋值应该是地址，而0x67A9只是一个普通的16进制数，（int *）是强制类型转换，不 用这个编译都过不了
user-0 提问: 【求助】关于程序跳过语句的问题啊！！！！

回复:
user: user-1
content: fflush(stdin);

user: user-2
content: 在第二个scanf之前加上getchar()来接收第一个scanf的回车字符 for(i=0;i<100;i++)     {             printf(">>>请输入第%3d个数：",i+1);             scanf("%d",&num[i]);             if(0 == num[i])             {                 printf(">>>您输入了数字0，是否将其作为结束标志？(Y/N)\n"); 				getchar();//接收第一个scanf的回车字符                 scanf("%c",&end);                 if('Y'==end || 'y'==end)                 {                     i = 100;                     break;                 }             }             n = i+1;     }     putchar('\n');

user: user-3
content: printf(">>>您输入了数字0，是否将其作为结束标志？(Y/N)\n"); 因为这句printf输出了一个换行符，换行被后面的scanf语句当做输入了 在第二句scanf语句前面加一句getchar();
user-0 提问: gtk_vbox_new()警告

回复:
user: user-1
content: 3.0库已经弱化这个函数，为了保持向后兼容，它会给出警告！取而代之将是gtk_grid_new()。你在编译时候指定2.0库就不会有这个警告了！

user: user-2
content: 好久没用gtk，不甚了解，可能3.0的库有什么不同吧。这个应该没有多大问题，你想用垂直的就用垂直的，想用水平的就用水平的。
user-0 提问: 对本版置顶贴的几点质疑

回复:
user: user-1
content: 不要从中文抠词了，要从c标准的英文版中去理解。 从英文到中文的过程，就有含义的弱变！ 你有时间瞅它这文章，还不如有那时间好好读读原本标准怎么说的呢

user: user-2
content: >程序设计中应该贯彻的规则是：如果在任何“完整表达式”（形成一段由顺序点结束的计算）里存在对同一“变量”的多个引用，那么表达式里就不应该出现对这一“变量”的副作用，否则就不能保证得到预期结果。 >这么说来，i = i + 1也不能得到预期的结果了。因为这里对i多次引用，而且出现了副作用 除了这点以外，其他的几个吐槽我就觉得lz在抠词，没啥建设性意见。

user: user-3
content: 引用 2 楼 sholber 的回复:[quote=引用 1 楼 user-4 的回复:] C和C++标准在csdn都可以下载到。楼主为何不引用标准来给出你所谓的答案呢。 这还用得着下载，电脑里有现成的。 朕不想长篇大论，忙里偷闲，捣乱一下，好玩而已。 [/quote]捣乱也不多给点分

user: user-0
content: 引用 1 楼 user-4 的回复:C和C++标准在csdn都可以下载到。楼主为何不引用标准来给出你所谓的答案呢。 这还用得着下载，电脑里有现成的。 朕不想长篇大论，忙里偷闲，捣乱一下，好玩而已。

user: user-4
content: C和C++标准在csdn都可以下载到。楼主为何不引用标准来给出你所谓的答案呢。
user-0 提问: scanf问题

回复:
user: user-1
content: 引用 3 楼 jhams 的回复:。。。没查到 N1570  Committee Draft — April 12, 2011 ISO/IEC 9899:201x 7.21.6.4 The scanf function Synopsis 1 #include <stdio.h> int scanf(const char * restrict format, ...); Description 2 The scanf function is equivalent to fscanfwith the argument stdin interposed before the arguments toscanf. Returns 3 The scanf function returns the value of the macroEOFif an input failure occurs before the first conversion (if any) has completed. Otherwise, the scanf function returns the number of input items assigned, which can be fewer than provided for, or even zero, in the event of an early matching failure.

user: user-0
content: 试了一下，是输入字符串的限制长度，超过就截断

user: user-2
content: 唉，不明白就动手练。 下面的代码，%9s，当输入的字符超过9个时，只接受前9个输入。 这样意思就明白了。  #include<stdio.h> int main() { 	char pcRead[10]; 	scanf("%9s", pcRead); 	puts(pcRead);  	return 0; }

user: user-3
content: http://www.cplusplus.com/reference/cstdio/scanf/:  width	Specifies the maximum number of characters to be read in the current reading operation (optional).

user: user-4
content: 应该是长度吧

user: user-0
content: 。。。没查到

user: user-1
content: 查书去````

user: user-5
content: 查书去
user-0 提问: 求大神解决

回复:
user: user-1
content: 以前不知道有这个格里拉公式，学习了，作为回报，附上程序和注释。 希望楼主提供一下自己学习所用的书本。  int main() { 	double dQuarterPi=1.0;	//初始值 	double dx;				//1/3,1/5,1/7…… 	int ix=0; 	char pcPi1[100];		//结果存储 	char pcPi2[100];		//结果存储 	for(dx = 3; ; dx+=2) 	{ 		if(ix%2)				//计数，一次加，一次减 		{ 			dQuarterPi += 1/dx; 		} 		else 		{ 			dQuarterPi -= 1/dx; 		} 		sprintf(pcPi2, "%f", dQuarterPi*4);//数值转换成字符型 		if( 0!=memcmp(pcPi1, pcPi2, 5) )	//比较前5个字节，3.+小数点后三位 		{ 			strcpy(pcPi1, pcPi2);			//不同，则保存上一次的结果 		} 		else 		{ 			printf("%s\n", pcPi1);			//5个字节相同则输出。 			break; 		} 		ix++; 	} 	return 0; }

user: user-2
content: 你自己先弄，弄完再说。退朝！！！

user: user-1
content: 引用 3 楼 sholber 的回复:[quote=引用 2 楼 zjq9931 的回复:] 以前不知道有这个格里拉公式，学习了，作为回报，附上程序和注释。 希望楼主提供一下自己学习所用的书本。  int main() { 	double dQuarterPi=1.0;	//初始值 	double dx;				//1/3,1/5,1/7…… 	int ix=0; 	char pcPi1[100];		//结果存储 	char pcPi2[100];		//结果存储 	for(dx = 3; ; dx+=2) 	{ 		if(ix%2)				//计数，一次加，一次减 		{ 			dQuarterPi += 1/dx; 		} 		else 		{ 			dQuarterPi -= 1/dx; 		} 		sprintf(pcPi2, "%f", dQuarterPi*4);//数值转换成字符型 		if( 0!=memcmp(pcPi1, pcPi2, 5) )	//比较前5个字节，3.+小数点后三位 		{ 			strcpy(pcPi1, pcPi2);			//不同，则保存上一次的结果 		} 		else 		{ 			printf("%s\n", pcPi1);			//5个字节相同则输出。 			break; 		} 		ix++; 	} 	return 0; }  程序写得很工整，但是很要命。[/quote] 为什么恨要命？

user: user-2
content: 引用 2 楼 zjq9931 的回复:以前不知道有这个格里拉公式，学习了，作为回报，附上程序和注释。 希望楼主提供一下自己学习所用的书本。  int main() { 	double dQuarterPi=1.0;	//初始值 	double dx;				//1/3,1/5,1/7…… 	int ix=0; 	char pcPi1[100];		//结果存储 	char pcPi2[100];		//结果存储 	for(dx = 3; ; dx+=2) 	{ 		if(ix%2)				//计数，一次加，一次减 		{ 			dQuarterPi += 1/dx; 		} 		else 		{ 			dQuarterPi -= 1/dx; 		} 		sprintf(pcPi2, "%f", dQuarterPi*4);//数值转换成字符型 		if( 0!=memcmp(pcPi1, pcPi2, 5) )	//比较前5个字节，3.+小数点后三位 		{ 			strcpy(pcPi1, pcPi2);			//不同，则保存上一次的结果 		} 		else 		{ 			printf("%s\n", pcPi1);			//5个字节相同则输出。 			break; 		} 		ix++; 	} 	return 0; }  程序写得很工整，但是很要命。
user-0 提问: 请大神告知，为什么我的程序陷入死循环

回复:
user: user-0
content: 谢谢各位了！

user: user-1
content: 引用 7 楼 u012421456 的回复:[quote=引用 6 楼 sholber 的回复:] [quote=引用 5 楼 u012421456 的回复:] 你循环里的代码就无法结束循环啊！比如说你输入一个7，则执行完 n=n/3; 语句后，n = 2,然后s=s+n; s = 2，接着j=n%3; j = 0， n还是2不变，继续循环，n变成了0，然后不再改变，根本无法结束啊！lz代码哪来的？还是自己写的？ 这样的代码正表明的确是他自己写的。抄袭可耻，原创光荣！[/quote] 如果是自己写的，建议lz好好看看循环方面的内容，这个代码只要往下推一下就可以找到问题啊！学习方法很重要，对于学习，我个人的建议是遇到不会的就仔细想想，想不出来就看书，看不出来就谷歌百度，再不行了来论坛，这样的流程下来，许多问题就被解决了，而且自己也能体会到学习的快乐，何乐而不为呢？ [/quote] 可不是咋的。有道理！顶！！

user: user-2
content: 引用 6 楼 sholber 的回复:[quote=引用 5 楼 u012421456 的回复:] 你循环里的代码就无法结束循环啊！比如说你输入一个7，则执行完 n=n/3; 语句后，n = 2,然后s=s+n; s = 2，接着j=n%3; j = 0， n还是2不变，继续循环，n变成了0，然后不再改变，根本无法结束啊！lz代码哪来的？还是自己写的？ 这样的代码正表明的确是他自己写的。抄袭可耻，原创光荣！[/quote] 如果是自己写的，建议lz好好看看循环方面的内容，这个代码只要往下推一下就可以找到问题啊！学习方法很重要，对于学习，我个人的建议是遇到不会的就仔细想想，想不出来就看书，看不出来就谷歌百度，再不行了来论坛，这样的流程下来，许多问题就被解决了，而且自己也能体会到学习的快乐，何乐而不为呢？

user: user-1
content: 引用 5 楼 u012421456 的回复:你循环里的代码就无法结束循环啊！比如说你输入一个7，则执行完 n=n/3; 语句后，n = 2,然后s=s+n; s = 2，接着j=n%3; j = 0， n还是2不变，继续循环，n变成了0，然后不再改变，根本无法结束啊！lz代码哪来的？还是自己写的？ 这样的代码正表明的确是他自己写的。抄袭可耻，原创光荣！

user: user-2
content: 你循环里的代码就无法结束循环啊！比如说你输入一个7，则执行完 n=n/3; 语句后，n = 2,然后s=s+n; s = 2，接着j=n%3; j = 0， n还是2不变，继续循环，n变成了0，然后不再改变，根本无法结束啊！lz代码哪来的？还是自己写的？

user: user-3
content: 那就说明while条件始终为真，即n！=1

user: user-4
content: 首先我不知道你到底要干嘛， 说说程序的问题吧， n = n / 3不能保证n最后为1，因此会出现死循环的情况，比如n = 7; 在使用while()时，里面的条件一定要保证在某种情况时结束

user: user-5
content: n最后的值是稳定到0。。。0不等于1

user: user-1
content: while(n!=1)  {  n=n/3;
user-0 提问: 数据结构里单链表读取里第14行的j>i条件的作用是什么？

回复:
user: user-0
content: 引用 2 楼 my_live_123 的回复:非法值的处理：当i<=0都是非法的，函数进来没有立即处理。转移到你问的哪里处理的。因为当i非法时候，while循环是不执行的，p这个时候是非空，！p为假，继续执行||后的j>i此时就处理这种i非法的情况！ 当p为空的时候，！p为真，此时是不考虑j>i的 非常感谢 回答的很清晰  另外谢谢一楼的提醒

user: user-1
content: 非法值的处理：当i<=0都是非法的，函数进来没有立即处理。转移到你问的哪里处理的。因为当i非法时候，while循环是不执行的，p这个时候是非空，！p为假，继续执行||后的j>i此时就处理这种i非法的情况！ 当p为空的时候，！p为真，此时是不考虑j>i的

user: user-2
content: 看起来应该是这样。不过也许i传入了一个非法值，如0，这时候就可能出现j > i了。 不过对参数的检查应该是刚进入函数就检查了。 贴代码最好格式化一下，否则别人没什么耐心去看。  /* 初始条件：顺序线性表L已存在，1≤i≤ListLength(L) */ /* 操作结果：用e返回L中第i个数据元素的值 */ Status GetElem(LinkList L, int i, ElemType *e) { 	int j; 	LinkList p;     /* 声明一结点p */ 	p = L->next;     /* 让p指向链表L的第一个结点 */ 	j = 1;      /*  j为计数器 */ 	while (p && j < i)  /* p不为空或者计数器j还没有等于i时，循环继续 */ 	{ 		p = p->next;  /* 让p指向下一个结点 */ 		++j; 	} 	if (!p || j>i)     //就是这里的j>i 按照前一个while循环，j最大只会到j=i啊 		return ERROR;  /*  第i个元素不存在 */ 	*e = p->data;   /*  取第i个元素的数据 */ 	return OK; }
user-0 提问: 进制转换

回复:
user: user-1
content: 引用 15 楼 ak47_wz 的回复:[quote=引用 14 楼 sholber 的回复:] [quote=引用 11 楼 ak47_wz 的回复:] 题意有点没说清楚。 应该他想考的其中一个知识点是，补码和原码的转换。但是他没说清楚。或者他故意不说，这个我不懂。可能他认为，计算机中负整数是按照补码来存储的，所以自己来转换。答案应该是D。如果是无符号数的话，211，这个应该是没什么问题的。 如果是有符号，最高位是符号位1，表示负数，将补码转为原码，符号位不变，其余位取反，末位+1，即10101101，也就是-45. 就算按楼主的题意，在假定它是一个负数的情况下，你能确定它是按2的补码存储，还是按1的补码存储？[/quote] 你来给个答案吧。[/quote] C标准允许不同的实现可以选择1的补码或者2的补码方式。 按楼主的要求，如果10101101这个二进制序列是一个负数，那么，如果是按2的补码形式存储，则它对应的十进制数是-45；如果是按1的补码形式存储的，则它对应的十进制数是-82。

user: user-2
content: 引用 14 楼 sholber 的回复:[quote=引用 11 楼 ak47_wz 的回复:] 题意有点没说清楚。 应该他想考的其中一个知识点是，补码和原码的转换。但是他没说清楚。或者他故意不说，这个我不懂。可能他认为，计算机中负整数是按照补码来存储的，所以自己来转换。答案应该是D。如果是无符号数的话，211，这个应该是没什么问题的。 如果是有符号，最高位是符号位1，表示负数，将补码转为原码，符号位不变，其余位取反，末位+1，即10101101，也就是-45. 就算按楼主的题意，在假定它是一个负数的情况下，你能确定它是按2的补码存储，还是按1的补码存储？[/quote] 你来给个答案吧。

user: user-1
content: 引用 11 楼 ak47_wz 的回复:题意有点没说清楚。 应该他想考的其中一个知识点是，补码和原码的转换。但是他没说清楚。或者他故意不说，这个我不懂。可能他认为，计算机中负整数是按照补码来存储的，所以自己来转换。答案应该是D。如果是无符号数的话，211，这个应该是没什么问题的。 如果是有符号，最高位是符号位1，表示负数，将补码转为原码，符号位不变，其余位取反，末位+1，即10101101，也就是-45. 就算按楼主的题意，在假定它是一个负数的情况下，你能确定它是按2的补码存储，还是按1的补码存储？

user: user-1
content: 引用 10 楼 u010328107 的回复:一个字节8位的 哪个告诉你的？建议你捶他一顿。

user: user-3
content: unsigned int atou(const char *s)  61 {  62         unsigned int i = 0;  63         while (isdigit(*s))  64                 i = i * 10 + (*s++ - '');  65         return i;  66 }

user: user-2
content: 题意有点没说清楚。 应该他想考的其中一个知识点是，补码和原码的转换。但是他没说清楚。或者他故意不说，这个我不懂。可能他认为，计算机中负整数是按照补码来存储的，所以自己来转换。答案应该是D。如果是无符号数的话，211，这个应该是没什么问题的。 如果是有符号，最高位是符号位1，表示负数，将补码转为原码，符号位不变，其余位取反，末位+1，即10101101，也就是-45.

user: user-0
content: 一个字节8位的

user: user-0
content: 设某单字节整数的二进制形式为11010011，其分别作为有符号和无符号整数转换为十进制形式为？ A -211 211 B -83 83 C -44 211 D -45 211

user: user-1
content: 忙得不沓糊涂，给弄错了。反正一个字节最少是8位，而你那又是8位，直接转换后赋给signed char即可。因为char 到底等效于signed char还是unsigned char是由实现定义的。 printf("%d\n", (signed char)strtol("11010011", 0, 2));

user: user-1
content: 忙糊涂了，上面的答案不对。

user: user-1
content: 一个字节多少位，哪种编码方式，可以由C的实现自由处理，只要程序中不做任何假定即可： unsigned char c = strtol("11010011", 0, 2);     printf("signed:%d, unsigned:%d\n", (signed char)c, c); 以上仅供参考。

user: user-4
content: 引用 4 楼 sholber 的回复:[quote=引用 3 楼 u014044789 的回复:] int main(){ char *str="11010011"; printf("%ld",strtol(str,NULL,2));} 1，一个字节不一定非得是8位，有可能是9位、18位，等等。C语言只是规定1个字节至少8个比特。如果一个字节被定义成超过8位，正负值的十进制形式是一样的。你这么写就是错的。  2，你那个二进制比特串，到底是什么编码？是采用2的补码形式还是1的补码形式，没说清楚。如果一个字节8个比特，两种补码形式要分别判定处理，你这么写也是错的。[/quote] 能帮我看看这个题么，我不会写，谢谢 http://bbs.csdn.net/topics/390745070

user: user-1
content: 引用 3 楼 u014044789 的回复:int main(){ char *str="11010011"; printf("%ld",strtol(str,NULL,2));} 1，一个字节不一定非得是8位，有可能是9位、18位，等等。C语言只是规定1个字节至少8个比特。如果一个字节被定义成超过8位，正负值的十进制形式是一样的。你这么写就是错的。  2，你那个二进制比特串，到底是什么编码？是采用2的补码形式还是1的补码形式，没说清楚。如果一个字节8个比特，两种补码形式要分别判定处理，你这么写也是错的。

user: user-4
content: int main(){ char *str="11010011"; printf("%ld",strtol(str,NULL,2));}

user: user-5
content: 有一个是211吧，哪一个就不知道了

user: user-1
content: 这题出得没头没脑。 1，一个字节不一定非得是8位，有可能是9位、18位，等等。C语言只是规定1个字节至少8个比特； 2，你那个二进制比特串，到底是什么编码？是采用2的补码形式还是1的补码形式，没说清楚。
user-0 提问: 这两种循环选择有何区别，对于我的程序第一种循环选择可以，而第二种不可以，这是为啥？求求高手指教

回复:
user: user-0
content: 多谢

user: user-1
content: 第一种循环提取两次字符，第二种循环只提取一个字符 其实第一种循环，第一个字符是输入的Y,为真，继续||后的第二个getchar不执行；如果输入的非Y，第二个getchar得到的是“回车”。 我觉得你输入Y能成功，输入y就应该退出循环了

user: user-2
content: while( getchar() == 'Y' || getchar() == 'y' ); 这里获取了两次字符，你说呢，

user: user-3
content: 区别在于，第一种循环，其实也有错误。他调用了两次getchar（），第二个getchar（）其实是把回车给吃掉了。第二种循环，他没有吃掉回车，导致下次循环的时候，读取到的字符将是回车，也就是‘\n'。 解决的方法可以刷新一下缓冲区。或者多吃掉那个回车符就行了。

user: user-4
content: 我测试了一下，第一种循环有问题吧，getchar()应该是运行了两次，如下代码输入'y'时，就结束循环了， 输出：1，空格 显然不是你要的功能# include <stdio.h>  int main() { 	int i = 0; 	char ch; 	do 	{ 		i++; 	}while((ch = getchar()) == 'Y' || (ch = getchar()) == 'y');  	printf("%d,%c\n", i, ch); 	return 0; }

user: user-5
content: 你需要的是fflush(stdin) scanf路遇回车，请看楼下分解

user: user-6
content: 新手，说一下我的意见 为什么我的感觉是第一种不可以，第二种可以呢？ 第一种while语句里的getchar到底执行几次呢？ 这个貌似不太对
user-0 提问: C程序运行崩溃

回复:
user: user-0
content: 引用 3 楼 majia2011 的回复:void *pt=p1  不要说咱眼力好，一看断言，我就知道那错了  厉害！！ok了，3Q~

user: user-1
content: 引用 4 楼 u010875363 的回复:[quote=引用 2 楼 sholber 的回复:] bool str_in(char **); ？？？？？？？？？？？？？？？ bool str_in(char *);  在CSDN呆了好几天，没意思。  char **貌似没问题啊，指向char指针的指针。变元&pS[i]为pS[i]的地址，即指向pS[i]的指针。而pS[i]是一个指向char的指针。所以类型就申明为char **[/quote]  好吧，u r right.

user: user-0
content: 引用 2 楼 sholber 的回复:bool str_in(char **); ？？？？？？？？？？？？？？？ bool str_in(char *);  在CSDN呆了好几天，没意思。  char **貌似没问题啊，指向char指针的指针。变元&pS[i]为pS[i]的地址，即指向pS[i]的指针。而pS[i]是一个指向char的指针。所以类型就申明为char **

user: user-2
content: void *pt=p1  不要说咱眼力好，一看断言，我就知道那错了

user: user-1
content: bool str_in(char **); ？？？？？？？？？？？？？？？ bool str_in(char *);  在CSDN呆了好几天，没意思。

user: user-3
content: 点击重试看看什么地方出错了
user-0 提问: 实参中含有return语句

回复:
user: user-0
content: 好吧。我结贴。    每次 看到不懂的英文，我就感觉  好 屌丝

user: user-1
content: 这个要看return 100是不是表达式了

user: user-2
content: 标准多少年才更新一回……

user: user-0
content: 引用 4 楼 sholber 的回复:你上网搜索n1570 pdf 最新的C语言标准。2011年 N1570  Committee Draft — April 12, 2011 ISO/IEC 9899:201x 记得给分啊。C11标准，为什么叫n1570，从哪可以获取啊，如果以后标准跟新了

user: user-2
content: 你上网搜索n1570 pdf 最新的C语言标准。2011年 N1570  Committee Draft — April 12, 2011 ISO/IEC 9899:201x 记得给分啊。

user: user-0
content: 引用 2 楼 sholber 的回复:N1570，6.5.2.2： A postfix expression followed by parentheses() containing a possibly empty, comma separated list of expressions is a function call. The postfix expression denotes the called function.  The list of expressions specifies the arguments to the function. 函数调用中的表达式列表指定了函数的实参。 return语句不是表达式。上面的英文是什么标准啊，从哪里获取

user: user-2
content: N1570，6.5.2.2： A postfix expression followed by parentheses() containing a possibly empty, comma separated list of expressions is a function call. The postfix expression denotes the called function.  The list of expressions specifies the arguments to the function. 函数调用中的表达式列表指定了函数的实参。 return语句不是表达式。

user: user-3
content: 不符合编译器的语法规则就报错。
user-0 提问: 计算机储存模式——大端模式和小端模式

回复:
user: user-1
content: 引用 2 楼 sholber 的回复:楼主一派胡言。 “在共用体中，所有数据成员公用一个空间，同一时间内只能储存其中一个数据成员，它所占空间等于其最大成员所占的空间” 评：你不知道为了对齐的需要，联合（也就是你所说的共用体）是可以有填充字节的吗？建议你试试这个：printf ("%d\n", sizeof (union check {int i; char ch[5];}));  “union check  {   int i; char ch; }; 我们定义了一个union check的类型，占4个字节。” 评：难道int类型的长度一定要是4吗？  “对于上面定义的union check类型，假设int变量被初始化为1，则1在内存中存储为……” 评：你是说“假设”。别的数也可以用来测试。但是，如果用负数来测试，你的例子还能用吗（PS：这个世界除了2的补码外，还有1的补码），还有，有符号整数（除了char和signed char）可以有填充比特，考虑了吗？  int * p=( int * )( ( int )array+1 ); printf(" %x\n ",*p); 评：如果硬件架构要求int[color=#FF00FF]必须对齐，你这样做安全不？[/color] 老手何必为难我们新手

user: user-2
content: unsigned char c  = "B??L"[*(unsigned char *)&0x1020304 -1];       B →Big_endianess  ,  ？ → Unknown   ,L → Little_endianess 这个能测出么？？

user: user-3
content: 我记着是，Intel和Motorola 两种模式 未知的否 似乎大小端是一笔糊涂账，有人称Intel为大端，有人称Intel为小端 两种方式的不同，就在字节顺序 一个低字节在低地址，另一个正好相反。 intel 的低字节在低地址（右），正好和16进制的书写顺序相反。  比如 0x 77 FF, 77 高字节在高地址。FF低字节在低地址， 按照字符串，从低地址数起的习惯，顺序正好是反的。 对于 整数 0x77FF，16进制字符串表示 是 77FF  二进制自低向高的顺序是 FF,77  符合低地址（位）在右，高地址（位）在左的习惯----计算机内，不管是位串，还是字符串，一般都是这样的。 但是，从字符表示看 0x77FF，则符合先读在左，后读在右的英文习惯。 ----传统汉语的习惯正好相反，水平排列的文字，从右向左读。竖直排列的文字，先读右边那一列。  如果自右向左读，刚好是低字节在前， 不过恰恰相反，人们习惯从高位读起，所以按照读的习惯 自然就写成高位（字节）在前，低位（字节）在后了。 这就是Intel格式数据的字节顺序。 Motorola和Intel恰好相反。

user: user-4
content: LZ是来散分的。

user: user-5
content: 楼主一派胡言。 “在共用体中，所有数据成员公用一个空间，同一时间内只能储存其中一个数据成员，它所占空间等于其最大成员所占的空间” 评：你不知道为了对齐的需要，联合（也就是你所说的共用体）是可以有填充字节的吗？建议你试试这个：printf ("%d\n", sizeof (union check {int i; char ch[5];}));  “union check  {   int i; char ch; }; 我们定义了一个union check的类型，占4个字节。” 评：难道int类型的长度一定要是4吗？  “对于上面定义的union check类型，假设int变量被初始化为1，则1在内存中存储为……” 评：你是说“假设”。别的数也可以用来测试。但是，如果用负数来测试，你的例子还能用吗（PS：这个世界除了2的补码外，还有1的补码），还有，有符号整数（除了char和signed char）可以有填充比特，考虑了吗？  int * p=( int * )( ( int )array+1 ); printf(" %x\n ",*p); 评：如果硬件架构要求int[color=#FF00FF]必须对齐，你这样做安全不？[/color]
user-0 提问: 菜鸟求助，谁能帮忙看下

回复:
user: user-1
content: 引用 楼主 u014412098 的回复:// 帮忙分析一下 #include<iostream.h> #include <string.h> #include <malloc.h> #include <stdio.h> #include <stdlib.h> #include <memory.h> typedef struct  AA {         int b1:5;         int b2:2; }AA; void main() {         AA aa;         char cc[100];          strcpy(cc,"0123456789abcdefghijklmnopqrstuvwxyz");        memcpy(&aa,cc,sizeof(AA));         cout << aa.b1 <<endl;         cout << aa.b2 <<endl; } 答案是 -16和１ 首先sizeof(AA)的大小为4,b1和b2分别占5bit和2bit. 经过strcpy和memcpy后,aa的4个字节所存放的值是: 0,1,2,3的ASC码，即00110000,00110001,00110010,00110011 所以，最后一步：显示的是这４个字节的前５位，和之后的２位 分别为：10000,和01 因为int是有正负之分　　所以：答案是-16和１ 10000为什么是-16啊？ 01为什么就是1？ 你没学过补码吧，10000就是-16的二进制编码，5位有符号数表示范围-16~15 01自然是1喽。
user-0 提问: 这两种for循环不同在哪里？

回复:
user: user-1
content: j每次循环完，没有被重新赋值，

user: user-2
content: 刚刚好像打错了，是j=10

user: user-2
content: 当然会不一样了啊，   for(; i < 2; i++)         for(; j < 10; j++)             printf("%d\t", ar[i][j]); 这个循环在i= 1的时候进入二层循环的时候j= 11了，就不会在执行第二个循环了，条件不满足就跳出来了，只会打印一行

user: user-3
content: 嗯，j 的问题，lz仔细想想，for循环的用法，能看出来的

user: user-4
content: J的值不一样
user-0 提问: 求解啊   哪里错了问题？？

回复:
user: user-1
content: Finding prime numbers - Kenneth Haugland Different schemas for finding prime numbers explained with code http://www.codeproject.com/Article.aspx?tag=198374988322054872& 我就是有点崇洋媚外。

user: user-2
content: 引用 11 楼 u012421456 的回复:关于求素数的放方法，lz可以看看这个——http://blog.csdn.net/u012421456/article/details/19074525 方法

user: user-2
content: 关于求素数的放方法，lz可以看看这个——http://blog.csdn.net/u012421456/article/details/19074525

user: user-2
content: # include <stdio.h>         int main(void)   {         int i, n;        printf("100以内的所有数的质数为:");     for (i=2; i<=100; ++i)       {            for (n=2; n<i; ++n)           {               if (0 == i%n)                   break;           }           if (n == i)               printf("%3d ", i);       }          return 0;   }

user: user-3
content: mian??main??打几个字，顺便得几分，何乐不为。

user: user-4
content: error LNK2001: unresolved external symbol _main 把这句放到百度里，百度，然后解决办法一堆，一个环境量需要设置，按百度出的解决办法做就OK

user: user-1
content: 关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

user: user-5
content: 引用 5 楼 u014403258 的回复:#include<stdio.h> int main() { 	int i,n,p=1; 	for(i=2;i<=100;i++) 	{ 		for(n=1;n<=100;n++) 		{ 			if(i%n==0) 				p=0; 		} 		if(p==1 && i!=1) 			printf("%d",i); 	} 		printf("100以内的所有数的质数为:%d",i); 		return 0; }    Linking...  22.exe - 0 error(s), 0 warning(s)    还是不能编译  这已经通过编译了啊

user: user-0
content: #include<stdio.h> int main() { 	int i,n,p=1; 	for(i=2;i<=100;i++) 	{ 		for(n=1;n<=100;n++) 		{ 			if(i%n==0) 				p=0; 		} 		if(p==1 && i!=1) 			printf("%d",i); 	} 		printf("100以内的所有数的质数为:%d",i); 		return 0; }    Linking...  22.exe - 0 error(s), 0 warning(s)    还是不能编译

user: user-5
content: 引用 3 楼 u014403258 的回复:改了之后，为什么还是用不了？？？  用不了...

user: user-0
content: 改了之后，为什么还是用不了？？？

user: user-6
content: 楼主要学会看懂英文的错误提示。error LNK2001:  是提示连接错误  unresolved external symbol _main  这句话的意思是没有找到main函数。也就是你把main     写成了 mian

user: user-7
content: mian --> main
user-0 提问: fgetpos（）段错误

回复:
user: user-1
content: fpos_t *pos,*pos2; --> fpos_t pos, pos2; fgetpos(fi,pos); --> fgetpos(fi, &pos); fgetpos(fi2, pos2); --> fgetpos(fi2, &pos2); fsetpos(fi2,pos2); --> fsetpos(fi2, &pos2); fsetpos(fi,pos); --> fsetpos(fi, &pos);
user-0 提问: 求助：怎么用c语言找图中最黑的点？？

回复:
user: user-1
content: 很好奇找到这个最黑的点有算法吗 感觉图像没有什么规律，难道要遍历？

user: user-0
content: 引用 4 楼 lin5161678 的回复:看了三楼的回复才想明白 这个不就只是读取文件数据嘛 连api都省了  你好！  谢谢你的回复！ 请问在C语音里怎么“读取文件数据”？ 可以提示写代码吗？  谢谢！

user: user-2
content: 先转灰度，然后找即可。

user: user-3
content: 引用 楼主 ampYou 的回复:求助啊！  请问怎么用C语言来找下面这张图中最黑的点？ 这个编程要怎么编啊？？  用的是一个 PPM image file  n44f.ppm    怎么用RGB 和 0-255（0 表示黑色，255表示白色）来编程这个C语言找图中最黑的点？？ 先得搞清楚ppm的存储格式，不然就算找到了你也不知道坐标

user: user-4
content: 搜“RGB转HSL”和“RGB转HSB”

user: user-5
content: 看了三楼的回复才想明白 这个不就只是读取文件数据嘛 连api都省了

user: user-6
content: 我说的不是很有帮助啊，只是想起来一些相关的内容。  记得没在C里边写过，在用MATLAB的时候，可以把图片很轻松的提取出R、G、B分量，也可以将彩色图转换成灰度图，然后就可以很轻松的进行判断了。  在用OpenGL的时候看过 PPM 图像的一点东西，只知道能够读取头文件，PPM可以将图像以数值的形式显示出来，个人猜测可以通过这种方式来判断。但是对于API却真的是不知道了。

user: user-0
content: 引用 1 楼 lin5161678 的回复:获取点的颜色就靠各种api了 获取颜色之后你的问题也只是 二维数组求最大值 二维数组求最小值这种水平的问题   你好！ 请问可以说具体些嘛？ 可以给些编程/代码建议嘛？  谢谢！

user: user-5
content: 获取点的颜色就靠各种api了 获取颜色之后你的问题也只是 二维数组求最大值 二维数组求最小值这种水平的问题
user-0 提问: C语言函数传参问题，传地址？

回复:
user: user-1
content: 1.Tree  t ；  t是一个野指针(必须初始化，在我用的Centos，Ubuntu下   野指针不是能作为参数传递的)    2.所有的参数传递本质上都是值传递，只是一个数值，你传递了一个野指针的拷贝，再又把这个野指针的值赋值给一个局部变量  然后丢弃这个局部变量中的值(野指针原来的值，你可以%p打印他们三的值  都是一样的值)  让这个局部变量指向malloc分配的堆内存区域    其实你思路对了  但是你的指针用错了   你这个思路需要用二级指针   稍微改改就可以

user: user-2
content: 楼上注意，楼主用的就是二级指针

user: user-2
content: 前面几楼都被楼主恶劣的编程风格骗了，Tree是指针啊！声明成pTree就没歧义了 问题很明显， pTree ptre=*t； ptre=...malloc...； ptre此时就跟*t毫无关系了 所以最后要加上 *t=ptre

user: user-3
content: 无论是传递什么，本质都是个值：也就是都是传值！只是这个“值”是什么性质的，决定你在函数体内能不能操作函数外的变量！ 所谓传指针，也是传递地址的这类值，是说明能够操作函数外变量区别于一般传递变量的值的一种简化称呼，不要被教科书迷惑！  举个范例吧，更好理解   void fun1（char *ptr和void fun2（char noptr）  现在有变量 char ch, *chp = &ch; fun1(chp);//传递值，这个值是指针chp，即ptr = chp fun2(ch);//传递值，这个值是变量ch，noptr=ch 都是传值，赋值！这是本质 那么在fun1内修改prt，chp不会变的。操作的临时变量ptr 同理在fun2内修改noptr，ch也不会变的，操作的临时变量noptr 但是在fun1内，操作*ptr，就不在是操作临时变量ptr了，而是操作ch 因为多了一层映射*作用。  就说这么多吧，自己慢慢理解！实在不行自己反汇编，这个更容易理解这些细节区别

user: user-4
content: 引用 5 楼 u013867292 的回复:[quote=引用 4 楼 sholber 的回复:] void PreOrder( Tree t ) {     if (t) { /* …… */ }  }  不能这么干。t是结构类型的对象，而if语句的控制表达式只能是标量类型（指针类型和算术类型合称标量类型）。 那你能给我讲讲指针的间接引用这个问题吗[/quote] 函数CreateTree定义了，却没有使用，不知道你啥意思。 其次，void PreOrder( Tree t )本身没有问题，函数可以授受结构类型的参数，这没有问题。当然，通过传递指针也没有问题： void PreOrder(Tree * pt) {/* …… */} 你自己决定一下，写出来我看看再说。

user: user-5
content: 问题出在main函数里面， int main() {        Tree T;        PreOrder(T);         }  这里本来就是传个空指针T给PreOrder,  没看到函数CreateTree在哪里使用啊？

user: user-6
content: 搞这么多干嘛 统一一种方式就行

user: user-0
content: 引用 4 楼 sholber 的回复:void PreOrder( Tree t ) {     if (t) { /* …… */ }  }  不能这么干。t是结构类型的对象，而if语句的控制表达式只能是标量类型（指针类型和算术类型合称标量类型）。 那你能给我讲讲指针的间接引用这个问题吗

user: user-4
content: void PreOrder( Tree t ) {     if (t) { /* …… */ }  }  不能这么干。t是结构类型的对象，而if语句的控制表达式只能是标量类型（指针类型和算术类型合称标量类型）。

user: user-7
content: 传引用更方便。

user: user-0
content: 嗯最后在函数中加上*t = tre;即可，间接引用？但是前面tre = *t;不已经让它们指向的同一块地址吗？ void CreateTree( Tree* t ) { char ch;   Tree tre = *t; //tre = *t; scanf("%c",&ch);   if ( ch == '#' )   tre = NULL;   else   {   tre = (Tree)malloc(sizeof(TreeNode));   if ( !tre )   {   printf("分配内存出错") ; return ;   }   tre->data = ch;   CreateTree(&(tre->lchild));   CreateTree(&(tre->rchild));   }   *t = tre; }

user: user-0
content: 虽然我知道用returen的方法可以实现，但是我想知道为什么这样子传地址不可以，应该怎么传才能实现不通过返回将正确的值传入PreOrder()中乃?
user-0 提问: 照书写了个贪吃蛇，可一按方向键就退出，求助！

回复:
user: user-0
content: 我照做了，是可以接受按键了，但是按一下走一步，我把跳出循环的break改成return就好了，不管怎么说，还是谢谢你看完了这么长的代码！

user: user-1
content: 216行的的那个语句应该放在内循环里面的吧？              if(snake.life == 1)             {                 break;                } 这句应该是在里面的那个while的结尾处，而不是在外面的do...while()
user-0 提问: 集合并运算

回复:
user: user-0
content: 回楼上，我用了typedef啊！指针传进去了的！  具体的见第一次贴的代码的前几行！！！   #define Element int   struct node; typedef struct node *list;

user: user-1
content: 链表头要返回或者传递指针过去，不然你只是在操作野指针... void initlist(list *L);  void creatlist(list *L,int n);

user: user-0
content: 楼上啊，我不是不调试，是有些接口问题不对劲，，这两个函数不能配对使用，但是我感觉是对的啊，  另外上面的代码缺陷在少了个i++计数器忘弄了→_→，  请看接下来这两个  建表和输出表：  不带头结点的表   void creatlist(list L,int n) { 	initlist(L); 	list p,r; 	int i=0; 	scanf("%d",&L->D); 	r=L; 	while(i<n-1) 	{ 		p=(list)malloc(sizeof(struct node)); 		scanf("%d",&p->D); 		r->next=p; 		r=r->next; 		i++; 	} 	r->next=NULL; }  void printlist(list L) { 	list p; 	p=L; 	while(p!=NULL) 	{ 		printf("%d",p->D); 		p=p->next; 	} 	printf("\n"); }

user: user-2
content: 这个问题最高效的做法是直接遍历两个表建BST，最后输出一次即可。

user: user-3
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。