Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 十个整数  把最小的和第一个数互换 最大和最后互换 如果把*(a+9)=*max*去掉 就提示左值 求详解

回复:
user: user-1
content: 《牛肉干》 C语言上机课，某女同学偷偷吃起牛肉干。 有一粒牛肉干掉到了键盘上，卡在7和8键之间。 女同学就在键盘上抠啊、抠啊、抠啊…… 程序里一行代码变成这个样子： int *pa=&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&a; 后来的结局是 ————程序顺利通过编译，运行结果正确！

user: user-2
content: 引用 3 楼 qq_35109846 的回复:[quote=引用 1 楼 paschen 的回复:] a=number;    这句语法上没问题  max=(a+i);        加*是解引指针，而你这里只是做指针运算，所以不用加*  (a+9)=max;  因为a+9是一个右值（临时的值），你不能对他进行赋值那为什么加上*就可以赋值[/quote]  *(a+9)是解引该地址的值，是左值，但a+9是个右值

user: user-3
content: a=number; 不用加 * ，这句话的意思是让 a 指向 number指向的内存，在这里也就是传进来的数组的首地址。如果改为 *a = *number; 的话，那只是将 a 所指向的内存初始化为number[0] ，也就会导致之后的程序无法通过  a 引用到数组中的值。  max=(a+i);   同理，也是为了达到交换指向的目的，如果变为单纯的值赋值的话，是没有什么意义的。  关于左右值得问题，参考楼上的就可以了，实在不行就从网上找找相关的资料，c语言的指针确实容易让人迷惑，但是一旦要是理解了也就会豁然开朗的~

user: user-4
content: 引用 4 楼 qq_35109846 的回复:[quote=引用 2 楼 qq423399099 的回复:] *max加上*并且作为左值，表示你对max指针所指向的值要进行赋值操作 而你的max指针只是要找到最大的值，并且指向它就可以了  左值：能代表一个“容器”的就是一个左值。 一般来说，左值都是有地址的，但是寄存器变量是没有地址的max为什么不是右值 而a+i是 ，麻烦说详细点[/quote] max不是不能作为右值，而是此处应当作为左值，才能指向值最大的元素 PS：建议看下指针的基础

user: user-0
content: 引用 2 楼 qq423399099 的回复:*max加上*并且作为左值，表示你对max指针所指向的值要进行赋值操作 而你的max指针只是要找到最大的值，并且指向它就可以了  左值：能代表一个“容器”的就是一个左值。 一般来说，左值都是有地址的，但是寄存器变量是没有地址的max为什么不是右值 而a+i是 ，麻烦说详细点

user: user-0
content: 引用 1 楼 paschen 的回复:a=number;    这句语法上没问题  max=(a+i);        加*是解引指针，而你这里只是做指针运算，所以不用加*  (a+9)=max;  因为a+9是一个右值（临时的值），你不能对他进行赋值那为什么加上*就可以赋值

user: user-2
content: a=number;    这句语法上没问题  max=(a+i);        加*是解引指针，而你这里只是做指针运算，所以不用加*  (a+9)=max;  因为a+9是一个右值（临时的值），你不能对他进行赋值

user: user-4
content: *max加上*并且作为左值，表示你对max指针所指向的值要进行赋值操作 而你的max指针只是要找到最大的值，并且指向它就可以了  左值：能代表一个“容器”的就是一个左值。 一般来说，左值都是有地址的，但是寄存器变量是没有地址的
user-0 提问: 求解答

回复:
user: user-1
content: 数组名不允许做左值,可以考虑是用strcpy/strncpy/memcpy代替赋值；

user: user-2
content: 数组是不允许 直接赋值的 你可以使用copy系统函数或使用下标方式赋值

user: user-3
content: str不是指针类型，而是数组类型  数组类型不允许被赋值

user: user-4
content: 数组一旦定义就会被分配一片连续的空间，因此数组的首地址是不变的，因此可以说数组名是一个常量指针，一旦定义就不能再被赋值了。 数组名它永远是右值。 http://blog.csdn.net/weiwenhp/article/details/8002942

user: user-5
content: const char*, const是很重要的一个关键字，不要漏了
user-0 提问: C语言问题

回复:
user: user-1
content: 结果与楼主所述不符啊

user: user-1
content: 结果与楼主所述不符啊

user: user-2
content: 最后的输出不会是 1  0

user: user-3
content: a 数组大小怎么没传给f 函数，你f 函数里while循环的结束条件呢？？？你a[]数组里全都是<=10的，如果size=sizeof(a); a[size]<= 10呢？？

user: user-4

user: user-5
content: 楼主截个图看看

user: user-6
content: 楼主截个图看看
user-0 提问: 我的这本教材我怎么感觉好多错的地方呢？这段代码又编译不了。

回复:
user: user-1
content: 换书，并且换编译器，vc6.0太老了

user: user-2
content: strcat那里改成(pFun)strcat  同理strcpy那句

user: user-3
content: 变量名和函数名重名,就近原则编译器认为你输入的是第三个参数是变量而不是函数了

user: user-4
content: 建议楼主换这个： C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817

user: user-4
content: 反正我是没见过哪本教材里面的代码有把函数原型写在函数内部的。

user: user-5
content: strcat和strcpy在string.h头文件里，你没include当然就是undeclared identifier

user: user-0
content: 引用 7 楼 qq423399099 的回复:strcat和strcpy在string.h头文件里，你没include当然就是undeclared identifier 哦

user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:反正我是没见过哪本教材里面的代码有把函数原型写在函数内部的。 赵老师好啊，我又回来了。 那两句 的确是我自己写进去的。 教材里这段代码  它的原文 的确没有 #include <string.h> 书名 叫 零基础学C语言  第三版。 作者是个叫 康莉的人。  我想应该是印刷错误吧。

user: user-6
content: #include <string.h>

user: user-6
content: 还有，s是source的缩写，d是destination的缩写，两者顺序不宜搞错了。

user: user-0
content: 引用 3 楼 qq423399099 的回复:你变量名和函数名取名一样。。。 敢不敢换个名字。 教材要是真取这样的变量名的话也是牛   what?      char strcat[40]="\0" char strcpy[40]="\0 这两句真是我添的。函数名？ 那是C风格字符串的变量名。 函数名 fun这个才是？ 我为啥要自作主张添 这两句请看下图 错误提示：  那两个单词是不是 未声明变量的意思？ 去了我添的两句还是编译不了嘛

user: user-5
content: 你变量名和函数名取名一样。。。 敢不敢换个名字。 教材要是真取这样的变量名的话也是牛

user: user-6
content: char strcat[40]="\0" char strcpy[40]="\0" 这两句注释掉试试，strcat和strcpy应该是函数名，作为fun()函数的参数。

user: user-7
content: 什么书，这么牛？你确定是书上的代码？不是你自己写的？
user-0 提问: codingame这个编程游戏的玩法请问谁知道

回复:
user: user-1
content: printf("%d %d 50\n", nextCheckpointY, nextCheckpointY); //改为:printf("%d %d 70\n", nextCheckpointX, nextCheckpointY); 其它自己慢慢琢磨.
user-0 提问: 删除数组中指定元素 出错求修改

回复:
user: user-1
content: delete是关键词，不能用作函数名，换一个名字

user: user-2
content: #include<stdio.h> void mdelete(int *p,int m) { 	int i; 	for(i=m-1;i<=5;i++) 	{ 		*(p+i)=*(p+i+1); 	} 	*(p+6)=0; } int main() { 	int a[]={1,2,3,4,4,5,6}; 	int m,i; 	int *p; 	for(i=0;i<=6;i++) 		printf("%d",a[i]); 	printf("please input the position you want to delete"); 	scanf("%d",&m); 	p = &a[0]; 	mdelete(p,m); 	for(i=0;i<=5;i++) 		printf("%d",a[i]); 	return 0; }
user-0 提问: 关于C变量的作用域

回复:
user: user-1
content: for中n与外面的n是不同的两个变量，for中声明的n（for(int n = ....)）只在for循环范围内有效（当然这一点在VC6里不是）

user: user-0
content: 谢谢各位！其实这是C primer plus上的例子，自己不会这样写程序的。

user: user-2
content: 不建议LZ在以后写程序时这样做；因为代码可读性很差,对自己对别人都是可读性差呀~

user: user-2
content: 第二个循环的n就是使用的初始定义的n的变量,第二个循环把n的值重新赋值了,就是赋值为1了,然后就进入循环；循环之后就是3；

user: user-3
content: 因为你第二个for比第一个for少了个int
user-0 提问: 大神求指点？？？

回复:
user: user-1
content: DOS下地址0处的4个字节用来保存的中断0的服务程序的入口地址。

user: user-2
content: http://www.cnblogs.com/fly1988happy/archive/2012/04/16/2452021.html

