Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: AC问题

回复:
user: user-0
content: 恩恩，学习了。蟹蟹各位大神！

user: user-1
content: 每次外层循环的时候将sum值重置为0

user: user-2
content: 在循环里面，你会把上次累加的结果计算到本次循环中。所以循环里，先把上次累加的结果sum清0

user: user-0
content: 噢噢，原来是这样，但是，我不明白为什么？大神，可以告诉我为什么吗？

user: user-2
content: while(n--) { gets(a); len=strlen(a); for(int i=0;i<len;i++) { sum+=a[i];	 } 改成 while(n--) { sum = 0; gets(a); len=strlen(a); for(int i=0;i<len;i++) { sum+=a[i];	 }
user-0 提问: JPEG中的DCT变换

回复:
user: user-0
content: 可不可以提取出库中的熵编码，单独为我所用。或者有人试过吗

user: user-1
content: dct以后才能做编码。你不想dct那还要jpeg干甚

user: user-2
content: JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用 http://www.ibm.com/developerworks/cn/linux/l-cn-jpeg/
user-0 提问:  printf()  末尾显示多余乱码

回复:
user: user-1
content: 另外，char str_m[2]; 这里应该声明3个元素，还需要存最后的\0  可以申请时直接写成  char str_m[3] = {0};  ，这样先把缓存全用0填充

user: user-1
content: 字符串要以\0结尾，你在 strncpy 时复制的字符数要把结尾的\0也计算进去

user: user-2
content: 使用数组注意: 1.初始化问题 2.边界问题，数组末尾需要放'\0'

user: user-3
content: 你的数组char str_t[4];4个字节空间，但你输入4个字符，记得零终止符号'\0'也是占一位的。 如果你想str_t存储0912正常就至少要开5个字节大小。char str_t[5];同理char str_m[2];类似。   其次数组缓存应用前记得清空一下，  strncpy(str_m,str_t,2);前面要清空一下str_m

user: user-4
content: 字符串结尾要用\0的，你的字符中数据空间小了。
user-0 提问: 字符指针、字符数组与字符串的使用的问题

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: C语言 多个字符串排序的问题

回复:
user: user-1
content: 排序＝比较＋交换

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 引用 2 楼 coding_hello 的回复:实现的就是个冒泡排序算法， 理解清楚这里用到的数据结构。 pProverbs 是字符串数组， pLengths 是字符串数组对应的每个字符串的长度，避免按长度排序时要重复计算长度的开销。 冒泡算法进行比较时发现要调整位置，就要调整pProverbs里面的字符串内容本身的位置，以及对应的长度在pLengths中的位置。 为什么要调整pProverbs里面的内容呢，比如我输入3条字符串，直接用pLengths比较三个的长度就可以排序了啊？您能深入一点嘛

user: user-3
content: 实现的就是个冒泡排序算法， 理解清楚这里用到的数据结构。 pProverbs 是字符串数组， pLengths 是字符串数组对应的每个字符串的长度，避免按长度排序时要重复计算长度的开销。 冒泡算法进行比较时发现要调整位置，就要调整pProverbs里面的字符串内容本身的位置，以及对应的长度在pLengths中的位置。

user: user-0
content: 这个程序是完成如下功能：  输入任意个谚语，并将它们存储到执行期间分配的内存中，然后将它们以字长顺序由短到长进行输出。

user: user-4
content: for (size_t i = 0; i < count-2; ++i)     {         for (size_t j = i+1; j < count-1; ++j)         {             if (*(pLengths+i)>*(pLengths+j))             {                 // Swap the proverb pointers                 pstr = *(pProverbs + i);                 *(pProverbs + i) = *(pProverbs + j);                 *(pProverbs + j) = pstr;                   // Swap corresponding lengths                 length = *(pLengths + i);                 *(pLengths + i) = *(pLengths + j);                 *(pLengths + j) = length;             }         }     }  这个循环不是在遍历二维数组，而是冒泡排序，需要两层循环，具体原理可去网上搜索冒泡排序
user-0 提问: c语言static关键字与关于多个.c文件编译问题

回复:
user: user-1
content: 引用 6 楼 marco_0631 的回复:[quote=引用 3 楼 paschen 的回复:] .c文件不是用来包含的，需要添加到项目参与编译  static函数只能在该文件中使用，其他文件中可以定义相同名字函数，不会发生冲突  你把static函数放在.c文件里定义  谢谢。我不太清楚c的工作原理，楼上的兄弟说了#include "test1.c"相当于把两个c文件合并在了一起。所以第一种方式相当于把所有内容写在一起所以static看上去不起效果，第二种方式就是相反。还有，static关键字真正起作用的原理是因为编译最后一步链接的时候做的内存限制吗？ 怎么限制的？[/quote]  .c文件加入工程是作为一个编译单元，如果拿去包含，效果就与.h文件相同，只是添加到其他编译单元参与编译  参看：《程序员的自我修养——链接、装载与库》

user: user-0
content: 引用 3 楼 paschen 的回复:.c文件不是用来包含的，需要添加到项目参与编译  static函数只能在该文件中使用，其他文件中可以定义相同名字函数，不会发生冲突  你把static函数放在.c文件里定义  谢谢。我不太清楚c的工作原理，楼上的兄弟说了#include "test1.c"相当于把两个c文件合并在了一起。所以第一种方式相当于把所有内容写在一起所以static看上去不起效果，第二种方式就是相反。还有，static关键字真正起作用的原理是因为编译最后一步链接的时候做的内存限制吗？ 怎么限制的？

user: user-0
content: 引用 2 楼 pengzhixi 的回复:#include "test1.c" 你看这句吧  好的，谢谢。 不太了解c的工作原理，现在清楚了。

user: user-0
content: 引用 1 楼 shangyu0801 的回复:不应该直接包含C文件的。 include的意思是把文件内容直接更当前文件合并！！也就是说，你include了之后其实相当于在一个文件里，static是起作用的。不用怀疑。   按照这个思路在理理看吧。  谢谢。我知道了，也就是第一种include通过gcc编译仅仅相当于一个文件编译成目标文件再和系统库链接成可执行文件。 第二种则是test.o test1.o两个目标文件和系统库文件链接。

user: user-1
content: .c文件不是用来包含的，需要添加到项目参与编译  static函数只能在该文件中使用，其他文件中可以定义相同名字函数，不会发生冲突  你把static函数放在.c文件里定义

user: user-2
content: #include "test1.c" 你看这句吧

user: user-3
content: 不应该直接包含C文件的。 include的意思是把文件内容直接更当前文件合并！！也就是说，你include了之后其实相当于在一个文件里，static是起作用的。不用怀疑。   按照这个思路在理理看吧。
user-0 提问: 用strcmp()比较一个数组字符串与 一个常量字符串

回复:
user: user-1
content: scanf("%s",&str_md);  去掉 &  strncpy(str_m, str_md,2);  为什么是 2 ，至少 3 才能正常啊。  或者不用 strcmp ，用 strncmp 。

user: user-2
content: 在strncpy(str_m, str_md,2)一句前，加上一句， memset(str_m,'\0',sizeof(str_m)); 清空一下数组缓存。
user-0 提问: x86 linux 反汇编问题

回复:
user: user-1
content: 我本来也不太懂汇编的，经过与楼主的讨论，加上自己的研究，下面是我的理解： 每个函数开头都会有这几句 pushq   %rbp 上面这句的目的是因为下面这句要使用bp,所以先保存一下 movq    %rsp, %rbp 上面这句是保存sp到bp中，由于push操作会改变sp, 所以保存sp只能用move语句 保存sp的目的是函数中的局部变量都保存在栈上，有新的变量定义sp的值就会改变， sp的原始值保存在bp中，这样函数结束时释放线变量只需令sp = bp即可。 subq    $16, %rsp 然而为了效率，并不是定义几个变量就对sp减几次，而是一次性分配一定空间。 改变sp的目的是为了让里层的函数以最新的sp为基址，所以最里层的函数就不需要改变sp了.  还有一点蛮奇怪的，函数开头有保存bp, sp函数结束时没有还原。 只有最里层函数用pop bp, 但貌似bp根本没变。 我猜测可能调用函数在父函数的最后一句，所以就不需要了

user: user-0
content: 引用 11 楼 ipqtjmqj 的回复:[quote=引用 9 楼 shangyu0801 的回复:] [quote=引用 7 楼 ipqtjmqj 的回复:] 这毕竟是机器产生的，不完美，我仔细看了下，sp寄存器从头到尾都没啥用  sp是栈顶指针，所有的pop和push都是依赖这个的。 我就是看不懂这个逻辑，什么时候给add_x里的局部变量和形参分配的空间。。。咋上来就用bp指针取这些变量了～[/quote] 哦，这样就很好解释了，因为add_X函数里面有pop语句，所以sp不能变[/quote]  我觉得这个不是原因而是结果，因为bsp没有变化(sp == bp)，所以才能用直接用pop bp，否则应该先执行sp = bp.然后在pop bp

user: user-0
content: 引用 5 楼 ipqtjmqj 的回复:疑问三：因为是最里层的函数了 引用 10 楼 pengzhixi 的回复:看了下 即使在add_X 里面return data也不会使用rsp分配空间。  good结合engzhixi的分析应该是这个原因了。因为是最底层，是不用修改esp的，因为不用记录当前的堆栈使用情况，返回该函数退出时直接拿到ebp就OK。 我在add_X里再调用一个函数，就发现有sub xx,%rsp的操作了。  值得一提的是，在vs下，一直都是有sub xx,%rsp的操作的。。

user: user-1
content: 引用 9 楼 shangyu0801 的回复:[quote=引用 7 楼 ipqtjmqj 的回复:] 这毕竟是机器产生的，不完美，我仔细看了下，sp寄存器从头到尾都没啥用  sp是栈顶指针，所有的pop和push都是依赖这个的。 我就是看不懂这个逻辑，什么时候给add_x里的局部变量和形参分配的空间。。。咋上来就用bp指针取这些变量了～[/quote] 哦，这样就很好解释了，因为add_X函数里面有pop语句，所以sp不能变

user: user-2
content: 看了下 即使在add_X 里面return data也不会使用rsp分配空间。

user: user-0
content: 引用 7 楼 ipqtjmqj 的回复:这毕竟是机器产生的，不完美，我仔细看了下，sp寄存器从头到尾都没啥用  sp是栈顶指针，所有的pop和push都是依赖这个的。 我就是看不懂这个逻辑，什么时候给add_x里的局部变量和形参分配的空间。。。咋上来就用bp指针取这些变量了～

user: user-2
content: 引用 6 楼 shangyu0801 的回复:[quote=引用 3 楼 shangyu0801 的回复:] 而且，如果是调用前分配的，那么在call_x里通过bp调用时，肯定是正偏移，而不应该是负的偏移呀。  说错了，我的意思是在add_x里，取值的时候，应该是         movq    %rax, 32(%rbp)         movq    %rdx, -24(%rbp)  引用 5 楼 ipqtjmqj 的回复:疑问三：因为是最里层的函数了 没理解呀！与非里层的函数有什么区别么？[/quote]经楼主提醒 又去看了下，觉得应该是编译器做的优化。没有对rsp做修改，而是直接用rbp来为add_X(struct data_st data)这个参数分配空间，能想到的一个好处就是不用对rsp做进一步的恢复。因为你传递的不是指针，函数调用返回 这个参数所在的空间就不可用。所以优化一下不用rsp分配空间，直接用rhp 减去某个值来使用栈。 返回的时候又不用恢复rsp。还挺好

user: user-1
content: 这毕竟是机器产生的，不完美，我仔细看了下，sp寄存器从头到尾都没啥用

user: user-0
content: 引用 3 楼 shangyu0801 的回复:而且，如果是调用前分配的，那么在call_x里通过bp调用时，肯定是正偏移，而不应该是负的偏移呀。  说错了，我的意思是在add_x里，取值的时候，应该是         movq    %rax, 32(%rbp)         movq    %rdx, -24(%rbp)  引用 5 楼 ipqtjmqj 的回复:疑问三：因为是最里层的函数了 没理解呀！与非里层的函数有什么区别么？

user: user-1
content: 疑问三：因为是最里层的函数了

user: user-3
content: 没准默认被优化了。 http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-0
content: 而且，如果是调用前分配的，那么在call_x里通过bp调用时，肯定是正偏移，而不应该是负的偏移呀。

user: user-0
content: 引用 1 楼 pengzhixi 的回复:subq    $16, %rsp      #疑问1，这里为啥要减去16 ？而不是 4？ a的size是4呀？ 这个再debug模式下不一定是4，但是这个 不重要 你只需要看movl    $0, -4(%rbp)这个对a进行赋值的时候没有取错就好了。我个人猜测只是出于对齐的考虑。这个和疑问二可以算是同一个问题。  #疑问三，这里咋没有sub ？ 直接就那bp进行取数据了?  这个参数的空间是调用的时候有调用函数分配了。具体你可以调用下add_x就知道了  感谢!! add_x已经在call_x里被调用了。call_x里并没有分配的地方啊？

user: user-2
content: subq    $16, %rsp      #疑问1，这里为啥要减去16 ？而不是 4？ a的size是4呀？ 这个再debug模式下不一定是4，但是这个 不重要 你只需要看movl    $0, -4(%rbp)这个对a进行赋值的时候没有取错就好了。我个人猜测只是出于对齐的考虑。这个和疑问二可以算是同一个问题。  #疑问三，这里咋没有sub ？ 直接就那bp进行取数据了?  这个参数的空间是调用的时候有调用函数分配了。具体你可以调用下add_x就知道了
user-0 提问: c语言 判断子字符串是否等于常量字符串

回复:
user: user-0
content: 用strcmp以后，又有新问题： char str_m[2]; const char* pstr = "123-456"; if (strcmp(str_m,"12")==0)  条件仍然不能满足。  可能因为参数str_m类型是指针，而参数"12"的类型是常量字符串.。 一个数组，一个是常量字符串，怎么比较啊？

user: user-1
content: 大家都知道，在C语言中两上字符串是不能直接进行比较的，我们一般使用<string.h>中的字符串比较函数strcmp()来进行两个字符串的比较。那么，为什么不允许两个字符串直接进行比较呢？可做如下解释：  有如下代码： char s1[] = "abc"; char s2[] = "abc";  如果直接进行比较： if (s1 == s2) { printf("s1等于 s2"); } else { printf("s1 不等于s2"); }  大家想想输出结果会是什么呢？   输出结果永远为：s1 不等于 s2.(不论你换成char s1[] = "abc"; char s2[] = "def"; 还是char s1[] = "def"; char s2[] = "abc";,输出结果都一样）。  为什么呢？ 大家因为这样比较，其实是在把s1和s2当作指针来进行比较，而不是比较两个数组中的内容。因为s1和s2在内存中位置肯定不同，所以s1 == s2的值肯定为0，所以出现上面的结果也就是理所当然了。 这个应该可以追溯到C语言中 数组（字符串也可认为是数组）的访问机制

user: user-2
content: 字符串不能用==比较，否则只是比较两个指针值是否相等  比较字符串需要用strcmp比较，返回0表示相等  if (strcmp(str_m,"12")==0)     ///相等

user: user-3
content: str_m 是个地址，批向一个数组，“12”是一个常量字符串地址，这个里面存了12和\0,所以 (str_m=="12"）比的一个指向栈内存的地址和一个指向常量的地址，不可能相等的，对于数组、字符这样的，直接看到的是指针，比字符串应该用2L的方法。

user: user-4
content: 字符串在c语言中不能直接比较 需要把 if (str_m=="12")  printf("%s",str_m);system("pause"); 改为 if (0 == strcmp(str_m, "12"))  printf("%s",str_m);system("pause");

user: user-5
content: C语言应该没有字符串对象  只能用strcmp
user-0 提问: 变长数组的问题

回复:
user: user-1
content: 把这句int magic_square[n][n];移到scanf("%d", &n);后面 否则你的magic_square的大小已经被固定下来了是0x0的一个二维数组。  #include <stdio.h> #include <stdlib.h>  int main() { 	int i, j, k, n = 0, a = 0, b = 0; 	 	printf("Enter size of magic square: "); 	scanf("%d", &n); 	int magic_square[n][n]; 	for (j = 0, i = 1, k = n / 2; i <= n*n; i++) 	{ 		if (j < 0) j += n; 		if (k == n) k = 0; 		if (magic_square[j][k] != 0) 		{ 			j = a + 2; k = b - 1; 		} 		magic_square[j][k] = i; 		--j; ++k; a = j; b = k; 	} 	printf("\n"); 	for (i = 0; i < n; i++) 	{ 		for (j = 0; j < n; j++) 		{ 			if (j == n - 1)printf("%4d\n", magic_square[i][j]); 			else printf("%4d", magic_square[i][j]); 		} 	}  	return 0; }
user-0 提问: 求助keil C中，我接收两个uchar，想把两个uchar中间加个小数点，再把这两个数和小数点组成字符串的形式

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

user: user-1
content: 用strcat把三个字符拼成一个字符串

user: user-2
content: 为字符串分配内存，然后复制第一个uchar到第0个字符，复制'.'到第1个字符，复制第2个uchar到第2个字符，复制'\0'到第3个字符

user: user-0
content: 小白求助呀！！！
user-0 提问: c primer plus 这里是不是有个错误啊？

回复:
user: user-1
content: char side_a[] = 'SIDE A' ; 这种用法是错的  应该是char side_a[] = "SIDE A'";  放在双引号里  此时side_a是字符串，SIDE A是字符串的内容

user: user-2
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-3
content: 这种问题你自己瞧一瞧代码就知道了，我测试结果是编译错误 http://coliru.stacked-crooked.com/a/1803b04c5e496e93
user-0 提问: c语言do wile 循环条件用int 变量

回复:
user: user-0
content: 通过了，最后少了括号，应为： while ( i);

user: user-1
content: 建议楼主重新表述下问题。 或者自己单步调试。 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: 什么叫做调试没有通过？是你看到i被赋值为0，但是循环没有结束吗？
user-0 提问: c语言，函数执行完释放内存的相关问题。

回复:
user: user-1
content: 指针指向的对象在函数 f 结束之后就不存在了。

user: user-2
content: 局部变量的地址是在栈上的,函数调用使用的是栈,你注释掉的printf语句覆盖了stack上s变量地址的值,函数结束后是把ESP指针(指向栈顶)下移(就是释放了s的空间,下次操作栈的时候会把这部分当成可使用的,比如函数的参数,局部变量都会使用到),你用绝对地址的方式还是可以访问到的,并没有做可写可读的限制

user: user-3
content: 栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……

user: user-4
content: 不要让指针指向局部变量，否则结果是未定义的，也就是说可能与你期望的相同，也可能与你期望的不同，甚至出错  当你运行了printf之后，之前的变量被覆盖了，所以结果不同了

user: user-5
content: 你函数里面的形参是int **型(指向指针的指针)，所以指向的s也得是一个指针，但是你s却定义成int型。
user-0 提问: 关于opencv里的内存泄漏

回复:
user: user-1
content: VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533

user: user-1
content: 提醒：OpenCV是开源的。  检查是否资源泄漏的办法之一： 在任务管理器 进程 查看 选择列 里面选择：内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍，越多越好，比如1000000次甚至无限循环，记录以上各数值，再隔至少一小时，越长越好，比如一个月，再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加，则铁定有对应资源的资源泄漏！  搜“GDI泄露检测”
user-0 提问: 二级指针，绕不出来了，大神求指教

回复:
user: user-1
content: 最好不要这样写char **p = NULL; 指针变量应该在定义的时候就赋值： char **p = &q;

user: user-2
content: *p = q; 明显不对，不管你什么类型指针，只要没有给它分配内存，或者让指针指向有效对象，就不能去解引指针（*p）

user: user-3
content: q = s;    这一句是可以的。 *p = q;  这一句是不行的。 p 现在指向NULL，*p 就是非法的。  可以改成： p = &p；

user: user-4
content: 理解和讨论之前请先学会如何观察！  仅供参考：//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-2
content: 引用 4 楼 qq_33242956 的回复:[quote=引用 2 楼 paschen 的回复:] *p = q; 明显不对，不管你什么类型指针，只要没有给它分配内存，或者让指针指向有效对象，就不能去解引指针（*p）  这是我想的就是这样，编译可以通过的，运行段错误；但是其他人运行就可以了 char **p; char s[12] = "hello"; char *q = s; printf("%p\n", p); *p = q; printf("%p\n", p); 别人运行两次的打印结果是一样的，我用的4.6.3的gcc在Ubuntu系统下编译运行，是段错误。出段错误的就是*p = q；[/quote]  解引野指针的结果是未定义的，看似正确不代表正确，或许你把什么不属于你的内存覆盖了，也或许这个内存还没有分配物理存储器，也就出错了

user: user-0
content: 引用 2 楼 paschen 的回复:*p = q; 明显不对，不管你什么类型指针，只要没有给它分配内存，或者让指针指向有效对象，就不能去解引指针（*p）  这是我想的就是这样，编译可以通过的，运行段错误；但是其他人运行就可以了 char **p; char s[12] = "hello"; char *q = s; printf("%p\n", p); *p = q; printf("%p\n", p); 别人运行两次的打印结果是一样的，我用的4.6.3的gcc在Ubuntu系统下编译运行，是段错误。出段错误的就是*p = q；

user: user-5
content: q = s这个是可以的，表示q指向s中的第一个元素。 *p = q这个不行，就如同楼上说的那样。 在理解二级指针的时候，先要把指针弄清楚，把指针弄清楚了，二级指针其实不难理解。 http://blog.csdn.net/xiangdongwang1000/article/details/49658797?locationNum=7&fps=1
user-0 提问: 一道哈弗曼编码的题目

回复:
user: user-1
content: 指针必须要分配空间才能使用，不然指向的是未知区域，尝试写入会导致异常  #include<stdio.h> #include<stdlib.h> #define MAX 100  typedef struct{ 	int bit[MAX]; 	int start; }HCodetype;  int main() { 	int n = 1; 	HCodetype *cd = (HCodetype *)malloc(sizeof(HCodetype)); 	cd->start = n - 1; 	return 0; }

user: user-2
content: 学习 学习。

user: user-0
content: 问题已解决，非常感谢上面三位大神的教导

user: user-0
content: 改为HCodetype *cd=(HCodetype *)malloc(sizeof(HCodetype));还是不行

user: user-0
content: 怎么改？？大神

user: user-3
content: 意思就是你就定义了一个指针，但是你的指针没有指向的对象，你怎么用，用了当然要崩溃咯！

user: user-0
content: 不要NULL也是崩溃啊

user: user-0
content: 不太懂，应该怎么改？

user: user-4
content: 因为你的cd是NULL，你的cd并滑指向有效的内存，你就cd->start所以错了  NULL这真内存是不可访问的

user: user-0
content: void HaffmanCode() {     HCodetype *cd=NULL;     int i,j,c,p;     FILE *fp;     for(i=0;i<n;i++)     {         cd->start=n-1;         c=i;         p=HuffMTree[c]->parent;         while(p!=-1)         {             if(HuffMTree[p]->lchild==c)                 cd->bit[cd->start]=0;             else                 cd->bit[cd->start]=1;             cd->start--;             c=p;             p=HuffMTree[c]->parent;         }         for(j=cd->start+1;j<n;j++)             HuffCode[i]->bit[j]=cd->bit[j];         HuffCode[i]->start=cd->start+1;     }
user-0 提问: C语言 .exe已停止 大神们帮我看下代码哪里出错了

回复:
user: user-1
content: 要在函数内修改指针的指向，必须传二级指针或者一级指针的引用才行 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: jie函数参数p、q是按值传递的，也就是说函数中的参数只是实参的一个复制品，你在jie函数中修改的p q 的值也只是修改一个复制的对象，主函数中的仍然是NULL，这导致后面解引出错  如果要修改指针的值，需要要传入指针的地址

user: user-3
content: 主函数中p,q改成double类型，传参时改成&p, &q,  jie函数中，给p,q赋值改成*p = x1, *q = x2
user-0 提问: 如何将两个ASCII字符合成一个字节

回复:
user: user-1
content: 这个能合并？你要用来干什么？如果是不可逆的，你自己随便定义操作就行，但如果要是可逆的，我想我不使用其他的存储信息，合并应该有问题吧

user: user-2
content: 赵４老师，好像有点不对哦，验证了，42F0E666试下，　　BCD[i/2]=(sv[i]<<4)|(sv[i+1]&0x0F);

user: user-3
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <conio.h> unsigned int iv,i; unsigned char BCD[5];//定长10位BCD码 unsigned char sv[11]; void main() {     iv=123456789;//最大10位无符号正整数     //INT2BCD     sprintf(sv,"%010u",iv);     for (i=0;i<10;i+=2) {         BCD[i/2]=(sv[i]<<4)|(sv[i+1]&0x0F);     }     printf("BCD=%02x%02x%02x%02x%02x\n",BCD[0],BCD[1],BCD[2],BCD[3],BCD[4]);     //BCD2INT     for (i=0;i<10;i+=2) {         sv[i]='0'|(BCD[i/2]>>4);         sv[i+1]='0'|(BCD[i/2]&0x0F);     }     sscanf(sv,"%010u",&iv);     printf("iv=%010u\n",iv);     getch(); }

user: user-0
content: 大神,给代码呗,随便c,c++或者oc都行啊

user: user-4
content: 位运算 : 位左移和位或
user-0 提问: 蓝桥杯 十六进制转十进制 

回复:
user: user-1
content: #include <stdio.h> #include <string.h> #include <math.h> int a[10]; char s[10]; int main() { 	gets(s); 	memset(a,0,sizeof(a)); 	int len=strlen(s); 	int i,k=0,sum=0; 	for(i=len-1;i>=0;i--) 	{ 		if(s[i]>='0'&&s[i]<='9') 			a[k++]=s[i]-'0'; 		else if(s[i]>='A'&&s[i]<='Z') 			a[k++]=s[i]-55; 		else 			a[k++]=s[i]-87; 	} 	for(i=9;i>=0;i--) 	{ 		sum+=a[i]*pow(16,i); 	} 	printf("%d\n",sum); 	return 0; } 我的也错了...有一组测试数据过不了

user: user-2
content: 你让小写的a到f情何以堪？

user: user-3
content: 除了不支持0x前缀的输入之外，第二个代码输入的A~F只能是大写，没有处理小写的情况

user: user-4
content: 没仔细看，目测第二段代码不支持 0x123 这样的输入吧？

user: user-0
content: 我觉得自己的代码应该没有问题吧，两个程序用来测试得到的结果是一样的
user-0 提问: 错误：expected ‘)’ before ‘*’ token

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:目测没什么问题，你加上防止重复编译的宏定义看看？另外，头文件自己include自己是什么意思？ 兄弟，刚才忘记刷新网页就结贴了，自己也是单文件拿出来测试的时候发现了这个隐蔽的错误的，不管怎样，非常感谢

user: user-0
content: 引用 1 楼 user-1 的回复:目测没什么问题，你加上防止重复编译的宏定义看看？另外，头文件自己include自己是什么意思？ 确实是宏定义的问题，宏定义的头拷贝了其他文件的，忘记改过来了，应该是自己的头文件没有被包含，只是编译器提示有点不太准确

user: user-1
content: 目测没什么问题，你加上防止重复编译的宏定义看看？另外，头文件自己include自己是什么意思？
user-0 提问: 死循环怎么办

回复:
user: user-1
content: 引用 3 楼 小灸舞的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 太对了，别人说在多变，自己不动手还是学不会。

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-3
content: 你这个不能找水仙花数，返回0或1有啥用啊？你不应该返回水仙花数吗？

user: user-4
content: 并不是 死循环吧，而是应为你是函数返回只有0和1，所以给你返回了900个0或者1让你有一种死循环的错觉吧
user-0 提问: 关于C语言文件传输问题  新手求指点

回复:
user: user-1
content: tcp链路是一一对应的，关闭了服务端，还要求客户端不关闭，是啥需求？？

user: user-2
content: 最好→最后

user: user-2
content: 试试改变协议，让最后收到某条数据的那端关闭连接；而不是让最好发出某条数据的那端关闭连接。
user-0 提问: c语言 如何判断一个 字符串 中某一个字符 等于一个字符常量？

回复:
user: user-1
content: 用指针或者数组的下标索引都可以

user: user-2
content: if (ch[3] == '-') {      //做你想做的事 }

user: user-3
content: 利用数组判断a[3]是否等于'-'

user: user-4
content: const char* pstr = "123-456"; if( *(pstr + 3) == '-' ) { }
user-0 提问: 最近在做一个涉及缅甸文显示的项目，然后因为缅甸文字库的编码形式好像有别于我们使用的GBK编码格式，所以前来请教

回复:
user: user-1
content: 仅供参考：#pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <windows.h> HWND WINAPI GetConsoleWindow(); void HideTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = FALSE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } void ShowTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = TRUE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } int main() {     HWND  hwnd;     HDC   hdc;     HFONT hfont;      system("color F0");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hfont = CreateFont(48, 0, 0, 0, 0, 0, 0, 0, 0             , 0, 0, 0, 0, "Arial Unicode MS");     SelectObject(hdc,hfont);     TextOutW(hdc,10,10,L"你好",2);     DeleteObject(hfont);     hfont = CreateFont(48, 0, 0, 0, 0, 0, 0, 0, JOHAB_CHARSET , 0, 0, 0, 0, "Arial Unicode MS");     SelectObject(hdc,hfont);     TextOutW(hdc,10,80,L"\xb7f0\xb7f0\xb2dd\xb2dd",4);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     getch();     system("color 07");     system("cls");     ShowTheCursor();     return 0; }
user-0 提问: C语言 新手求教 while(*p++)； 为何不等于while(*p!='\0') *p++;

回复:
user: user-0
content: 谢谢大家喽~~~

user: user-1
content: 第一个ASCII码，对应的字符是（Null），其实就是‘\0’，即空字符。 可以被当做判断的表达式。

user: user-2
content: 楼上(#4)要表达的是: 表示当a[i] 为0时退出循环a[i]非 0时循环.

user: user-3
content: 引用另外关于 while(*p++=*q++)  最后停止是q指向了'\0'  停止了  是的   引用还有一个相似的 for(;a[i];) {......}  表示当a[i] 非0时退出循环  '\0'实际是一个值为0的字符，所以可以用作循环判断

user: user-4
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-0
content: 打错了 标题中 应该是while(*p!='\0') p++;

user: user-5
content: 用表达式的值作为条件进行判断。
user-0 提问: 刚开始学数据结构的问题

回复:
user: user-0
content: 引用 1 楼 取个名字这么麻烦的回复:node应该是一个自定义的结构体，然后通过typedef为这个新的结构体取了一个别名叫Node，例如 typedef struct node {     int a;     int b; }Node; 写错位置了，c用得不熟练

user: user-0
content: 引用 2 楼 qq_36409192的回复:定义的结构是需要在程序中定义的，没有定义当然会给出错误提示。 ps：楼主多看看书吧，这是最基本的东西 在main里面已经定义了，自己试了一下要把这个insert写在main里面就可以，可是我之前是想写在main外面添加声明这样用的。

user: user-1
content: 定义的结构是需要在程序中定义的，没有定义当然会给出错误提示。 ps：楼主多看看书吧，这是最基本的东西

user: user-2
content: node应该是一个自定义的结构体，然后通过typedef为这个新的结构体取了一个别名叫Node，例如 typedef struct node {     int a;     int b; }Node;

user: user-1
content: 引用 3 楼 hxf0224的回复:[quote=引用 2 楼 qq_36409192的回复:]定义的结构是需要在程序中定义的，没有定义当然会给出错误提示。 ps：楼主多看看书吧，这是最基本的东西 在main里面已经定义了，自己试了一下要把这个insert写在main里面就可以，可是我之前是想写在main外面添加声明这样用的。[/quote] 楼主，请把问题说清楚点。
user-0 提问: 这是我用vc++6.0做的一个星期查询，能不能把代码简单化？

回复:
user: user-1
content: 仅供参考：#include <afxdisp.h> #include <stdio.h> #include <stdlib.h> int main(int argc, TCHAR* argv[]) {     COleDateTime t;     COleDateTimeSpan ts;     CString s,fmt;     int nYear;     int nMonth;     int nDay;     int nHour;     int nMin;     int nSec;     int lDays;     int nHours;     int nMins;     int nSecs;     int i,N;     // initialize MFC and print and error on failure     if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {         printf("Fatal Error: MFC initialization failed\n");         return 1;     }     if (argc<13) {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 2;     }     if (stricmp(argv[12],"SQL")==0) fmt="%Y-%m-%d %H:%M:%S";     else if (stricmp(argv[12],"YYYY")==0) fmt="%Y%m%d %H%M%S";     else if (stricmp(argv[12],"YY")==0) fmt="%y%m%d %H%M%S";     else {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 3;     }     nYear =atoi(argv[ 1]);     nMonth=atoi(argv[ 2]);     nDay  =atoi(argv[ 3]);     nHour =atoi(argv[ 4]);     nMin  =atoi(argv[ 5]);     nSec  =atoi(argv[ 6]);     lDays =atoi(argv[ 7]);     nHours=atoi(argv[ 8]);     nMins =atoi(argv[ 9]);     nSecs =atoi(argv[10]);     N     =atoi(argv[11]);     if (N<=0) {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 4;     }     t=COleDateTime( nYear, nMonth, nDay, nHour, nMin, nSec);     ts=COleDateTimeSpan( lDays, nHours, nMins, nSecs );     for (i=1;i<=N;i++) {         s=t.Format(fmt);         printf("%08d %s\n",i,s);         t=t+ts;     }     return 0; }

user: user-1
content: COleDateTime::GetDayOfWeek int GetDayOfWeek( ) const;  Return Value  The day of the week represented by the value of this COleDateTime object.  Remarks  Call this member function to get the day of the month represented by this date/time value.  Valid return values range between 1 and 7, where 1=Sunday, 2=Monday, and so on. If the status of this COleDateTime object is not valid, the return value is AFX_OLE_DATETIME_ERROR.  For information on other member functions that query the value of this COleDateTime object, see the following member functions:   GetDay   GetMonth   GetYear   GetHour   GetMinute   GetSecond   GetDayOfYear  COleDateTime Overview |  Class Members |  Hierarchy Chart  See Also   COleDateTime::COleDateTime, COleDateTime::SetDateTime, COleDateTime::operator =, COleDateTime::GetStatus

user: user-2
content: 如果觉得主函数太长可以分成几个函数来执行相关功能
user-0 提问: 请问C语言怎么比较两张图的相似程度？

回复:
user: user-0
content: 引用 16 楼 paschen 的回复:[quote=引用 15 楼 yyxgs 的回复:] [quote=引用 14 楼 paschen 的回复:] [quote=引用 10 楼 paschen 的回复:] [quote=引用 8 楼 yyxgs 的回复:] [quote=引用 2 楼 paschen 的回复:] opencv可以很容易实现  Windows和Android上都可以吗？[/quote]  可以，OPENCV是跨平台的[/quote]  OPENCV 1.0 是C语言的，之后版本好像也保留了C的接口[/quote]  我看了百科了，“保留了大量的C的接口”，也就是说真正适合的还是C++。。[/quote]  是的，OPENCV2.X 3.X都是用C++写的[/quote]   哦哦，谢谢！那还是等以后学了C++再考虑opencv吧。

user: user-1
content: 引用 17 楼 yyxgs 的回复:[quote=引用 16 楼 paschen 的回复:] [quote=引用 15 楼 yyxgs 的回复:] [quote=引用 14 楼 paschen 的回复:] [quote=引用 10 楼 paschen 的回复:] [quote=引用 8 楼 yyxgs 的回复:] [quote=引用 2 楼 paschen 的回复:] opencv可以很容易实现  Windows和Android上都可以吗？[/quote]  可以，OPENCV是跨平台的[/quote]  OPENCV 1.0 是C语言的，之后版本好像也保留了C的接口[/quote]  我看了百科了，“保留了大量的C的接口”，也就是说真正适合的还是C++。。[/quote]  是的，OPENCV2.X 3.X都是用C++写的[/quote]   哦哦，谢谢！那还是等以后学了C++再考虑opencv吧。[/quote] 识时务者为俊杰。

user: user-2
content: 引用 15 楼 yyxgs 的回复:[quote=引用 14 楼 paschen 的回复:] [quote=引用 10 楼 paschen 的回复:] [quote=引用 8 楼 yyxgs 的回复:] [quote=引用 2 楼 paschen 的回复:] opencv可以很容易实现  Windows和Android上都可以吗？[/quote]  可以，OPENCV是跨平台的[/quote]  OPENCV 1.0 是C语言的，之后版本好像也保留了C的接口[/quote]  我看了百科了，“保留了大量的C的接口”，也就是说真正适合的还是C++。。[/quote]  是的，OPENCV2.X 3.X都是用C++写的

user: user-0
content: 引用 14 楼 paschen 的回复:[quote=引用 10 楼 paschen 的回复:] [quote=引用 8 楼 yyxgs 的回复:] [quote=引用 2 楼 paschen 的回复:] opencv可以很容易实现  Windows和Android上都可以吗？[/quote]  可以，OPENCV是跨平台的[/quote]  OPENCV 1.0 是C语言的，之后版本好像也保留了C的接口[/quote]  我看了百科了，“保留了大量的C的接口”，也就是说真正适合的还是C++。。

user: user-2
content: 引用 10 楼 paschen 的回复:[quote=引用 8 楼 yyxgs 的回复:] [quote=引用 2 楼 paschen 的回复:] opencv可以很容易实现  Windows和Android上都可以吗？[/quote]  可以，OPENCV是跨平台的[/quote]  OPENCV 1.0 是C语言的，之后版本好像也保留了C的接口

user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:https://www.baidu.com/s?wd=sift   好算法！。。可是怎么使用呢？

user: user-0
content: 引用 10 楼 paschen 的回复:[quote=引用 8 楼 yyxgs 的回复:] [quote=引用 2 楼 paschen 的回复:] opencv可以很容易实现  Windows和Android上都可以吗？[/quote]  可以，OPENCV是跨平台的[/quote]  这个又是C++编写的....是不是要用它又得先会C++.....?

user: user-1
content: https://www.baidu.com/s?wd=sift

user: user-2
content: 引用 8 楼 yyxgs 的回复:[quote=引用 2 楼 paschen 的回复:] opencv可以很容易实现  Windows和Android上都可以吗？[/quote]  可以，OPENCV是跨平台的

user: user-3
content: 难道要一个一个像素比较

user: user-4
content: 应该可以异或操作下吧。具体我也不知道。好像楼上的那个方法挺好的

user: user-0
content: 引用 4 楼 shihengzhen101 的回复:难道要一个一个像素比较  哈哈，一个个像素比较也行啊，怎么个比法呢？

user: user-0
content: 引用 2 楼 paschen 的回复:opencv可以很容易实现  Windows和Android上都可以吗？

user: user-0
content: 引用 1 楼 user-5 的回复:什么图？不同的图不同的比较方法  就是一般的jpg、bmp、png格式的图片

user: user-1
content: http://cn.bing.com/images/search?q=%E6%94%AF%E4%BB%98%E9%B8%A8&FORM=BILH1

user: user-1
content: (.)(.) 和 支付鸨 最新放出的哪几幅图片 相似？  http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E6%94%AF%E4%BB%98%E9%B8%A8

user: user-2
content: opencv可以很容易实现

user: user-5
content: 什么图？不同的图不同的比较方法
user-0 提问: （初学者）这个代码怎么哪错了？为什么没有输出？

回复:
user: user-1
content: VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-3
content: #include <stdio.h>                                     int main() {          char array[100] = "我叫陈玉涛啦啦啦";      int length = 0;      while (array[length++])      |   ;      length--;      int min = 0;      int max = length - 1;      int tmp;       while (min < max)    /* Delete the ';' */                                                                                                                                                                  {      |   /*      |   char temp = array[min];      |   array[min] = array[max - 1];      |   array[max - 1] = temp;            |   temp = array[min + 1];      |   array[min + 1] = array[max];      |   array[max] = temp;             |   min += 2;      |   max -= 2;      |   */      |   tmp = array[min];        |   array[min] = array[max];      |   array[max] = tmp;      |   min++;      |   max--;                             }                            printf("%s\n", array);              return 0;                            }

user: user-4
content: while有分号就是空语句了

user: user-5
content: 粗看了一下，你的第二个while后面多了个分号
user-0 提问: 又有莫名的新概念了，函数宏到底是个什么玩意儿？

回复:
user: user-1
content: 引用 11 楼 ipqtjmqj 的回复:[quote=引用 10 楼 zhao4zhong1 的回复:] 理解和讨论之前请先学会如何观察！  VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898 赵老师自己也没观察，楼主问的是“函数宏”与“宏函数”的区别[/quote] 我不需要观察，只需要告诉人怎么去观察。

user: user-2
content: 宏,  不管是常量宏, 还是函数宏.  都是成变不离其中.  都是编译时做代码替换,     比如最常用常用的 取最大值的宏    #define max(a,b)    (((a) > (b)) ? (a) : (b))  它就是一个宏函数 实际还不是代码替换,  展开后就是一个   问号表达式

user: user-3
content: 你得给出上下文。

user: user-4
content: #define MACRO(x,y) ((x) + (y))  宏是可以带参数的

user: user-5
content: macro function, function macro你是从哪本书上看到的，要联系上下文

user: user-0
content: 引用 2 楼 qq_36409192 的回复:概念性的问题可以自己去百度搜一下 度娘的结果含混不清，借东说西，有时候反而容易误导。还是来坛子里请教各位老师前辈比较有针对性。

user: user-5
content: 引用 10 楼 zhao4zhong1 的回复:理解和讨论之前请先学会如何观察！  VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898 赵老师自己也没观察，楼主问的是“函数宏”与“宏函数”的区别

user: user-1
content: 理解和讨论之前请先学会如何观察！  VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898

user: user-6
content: 个人理解：  函数宏—— 类似函数的宏，如max宏  宏函数——宏展开后调用的是一个函数，如ZeroMemory

user: user-7
content: 宏的使用无非就是给代码起个别名，然后在使用的时候不必每次都把代码写上去。一般用在： 1.常用数字，如：#define  N  10 2.一句代码或者几句代码的替换（你说的函数其实就是这一种） 3.变量类型的说明（某些类型可能有多种意思，使用宏可以增加代码的可读性）

user: user-7
content: 概念性的问题可以自己去百度搜一下

user: user-7
content: 引用 4 楼 stalk12 的回复:[quote=引用 2 楼 qq_36409192 的回复:] 概念性的问题可以自己去百度搜一下 度娘的结果含混不清，借东说西，有时候反而容易误导。还是来坛子里请教各位老师前辈比较有针对性。[/quote] 楼主先看看这个 http://blog.csdn.net/hust_sheng/article/details/51093889?locationNum=2&fps=1

user: user-5
content: 应该是一个东西，宏函数比较常用，说成函数宏是强调本质是个宏吧
user-0 提问: 请教C语言写的简单字典程序的问题

回复:
user: user-1
content: 很明显是你申请的堆空间被越界写入了，导致堆被破坏，所以析构时出错。

user: user-2
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

user: user-3
content: 点击重试，然后点击中断，通过调用堆栈定位到相关代码，观察分析原因，必要时可单步跟踪程序运行  从提示看，很可能是堆越界了

user: user-4
content: 刚自学就那么厉害啦，膜
user-0 提问: 求乘方运算程序报错，求助

回复:
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-2
content: 自己写的函数如果出现undefined reference to XXXXXX错误 此时检查下： 1.函数是不是只有声明而没有实现 2.函数的声明和实现是否一致（比如函数名的拼写，参数的个数，类型）

user: user-3
content: #include<stdio.h> #include<math.h> int main() { 	double calpow(double,double); 	double num,power,answer; 	printf("Please enter tne number you want to calculate it's power:\n"); 	scanf("%lf",&num); 	printf("Please enter hou much power of %f you want to know:\n",num); 	scanf("%lf",&power); 	answer=calpow(num,power); 	printf("The answer is %lf.\n",answer); 	return 0; } double calpow(double num,double power) { 	return pow(num,power); }

user: user-4
content: answer=pow(num,power);  改成：  int answer=pow(num,power);   #include<stdio.h> #include<math.h> int main() { 	float calpow(float,float); 	float num,power,answer; 	printf("Please enter tne number you want to calculate it's power:\n"); 	scanf("%f",&num); 	printf("Please enter hou much power of %f you want to know:\n",num); 	scanf("%f",&power); 	answer=calpow(num,power); 	printf("The answer is %f.\n",answer); 	return 0; } float calpow(float num,float power) { 	int answer=pow(num,power); 	return answer; }

user: user-4
content: int calpow(float num,float power,float answer)  改成  float calpow(float num,float power)

user: user-5
content: float calpow(float,float);    // 只有声明却没有定义  // 定义 与  声明的 函数参数 需要保持一致 int calpow(float num,float power) {     float  answer=pow(num,power);     return answer; }
user-0 提问: 关于函数内的一个问题

回复:
user: user-1
content: 32位机上sizeof(a)恒为4 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 引用 1 楼 u014444402 的回复:要学会调试啊，函数参数中传递数组会退化成指针，所以你在查找函数里面的长度是不对的。谢谢

user: user-2
content: 要学会调试啊，函数参数中传递数组会退化成指针，所以你在查找函数里面的长度是不对的。
user-0 提问: 最近学习数据结构，按照例子写了个顺序栈，怎么写都是错的，求大神指教

回复:
user: user-0
content: 引用 3 楼 qq423399099 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  提醒的很对，主要我一直搞得java，现在学习c，指针这块还不怎么了解，而且基本用的在线编译...没下什么ide、

user: user-0
content: 引用 1 楼 u012924019 的回复:建议多看C语音基础吧 1. #define 2. 结构体指针 3. ==和=   赋值非初始化 4. 循环打印时i 初始值 修改后代码  #define Max_Size 100  typedef int SElemtype;  typedef struct { 	SElemtype data[Max_Size]; 	int top; }Sqstack;  void init(Sqstack *s) { 	s->top = 0; }   void Push(Sqstack *s, int e) { 	s->top++; 	s->data[s->top] = e; }  int Pop(Sqstack *s, int e) { 	s->top--; 	return s->data[s->top + 1]; }  int main() { 	Sqstack sq; 	int i = 0, j = 0; 	init(&sq);  	for (; i <= 5; i++) 	{ 		Push(&sq, i); 	}  	i = 0; 	for (; i <= 5; i++) 	{ 		j = Pop(&sq, i); 		printf("出栈[%d]\t", j); 	} 	return 0; }   多谢大神，对*和& 这块了解的不是很透彻，看来要抽时间学下了。

user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: 如果编译通过了，还是有问题，那么你可以进行单步调试或者在程序中通过使用输出相关变量的方法来找出有问题的语句。ps.建议楼主多看下书吧！感觉你基础的东西都没学清楚。

user: user-3
content: 建议多看C语音基础吧 1. #define 2. 结构体指针 3. ==和=   赋值非初始化 4. 循环打印时i 初始值 修改后代码  #define Max_Size 100  typedef int SElemtype;  typedef struct { 	SElemtype data[Max_Size]; 	int top; }Sqstack;  void init(Sqstack *s) { 	s->top = 0; }   void Push(Sqstack *s, int e) { 	s->top++; 	s->data[s->top] = e; }  int Pop(Sqstack *s, int e) { 	s->top--; 	return s->data[s->top + 1]; }  int main() { 	Sqstack sq; 	int i = 0, j = 0; 	init(&sq);  	for (; i <= 5; i++) 	{ 		Push(&sq, i); 	}  	i = 0; 	for (; i <= 5; i++) 	{ 		j = Pop(&sq, i); 		printf("出栈[%d]\t", j); 	} 	return 0; }
user-0 提问: 关于C语言文件读取fopen函数的问题

回复:
user: user-1
content: 学习受教了，不过每天进步还是太少

user: user-2
content: 引用 2 楼 Tony_cheer 的回复:问题解决谢谢！ 可是我记得新的C99?是可以在使用变量时再定义呀，为何这里不行呢？  VS不支持C99

user: user-3
content: C99真不支持  http://msdn.microsoft.com/en-us/library/02y9a5ye.aspx  Microsoft C conforms to the standard for the C language as set forth in the 9899:1990 edition of the ANSI C standard.

user: user-4
content: Microsoft Visual C++ 	Partial[13] 	 Visual C++ 2012 and earlier did not support C99.[28][29][30] Visual C++ 2013 implements a limited subset of C99 required to compile popular open-source projects.[31][32] Visual C++ 2015 implements the C99 standard library, with the exception of any library features that depend on compiler features not yet supported by the compiler (for example, <tgmath.h> is not implemented).[13]

user: user-4
content: 引用 3 楼 Tony_cheer 的回复:@user-4 我查了下，好像也不是完全支持C99,参考

user: user-4
content: 引用 3 楼 Tony_cheer 的回复:@user-4 估计得设置一下编译器吧

user: user-0
content: @user-4

user: user-0
content: 问题解决谢谢！ 可是我记得新的C99?是可以在使用变量时再定义呀，为何这里不行呢？

user: user-4
content: 变量定义要放最前面
user-0 提问: 请问结构体应该怎样排序？

回复:
user: user-1
content: 结构体排序和普通的数组排序道理是 一样的。 比较的时候比较的是结构体变量的某个成员。 交换的时候交换的是整个结构体，其他都一样。

user: user-2
content: 具体没细看，不过for(k=j+1;k<i-1;k++){ 应该是：for(k=j+1;k<i;k++){ 吧  http://blog.chinaunix.net/uid-26404477-id-3086025.html

user: user-0
content: 引用 1 楼 paschen 的回复:具体没细看，不过for(k=j+1;k<i-1;k++){ 应该是：for(k=j+1;k<i;k++){ 吧  http://blog.chinaunix.net/uid-26404477-id-3086025.html 谢谢，我用冒泡法搞定了，我原意是想有选择排序的，一开始是k<i;，（我忘记改回来了），也不行

user: user-3
content: 仅供参考：//学号 姓名 电话 成绩 //01 XXX 182XXXXXXXX 88 #include <stdio.h> #include <string.h> #define MAXS 10000 struct ST {     int XH;     char XM[11];     char DH[13];     int CJ; } st[MAXS],t; int n,i,j; char ln[80]; FILE *f; int main() {     f=fopen("in.txt","r");     if (NULL==f) {         printf("Can not open file in.txt!\n");         return 1;     }     i=0;     while (1) {         if (NULL==fgets(ln,80,f)) break;         if (4!=sscanf(ln,"%d%10s%12s%d",&st[i].XH,st[i].XM,st[i].DH,&st[i].CJ)) {             st[i].XH=0;             strcpy(st[i].XM,"Unknown");             strcpy(st[i].DH,"Unknown");             st[i].CJ=0;             printf("line %d format error:%s!\n",i+1,ln);         }         i++;         if (i>=MAXS) {             printf(">%d lines Ignored.\n",MAXS);             break;         }     }     fclose(f);     n=i;     for (i=0;i<n-1;i++) {         for (j=i+1;j<n;j++) {             if (st[i].CJ<st[j].CJ) {t=st[i];st[i]=st[j];st[j]=t}         }     }     for (i=0;i<n;i++) {         printf("%5d%10s%12s%4d\n",st[i].XH,st[i].XM,st[i].DH,st[i].CJ);     }     return 0; }
user-0 提问: 请教一下动态库和共享库的具体区别，以及.so和.dll的具体区别。

回复:
user: user-1
content: 动态链接库 .dll  对应WINDOWS  共享库  .so  对应LINUX  本质差不多，都是动态装载链接  具体可看：《程序员的自我修养——链接、装载与库》

user: user-2
content: 一个是 Linux 家的，一个是 Windows 家的。

user: user-3
content: 库可以有三种使用的形式：静态、共享和动态。静态库的代码在编译时就已连接到开发人员开发的应用程序中，而共享库只是在程序开始运行时才载入，在编译时，只是简单地指定需要使用的库函数。动态库则是共享库的另一种变化形式。动态库也是在程序运行时载入，但与共享库不同的是，使用的库函数不是在程序运行开始，而是在程序中的语句需要使用该函数时才载入。动态库可以在程序运行期间释放动态库所占用的内存，腾出空间供其它程序使用。由于共享库和动态库并没有在程序中包括库函数的内容，只是包含了对库函数的引用，因此代码的规模比较小 PS：以上内容来自http://wenku.baidu.com/link?url=XDxbfNLKv3LwscptyjUEiet2rhI5idQYQD2pgo4OPS--iKZrxRLSfMtTjO0S8j244l3ctaffaVeQGxYz18Fc7jW6gH_1cF4D2hYhngndpNa

user: user-4
content: .so用objdump查看。  .dll用dumpbin.exe查看。
user-0 提问: 请帮忙看下哪里错了  感谢！！！

回复:
user: user-1
content: 引用 2 楼 qq_35983245 的回复:[quote=引用 1 楼 paschen 的回复:] CreatSMatrix函数没有返回一个值  PrintSMartrix 也没有返回 这个没关系吧  主要是输出不对[/quote]  建议在必要的地方设置断点，然后单步跟踪程序运行，看每条语句执行结果与你期望是否一致

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-3
content: 调试一下，看看每个值是否和你想要的值相符，找出不对的地方，再根据这个值来找你错的位置。

user: user-0
content: 引用 1 楼 paschen 的回复:CreatSMatrix函数没有返回一个值  PrintSMartrix 也没有返回 这个没关系吧  主要是输出不对

user: user-1
content: CreatSMatrix函数没有返回一个值  PrintSMartrix 也没有返回
user-0 提问: 字符易位破译程序，下面是我写的，看不懂Debug，请解释一下，谢谢

回复:
user: user-1
content: 这样改：  #include <stdio.h> int change(char a[5],char b[5]) { 	int i,j; 	for(i=0;i<5;i++) a[i]=(int)a[i]; 	for(j=0;j<5;j++) b[i]=(int)b[i]; 	return (a[5],b[5]); }  int sort(char a[5],char b[5]) { 	int i,j,t; 	for(i=0;i<4;i++) 	{ 		if(a[i]>a[i+1]) {t=a[i];a[i]=a[i+1];a[i+1]=t;} 	}	 	for(j=0;j<4;j++) 	{ 		if(b[i]>b[i+1]) {t=b[i];b[i]=b[i+1];b[i+1]=t;} 	} 	return (a[5],b[5]); }	   int compare(char a[5],char b[5]) { 	int i; 	for(i=0;i<5;i++) 	{ 		if (a[i]==b[i]) printf("是字母异位词"); 		else printf("不是字母异位词"); 	} }   int main() { 	int i,j; 	char a[5]; 	char b[5]; 	for(i=0;i<5;i++) scanf("%s",&a); 	for(j=0;j<5;j++) scanf("%s",&b); 	change (a,b); 	sort (a,b); 	compare (a,b); }

user: user-2
content: 不知道你的程序是干什么的，只能把语法错误调没了 #include <stdio.h> int change(char a[5],char b[5]) { 	int i,j; 	for(i=0;i<5;i++) a[i]=(int)a[i]; 	for(j=0;j<5;j++) b[i]=(int)b[i]; 	return (a[5],b[5]); }  int sort(char a[5],char b[5]) { 	int i,j,t; 	for(i=0;i<4;i++) 	{ 		if(a[i]>a[i+1]) {t=a[i];a[i]=a[i+1];a[i+1]=t;}; 	}	 	for(j=0;j<4;j++) 	{ 		if(b[i]>b[i+1]) {t=b[i];b[i]=b[i+1];b[i+1]=t;}; 	} 	return (a[5],b[5]); }	   int compare(char a[5],char b[5]) { 	int i; 	for(i=0;i<5;i++) 	{ 		if (a[i]==b[i]) printf("是字母异位词"); 		else printf("不是字母异位词"); 	} 	return 0; }   int main() { 	int i,j; 	char a[5]; 	char b[5]; 	scanf("%s",&a); 	scanf("%s",&b); 	change(a,b); 	sort(a,b); 	compare(a,b); }
user-0 提问: Turbo C 为什么不支持windows.h？

回复:
user: user-1
content: include windows.h的全路径,全路径参考下面的博客... http://blog.csdn.net/hyman_c/article/details/53057037

user: user-2
content: 莫非楼主想写的是Win32控制台程序？用VC就可以了。

user: user-3
content: 你需要包含这个文件，这个文件通常在平台SDK目录下，你需要设置包含目录  建议换VS，别去折腾TC了

user: user-2
content: 当真？for DOS的编译器支持windows.h？

user: user-4
content: 建议早转VS2016

user: user-4
content: BC支持windows.h bc++3.1 http://download.csdn.net/source/2805028  Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

user: user-5
content: 需要设置一下include的搜索路径。

user: user-6
content: 支持的，你不会用编译器而已
user-0 提问: 请问C语言Windows记事本的行数用'\n'统计的行数怎么不一样呢？

回复:
user: user-1
content: 引用 4 楼 yyxgs 的回复:[quote=引用 3 楼 u010165006 的回复:] [quote=引用 2 楼 yyxgs 的回复:] [quote=引用 1 楼 u010165006 的回复:] 贴代码看看？有可能读取一行的时候碰到中间有空白字符就没有读取空白后面的半行了。  我知道原因了，记事本显示1024列数据后会自动换行[/quote]  Windows记事本有个自动换行选项。[/quote]  嗯，不过我这个选项，我每次装系统都会关掉的，即使关掉，也只能显示1024列。[/quote]  我的Win7系统的记事本，自动换行默认是开的，你用的是什么系统？1024列没有试过。

user: user-0
content: 引用 3 楼 u010165006 的回复:[quote=引用 2 楼 yyxgs 的回复:] [quote=引用 1 楼 u010165006 的回复:] 贴代码看看？有可能读取一行的时候碰到中间有空白字符就没有读取空白后面的半行了。  我知道原因了，记事本显示1024列数据后会自动换行[/quote]  Windows记事本有个自动换行选项。[/quote]  嗯，不过我这个选项，我每次装系统都会关掉的，即使关掉，也只能显示1024列。

user: user-1
content: 引用 2 楼 yyxgs 的回复:[quote=引用 1 楼 u010165006 的回复:] 贴代码看看？有可能读取一行的时候碰到中间有空白字符就没有读取空白后面的半行了。  我知道原因了，记事本显示1024列数据后会自动换行[/quote]  Windows记事本有个自动换行选项。

user: user-1
content: 引用 6 楼 yyxgs 的回复:[quote=引用 5 楼 u010165006 的回复:] [quote=引用 4 楼 yyxgs 的回复:] [quote=引用 3 楼 u010165006 的回复:] [quote=引用 2 楼 yyxgs 的回复:] [quote=引用 1 楼 u010165006 的回复:] 贴代码看看？有可能读取一行的时候碰到中间有空白字符就没有读取空白后面的半行了。  我知道原因了，记事本显示1024列数据后会自动换行[/quote]  Windows记事本有个自动换行选项。[/quote]  嗯，不过我这个选项，我每次装系统都会关掉的，即使关掉，也只能显示1024列。[/quote]  我的Win7系统的记事本，自动换行默认是开的，你用的是什么系统？1024列没有试过。[/quote]  我也是Win7旗舰，自动换行是关的。但也只能显示1024列。[/quote]  我试了一下，确实只能显示1024列。

user: user-0
content: 引用 5 楼 u010165006 的回复:[quote=引用 4 楼 yyxgs 的回复:] [quote=引用 3 楼 u010165006 的回复:] [quote=引用 2 楼 yyxgs 的回复:] [quote=引用 1 楼 u010165006 的回复:] 贴代码看看？有可能读取一行的时候碰到中间有空白字符就没有读取空白后面的半行了。  我知道原因了，记事本显示1024列数据后会自动换行[/quote]  Windows记事本有个自动换行选项。[/quote]  嗯，不过我这个选项，我每次装系统都会关掉的，即使关掉，也只能显示1024列。[/quote]  我的Win7系统的记事本，自动换行默认是开的，你用的是什么系统？1024列没有试过。[/quote]  我也是Win7旗舰，自动换行是关的。但也只能显示1024列。

user: user-0
content: 引用 1 楼 u010165006 的回复:贴代码看看？有可能读取一行的时候碰到中间有空白字符就没有读取空白后面的半行了。  我知道原因了，记事本显示1024列数据后会自动换行

user: user-1
content: 贴代码看看？有可能读取一行的时候碰到中间有空白字符就没有读取空白后面的半行了。
user-0 提问: 动态库互相调用问题

回复:
user: user-1
content: 在 编写 B 的时候，你不能假定这个 B 是由 A 呼叫的。 她可能是由 C 呼叫的。  所以，你不能这样去理解。  你应该要求，当 B 加载的时候，或者调用某个函数的时候，需要提供一个回调机制。  举个例子： 比如你的 B 的一个函数用来计算一个很复杂的数值，但是需要很长的时间。 此时 B 的这个函数，除了正常的输入参数外，还需要一个回调接口， 这个回调接口就是，当 B 计算完成时，呼叫的一个方法。 至于这个回调到底是什么，是 A 的，还是 C 的，B不知道，也不需要知道。

user: user-2
content: 引用 2 楼 csc008008 的回复:@cyfcsd 感觉不知道哪里不对   都是有源码的，但是A 动态加载B的   但是B想用A里面的FUN  这个怎么做呢 跟动态不动态没关系，只要是源码可改就可以用下面的方法就行，如果不行那可能是其他问题  //main.cpp #include <iostream> #include "a.h"  using namespace std;  int main() { 	fa1(); 	system("pause"); 	return 0; }  //a.h #ifndef _A_H #define _A_H  void fa1(); void fa2();  #endif  //a.cpp #include "b.h" #include <iostream>  using namespace std;  void fa1() { 	cout<<"fa1()"<<endl; 	fb(); } void fa2() { 	cout<<"fa2()"<<endl; }  //b.h #ifndef _B_H #define _B_H  void fb();  #endif  //b.cpp #include <iostream>  using namespace std;  void fb() { 	cout<<"fb()"<<endl; 	fa2(); }

user: user-0
content: @cyfcsd 感觉不知道哪里不对   都是有源码的，但是A 动态加载B的   但是B想用A里面的FUN  这个怎么做呢

user: user-3
content: A中声明回调函数供B调用。

user: user-2
content: 动态库是你自己生成的吗？要是自己生成的应该不会有问题啊，直接调用就可以了啊，你是哪儿出的问题啊
user-0 提问: C语言文件操作fread的小问题

回复:
user: user-0
content: 引用 1 楼 cyfcsd 的回复:你百度下 realloc就知道了，st不是以前的地址了，原先的内容被复制到新的地方了，返回的是新的地址  你的意思我知道，但realloc是在原内存后面不够的时候才指向新地址，有的话仍指向原地址的。  这个代码的问题老师今天说了是昨天他自己写错了。。

user: user-1
content: 你百度下 realloc就知道了，st不是以前的地址了，原先的内容被复制到新的地方了，返回的是新的地址
user-0 提问: windows.h

回复:
user: user-1
content: https://en.wikipedia.org/wiki/Windows.h

user: user-2
content: 不分32位与64位，32位与64位程序都是包含windows.h

user: user-2
content: Windows.h包含了其他Windows头文件，这些头文件的某些也包含了其他头文件。这些头文件中最重要的和最基本的是： WINDEF.H 基本数据类型定义。 WINNT.H 支持Unicode的类型定义。 WINBASE.H Kernel(内核)函数。 WINUSER.H 用户界面函数。 WINGDI.H 图形设备接口函数。 这些头文件定义了Windows的所有资料型态、函数调用、资料结构和常数识别字，它们是Windows文件中的一个重要部分。
user-0 提问: c语言链栈运行时触发断点

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-3
content: 建议你单步跟踪程序运行，观察每一步结果与你期望的是否一致，分析原因   另外你在Push函数中InitStack(s);貌似没有什么意义

user: user-4
content: #include<stdio.h> #include<stdlib.h>  typedef struct {     char name[50];     int age; }DataType;   typedef struct stacknode {     DataType data;     struct stacknode *next; }StackNode;   typedef struct {     StackNode *top; }LinkStack;   StackNode *StackInit(void) {     StackNode *p;     if (p = ((StackNode *)malloc(sizeof(StackNode))))     {         p->next = NULL;         return p;     }     return NULL; }   void InitStack(LinkStack *s) {     s->top = NULL; }     int StackEmpty(LinkStack *s) {     return s->top == NULL; }     void Push(LinkStack *s, DataType x) {     StackNode *p = (StackNode *)malloc(sizeof(StackNode));     p -> data = x;     p->next = s->top;     s->top = p; }     DataType Pop(LinkStack *s) {     DataType x; 	StackNode *p = s->top;     if (StackEmpty(s))     {         printf("stack underflow");     }     x = p->data;     s->top = p->next;     free(p);     return x; }     DataType StackTop(LinkStack *s) {     if (StackEmpty(s))     {         printf("stack is empty");     }     return s->top->data; }    int main(void) { 	LinkStack ls; 	InitStack(&ls);     DataType data, data1;       printf("接下来进行入栈操作!\n");     printf("按照 姓名 年龄依次输入信息:  ");     scanf("%s%d", data.name, &data.age);     Push(&ls, data); printf("按照 姓名 年龄依次输入信息:  ");     scanf("%s%d", data.name, &data.age);     Push(&ls, data);               printf("接下来进行出栈操作!\n");     data1 = Pop(&ls);     printf("出栈操作的数据是(%s,%d)\n", data1.name, data1.age);     data1 = Pop(&ls);     printf("出栈操作的数据是(%s,%d)\n", data1.name, data1.age);       system("pause");     return 0;     }  稍微改了一下，但不是很标准，标准的实现网上有很多，你可以去看一下

user: user-5
content: 引用 1 楼 GailyYelp 的回复:编译是对的，运行时输入完数据就会触发断点 改用release模式

user: user-0
content: 编译是对的，运行时输入完数据就会触发断点
user-0 提问: 关于%c前加空格的问题，求详解！

回复:
user: user-1
content: scanf %c和getchar()什么的，都会读取输入缓冲区遗留的回车符的（比如你之前输入过数据了） 所以在scanf %c前面加一句fflush(stdin);清空输入缓冲区

user: user-2
content: //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

user: user-0
content: 就是第二个 scanf  %c前得加空格，不然就出错误，求解答

user: user-0

user: user-3
content: 应该是你的程序问题，在你调用scanf函数如果缓冲区中有多余的字符肯定是不正确的，这不是空格的问题

user: user-4
content: 有些时候是什么时候啊，是不是前面还有别的东西啊

user: user-5
content: 你第一次输入完后还会在缓冲区中留下换行符\n，会被下一次接收掉

user: user-6
content: 楼主是说的scanf  ("%c%c", &a,&b) ;这种情况输入中间加空格吗？还是什么其他的意思？
user-0 提问: 请问C语言从文件读取数据，为什么中文读出来是乱码，英文读出来却是正确的呢？

回复:
user: user-1
content: 引用 2 楼 user-4 的回复:txt文件用ANSI编码保存 老哥  太感谢了 能说下为什么吗

user: user-2
content: 将数据转成宽字节然后输出就可以了，fopen（）fread（）读出来的数据是ASCII

user: user-3
content: 用Windows记事本——另存为，可以看到编码，是不是存为UTF-8了？有些系统比如Linux，默认的字符编码是UTF-8。

user: user-4
content: txt文件用ANSI编码保存

user: user-0