user: user-2
content: 我们的程序在使用的是系统给定的一个段，程序中的零值指针指向这个段的开端，为了保证NULL概念，系统为我们这个段的开头64K内存做了苛刻的规定，根据虚拟内存访问权限控制，我们程序中（低访问权限）访问要求高访问权限的这64K内存被视作是不容许的，所以会必然引发Access Volitation 错误，而这高权限的64K内存是一块保留内存（即不能被程序动态内存分配器分配，不能被访问，也不能被使用），就是简单的保留，不作任何使用。

user: user-3
content: windows把内存地址0X00000000到0X0000ffff指定为分配null指针的地址范围,如果程序试图访问这一地址，则认为是错误。c/c++编写的程序通常不进行严格的错误检查，当采用malloc来分配内存而可供分配的地址空间不够的情况下返回null指针。
user-0 提问: 结构体中函数指针的问题？

回复:
user: user-1
content: 引用 8 楼 x303687305 的回复:引用 7 楼 paschen 的回复:[quote=引用 5 楼 x303687305 的回复:]CLARKE *和Unit32可以通过强转来通过调用，他两的内存模型是一样的即为4字节的地址  那请问一下，(void(*)(Uint32))clarke_calc ， 是什么意思啊？[/quote]  void(*)(Uint32) 是一个函数指针，指针指向参数为Uint32，无返回的函数  不同类型的指针是不能隐式转换的  在这里是做强制转换，让他转换成这种类型函数指针  正如(int)a  就是将a转换成int类型[/quote]  非常非常感谢，我好像明白了。请问你们这些东西都是在哪学的啊？有没有好一点的书推荐一下？我有一本谭浩强的C程序设计教程，是大学时候C语言的书，写得非常浅显。  我本人并不是学编程的，是学电气的。但是很多控制算法都需要编程来实现，所以我C语言有一些弱[/quote]C primer plus也可以学习使用，建议看看或者到网上找些电子版关于c的

user: user-0
content: 引用 7 楼 paschen 的回复:引用 5 楼 x303687305 的回复:CLARKE *和Unit32可以通过强转来通过调用，他两的内存模型是一样的即为4字节的地址  那请问一下，(void(*)(Uint32))clarke_calc ， 是什么意思啊？[/quote]  void(*)(Uint32) 是一个函数指针，指针指向参数为Uint32，无返回的函数  不同类型的指针是不能隐式转换的  在这里是做强制转换，让他转换成这种类型函数指针  正如(int)a  就是将a转换成int类型[/quote]  非常非常感谢，我好像明白了。请问你们这些东西都是在哪学的啊？有没有好一点的书推荐一下？我有一本谭浩强的C程序设计教程，是大学时候C语言的书，写得非常浅显。  我本人并不是学编程的，是学电气的。但是很多控制算法都需要编程来实现，所以我C语言有一些弱

user: user-2
content: 引用 5 楼 x303687305 的回复:CLARKE *和Unit32可以通过强转来通过调用，他两的内存模型是一样的即为4字节的地址[/quote]  那请问一下，(void(*)(Uint32))clarke_calc ， 是什么意思啊？[/quote]  void(*)(Uint32) 是一个函数指针，指针指向参数为Uint32，无返回的函数  不同类型的指针是不能隐式转换的  在这里是做强制转换，让他转换成这种类型函数指针  正如(int)a  就是将a转换成int类型

user: user-0
content: 引用 4 楼 renwotao2009 的回复:[quote=引用 3 楼 x303687305 的回复:] [quote=引用 2 楼 renwotao2009 的回复:]  void(*calc)( Uint32); // 改成这样，C和C++都是强类型语言，不符合定义编译不过   你这么一改，还真就成功了！！谢谢你！！可是我不太明白其中的原理，能再给我讲讲吗？  为什么用void(*calc)( Uint32); 这样的形式就能行呢？ Uint32 代表了这个函数的参数，是无符号的32位数据类型。  可是，我实际装载的函数，是void clarke_calc(CLARKE *v)，这个函数的参数，是CLARKE *v 啊？  [/quote]CLARKE *和Unit32可以通过强转来通过调用，他两的内存模型是一样的即为4字节的地址[/quote]  那请问一下，(void(*)(Uint32))clarke_calc ， 是什么意思啊？

user: user-0
content: [/quote]CLARKE *和Unit32可以通过强转来通过调用，他两的内存模型是一样的即为4字节的地址[/quote]  那请问一下，(void(*)(Uint32))clarke_calc ， 是什么意思啊？

user: user-1
content: 引用 3 楼 x303687305 的回复:[quote=引用 2 楼 renwotao2009 的回复:]  void(*calc)( Uint32); // 改成这样，C和C++都是强类型语言，不符合定义编译不过   你这么一改，还真就成功了！！谢谢你！！可是我不太明白其中的原理，能再给我讲讲吗？  为什么用void(*calc)( Uint32); 这样的形式就能行呢？ Uint32 代表了这个函数的参数，是无符号的32位数据类型。  可是，我实际装载的函数，是void clarke_calc(CLARKE *v)，这个函数的参数，是CLARKE *v 啊？  [/quote]CLARKE *和Unit32可以通过强转来通过调用，他两的内存模型是一样的即为4字节的地址

user: user-0
content: 引用 2 楼 renwotao2009 的回复: void(*calc)( Uint32); // 改成这样，C和C++都是强类型语言，不符合定义编译不过   你这么一改，还真就成功了！！谢谢你！！可是我不太明白其中的原理，能再给我讲讲吗？  为什么用void(*calc)( Uint32); 这样的形式就能行呢？ Uint32 代表了这个函数的参数，是无符号的32位数据类型。  可是，我实际装载的函数，是void clarke_calc(CLARKE *v)，这个函数的参数，是CLARKE *v 啊？

user: user-1
content: void(*calc)( Uint32); // 改成这样，C和C++都是强类型语言，不符合定义编译不过

user: user-3
content: C 试试 要不强制转换
user-0 提问: 写入和读取文件莫名出错

回复:
user: user-1
content: 运行出错的时候点中断，通过调用堆栈定位出错位置，然后观察分析原因

user: user-2
content: 引用 1 楼 zhao4zhong1 的回复:请判断每个函数的返回值。尤其是fscanf++ fscanf，fread 等标准库函数的返回值，都是有它的用途的 使用这些函数的时候， 应该知道返回值的含义，并尽可能的使用它

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

user: user-0
content: 老师您能说明白点吗

user: user-4
content: 请判断每个函数的返回值。尤其是fscanf
user-0 提问: 关于数组的问题

回复:
user: user-1
content: 请楼主准时参加赵4老师的公开课《C语言指针与汇编内存地址（三、四）——通过静态和动态一、二、三维数组实例了解指针与数组对应的汇编内存地址。》

user: user-2
content: int ** arr_2d(int m,int n){ 	int **p=(int **)malloc(sizeof(int*)*m); 	int i; 	p[0] = (int*)malloc(sizeof(int)*m*n); 	for(i=1;i<m;i++){ 		p[i]=p[0]+i*n; 	} 	return p; }   void free_arr_2d(int **p){      free(p[0]); 	 free(p); }  也许这么做可以，你试试

user: user-2
content: 因为动态分配的数据，没有每一维 大小，相关的类型信息 所以 *（a+i）+j 没法计算

user: user-3
content: int main(){  	char _array[3][4]; 	char *a = (char *)_array; 	printf("_array:%p  &_array[1][2]:%p  *(_array+1)+2:%p\n", _array ,  &_array[1][2],  *(_array+1)+2); 	printf("a:%p ,(a+1*4)+2:%p\n", a, (a+1*4)+2);  	return 0; }  楼主拿这个代码去执行，自己悟一下？  注意："*a代表的是&a[0][0]"这个说法是不对的，它们的类型不一样的...... 比方说char *pc=NULL， int *pi=NULL pc和pi都是null，但是pc+1和pi+1的结果就完全不一样了
user-0 提问: 请教下windows下的管道操作.

回复:
user: user-1
content: WriteFile最后一个参数就是用来进行异步IO操作的，关于Windows上的异步IO，《Windows核心编程》第10章有讲，可以找本电子书看一下

user: user-0
content: 引用 3 楼 CharlesSimonyi 的回复:WriteFile最后一个参数就是用来进行异步IO操作的，关于Windows上的异步IO，《Windows核心编程》第10章有讲，可以找本电子书看一下   感谢回复, 查了下匿名管道不支持异步. 退而求其次, 我查了下命名管道的用法, 写出来后不阻塞, 但数据不对,是否我取文件描述符取的不对?      const char *pStrPipeName = "\\\\.\\pipe\\NamePipe_MoreWindows";     DWORD dwLen = 0;     OVERLAPPED ov;     memset(&ov, 0, sizeof(OVERLAPPED));  	HANDLE hPipe = CreateNamedPipe(pStrPipeName, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_NOWAIT, PIPE_UNLIMITED_INSTANCES, 0, 0, NMPWAIT_WAIT_FOREVER, 0);     if (WaitNamedPipe(pStrPipeName, NMPWAIT_WAIT_FOREVER) == FALSE) {         return NULL;     }      WriteFileEx(hPipe, data_source, data_source_len, &dwLen, &ov);      int file_des = _open_osfhandle((intptr_t)hPipe, 0);

user: user-0
content: 已经对照msdn手册学会用了,多谢大家...

user: user-0
content: 引用 1 楼 user-2 的回复:windows下面默认是同步IO，异步IO的话，仔细看看官方的文档就行了： https://msdn.microsoft.com/en-us/library/windows/desktop/aa365748(v=vs.85).aspx  感谢回复  能否给个例子.

user: user-2
content: windows下面默认是同步IO，异步IO的话，仔细看看官方的文档就行了： https://msdn.microsoft.com/en-us/library/windows/desktop/aa365748(v=vs.85).aspx
user-0 提问: vs中关于opencv附加依赖项lib文件添加的疑问

回复:
user: user-1
content: 各位大佬，为啥会有这个错误“>LINK : fatal error LNK1104: 无法打开文件“opencv_core330d.lib””啊。。很迷

user: user-2
content: 引用 13 楼 Scutum_hy 的回复:各位大佬，为啥会有这个错误“>LINK : fatal error LNK1104: 无法打开文件“opencv_core330d.lib””啊。。很迷 全盘搜索opencv_core330d.lib，如果没有，生成之；如果有，将其所在文件夹对应全路径填写到 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 中

user: user-2
content: 有人说多个lib麻烦，但WindowsXP之后的很多系统dll TMD 都拆分成好多个小dll了！

user: user-3
content: 引用 9 楼 CharlesSimonyi 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] [quote=引用 7 楼 CharlesSimonyi 的回复:] [quote=引用 6 楼 zhao4zhong1 的回复:] [quote=引用 5 楼 zhao4zhong1 的回复:] [quote=引用 4 楼 CharlesSimonyi 的回复:] 都是手动输，第一次麻烦点，以后直接复制粘贴。 也可以用OpenCV3 基本上只有一个文件了opencv_world300.lib 学习了。[/quote] 刚试了一下，好象x64才能用。[/quote]  X86也有的，编译的时候X64 x86都编译一份[/quote] 不知道我漏编译了哪个项目。[/quote]  我装的是opencv3.0.0，里面提供了编译好的X86 X64的bin。 现在最新的opencv3.1.0，里面只提供了编译好的x64的bin。 但是可以自行编译一下，用cmake创建VS解决方案sln。 VisualStudio打开，编译一个X86的bin。[/quote] 这位大神,请问如何编译x86并将其编译结果集中在一个lib里面?好像它自带的64位opencv_world320.lib一样. 我编译出来就是好多个lib觉得麻烦.

user: user-4
content: cmd到存放lib目录，用“dir *.lib”显示所有依赖项，再复制，很方便

user: user-2
content: 引用 7 楼 CharlesSimonyi 的回复:[quote=引用 6 楼 zhao4zhong1 的回复:] [quote=引用 5 楼 zhao4zhong1 的回复:] [quote=引用 4 楼 CharlesSimonyi 的回复:] 都是手动输，第一次麻烦点，以后直接复制粘贴。 也可以用OpenCV3 基本上只有一个文件了opencv_world300.lib 学习了。[/quote] 刚试了一下，好象x64才能用。[/quote]  X86也有的，编译的时候X64 x86都编译一份[/quote] 不知道我漏编译了哪个项目。

user: user-5
content: 引用 8 楼 zhao4zhong1 的回复:[quote=引用 7 楼 CharlesSimonyi 的回复:] [quote=引用 6 楼 zhao4zhong1 的回复:] [quote=引用 5 楼 zhao4zhong1 的回复:] [quote=引用 4 楼 CharlesSimonyi 的回复:] 都是手动输，第一次麻烦点，以后直接复制粘贴。 也可以用OpenCV3 基本上只有一个文件了opencv_world300.lib 学习了。[/quote] 刚试了一下，好象x64才能用。[/quote]  X86也有的，编译的时候X64 x86都编译一份[/quote] 不知道我漏编译了哪个项目。[/quote]  我装的是opencv3.0.0，里面提供了编译好的X86 X64的bin。 现在最新的opencv3.1.0，里面只提供了编译好的x64的bin。 但是可以自行编译一下，用cmake创建VS解决方案sln。 VisualStudio打开，编译一个X86的bin。

user: user-2
content: 引用 5 楼 zhao4zhong1 的回复:[quote=引用 4 楼 CharlesSimonyi 的回复:] 都是手动输，第一次麻烦点，以后直接复制粘贴。 也可以用OpenCV3 基本上只有一个文件了opencv_world300.lib 学习了。[/quote] 刚试了一下，好象x64才能用。

user: user-2
content: 引用 4 楼 CharlesSimonyi 的回复:都是手动输，第一次麻烦点，以后直接复制粘贴。 也可以用OpenCV3 基本上只有一个文件了opencv_world300.lib 学习了。

user: user-5
content: 引用 6 楼 zhao4zhong1 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] [quote=引用 4 楼 CharlesSimonyi 的回复:] 都是手动输，第一次麻烦点，以后直接复制粘贴。 也可以用OpenCV3 基本上只有一个文件了opencv_world300.lib 学习了。[/quote] 刚试了一下，好象x64才能用。[/quote]  X86也有的，编译的时候X64 x86都编译一份

user: user-5
content: 都是手动输，第一次麻烦点，以后直接复制粘贴。 也可以用OpenCV3 基本上只有一个文件了opencv_world300.lib

user: user-6
content: 用pragma comment(lib,"XXX.lib")方便点

user: user-7
content: 用文本编辑器（写字板之类）打开工程对应的*.vcxproj文件，找到 <Lib>       <AdditionalDependencies> 的地方，把你的lib名字一股脑填进去

user: user-8
content: 那就自己写个小程序，把目录下所有文件名输出到文本文件中
user-0 提问: 扫雷游戏代码，vc6.0 运行总是踩到雷

回复:
user: user-1
content: 炸炸更健康！

user: user-2
content: 在必要的地方加断点，运行时断下来看，同时可采用单步调试等技术，观察分析原因

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

回复:
user: user-1
content: Properties是个什么东西？ Properties[i]又是个什么东西  一次往&Properties[i]写14字节的东西，内存分配好了吗？

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

回复:
user: user-1
content: 包含这个头文件就可以了：#include "Que.h"    如果这个头文件不在工作目录下，需要使用完整路径

user: user-2
content: 直接include就行了啊 自己编译链接的话，记得把cpp文件对应的obj链接进来

user: user-3
content: 同一目录直接 #include 如果要提供给其他目录或者程序用 就安装到 /usr/local/include 或者其他PATH下

user: user-4
content: 不是一样用include就可以了吗？？？

user: user-5
content: #include "Que.h"   or  #include <Que.h>   问度娘  C  include

user: user-6
content: 如果你的一个.c文件要用到Que.h里声明的函数或变量，那就在该.c文件的开头写上include"Que.h"就可以了         编译时编译器会自动将Que.h里的所有内容复制粘贴到include"Que.h"这个地方，你下面的程序就可以用Que.h里声明的函数或变量了.
user-0 提问: remalloc异常，抛出SIGSEGV、SIGABRT等信号

回复:
user: user-1
content: 小心驶得万年船。

user: user-2
content: 越界访问导致出错

user: user-1
content: 多线程读/写或malloc、realloc、free竞争资源需要加锁。

user: user-0
content: 我自己先抛一种情况： 当发生内存越界操作，导致这块内存临接的下一块内存被篡改（下块内存头长度信息被覆盖），此时进行remalloc时就会触发异常（具体处理方式与内核有关），如SIGSEGV。 但是我这次并没有越界操作。唯一我能知道的异常方式是：该内存已经被我释放，对野指针进行remalloc触发了SIGSEGV，因为该对象确实存在并发操作，有被删除的可能，而且没做资源保护。
user-0 提问: 子函数怎么返回多个值

回复:
user: user-1
content: 传个指针过去,用指针操作.

user: user-2
content: 指针、引用的方式传递参数

user: user-3
content: 用指针吧。。或者定义结构体

user: user-4
content: 利用地址传递的特性，将返回的多个值存放于数组或者结构体，最后返回只想这种数据类型的指针就可以了

user: user-5
content: 通过返回结构体类型的变量可以获取多个参数；把想要返回的数据放入结构体里； 另外,也可以通过传入传出参数实现,但是不建议将函数参数数目超过5个；

user: user-6
content: tuple?

user: user-7
content: 1.返回结构体 2.通过指针/引用传参的方式将结果带出子函数
user-0 提问: 求大神助攻！==

回复:
user: user-1
content: 仅供参考：#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-0
content: typedef struct { 	char ch; 	int bit[96]; }codenode;  codenode huffman_code[20];//编码 数组  void get_code(huff_node *T, int k, char aim,int zifu,int ceng) { 	int i; 	if (T!=NULL) 	{ 		for (i = 0; i < k; i++) 		{ 			int m = ceng+1; 			get_code(huffmanT[T->child[i]], k, aim, zifu, m);//递归到叶节点 			if (T->weight.letter == aim)//若找到 			{ 				huffman_code[zifu].bit[ceng-1] = i; 				f_flag = 1;//标记找到正确路径 				huffman_code[zifu].bit[ceng] = 9;//随便定义一个数作为结束标志 			} 			else if (f_flag == 1&&t_flag==0)//路径正确，而且未到根节点 			{ 				if (T == huffmanT[all])//回到根节点 					t_flag = 1; 				huffman_code[zifu].bit[ceng-1] = i; 				return;//无需访问其他儿子节点 			} 		} 	} } 这样的。zifu是指编码数组 huffman_code的游标，ceng是每个字符的编码数组bit的游标

user: user-2
content: get_code的源程序呢？

user: user-3
content: 看不清你的源程序

user: user-4
content: 你还说没有修改, 你看你的代码中标红的地方是在做什么 void get_code(huff_node *T, int k, char aim,int zifu,int ceng) { int i; if (T!=NULL) { for (i = 0; i < k; i++) { int m = ceng+1; get_code(huffmanT[T->child[i]], k, aim, zifu, m);//递归到叶节点 if (T->weight.letter == aim)//若找到 { huffman_code[zifu].bit[ceng-1] = i; f_flag = 1;//标记找到正确路径 huffman_code[zifu].bit[ceng] = 9;//随便定义一个数作为结束标志 } else if (f_flag == 1&&t_flag==0)//路径正确，而且未到根节点 { if (T == huffmanT[all])//回到根节点 t_flag = 1; huffman_code[zifu].bit[ceng-1] = i; return;//无需访问其他儿子节点 } }
user-0 提问: c语言问题

回复:
user: user-1
content: 还有，疑惑的地方，多加括号，可以避免一些奇怪的问题

user: user-2
content: VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898

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

user: user-3
content: #define PI (3.1415926)  类似的 #define SUM ((NUM) + (NUM)) 能用括号尽量用括号，不管优先级 如果是C++程序，舍弃define，用const typedef 可以自己定义类型

user: user-3
content: #define PI (3.1415926)  类似的 #define SUM ((NUM) + (NUM)) 能用括号尽量用括号，不管优先级 如果是C++程序，舍弃define，用const typedef 可以自己定义类型

user: user-4
content: #define PI 3.1415926；  后面多了分号  宏定义的时候不要在后面加分号  不然展开后也会带着分号，这样就可能造成错误  如果你PI写在最后，那么展开的分号在最后所以没问题  但PI写在前面就会出错

user: user-0
content: 还有就是 #define PI （3.1415926） 这样定义的话 也能编译通过，求解释
user-0 提问: 一个二级指针+一个缓冲区大小的函数原型要如何实现？

回复:
user: user-1
content: unsigned int GetSysInfo1(     char *SysInfo,     unsigned int Length ); // 常见方式直接传指针和长度 SystemInfomation sysInfo; GetSysInfo1(&sysInfo, sizeof(sysInfo));unsigned int GetSysInfo2(     char **SysInfo );  // 传二级指针方式，通常都不需要长度 SystemInfomation *lpSysInfo; if (GetSysInfo2(&lpSysInfo) > 0) {     printf("%?\n", lpSysInfo->xxx);     // 如果成功，则需要释放。API 编写者提供一个对应的释放函数。     // 如 Windows 中经常有 LocalFree、ILFree/CoTaskMemFree 等     xxxFree(lpSysInfo); }

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:外部分配内存。 传进来的Length限制你填写信息的总字节长度。  谢谢，是这样的，后面把二级指针改成一级指针了。

user: user-0
content: 引用 4 楼 SXJIAKE 的回复:unsigned int GetSysInfo1(     char *SysInfo,     unsigned int Length ); // 常见方式直接传指针和长度 SystemInfomation sysInfo; GetSysInfo1(&sysInfo, sizeof(sysInfo));unsigned int GetSysInfo2(     char **SysInfo );  // 传二级指针方式，通常都不需要长度 SystemInfomation *lpSysInfo; if (GetSysInfo2(&lpSysInfo) > 0) {     printf("%?\n", lpSysInfo->xxx);     // 如果成功，则需要释放。API 编写者提供一个对应的释放函数。     // 如 Windows 中经常有 LocalFree、ILFree/CoTaskMemFree 等     xxxFree(lpSysInfo); }  谢谢，后面的接口已经改了，二级指针改成了一级指针。

user: user-2
content: 外部分配内存。 传进来的Length限制你填写信息的总字节长度。

user: user-3
content: 目前不知道你的系统信息是一个什么结构的，是数组（二维），还是二维的指针； 通过改函数想获取系统信息，将系统信息存放在SysInfo中，然后通过调用改函数将一个二重的指针（根据你的参数是否要申请空间）或二重数组作为实参传给改函数；调用结束实参里存放的是系统信息；
user-0 提问: 例句搜索

回复:
user: user-1
content: 找一个全文检索方面的开源项目参考之。

user: user-2
content: 一次投资终身受益

user: user-3
content: 一次建立，之后查找效率会很高

user: user-4
content: 索引只建立一次吧，只要不是画上几小时的，都能接受。
user-0 提问: c语言传送带问题求解

回复:
user: user-1
content: 分类讨论都差不多，其实重点是算法的优化！

user: user-2
content: 最多时间是完全不跑 tm 最少时间是完全跑    t0  如果 t0<=t 那么t0 是最快的 否则  如果 t <t0，那么最块时间在 t0~tm之间，t时间跑步， 剩余时间 休息，这要安排好这跑步时间，让他没跑的路程花费时间最短。

user: user-2
content: ///最快可能时间为 ：t0 =Sum(Si/(Vi+dv)); ///最慢可能时间为：tm =Sum(Si/Vi) 当 t0<= t 的时候，最快时间为 t0 当 t0 > t 的时候,t 用完，也不能过全部传送带 此时 ///  T= (tm-t) -Sum(ti*dV/Vi); ///  条件是 0 <=ti <= Si/(Vi+dV); ///求 T的最小值，即可 这是约束条件下的极值问题啊

user: user-0
content: 引用 7 楼 sds428的回复:呵呵，没看明白 呃，确实稍微理解起来难了点

user: user-0
content: 引用 5 楼 赵4老师的回复:这个世界上最大的差别和最远的距离都存在于“说”和“做”之间。 你说的很对！谢谢你，正在一步一步的实践~

user: user-3
content: 这个世界上最大的差别和最远的距离都存在于“说”和“做”之间。

user: user-0
content: 引用 1 楼 lm_whales的回复:就是个讨论题  如果全程跑不超时 就全程跑， 否则，在各个带上分配跑的时间，力求最短时间通过 也许可以看成背包 具体实现应该怎么做呢？

user: user-0
content: 引用 2 楼 fangcheng'的回复:這個題目不應該是貪心嗎？ 嗯吧，先在速度最慢的传送带上跑，最后时间最短，但是我写不出来

user: user-4
content: 這個題目不應該是貪心嗎？

user: user-2
content: 就是个讨论题  如果全程跑不超时 就全程跑， 否则，在各个带上分配跑的时间，力求最短时间通过 也许可以看成背包
user-0 提问: 关于字符串打印的基础问题

回复:
user: user-1
content: fgets(...)读入文本行时的两种情况。  1. 如果n大于一行的字符串长度，那么当读到字符串末尾的换行符时，fgets(..)会返回。并且在s的最后插入字符串结束标志'\0'。 而s缓冲区剩余的位置不会再填充。  2. 如果n小于等于一行的字符串的长度，那么读入n-1个字符，此时并没有读入\n因为并没有到行尾   example： 12345 fgets(str,5,stdin); 此时，读入4个字符，12345\n,实际上还有最后的'\0',所以，strlen(s)=4。

user: user-2
content: 第一个输入12345输出1234是因为你定义的是一个字符型数组，在最后要加上一个字符串结束标记‘\0’，所以只读了1234并输出，你可以把fgets函数中的5换成6
user-0 提问: [交流]寻求一种算法效率高于使用mod（求余）操作

回复:
user: user-1
content: 这是基于当时的处理器说的，现在可以忽略 当时加减法指令，移位指令比较快 乘法指令比除法快 求余用的是除法指令，所以比较慢  尽管如此，多用 +，-*,等运算和位操作等依然有一定优势

user: user-2
content: 建议楼主至少三年后再学习优化。  无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

user: user-3
content: 就你这例子而言，PrintDigit((N %10));就是脱了裤子放P，前面都确保N<10了，直接PrintDigit(N);完事

user: user-4
content: 想多了，程序应该优化该优化的部分，如果确定这个操作是瓶颈，消耗了可观的CPU资源(>10%)再去优化也不迟。 不要为了若干个CPU周期忽略了大头

user: user-5
content: 对特定的值应该是有一些优化方案，但是如果对任意值求余，你应该相信编译器厂商的实力。
user-0 提问: C中控制台鼠标双击触发单击问题(利用ReadConsoleInput)

回复:
user: user-1
content: 这样判断：   		if(irInBuf.Event.MouseEvent.dwEventFlags == 0)//单击（包括按下或释放） 		{ 			if(irInBuf.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)//左键按下 			{  			} 			else if(irInBuf.Event.MouseEvent.dwButtonState == RIGHTMOST_BUTTON_PRESSED)//右键按下 			{  			} 			else if(irInBuf.Event.MouseEvent.dwButtonState == FROM_LEFT_2ND_BUTTON_PRESSED)//滚轮 			{  			} 			//释放的时候： 			else if(irInBuf.Event.MouseEvent.dwButtonState == 0) 			{  			} 		} 		else if(irInBuf.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)//双击 		{  		} 		else if(irInBuf.Event.MouseEvent.dwEventFlags == MOUSE_MOVED)//移动 		{  		}

user: user-2
content: 解决思路应该是每次触发单击时先暂时不响应，仅设置一个标志，等一定时间过后如果无双击触发，清除标志，执行实际的单击操作；如果有双击触发，清除标志，执行实际的双击操作。

user: user-2
content: 好象Windows下也是如此。  WM_LBUTTONDBLCLK The WM_LBUTTONDBLCLK message is posted when the user double-clicks the left mouse button while the cursor is in the client area of a window. If the mouse is not captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has captured the mouse.   WM_LBUTTONDBLCLK  fwKeys = wParam;        // key flags  xPos = LOWORD(lParam);  // horizontal position of cursor  yPos = HIWORD(lParam);  // vertical position of cursor    Parameters fwKeys  Value of wParam. Indicates whether various virtual keys are down. This parameter can be any combination of the following values: Value Description  MK_CONTROL Set if the ctrl key is down.  MK_LBUTTON Set if the left mouse button is down.  MK_MBUTTON Set if the middle mouse button is down.  MK_RBUTTON Set if the right mouse button is down.  MK_SHIFT Set if the shift key is down.    xPos  Value of the low-order word of lParam. Specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.  yPos  Value of the high-order word of lParam. Specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.  Return Values If an application processes this message, it should return zero.   Remarks Only windows that have the CS_DBLCLKS style can receive WM_LBUTTONDBLCLK messages, which the system generates whenever the user presses, releases, and again presses the left mouse button within the system's double-click time limit. Double-clicking the left mouse button actually generates four messages: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK, and WM_LBUTTONUP again.   An application can use the MAKEPOINTS macro to convert the lParam parameter to a POINTS structure.   QuickInfo   Windows NT: Requires version 3.1 or later.   Windows: Requires Windows 95 or later.   Windows CE: Requires version 1.0 or later.   Header: Declared in winuser.h.  See Also Mouse Input Overview, Mouse Input Messages, GetCapture, GetDoubleClickTime,MAKEPOINTS,POINTS, SetCapture, SetDoubleClickTime, WM_LBUTTONDOWN, WM_LBUTTONUP
user-0 提问: apue的错误处理函数是不是有问题

回复:
user: user-1
content: 引用 4 楼 zhaom_916 的回复:这个地方不用+2  +1就可以了吧 char    buf[MAXLINE+2];//+2 for "\n"  [quote=引用 3 楼 zhao4zhong1 的回复:]  char    buf[MAXLINE]; 应改为  char    buf[MAXLINE+2];//+2 for "\n"[/quote] 你是对的。我+2也不能说是错，可以说是“兼容”。

user: user-0
content: 这个地方不用+2  +1就可以了吧 char    buf[MAXLINE+2];//+2 for "\n"  引用 3 楼 zhao4zhong1 的回复:char    buf[MAXLINE]; 应改为  char    buf[MAXLINE+2];//+2 for "\n"

user: user-1
content: char    buf[MAXLINE]; 应改为  char    buf[MAXLINE+2];//+2 for "\n"

user: user-2
content: 你要看上面两句最多写入了多少字符啊，然后留了多少字符空间出来

user: user-1
content: 是
user-0 提问: error LNK2019: 无法解析的外部符号 "bool __cdecl AddItem(struct Telphone,struct list 

回复:
user: user-1
content: 检查AddItem(struct Telphone,struct list *)这个函数的声明和实现 查看是否只有声明而没有实现，是不是函数名拼写错了，参数个数，参数类型是否一致

user: user-2
content: 链接器链接时找不到XXX函数的具体实现，如果这个函数不是自己实现的函数，通常需要将依赖的库文件添加到项目设置中。  具体位置在：项目属性——链接器——输入——附加依赖项

user: user-0
content: 引用 4 楼 user-2的回复:链接器链接时找不到XXX函数的具体实现，如果这个函数不是自己实现的函数，通常需要将依赖的库文件添加到项目设置中。  具体位置在：项目属性——链接器——输入——附加依赖项 谢谢啦，发现问题了:自己实现的函数写错了，和声明不一致

user: user-0
content: 引用 5 楼 小灸舞的回复:检查AddItem(struct Telphone,struct list *)这个函数的声明和实现 查看是否只有声明而没有实现，是不是函数名拼写错了，参数个数，参数类型是否一致 谢谢你！原来不是缺少库，而是自己实现函数写错了，跟声明函数不一致。终于找到问题了

user: user-0
content: d3dx9.lib 添加好了，又回到了开始的问题。  error LNK2019: 无法解析的外部符号 "bool __cdecl AddItem(struct Telphone,struct list *)" (?AddItem@@YA_NUTelphone@@PAUlist@@@Z)，该符号在函数 _main 中被引用------------这个问题又出来了

user: user-1
content: 查看d3dx9.lib在哪个目录下 然后在库目录添加上该目录

user: user-0
content: 知道是缺少d3dx9.lib  了。但在在VS.NET中的项目/属性/配置属性/连接器/输入/附加依赖项中添加d3dx9.lib 后编译。出现 错误	1	error LNK1104: 无法打开文件“d3dx9.lib”
user-0 提问: c语言开发服务器，并发问题

回复:
user: user-1
content: 最简单的就是select模型啊，  记录对端的ip和端口号啊，  记录ip干嘛？   楼主不知道， 多个客户端可以在一台机器上？

user: user-2
content: 引用 11 楼 mLee79 的回复:我在我本子上试了下 epoll,    一个线程, 从4, 5 台虚拟机一共创建了 80万个连接的情况下,  响应时间在 1秒以下,  没啥问题的.  几百个连接就毛毛雨..    WIN 下用 select/poll ,  2000来个连接也完全木问题,   我测试时大概在 3,4万连接开始卡卡卡...  就懒得 ASIO 了..  嗯，这种场景下，一个线程足以........

user: user-2
content: 引用 1 楼 yangyunzhao 的回复:直接上libevent，妥妥的  楼主，听听这哥们的吧

user: user-3
content: 我在我本子上试了下 epoll,    一个线程, 从4, 5 台虚拟机一共创建了 80万个连接的情况下,  响应时间在 1秒以下,  没啥问题的.  几百个连接就毛毛雨..    WIN 下用 select/poll ,  2000来个连接也完全木问题,   我测试时大概在 3,4万连接开始卡卡卡...  就懒得 ASIO 了..

user: user-4
content: weblogic可以支持20000个线程同时运行呢，更加何况你是C的代码。

user: user-5
content: 补充下：几百个线程并不多。只不过创建销毁线程太多的话 CPU会耗在这个上面，所以建议使用线程池

user: user-5
content: 用你说的模型，然后加上线程池。  至于具体的我没法说，google或者baidu。我只能提供思路。

user: user-6
content: epoll ？

user: user-7
content: 直接上libevent，妥妥的

user: user-8
content: 你都说了是select了，还想要什么？

user: user-9
content: 如果几百台同时连接，那么就要开几百个线程。占用的资源确实很大。帮顶

user: user-0
content: 就是普通的select模式阿,连windows下的iocp都不是,应该也和linux下的epoll有差别,咋没什么人回答呢???
user-0 提问: 关于二级函数指针

回复:
user: user-1
content: c语言使用的过程中&函数名简化为函数名，&go实际上还是go

user: user-2
content: 因为 你的 *p 访问的地址不合法，想用的话你得先分配个内存给他才能解除引用，用楼上说的那种一级指针吧，这种纯属没事找事

user: user-3
content: 不是int (*p)(int a, int b) = &&go;  而是int (*p)(int a, int b) = &go;

user: user-4
content: int (*p)(int a, int b) = &go; int (**pp)(int a, int b) = &p;

user: user-0
content: 但是为什么用二级函数指针就不能修改了？  比如 :      int  类型。 int **是可以去间接改变int *的值的。

user: user-5
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-4
content: 这样不就行了？  #include "stdio.h" #include "stdlib.h" #include "Windows.h"   int go6688(int a, int b) { 	MessageBoxA(0, "劫持指令", "你已经被劫持" ,0); 	return 0; }  int go(int a, int b) { 	printf("haha\n"); 	return 0; }    void main() { 	int i = 1; 	int (*p)(int a, int b) = &go; 	p = go6688;             	printf("%p %p\n", go, go6688); 	system("pause"); }
user-0 提问: c语言问题

回复:
user: user-1
content: 安装WinRAR，右键点击你的程序目录——添加到xxxxxxx.rar

user: user-2
content: http://blog.csdn.net/turingo/article/details/8178510

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:cd /d "C:\Program Files\WinRAR" rar a myprog_setup d:\mydir\myprog.exe rar s myprog_setup copy myprog_setup.exe d:\mydir  谢谢赵老师，因为我是初学者，您写的我看不懂啊。。。能不能详细写一下？？

user: user-3
content: cd /d "C:\Program Files\WinRAR" rar a myprog_setup d:\mydir\myprog.exe rar s myprog_setup copy myprog_setup.exe d:\mydir
user-0 提问: 文件指针使用循环打开文件在关闭为什么会出错！

回复:
user: user-0
content: 已  引用 1 楼 user-1 的回复:if (   fp = fopen(str, "r") == NULL  )  改成 if ((fp = fopen(str, "r")) == NULL)  忘记括号了 感谢！

user: user-1
content: if (   fp = fopen(str, "r") == NULL  )  改成 if ((fp = fopen(str, "r")) == NULL)
user-0 提问: 别人问的，这个错误怎么解决，求大神，跪谢，今天交作业啊。。。。

回复:
user: user-1
content: c=malloc(sizeof(int*)*len1); //改为: c=(int**)malloc(sizeof(int*)*len1);

user: user-2
content: 14行改为： c = (int **)malloc(sizeof(int *) * len1);
user-0 提问: 使用异或进行文件内容加密时出现问题

回复:
user: user-0
content: 引用 2楼赵4老师 的回复:不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了但是，为什么先将文件内容写入数组后再进行异或运算，并将结果写入文件就可以，两种方式都是用的getc来读取，putc输出的，区别就只是一个是先写进数组，再进行异或运算，一个是在读取时就进行，应该说产生的字符是一样的才对，好纠结。

user: user-0
content: 引用 2楼赵4老师 的回复:不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了嗯嗯，谢谢啦

user: user-0
content: 引用 5楼ghx287524027 的回复:两种方式的完整代码怎么写的？贴出来看看吧刚刚看了下，是我看错了，以文本方式读取都无法异或回去，想来原因应该就是异或后产生的特殊字符函数无法操作吧

user: user-1
content: 两种方式的完整代码怎么写的？贴出来看看吧

user: user-1
content: 引用 2 楼 zhao4zhong1 的回复:不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了  对，以字节的形式读写就没问题了，按字符读写的话，有的特殊符号是操作不了的

user: user-2
content: 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-1
content: 这和具体异或出来的值有关，对于一些特殊的值，fgetc和fputc是无法操作的
user-0 提问: C语言遍历C盘所有.exe文件并将路径与文件名输出到TXT文件中出现问题

回复:
user: user-1
content: 强势围观看看

user: user-2

user: user-3
content: fwrite试试

user: user-4
content: 一个这么简单的功能写了100行，我用python写不会超过20行

user: user-5
content: 我之前写过一个：http://blog.csdn.net/wangyaninglm/article/details/8668132

user: user-6
content: 如何写的正确答案

user: user-7
content: 写代码过滤fc命令的输出。

user: user-0
content: 引用system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad  c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住，能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作，而不要用各种API获取或者操作，因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时，API会处理的不全面或陷入死循环，而shell命令不会。 如果嫌system黑窗口一闪，将system("...")替换为WinExec("cmd /c ...",SW_HIDE); 那能不能用shell比较两个TXT文件不同，并显示出不同的地方，这里的TXT文件都是逐行分析的，我用了windows下 fc 命令，但是有点不理想，把两个文件都显示出来了

user: user-7
content: system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad  c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住，能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作，而不要用各种API获取或者操作，因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时，API会处理的不全面或陷入死循环，而shell命令不会。 如果嫌system黑窗口一闪，将system("...")替换为WinExec("cmd /c ...",SW_HIDE);

user: user-8
content: 会不会是权限不够？不能在C盘目录下写入文件，换个盘试试 或者单步调试检查每一步的变量值和各个返回值。 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-9
content: 建议单步跟踪程序运行（特别是最后输出那一部分）以分析原因

user: user-0
content: 就是调用系统的shell是吧，这实现了，然后还得从allfilesinsub.txt文件中逐行读取，计算文件MD5再保存进去，就还是要用到格式化输入输出函数了
user-0 提问: //使用返回指针的函数查找最大值  帮看下哪里错了 运行不了 调试可以

回复:
user: user-0
content: 我弄错了 不好意思

user: user-0
content: 引用 1 楼 zxh707wk 的回复:#include<stdio.h>  int* findmax(int* a,int n) {     int* max=a;     int i=0 ;     for(i=1;i<n;i++)     {         if(*max<*(a+i))         {             max=a+i;         }     }     return max ; } int main() {     int a[10];     int i;     int* max;     printf("please input 10 number");     for(i=0;i<10;i++)     	scanf("%d",&a[i]);     max=findmax(a,10);     printf("%d",*max);     return 0; }   一楼有错啊

user: user-1
content: #include<stdio.h>  int* findmax(int* a,int n) {     int* max=a;     int i=0 ;     for(i=1;i<n;i++)     {         if(*max<*(a+i))         {             max=a+i;         }     }     return max ; } int main() {     int a[10];     int i;     int* max;     printf("please input 10 number");     for(i=0;i<10;i++)     	scanf("%d",&a[i]);     max=findmax(a,10);     printf("%d",*max);     return 0; }

user: user-2
content: 你下面四句的逻辑有问题 max=p+i;     //max指向p+i所指向的元素 *(p+i)=*(p+i+1);  //用后一个元素的值覆盖前一个 *(p+i+1)=*(p+i);  //用前一个元素的值又赋值给后面一个元素？？？ max=(p+i);        //又执行一遍max=p+i？？  而且你这个return的位置也不对，for循环就行一次就return了

user: user-3
content: 很多问题  *findmax(int *a,int n) 改成 int* findmax(int *a,int n)  另外for(p=a;p<a+10;p++) 这里p没有定义  另外不懂你思路，写的很混乱

user: user-0
content: 帮忙看下怎么修改我的  楼上的方法我知道
user-0 提问: 请问这段代码是什么意思？谁能帮我解释下，有偿

回复:
user: user-1
content: CCS中运行数据从可以通过串口读过来

user: user-2
content: sscanf ？？？ 是scanf 吧

user: user-3
content: 呃。。你可以把代码复制到编译器vc++或者gcc或者vs，编译运行。就知道这段代码什么意思了。无奈╮（╯＿╰）╭

user: user-4
content: 现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！

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

回复:
user: user-1
content: 首先看你的这个是否符合你们的要求，如果效率不够那么再来看瓶颈在哪。 接着说看瓶颈：    粗糙的：你可以直接写个时间统计（简单的那种计时）    精确的：google intel都有性能测试工具

user: user-2
content: https://blogs.msdn.microsoft.com/visualstudioalm/2015/07/20/performance-and-diagnostic-tools-in-visual-studio-2015/ 先用工具找出性能瓶颈，然后改进……  再给个例子 https://www.zhihu.com/question/27768721 楼主自己按类似的套路搞吧，自己搞出来的东西，印象才深刻

user: user-3
content: 感觉是for循环太多，不过可以在里面插入循环计数值，看看能否在算法上优化。  可以参考一下这个代码 http://blog.csdn.net/jia20003/article/details/16369143

user: user-0
content: 有没大神解答一下啊，，，

user: user-4
content: 分析性能，查看哪里是主要耗时，然后再看怎么优化  http://www.jb51.net/article/35771.htmhttp://

user: user-5
content: 设置输出Release版。
user-0 提问: VS中C语言0x0f6d20a7 (msvcr100d.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0x00369e9时发生访问冲突

回复:
user: user-1
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-0
content: 已经改了，但读出来的数据还是乱码

user: user-1
content: 引用 4 楼 yanzi0310 的回复:c:\program files\microsoft visual studio 10.0\vc\atlmfc\include\atlstr.h(16): fatal error C1189: #error :  ATL requires C++ compilation (use a .cpp suffix) 出现错误 将你的源代码扩展名由.c改为.cpp

user: user-0
content: c:\program files\microsoft visual studio 10.0\vc\atlmfc\include\atlstr.h(16): fatal error C1189: #error :  ATL requires C++ compilation (use a .cpp suffix) 出现错误

user: user-1
content: str.Format(_T("%d年%d月%d日%d时%d分%d秒"),year,month,day,hour,minute,second); _ftprintf(out,_T("%s %lf %lld %lld %hd %.11s %.7s\n"),str, buffer[i].GpsDataTime,buffer[i].t0Counter,buffer[i].t0Frequency,buffer[i].SatelliteNum,buffer[i].Latitude,buffer[i].Altitude);

user: user-0
content: GetLocalTime(&buffer[i].OldSystemTime); 		 int year,month,day,hour,minute,second; 		 year =buffer[i].OldSystemTime.wYear; 		 month = buffer[i].OldSystemTime.wMonth; 		 day = buffer[i].OldSystemTime.wDay; 		 hour = buffer[i].OldSystemTime.wHour; 		 minute = buffer[i].OldSystemTime.wMinute; 		 second = buffer[i].OldSystemTime.wSecond; 		 CString str; 		 		str.Format(L"%d年%d月%d日%d时%d分%d秒",year,month,day,hour,minute,second); 		fprintf(out,"%s %lf %lld %lld %d %s %s\n",str.Format(L"%d年%d月%d日%d时%d分%d秒",year,month,day,hour,minute,second), 			buffer[i].GpsDataTime,buffer[i].t0Counter,buffer[i].t0Frequency,buffer[i].SatelliteNum,buffer[i].Latitude,buffer[i].Altitude); 这块不知道怎么写了

user: user-2
content: SYSTEMTIME这个不能直接%s格式化吧，你要先用字符串转一次
user-0 提问: 关于结构体数组输入和输出的一个小问题。

回复:
user: user-1
content: 引用 9 楼 lm_whales 的回复:常有的事情，有时候会出现多了，少了个分号，大括号的错误 结果往往系统报错是某某头文件错误 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

user: user-1
content: 先学会跟踪代码，再学会写代码。

user: user-0
content: 引用 4 楼 paschen 的回复:[quote=引用 3 楼 setihomesfl 的回复:] [quote=引用 2 楼 paschen 的回复:] 两处 for (j = 0; j < 5; j++) 这个后面都多了一个分号  是的 就是这一个疏忽导致[/quote]  如果调试时单步跟踪程序运行，我想你不应该花4小时才发现 [/quote] 因为是小程序所以就没有跟踪,也因为是简单所以就没有往这方面想.

user: user-2
content: 引用 3 楼 setihomesfl 的回复:[quote=引用 2 楼 paschen 的回复:] 两处 for (j = 0; j < 5; j++) 这个后面都多了一个分号  是的 就是这一个疏忽导致[/quote]  如果调试时单步跟踪程序运行，我想你不应该花4小时才发现

user: user-0
content: 引用 2 楼 paschen 的回复:两处 for (j = 0; j < 5; j++) 这个后面都多了一个分号  是的 就是这一个疏忽导致

user: user-2
content: 两处 for (j = 0; j < 5; j++) 这个后面都多了一个分号

user: user-3
content: 常有的事情，有时候会出现多了，少了个分号，大括号的错误 结果往往系统报错是某某头文件错误

user: user-4
content: #define Printfshuchu printf("%s %d %s %d",xuesheng[j].name,xuesheng[j].number,xuesheng[j].csex,xuesheng[j].igrade); Printfshuchu(printf);

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:先学会跟踪代码，再学会写代码。 主要是没几句代码,感觉没必要用. 也没往细节那去想 以为是别的问题.太大意了.
user-0 提问: 用getchar输入4个字符到数组，输出数组时，结果却很奇怪，求助！

回复:
user: user-0
content: 引用 11 楼 qq423399099 的回复:因为你char str1[]="7777999999999999999999999999sdfsdfsdfdsff";这样写意味着编译器只会为他分配42+1个字节的空间 后面可能紧挨着别的变量或者一些有用的信息 你如果拼接以后就会越界写入，可能覆盖了一些重要的信息，比如VS下变量周围地址含调试信息，会报异常的  谢谢！

user: user-1
content: 因为你char str1[]="7777999999999999999999999999sdfsdfsdfdsff";这样写意味着编译器只会为他分配42+1个字节的空间 后面可能紧挨着别的变量或者一些有用的信息 你如果拼接以后就会越界写入，可能覆盖了一些重要的信息，比如VS下变量周围地址含调试信息，会报异常的

user: user-0
content: 引用 9 楼 qq423399099 的回复:vs下报异常。 明明就是strcat的效果…… 函数那样写没啥大问题，但不能这样去调用  是的，就是strcat效果。 为什么函数可以这么写，而main中不能这么写呢？

user: user-1
content: vs下报异常。 明明就是strcat的效果…… 函数那样写没啥大问题，但不能这样去调用

user: user-0
content: 这个代码是将字符串str2附加到str1。str2附加到str1上后，str1和没附加前比，应该算越界了。但代码运行是正常的。   #include <stdio.h> #include <string.h>  void copy(char *p,const char *q); int main(void) { 	//将字符串str2附加到str1  	char str1[]="7777999999999999999999999999sdfsdfsdfdsff"; 	char str2[] ="hello,world!sdfsdfsfsdfsfdsfdsffdsdfdsfdsfdsfsdf";  	copy(str1,str2); 	puts(str1); 	 	 	return 0; };  void copy(char *p,const char *q) { 	char *temp = p; 	while(*temp != '\0') { 		temp++; 	} 	 	while(*q != '\0') { 		*temp=*q; 		q++; 		temp++; 	} 	 	*temp = '\0'; 	 }

user: user-0
content: 加printf("%p %p %p %p %p\n", &a, &b, &c, &d, str1); 后的截图：

user: user-0
content: 我在看《C语言程序设计现代方法》，这本书里有个例子，字符串复制例子，复制时，字符数组也没有声明长度。指针移动到'\0'处开始复制目标字符串中的字符。  我现在是有些晕菜。

user: user-1
content: 引用 4楼我是你的主体 的回复:用的是Dev C++加上printf("%p %p %p %p %p\n", &a, &b, &c, &d, str1); 后运行结果再截个图

user: user-0
content: 用的是Dev C++

user: user-1
content: 楼主用的什么IDE? 我这里VS编译跑出来结果是对的  楼主再多跑几次结果还是这样？ 那就在char d = getchar();下面加一句： printf("%p %p %p %p %p\n", &a, &b, &c, &d, str1); 可能分配地址的时候d是紧挨着str1的，执行*p++=b;（刚好覆盖掉char d的内存） 也就是内存中是这样的：str1--d--c--b--a  PS：归根结底还是你代码有问题char str1[]="";这样写会造成越界 改成char str1[5]="";

user: user-0
content: 是的，%c打印数组内容，%d是打印的地址。  我发现数组1和数组3的值是一样后，就用%d查看地址是否一致，发现1和3的地址是不一致的，但数值却是一致的。  不知道怎么回事？

user: user-2
content: %d打印的是指针位置
user-0 提问: C语言的main函数中竟然允许定义子函数？

回复:
user: user-1
content: 少不了

user: user-1
content: 任何编译器都上不了那么几个“方言”。

user: user-0
content: 引用 1 楼 qq423399099 的回复:楼主的编译器是？ mingw编译OK， VC2013 fail

user: user-2
content: 应该是gcc扩展支持嵌套函数。

user: user-3
content: 楼主的编译器是？
user-0 提问: IP地址ascii码转16进制

回复:
user: user-1
content: 去年一滴相思泪，今日方才到嘴边。

user: user-0
content: 今日结贴结贴!

user: user-1
content: //提取出IP地址即char buf0[]="192.168.0.253"中的数字“192168000253”保存在char buf1[]中，再转为C0A800FD，以16进制保存在char buf2[]中 //printf("%s",buf2);   输出结果：C0A800FD #include <stdio.h> char buf0[]="192.168.0.253"; char buf1[13]; char buf2[9]; int v[4]; int main() {     sscanf(buf0,"%d.%d.%d.%d",&v[0],&v[1],&v[2],&v[3]);     sprintf(buf1,"%03d%03d%03d%03d",v[0],v[1],v[2],v[3]);     printf("buf1:[%s]\n",buf1);     sprintf(buf2,"%02X%02X%02X%02X",v[0],v[1],v[2],v[3]);     printf("buf2:[%s]\n",buf2);     return 0; } //buf1:[192168000253] //buf2:[C0A800FD] //

user: user-0
content: @user-3 ：大神，那个buf2中保存的是16进制的数据，不是字符串"C0A800FD"啊，以16进制的形式输出，	char buf3[]={0xc0,0xa8,0x00,0xfd}; printf("\n buf3[0]=%02x",(unsigned char)buf3[0]);  输出结果：buf3[0]=c0 酱紫的  sprintf(buf2,"%02X%02X%02X%02X",a[0],a[1],a[2],a[3]); printf("\n buf2[0]=%02x",buf2[0]); 输出结果：buf2[0]=43; 两者不一样？

user: user-0
content: @user-3 :谢谢你啦，我知道了！

user: user-0
content: @user-3 :第14行和第15行代码有什么用捏？

user: user-2
content: inet_pton+ntohl+snprintf

user: user-3
content: #include <stdlib.h>  void split_ip_address(char* address,int* output) { 	char* s=(char*)address; 	char* ss=nullptr; 	int n=0; 	while (n<4&&(ss=strchr(s,'.'))!=nullptr) 	{ 		*ss=0; 		output[n++]=atoi(s); 		s=ss+1; 	} 	if (n<4&&*s) 		output[n]=atoi(s); }  int main() { 	char buf0[]="192.168.0.253"; 	int a[4]; 	split_ip_address(buf0,a);  	char buf1[16],buf2[16]; 	sprintf_s(buf1,"%d%d%d%d",a[0],a[1],a[2],a[3]); 	sprintf_s(buf2,"%02X%02X%02X%02X",a[0],a[1],a[2],a[3]);  	printf("buf1=%s\n",buf1); 	printf("buf2=%s\n",buf2);  	return 0; }
user-0 提问: 关于for循环变量的声明问题

回复:
user: user-1
content: 引用 1 楼 ghx287524027 的回复:如果你是C语言编译,在for中是不能定义变量的,C++编译器可以,在for中的变量作用域在for代码块内,外部的j被隐藏.j在for中声明时被赋值,是一次性的,for的循环体不包含赋值语句. VC6中好像这种写法有BUG,for中的变量具有函数的生命周期.之后的版本解决了这个问题. 不是说不允许，要看你用的那种标准编译的，如果是 C89是不允许的 C99是可以这样做的 以上是 变量作用域的问题，就近原则用。所以外面的sum没有加上去

user: user-2
content: 在for循环里不用再次定义sum,i，直接赋值即可。

user: user-3
content: 引用 3 楼 paschen 的回复:你循环中的sum与外面的sum是两个不同的变量，因为你循环中的sum是在for(int sum=10,i=3;i<10;++i)新定义的，把int删除掉应该就可以了 正解。

user: user-4
content: 作用域，重复定义覆盖掉了外边的sum

user: user-5
content: 你循环中的sum与外面的sum是两个不同的变量，因为你循环中的sum是在for(int sum=10,i=3;i<10;++i)新定义的，把int删除掉应该就可以了

user: user-6
content: 循环可能执行了（没做优化） 也可能没执行（优化了，根本没有生成循环的任何代码） 然而循环中的定义的变量只在循环语句中有效。 即作用域为for的小括号和循环语句（无大括号时候）或者语句组（有大括号时候）  PS：  循环语句，if 语句 也是一个作用域 其中定义的变量只在相应的循环 或者if语句内部有效

user: user-7
content: 在for循环的括号内声明变量，编译器会分配一块新的内存，这是一个全新的局部变量，而且只在循环内有效。for循环在这里相当于一个大括号（语句块）内一个局部变量。跳出循环，这个变量就没用了。但是，你在for循环声明的那个和sum和i 是在另一块内存里面，他们不在一个房间，即使他们的名字都一样，但是互不影响。对于int sum,int i;这种声明变量的方式是不允许的，不符合语法规范的。无论是在循环内还是循环外。

user: user-8
content: 如果你是C语言编译,在for中是不能定义变量的,C++编译器可以,在for中的变量作用域在for代码块内,外部的j被隐藏.j在for中声明时被赋值,是一次性的,for的循环体不包含赋值语句. VC6中好像这种写法有BUG,for中的变量具有函数的生命周期.之后的版本解决了这个问题.

user: user-9
content: 引用 7 楼 jeroy 的回复:#include <stdio.h> int main(void) { 	for(int sum=10,int i=1;i<=10;++i) 	{ 	sum+=i; 	printf("\n第一个数字是%d是%d是\n",sum,i); 	} 	return 0; }  这样写也会报错，是不是不能在for循环里声明2个变量的？ for(int sum=10,i=3;i<10;++i) 这么写就是i和sum都是重新定义的,覆盖了外面的,所以i和sum都是0;

user: user-0
content: #include <stdio.h> int main(void) { 	for(int sum=10,int i=1;i<=10;++i) 	{ 	sum+=i; 	printf("\n第一个数字是%d是%d是\n",sum,i); 	} 	return 0; }  这样写也会报错，是不是不能在for循环里声明2个变量的？

user: user-10
content: 在for中重复定义了sum，去掉sum前的int就对了
user-0 提问: C语言 十六进制转化为十进制？

回复:
user: user-1
content: sum=sum*16+t;这行代码有什么意义吗？

user: user-2
content: #include<stdio.h> long fun(char *s); int main() {  	long m; 	char s[50]; 	scanf("%s",s); 	m=fun(s); 	printf("%ld\n",m); 	return 0; } long fun(char *s) { 	int i,t; 	long sum=0; 	for(i=0;s[i];i++) 	{ 		if(s[i]<='9') 			t=s[i]-'0'; 		else 			t=s[i]-'a'+10; 		sum=sum*16+t; 	} 	return sum; }

user: user-0
content: 谢谢你们，我的问题已经解决了，谢谢版主

user: user-3
content: 引用 5 楼 xinye1230 的回复:我是初学者   不知道什么是char*    能不能帮忙该个不带*的？、  因为他们是完全不同的类型，一个是指针，一个不是

user: user-2
content: 引用 7 楼 xinye1230 的回复:[quote=引用 6 楼 qq423399099 的回复:] [quote=引用 5 楼 xinye1230 的回复:] 我是初学者   不知道什么是char*    能不能帮忙该个不带*的？、 数组学过没？[/quote] 数组 函数都学了。[/quote] 指针没学？ 把long fun(char *s)改成long fun(char s[])就行

user: user-0
content: 引用 6 楼 qq423399099 的回复:[quote=引用 5 楼 xinye1230 的回复:] 我是初学者   不知道什么是char*    能不能帮忙该个不带*的？、 数组学过没？[/quote] 数组 函数都学了。

user: user-2
content: 引用 5 楼 xinye1230 的回复:我是初学者   不知道什么是char*    能不能帮忙该个不带*的？、 数组学过没？

user: user-0
content: 我是初学者   不知道什么是char*    能不能帮忙该个不带*的？、

user: user-4
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉

user: user-3
content: long fun(char s)   参数不是char，应该是char*
user-0 提问: PAT甲级1035

回复:
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: else if(PIN[j]=='1')和else if(PIN[j]=='o')里  PIN[j]都写成PIN[k]了吧 最下面的else分支也不对吧？多循环了一次吧？ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  #include<stdio.h> #include<string.h> #include<math.h>   int main(){     char Team[20],PIN[20],store[20][40];     int n,N,flag,i,j,k;     int len1,len2;       while(scanf("%d",&n)!=EOF){         N=0;         for(i=0;i<n;i++){             flag=0;             scanf("%s%s",&Team,&PIN);             len1=strlen(Team);             len2=strlen(PIN);             for(j=0;j<len2;j++){                 if(PIN[j]=='0'){                     PIN[j]='%';                     flag=1;}                 else if(PIN[j]=='1'){                     PIN[j]='@';                     flag=1;}                 else if(PIN[j]=='o'){                     PIN[j]='O';                     flag=1;}                 else if(PIN[j]=='l'){                     PIN[j]='L';                     flag=1;}             }             if(flag==1){                 for(k=0;k<len1;k++) store[N][k]=Team[k];                 store[N][k]=' ';                 for(k=0;k<len2;k++) store[N][k+len1]=PIN[k];                 store[N][len1+len2]='\n';                 N++;             }         }         if(N==0)printf("There is %d account and no account is modified\n",n);         else {             printf("%d\n",N);             for(i=0;i<N;i++){                 for(j=0;j<len1+len2+1;j++){                     printf("%c",store[i][j]);                 }                 printf("\n");             }         }     }     return 0; }