Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: write 错误Input/output error

回复:
user: user-1
content: EIO比较棘手，你可能需要查看当时更多的信息。

user: user-2
content: #include <string.h> ... write printf("%d %s\n",errno,strerror( errno ) );  _write Writes data to a file.  int _write( int handle, const void *buffer, unsigned int count );  Routine Required Header Compatibility  _write <io.h> Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  If successful, _write returns the number of bytes actually written. If the actual space remaining on the disk is less than the size of the buffer the function is trying to write to the disk, _write fails and does not flush any of the buffer’s contents to the disk. A return value of –1 indicates an error. In this case, errno is set to one of two values: EBADF, which means the file handle is invalid or the file is not opened for writing, or ENOSPC, which means there is not enough space left on the device for the operation.  If the file is opened in text mode, each linefeed character is replaced with a carriage return – linefeed pair in the output. The replacement does not affect the return value.   Parameters  handle  Handle of file into which data is written  buffer  Data to be written  count  Number of bytes  Remarks  The _write function writes count bytes from buffer into the file associated with handle. The write operation begins at the current position of the file pointer (if any) associated with the given file. If the file is open for appending, the operation begins at the current end of the file. After the write operation, the file pointer is increased by the number of bytes actually written.  When writing to files opened in text mode, _write treats a CTRL+Z character as the logical end-of-file. When writing to a device, _write treats a CTRL+Z character in the buffer as an output terminator.  Example   /* WRITE.C: This program opens a file for output  * and uses _write to write some bytes to the file.  */  #include <io.h> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h>  char buffer[] = "This is a test of '_write' function";  void main( void ) {    int fh;    unsigned byteswritten;     if( (fh = _open( "write.o", _O_RDWR | _O_CREAT,                                 _S_IREAD | _S_IWRITE )) != -1 )    {       if(( byteswritten = _write( fh, buffer, sizeof( buffer ))) == -1 )          perror( "Write failed" );       else          printf( "Wrote %u bytes to file\n", byteswritten );        _close( fh );    } }   Output  Wrote 36 bytes to file   Low-level I/O Routines  See Also   fwrite, _open, _read
user-0 提问: 结构体里面嵌套的结构体能不能被传回主函数

回复:
user: user-0
content: 我是想问一下，为什么子函数中的结构体A如果不用指针子函数结束后就会被释放，但是这个结构体A中嵌套的结构体B不会？

user: user-1
content: 那楼主手动释放一下呗。。。 程序结束反正也会自动释放掉的

user: user-2
content: 用free啊，c里面是用free释放内存

user: user-0
content: 代码应该没什么问题，就是在写的时候有点疑惑，函数中的结构体只能通过结构体指针传回，可是里面嵌套的结构体直接用函数结束后并没有释放掉
user-0 提问: 真是醉了，大神来帮我找出错误在哪？

回复:
user: user-1
content: 引用 8 楼 yuelengdihai 的回复:[quote=引用 6 楼 zhao4zhong1 的回复:] 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 几年前我都看懂这是什么意思[/quote] 但总是有“希望有个足够牛×的老师能代替学生我自己领悟和上厕所”的学生！  看来只能寄希望于未来发明大脑、小脑、植物神经的下载和上传接口了。 到时候就真的没有领悟和上厕所的问题了吗？ 本人深表怀疑。

user: user-2
content: void ex(int *p1,int *p2,int *p3) { if(*p1<*p2) swap(p1,p2); if(*p1<*p3) swap(p1,p3); if(*p2<*p3) swap(p3,p2);//这里原来也写错了  } void swap(int *p7,int *p8) { int temp; temp=*p7; *p7=*p8; *p8=temp;//原来这里写错了 }

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

user: user-4
content: #include <stdio.h>  int main() { 	void ex(int *p1, int *p2, int *p3); 	int a, b, c, *p4, *p5, *p6; 	scanf("%d%d%d",&a, &b,&c); 	p4 = &a; 	p5 = &b; 	p6 = &c; 	ex(p4,p5,p6); 	printf("the order is %d, %d, %d\n", *p4, *p5, *p6); 	system("pause");     return 0; }  void ex(int *p1, int *p2, int *p3) { 	void swap(int *p7, int *p8); 	if(*p1 < *p2) 		swap(p1, p2); 	if(*p1 < *p3) 		swap(p1, p3); 	if(*p2 < *p3) 		swap(p3, p2); }  void swap(int *p7, int *p8) { 	int temp; 	temp = *p7; 	*p7 = *p8; 	*p8 = temp; }  三处错误 scanf函数错误，不应有逗号 swap函数错误 ex函数第三个判断语句的错误

user: user-5
content: 引用 3 楼 qq423399099 的回复:楼主是想按从大到小吧？ 有两处错误： 1.swap函数里最后一行*p7=temp;应该改为*p8=temp; 2.ex函数里if(*p3<*p2) swap(p3,p2);应该改为if(*p2<*p3) swap(p2,p3); 楼主这手动模拟冒泡又是何苦，3楼正解

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

user: user-6
content: 交换两个数的值：  temp=*p7; *p7=*p8; *p8=temp;

user: user-7
content: 楼主是想按从大到小吧？ 有两处错误： 1.swap函数里最后一行*p7=temp;应该改为*p8=temp; 2.ex函数里if(*p3<*p2) swap(p3,p2);应该改为if(*p2<*p3) swap(p2,p3);

user: user-8
content: scanf里不加什么逗号啊，还有你那个ex是干什么的啊，排序？排序不是这样的，你再想一下吧

user: user-0
content: 就是输出的时候还是按照原来的顺序输出！并没有改变顺序！！
user-0 提问: 2d图绘制修复

回复:
user: user-1
content: 我比较好奇楼主小学语文多少分？

user: user-0
content: 忘了说，如果原图很潦草，用相应的路径字做总规范，然后用笔填，一般用形容词填，左填右，右填左
user-0 提问: 用C语言写离散数学题

回复:
user: user-0
content: #include<stdio.h> int main() { 	int n,m,t,i,j,k; 	int a[n]; 	scanf("%d",&n); 	for(m=1;m<=n;m++) 		scanf("%d",&a[m]); 	int b[15][2]; 	scanf("%d",&t); 	for(j=1;j<=15;j++) 	{ 		scanf("%d%d",b[j][1]); 	} 	for(j=1;j<=15;j++) 	{ 		if(b[j][1]%b[j][0]==0) 			break; 		else 			printf("N\n"); 		for(i=1;i<=15&&i!==j;i++) 			{ 				if(b[j][1]==b[j][0]) 					break; 				else 				{ 					if(b[j][0]!==b[i][1]&&b[j][1]!==b[i][0]) 						break; 					else 						printf("N\n"); 				} 			    if(b[j][1]==b[i][0]) 				{ 					for(k=1;k<=15;k++) 					{ 						if(b[k][0]==b[j][0]&&b[k][1]==[i][1]) 							printf("Y\n"); 						else 							printf("N\n"); 					} 				} 			} 		} 	} }求解哪里错了？
user-0 提问: 问一个问题.

回复:
user: user-1

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:搜网络教程“学OpenGL编3D游戏”。  谢谢啊，很好。  请问有具体的教材么

user: user-1
content: 搜网络教程“学OpenGL编3D游戏”。

user: user-0
content: 引用 1 楼 user-2 的回复:3D游戏，连DirectX都很少使用，而是使用含有游戏引擎的平台开发，国外的大型网游一般都是这样。游戏引擎不一而足，某些需要花钱买。  我在有论坛上看到有用C写的3D俄罗斯方块

user: user-0
content: 引用 1 楼 user-2 的回复:3D游戏，连DirectX都很少使用，而是使用含有游戏引擎的平台开发，国外的大型网游一般都是这样。游戏引擎不一而足，某些需要花钱买。  我在有论坛上看到有用C写的俄罗斯方块

user: user-2
content: 3D游戏，连DirectX都很少使用，而是使用含有游戏引擎的平台开发，国外的大型网游一般都是这样。游戏引擎不一而足，某些需要花钱买。
user-0 提问: vc++6.0打开问题

回复:
user: user-1
content: WIN7和VC6的兼容就不太好，楼主还是虚拟机跑算了。。。

user: user-0
content: 引用 12 楼 小灸舞的回复:WIN7和VC6的兼容就不太好，楼主还是虚拟机跑算了。。。 新手，求教，怎么弄，

user: user-0
content: 引用 6 楼 szn_409的回复:[quote=引用 4 楼 AK_one 的回复:] [quote=引用 3 楼 user-7的回复:]我猜你用的是win8系统吧 嗯，是的，，，，，，，，[/quote]   换个win7试试 [/quote] 电脑装win7蓝屏的说

user: user-0
content: 引用 9 楼 小灸舞的回复:打sp6补丁加上兼容模式勉强可以用。。。 如何打补丁，，，请教一下

user: user-2
content: FileTool.exe 替换打开和添加到项目中 Visual C++ 的新功能 http://support.microsoft.com/kb/241396/zh-cn

user: user-1
content: 打sp6补丁加上兼容模式勉强可以用。。。

user: user-3
content: 是vc6 sp6版本吗？

user: user-4
content: win7还行，最好是xp

user: user-5
content: 引用 4 楼 AK_one 的回复:[quote=引用 3 楼 user-7的回复:]我猜你用的是win8系统吧 嗯，是的，，，，，，，，[/quote]   换个win7试试

user: user-6
content: 不知道 装个虚拟机因该可以吧

user: user-0
content: 引用 3 楼 user-7的回复:我猜你用的是win8系统吧 嗯，是的，，，，，，，，

user: user-7
content: 我猜你用的是win8系统吧

user: user-0
content: 引用 1 楼 szn_409的回复:卸载 ，装vs2010或者其以上版本，vc6是古董了，可以抛弃了 我们学的就是这软件，没办法

user: user-5
content: 卸载 ，装vs2010或者其以上版本，vc6是古董了，可以抛弃了
user-0 提问: windows核心编程之RtlUserThreadStart函数第一句就是结束线程是什么意思？

回复:
user: user-1
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-2
content: ExitThread( (pfnStartAddr)(pvParam) ); ==>     UINT_PTR ret= pfnStartAddr(pvParam);     ExitThread(ret); 这和  char a[80]="1234"; char b[] ="4567890"; printf("%s",strcat(a,b)); 没有什么不同; 函数调用也是表达式。 函数调用表达式  pfnStartAddr)(pvParam)  的结果，作为函数实参表达式， 调用另一个函数ExitThread(），这是C,C++中很正常的函数调用。
user-0 提问: 为什么不能输出（后缀表达式）

回复:
user: user-1
content: 不能输出是因为程序一直在while里面循环 while(d[i]!='\0'){........} 这个循环都没有对i操作（比如++）所以陷入了死循环

user: user-2
content: void main() { struct ss { int q[100]; int top; }; struct ss a,*b; b=&a; char c[100]; char d[10]="(1+2)*3";  b->top=-1; int i=0,j=0,k=0; while(d[i]!='\0') { switch(d[i]) {    case '(':b->q[++b->top]=d[i];break;    case ')': 	   if(b->q[b->top]!='(') { c[j++]=b->q[b->top--]; } if(b->q[b->top]=='(') b->top--; break;     	case'-':    case '+': 	   if(b->q[b->top]!='(') { c[j++]=b->q[b->top--]; if(b->q[b->top]=='+'||b->q[b->top]=='-') c[j++]=b->q[b->top--]; }            break;    case'*':   case'/':	c[j++]=b->q[b->top--];         break;   default :if(d[i]>='0'&&d[i]<='9')    {c[j++]=d[i];} 	  } if(d[i]>='0'&&d[i]<='9')    {c[j++]=d[i];} i++; }   while(b->top!=-1) { c[j++]=b->q[b->top--]; } c[j]='\0'; while(c[k]!='\0') {        if(c[j]=='-'||c[j]=='+'||c[j]=='/'||c[j]=='*')               printf(" %c",c[k]);        else            printf(" %d",c[k]);    k++; } }

user: user-2
content: void main() { struct ss { int q[100]; int top; }; struct ss a,*b; b=&a; char c[100]; char d[10]="(1+2)*3";  b->top=-1; int i=0,j=0,k=0; while(d[i]!='\0') { switch(d[i]) {    case '(':b->q[++b->top]=d[i];break;    case ')': 	/*   if(b->q[b->top]!='(') { c[j++]=b->q[b->top--]; } if(b->q[b->top]=='(') b->top--;*/ break;     	case'-':    case '+': 	  /* if(b->q[b->top]!='(') { c[j++]=b->q[b->top--]; if(b->q[b->top]=='+'||b->q[b->top]=='-') c[j++]=b->q[b->top--]; }*/            break;    case'*':   case'/':	c[j++]=b->q[b->top--];         break;   default :if(d[i]>='0'&&d[i]<='9')    {c[j++]=d[i];} 	  } if(d[i]>='0'&&d[i]<='9')    {c[j++]=d[i];} i++; }   while(b->top!=-1) { c[j++]=b->q[b->top--]; } c[j]='\0'; while(c[k]!='\0') {        if(c[j]=='-'||c[j]=='+'||c[j]=='/'||c[j]=='*')               printf(" %c",c[k]);        else            printf(" %d",c[k]);    k++; } }  while里面不要死循环，只执行一次的话，用if 或者do {}while（） 数组下标不能小于0
user-0 提问: c关于失踪的空格和加号

回复:
user: user-1
content: 想弄明白就观察下scanf返回值

user: user-0
content: 引用 3 楼 wang0635 的回复:+或-号是%d格式要求中的合法符号，scanf从输入流中接受了它，随后应该紧跟十进制数字字符，但是遇到的却不是了，于是scanf就return了，没有转换成%d对应的数，返回0，那个符号也没有退回给输入流，因为符号本身是合法的、可接受的 这样的呀

user: user-2
content: +或-号是%d格式要求中的合法符号，scanf从输入流中接受了它，随后应该紧跟十进制数字字符，但是遇到的却不是了，于是scanf就return了，没有转换成%d对应的数，返回0，那个符号也没有退回给输入流，因为符号本身是合法的、可接受的

user: user-3
content: 因为+-都能读入到数字中，所以scanf读到+-号，会将+或-从输入流里读走到寄存器中，如果寄存器中已经有+了，那扫描到下一个字符是-自然不会再将-也读掉，而是判断出此次读入失败，直接返回0了，而已经读走的+就留在寄存器了吧

user: user-0
content: 引用 1 楼 qq423399099 的回复:我觉得会不会是因为,首先scanf会扫描输入流，然后将符合对应占位符的字符从输入流里读走先暂存起来（例如寄存器）， 然后遇到了不满足的字符或者空白符（tab,space,\n）就判断寄存器中存着的字符是否满足占位符的要求，如果满足就赋给变量， 不满足就返回0那这样的话，应该在读入1之后就直接跳出第一个while循环了呀（我试了把scanf函数中的%d后面的空格删了还是一样的结果）另外，我记得c primer plus 这本书中讲到scanf函数是从第一个非空字符开始扫描，所以在输入为1_2_+-_3_4* 的情况下，第一次读入1，返回1，缓存余下_2_+-_3_4*，第二次跳过空格读入2，返回1 ，缓存余下_+-_3_4*，第三次读+号，这里就出问题了，如果scanf函数将+视为正号而非四则运算符的话，那后面的-怎么办，如果后面是空格呢？现在的调试结果就是scanf将+录入了，不做处理， 返回0，缓存余下-_3_4*，后面也就能说通了，只是这个机制该怎么解释呢？

user: user-3
content: 我觉得会不会是因为,首先scanf会扫描输入流，然后将符合对应占位符的字符从输入流里读走先暂存起来（例如寄存器）， 然后遇到了不满足的字符或者空白符（tab,space,\n）就判断寄存器中存着的字符是否满足占位符的要求，如果满足就赋给变量， 不满足就返回0
user-0 提问: 虚拟内存去哪里？！

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

user: user-2
content: 楼主试试GlobalMemoryStatusEx() 用GlobalMemoryStatusEx(), 不要用GlobalMemoryStatus()，MSDN上自己说的，后者可能会返回不正确的结果： GlobalMemoryStatus can return incorrect information. Use the GlobalMemoryStatusEx function instead

user: user-0
content: 什么情况会导致虚拟内存消耗了那么多啊？new VirtualAlloc 或者用内存映射文件都申请不了足够大的比如1G的内存了！！！

user: user-3
content: 把代码贴出来吧。比如之前见过有一堆内存申请，并且每个都是MEM_COMMIT | MEM_RESERVE最后挂掉的奇葩代码...

user: user-2
content: 要降低虚拟内存使用，方法就是优化你的数据结构和算法，和消除内存泄漏。 如果windows设置成系统管理页面文件，它会根据使用情况自动增加交换空间

user: user-4
content: 引用 11 楼 cs290473786 的回复:@5楼，可能GlobalMemoryStatus()不太精确，但是大致应该是差不多的。而且是因为虚拟内存不太够用了，我才用这个函数进行验证的！！  [quote=引用 9 楼 renwotao2009 的回复:] [quote=引用 7 楼 cs290473786 的回复:] [quote=引用 2 楼 renwotao2009 的回复:] 你这项目静态加载了多少库，虚拟地址空间都不够用吗 可能是加载的库里面会申请一些内存导致的吗？[/quote]可能，都是公用的库，还是你们自己写的[/quote] 这种情况自写写的话，那就只能一个个的看是哪里申请了大量内存还是说检查内存泄漏吗？在库里面进行检查吗？[/quote]你们自己写的库的话，可以检查下有没有申请大量空间的代码看能不能优化，或改成动态载入形式，用时载入不用卸载。

user: user-0
content: @5楼，可能GlobalMemoryStatus()不太精确，但是大致应该是差不多的。而且是因为虚拟内存不太够用了，我才用这个函数进行验证的！！  引用 9 楼 renwotao2009 的回复:[quote=引用 7 楼 cs290473786 的回复:] [quote=引用 2 楼 renwotao2009 的回复:] 你这项目静态加载了多少库，虚拟地址空间都不够用吗 可能是加载的库里面会申请一些内存导致的吗？[/quote]可能，都是公用的库，还是你们自己写的[/quote] 这种情况自写写的话，那就只能一个个的看是哪里申请了大量内存还是说检查内存泄漏吗？在库里面进行检查吗？

user: user-0
content: 引用 10 楼 jdgdf566 的回复:你把内存当硬盘吗 用虚拟内存或者内存映射文件，申请一两个G很正常啊 ？

user: user-5
content: 你把内存当硬盘吗

user: user-4
content: 引用 7 楼 cs290473786 的回复:[quote=引用 2 楼 renwotao2009 的回复:] 你这项目静态加载了多少库，虚拟地址空间都不够用吗 可能是加载的库里面会申请一些内存导致的吗？[/quote]可能，都是公用的库，还是你们自己写的

user: user-0
content: 引用 2 楼 renwotao2009 的回复:你这项目静态加载了多少库，虚拟地址空间都不够用吗 可能是加载的库里面会申请一些内存导致的吗？

user: user-0
content: 引用 1 楼 yuelengdihai 的回复:全局变量也不会申请几个G的内存吧，资源管理器里面看看vs占了多少内存，程序占了多少内存， 感觉是越界引起的内存泄露 main函数才刚进入，怎么看哪里内存泄漏啊？都没有进行malloc和new操作。

user: user-0
content: 引用 3 楼 qq423399099 的回复:要降低虚拟内存使用，方法就是优化你的数据结构和算法，和消除内存泄漏。 如果windows设置成系统管理页面文件，它会根据使用情况自动增加交换空间 是win7操作系统，看虚拟内存设置里面是系统自动管理的！

user: user-4
content: 你这项目静态加载了多少库，虚拟地址空间都不够用吗

user: user-6
content: 全局变量也不会申请几个G的内存吧，资源管理器里面看看vs占了多少内存，程序占了多少内存， 感觉是越界引起的内存泄露
user-0 提问: 关于预处理__LINE__的问题

回复:
user: user-0
content: 非常感谢！我之所以转不出来就是因为一直试图在程序代码里传递参数__LINE__给宏，但始终都不会传递行号，而只是传递字符__LINE__；即便先赋值__LINE__给变量再传递参数也不行（就是没想到在指令里再定义一个宏做中间桥梁） 而在宏定义里使用#__LINE__也只能得到#40而不是“40”。 再次表示感谢！！！

user: user-1
content: 引用 2 楼 handanxuebu_2016 的回复: 感谢大侠！！！！！实在是太感谢了！！！！ 是不是可以这样理解： 宏定义在从程序中接受参数时始终都是直接将参数替换过去，而未进行运算； 仅当从嵌套宏定义中接受参数时才进行运算并替换（书中指“明示常量”）？ 也就是说预处理器在进行宏替换时仅对指令进行明示常量计算并替换程序代码，而不对程序本身进行计算？  过多的文字表述容易把简单问题复杂化。直接看一下展开的流程：   STR(__LINE__)  ==>  INT_STR(line_no)    编译器在处理STR（__LINE__)时，因为此时的宏定义中没有“#”号，所以编译器会先将__LINE__这一宏替换为对应的数值（行号，假设为40），进而再去解析 INT_STR(40)，编译器处理在#40时，会将后面的整数40展开为字符串”40“，然后就可以得到预期的结果。  之所以定义两个宏，是因为在第一次展开时需要获取__LINE__的数值。如果只用一个宏，#__LINE__ 会被替换为"__LINE__"

user: user-0
content: 感谢大侠！！！！！实在是太感谢了！！！！ 是不是可以这样理解： 宏定义在从程序中接受参数时始终都是直接将参数替换过去，而未进行运算； 仅当从嵌套宏定义中接受参数时才进行运算并替换（书中指“明示常量”）？ 也就是说预处理器在进行宏替换时仅对指令进行明示常量计算并替换程序代码，而不对程序本身进行计算？

user: user-1
content: #define INT_STR(x) #x #define STR(x) INT_STR(x)  #define LINE_FILE "Line " STR(__LINE__) " file " __FILE__
user-0 提问: C语言打开文件进行哈希运算得出摘要的程序为什么运行不对啊

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

user: user-2
content: 写代码一定要注释！尤其是要别人帮忙。 有这个时间看你的代码，为什么不能去看大师的代码？至少还有大把技术资料。 逛论坛是随便看看有什么可以顺手解答的，不会有谁有耐心看半天没成型的代码。  多学学软件工程方面的东东吧，以后干起活来肯定要和别人合作，没点基础不行的。 一般先设计，考虑到依赖性和拓展性，设计OK先搞测试用例，好的用例在通过测试时代码就是OK的。 建议看看《重构》，对软件开发非常有用。

user: user-3
content: main函数开始设断点，F10一步一步看，可以设几个观察的变量

user: user-0
content: 谢谢教导，虽然作为一名仅仅了解C皮毛的大四毕业生，但确实指导很受用！

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

回复:
user: user-1
content: 不同编译器结果都有可能不一样，这种东西。。诶。。

user: user-2
content: 关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

user: user-3
content: 不需要了解 所谓的“了解”只是自欺欺人罢了 正如同一个词在不同方言中的含义不同，是都错了，还是都对了，还是有对有错？ 毫无意义 正常人要做的，就是避免这些东西，才能与所有的正常人交流

user: user-4
content: 不要这样使用，结果是未定义的

user: user-5
content: 这是未定义行为，没有意义

user: user-6
content: printf计算参数是从右到左压栈的，打印的结果不同的编译器很可能不同 参考：http://bbs.csdn.net/topics/370153775
user-0 提问: C语言自动类型转换的问题

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

user: user-2
content: printf("%d,%f",a,a);第一个数据a，按照 int 处理，TC中 他是16Bits的 第二个数据a,按照 double 处理64Bits %f,%lf 只是输出精度可能不同，至少，float 不必采用高精度输出 所有 float,double  取数 都是按照 double 取的 float 参数按照 double 传递 TC中是64Bits的

user: user-3
content: 第二个问题a是按照int方式存储，但按照float方式读取，即IEE754标准读取

user: user-3
content: 第一个问题不同类型参与运算，则先转换为同一种类型再进行计算，转换按照类型提升的方向进行，低精度向高精度转换，或者说向类型长度增加的方向进行。强转则是临时性转换不改变原类型存储方式，仅仅对原类型结果求得目标类型值。 自动转换和强转都是临时性转换

user: user-0
content: 引用 1 楼 qq423399099 的回复:(int)b+c;是int+float都会隐式转换成double进行运算 a的值是3 问题2：请参考IEEE754浮点数存储标准 printf("%f",a); 这样指定输出并不会进行隐式类型转换，只是将a在内存中的二进制形式按照float存储标准来解析  ----------------------------------------------------------- 问题1，如果是表达式为double型的，为什么答案是3而不是3.7？

user: user-4
content: 引用 2 楼 prinke12345 的回复:[quote=引用 1 楼 qq423399099 的回复:] (int)b+c;是int+float都会隐式转换成double进行运算 a的值是3 问题2：请参考IEEE754浮点数存储标准 printf("%f",a); 这样指定输出并不会进行隐式类型转换，只是将a在内存中的二进制形式按照float存储标准来解析  ----------------------------------------------------------- 问题1，如果是表达式为double型的，为什么答案是3而不是3.7？[/quote] 因为你的a是int的啊。。。。

user: user-4
content: (int)b+c;是int+float都会隐式转换成double进行运算 a的值是3 问题2：请参考IEEE754浮点数存储标准 printf("%f",a); 这样指定输出并不会进行隐式类型转换，只是将a在内存中的二进制形式按照float存储标准来解析
user-0 提问: C语言switch里的default里加continue问题

回复:
user: user-0
content: 恩呢 谢谢 已经改好了 的确是函数把回车当成字符的原因

user: user-1
content: 主要是因为输入缓冲区有遗留下来的回车符，所以导致输入错误的时候Scord=getchar();会读到回车 方法是default分支下加上：fflush(stdin);或者getchar();都行  #include<stdio.h> #include<stdlib.h> int main() { 	char Scord; 	printf("-------------成绩管理系统------------\n"); 	printf("等级为'A'成绩在90分以上,\n"); 	printf("等级为'B'成绩在80~90分之间,\n"); 	printf("等级为'C'成绩在60~80分以上,\n"); 	printf("等级为'D'成绩在60分以下\n"); 	printf("请输入成绩等级:");  	while(1) 	{ 		Scord=getchar(); 		switch(Scord) 		{ 		case 'A': 			printf("该学生成绩在90分以上\n"); 			break; 		case 'B': 			printf("该学生成绩在80~90分之间\n"); 			break; 		case 'C': 			printf("该学生成绩在60~80分之间\n"); 			break; 		case 'D': 			printf("该学生成绩在60分以下\n"); 			break; 		default: 			getchar();//或者fflush(stdin);都能清空遗留下来的回车符 			printf("您输入的分数不正确,请重新输入:"); 			continue; 		} 		break; 	} 	system("pause"); }
user-0 提问: c语言软件程序混乱

回复:
user: user-1
content: 引用 3 楼 zpr5554321 的回复:不行，重装后一开始可以，换了一组数据就又乱了 #include<stdio.h> int main() { 	int max4(int a,int b,int c,int d); 	int a,b,c,d,max; 	scanf("%d,%d,%d,%d",&a,&b,&c,&d); 	max=max4(a,b,c,d); 	printf("%d",max); 	return 0; } int max4(int a,int b,int c,int d) { 	int max2(int a,int b); 	int m; 	m=max2(a,b); 	m=max2(max2(a,b),c); 	m=max2(max2(max2(a,b),c),d); 	return m; } int max2(int a,int b) { 	int max; 	max=(a>b?a:b); 	return max; }  1、a,b,c,d初始化为0：int a=0, b=0, c=0, d=0; 2、输入数据用逗号隔开：1,2,3,4 3、换一个编译器试试，gcc下编译通过且结果正常

user: user-2
content: 楼主重装过系统了啊，楼主用的啥编译软件？

user: user-0
content: 求大神们帮帮我

user: user-0
content: 不行，重装后一开始可以，换了一组数据就又乱了 #include<stdio.h> int main() { 	int max4(int a,int b,int c,int d); 	int a,b,c,d,max; 	scanf("%d,%d,%d,%d",&a,&b,&c,&d); 	max=max4(a,b,c,d); 	printf("%d",max); 	return 0; } int max4(int a,int b,int c,int d) { 	int max2(int a,int b); 	int m; 	m=max2(a,b); 	m=max2(max2(a,b),c); 	m=max2(max2(max2(a,b),c),d); 	return m; } int max2(int a,int b) { 	int max; 	max=(a>b?a:b); 	return max; }

user: user-0
content: 我试试看看，谢谢。

user: user-3
content: 重装系统试试
user-0 提问: 请问我的代码哪错了？

回复:
user: user-1
content: multiply声明了，没有进行运算，还有就是time.h导入的没有什么用啊，用时间播种子表示srand((unsigned)time(NULL));

user: user-2
content: 楼上正解，multiply一直是个垃圾值

user: user-3
content: multiply没有计算，还有为什么不用循环
user-0 提问: while(!feof(fp))跳不出循环

回复:
user: user-0
content: 找到错误了，谢谢大家解答

user: user-1
content: 不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。  返回值：实际读取的元素个数。如果返回值与count不相同，则可能文件结尾或发生错误。从ferror和feof获取错误信息或检测是否到达文件结尾。

user: user-0
content: 引用 5 楼 renwotao2009的回复:[quote=引用 4楼我是你的主体 的回复:][quote=引用 3 楼 renwotao2009的回复:]文本文件判断用EOF，EOF为-1。feof既可以判断文件文件也可以判断二进制文件 这个知道，但没找到跳不出循环的原因[/quote]你调试没，看函数返回值[/quote] 调试看了，发现是跳不出for循环，fread的返回值一直是1

user: user-0
content: 引用 6 楼 liehu232的回复:是for循环没退出吧 好像是，fread的返回值一直是1，为什么读到文件末尾不会返回0的

user: user-2
content: 是for循环没退出吧

user: user-3
content: 引用 4楼我是你的主体 的回复:[quote=引用 3 楼 renwotao2009的回复:]文本文件判断用EOF，EOF为-1。feof既可以判断文件文件也可以判断二进制文件 这个知道，但没找到跳不出循环的原因[/quote]你调试没，看函数返回值

user: user-0
content: 引用 3 楼 renwotao2009的回复:文本文件判断用EOF，EOF为-1。feof既可以判断文件文件也可以判断二进制文件 这个知道，但没找到跳不出循环的原因

user: user-3
content: 文本文件判断用EOF，EOF为-1。feof既可以判断文件文件也可以判断二进制文件

user: user-0
content: 引用 1 楼 user-4的回复:EOF是文本文件结束的标志。在文本文件中，数据是以字符的ASCⅡ代码值的形式存放，普通字符的ASCⅡ代码的范围是32到127（十进制），EOF的16进制代码为0x1A（十进制为26），因此可以用EOF作为文件结束标志。 PS: 对文本文件的结束判断可以看文件末尾是否读到EOF控制字符。  但是对于二进制文件来说，所有的内容都是以10101的形式存储的，因此在文件的末尾可能存在-1的情况，这样就不能用EOF作为二进制文件末尾的标识。 但我用的是feof，这个函数的返回值只有0和1

user: user-4
content: EOF是文本文件结束的标志。在文本文件中，数据是以字符的ASCⅡ代码值的形式存放，普通字符的ASCⅡ代码的范围是32到127（十进制），EOF的16进制代码为0x1A（十进制为26），因此可以用EOF作为文件结束标志。 PS: 对文本文件的结束判断可以看文件末尾是否读到EOF控制字符。  但是对于二进制文件来说，所有的内容都是以10101的形式存储的，因此在文件的末尾可能存在-1的情况，这样就不能用EOF作为二进制文件末尾的标识。
user-0 提问: 已经写完了函数，main发法怎么写呢

回复:
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: 全角反斜线 [＼＼] != 半角反斜线 [\\] 全角斜线 [／／] != 半角斜线 [//]

user: user-2
content: 全角斜线 [＼＼] != 半角斜线 [\\] 全角反斜线 [／／] != 半角反斜线 [//]

user: user-3
content: LZ所谓的写完了，估计也就是网上找的一段，期待有人给他写出完整的程序。

user: user-4
content: 楼主，你61，62行的注释貌似不对吧，运行肯定会报错，明显字体颜色都和上面两行的注释不一样

user: user-5
content: 仅供参考  #include <stdio.h> #include <stdlib.h>  typedef struct SeqStack {     int MAXNUM;	/*栈中最大元素个数*/     int t;		/*顺序栈类型定义*/     int *s;  }SeqStack, *PSeqStack;/*顺序栈类型的指针类型*/   PSeqStack createEmptyStack_seq(int m)  {     PSeqStack pastack = (PSeqStack)malloc(sizeof(SeqStack));     if (NULL == pastack) {     	return NULL; 	}      	if (m) {     	pastack->s = (int*)malloc(sizeof(int) * m);     	if (NULL == pastack->s) {     	free(pastack);     	return NULL;     	} 	}      pastack->MAXNUM = m;     pastack->t = -1;     return pastack; }  void destroyStack_seq(PSeqStack pastack) { 	if (pastack->s) { 		free(pastack->s); 	}  	 	free(pastack); }    void push_seq(PSeqStack pastack, int x)/*栈中插入一个元素*/ {     if (pastack->t >= (pastack->MAXNUM - 1)) {         printf("Overflow!\n");   	 	}     else {         pastack->t++;         pastack->s[pastack->t] = x;     } }   int pop_seq(PSeqStack pastack)/*删除栈顶元素*/ { 	int pop = 0; 	     if (pastack->t == -1) {         printf("Underflow!\n"); 	}      else {      	pop = pastack->s[pastack->t];      	pastack->t--; 	}      	return pop; }  int is_seq_empty(PSeqStack pastack) {     if (pastack->t == -1) {         return 1; 	} 	 	return 0;	 }  int top_seq(PSeqStack pastack)/*当pastack所指的栈不为空栈时，求栈顶元素的值*/ {     if (pastack->t == -1) {         printf("It is empty!\n");         return 0; 	}     else {     	return(pastack->s[pastack->t]); 	} }    int main(void) {     int m = 10;      PSeqStack pastack = NULL;            //创建一个能够容纳10个元素的栈     pastack = createEmptyStack_seq(m);     //向栈中压入数据      push_seq(pastack, 1);     push_seq(pastack, 2);     push_seq(pastack, 3);     push_seq(pastack, 4);     push_seq(pastack, 5);          while (!is_seq_empty(pastack)) {     	printf("pop data %d\n", pop_seq(pastack)); 	} 	 	destroyStack_seq(pastack); 	return 0; }

user: user-6
content: nt main()  {      int m; int x=1; scanf("%d",&m)      PSeqStack pastack;      pastack=createEmptyStack_seq(m);//创建  pop_seq(pastack);//插入数据     push_seq(pastack, x);//删除栈顶元素 int top = top_seq(pastack);//返回栈顶数据 return 0; }  楼主缺乏基本的debug能力呀，要多练习

user: user-0
content: 你好，你看一下，结果是这样的

user: user-0

user: user-7
content: mian里面直接调用就行了 nt main()  {      int m; int x=1; scanf("%d",&m)      PSeqStack pastack;      pastack=createEmptyStack_seq(m);//创建  pop_seq(pastack);//插入数据     push_seq(pastack, x);／／删除栈顶元素 int top = top_seq(pastack);／／返回栈顶数据 return 0; }
user-0 提问: c语言 串口通信 

回复:
user: user-1
content: if（'a' == buf[10]）

user: user-0
content: 请问4楼，怎样可以将输入的数据直接写成a，我写成if（buf[10]=a）错了

user: user-0
content: 5楼的意思是定义多个数组吗？

user: user-2
content: 如果文本框textbox个数很多的话， 可以定义成数组。对应的字符也可以放到数组里面。 然后用循环实现自动分配。

user: user-3
content: 你可以使用if语句或者switc..case 的格式对于你串口输入的数据进行判断，根据输入的数据的不同，跳转到不一样的处理函数。不知道这个的思路能不能解决楼主你的问题。我最近刚写了一点，就是使用stm32芯片，对每次从串口接收的数据进行判断，根据输入的不同调转到不同的出来函数去执行

user: user-0
content: 就是指向一个接收框控件 TEXTBOX

user: user-4
content: 啥叫“指向接收框”？

user: user-0
content: 有没有大神会这个，或者这样可不可行？
user-0 提问: C语言，关于数组的赋值的问题。

回复:
user: user-1
content: 看来楼主这家伙还没有真正认识什么是表达式，也不知道表达式会计算一个值。 int x = 0; while(links[i].p[j][k]!=0) {        printf(">%d", s[x ++] = links[i].p[j][k++]-1); }

user: user-2
content: k++递增一次就成，反正应该就是那个意思

user: user-2
content: 定义一个变量记录a当前使用的下标，在循环中赋值，在循环中递增下标 int l = 0,s[N] = {0};  while(links[i].p[j][k]!=0) {        s[l++] = links[i].p[j][k++]-1;        printf(">%d",links[i].p[j][k++]-1); }

user: user-0
content: 题目中打错了。数组a[]就是数组s[].同一个意思。
user-0 提问: 关于windows平台下c语言socket的问题

回复:
user: user-1
content: 需要调用 fflush 之类的函数，刷新缓冲区（让数据写入文件），或者关闭文件。 关闭当然最好，但是耽误事情 每次打开关闭，太麻烦了

user: user-2
content: 数据可能还在缓存里，关闭文件可以让缓存里的数据全部存到文件里

user: user-3
content: 是不是没有close(file)?

user: user-4
content: 楼上正解，刷新下缓存buf
user-0 提问: 学数据结构的时候写程序遇到的问题，应该很简单，求指教

回复:
user: user-1
content: SqList* &L就是指针的引用传递，加上&可以去改变L的指向，如果不加&则只能改变L所指向的区域的值

user: user-2
content: 有&传递的是一个指针的引用

user: user-3
content: 你用C编译C++于是出问题了 SqList* & L 是指针的引用， C++有引用类型， C没有引用类型 于是乎，编译不了代码

user: user-4
content: SqList* & L是不是有问题吧。 看L = (SqList*)malloc(sizeof(SqList));这句，SqList是个结构体吧。 SqList* L，L是个结构体指针。

user: user-5
content: 定义的是链表指针SqList*  L；L是链表指针  &L表示L的引用，也就是L的存放地址
user-0 提问: 把输入粘贴到输出

回复:
user: user-1
content: 1.字符要用%c输出，字符串才用%s 2.output[++m] = '\0';应该改为output[m] = '\0'; 3.(c = getchar()) != EOF我改成了(c = getchar()) != '\n'  #include<iostream> using namespace std; #define MAX_LINE 1000 int main() { 	int	n = 1; 	char	c; 	int	m; 	char	output[MAX_LINE];  	for(m = 0;(c = getchar()) != '\n'; m++){ 		output[m] = c; 	} 	output[m] = '\0'; 	m = 0;  	while(output[m] != '\0'){ 		if(n == 1){ 			printf("Line1:"); 			n += 1; 		} 		if(output[m] != '\n'){ 			printf("%c", output[m]); 			m++; 		} 		else{ 			/* 			printf("%s", output[m]); 			printf("Line%d:", n); 			n++; 			m++;*/ 		} 	}   printf("\n"); }

user: user-2
content: printf("%s", output[m]);  改成  printf("%s", output); 或者 printf("%c", output[m]);  output[m]只是一个字符

user: user-3
content: 就这样吧：  #include <stdio.h> #include <string.h> #define MAXCHARS 256 char ln[MAXCHARS]; int line, n; int main(void){    line = 1;    while(1){       if(NULL == fgets(ln, MAXCHARS, stdin)) break;       n = strlen(ln);        if('\n' == ln[0]) continue;        printf("%d %s", line, ln);       line++;    }     return 0; }
user-0 提问: 问一个保存数据到文件和读取的问题

回复:
user: user-1
content: fp=fopen("book.txt","ab"); 改成 fp=fopen("book.txt","a+b");

user: user-2
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 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-3
content: 其实你可以在添加书本的时候动态的统计书本的数量 或者说你可以用文件的大小除以结构体的大小

user: user-0
content: 搞懂了，是上面用追加的方式打开了文件，读取不到之前的数据，谢谢大家解答
user-0 提问: C语言新人求助

回复:
user: user-1
content: #include <stdlib.h> #include <stdio.h>  int _tmain(int argc, _TCHAR* argv[]) { 	char buff[1024] = {0}; 	scanf("%s", buff); 	//输入102.01s10后回车  	for (int i = 0; i < 1024; ++i) 	{ 		if (buff[i] == '0') 		{ 			memmove(buff + i, buff + i + 1, 1024 - i - 1); 		} 	}  	double value = strtod(buff, nullptr); 	//value = 12.100000000000000 	return 0; }   这样好看点

user: user-1
content: #include <stdlib.h> #include <stdio.h>  int _tmain(int argc, _TCHAR* argv[]) { 	char buff[1024] = {0}; 	scanf("%s", buff); 	//输入102.01s10后回车  	for (int i = 0; i < 1024; ++i) 	{ 		if (buff[i] == '0') 		{ 			memmove(buff + i, buff + i + 1, 1024 - i - 1); 		} 	}  	double value = strtod(buff, nullptr); 	//value = 12.100000000000000 	return 0; }

user: user-2
content: 字符串转化为整数 http://blog.csdn.net/zhangxiangdavaid/article/details/25245125

user: user-3
content: #include<stdio.h> void main()  {  	char str[128] = {0}; 	char buffer[128] = {0};     char *p = str, *q = buffer; 	printf("请输入字符串:"); 	scanf("%s", str); 	while(*p != '\0') 	{ 		if(*p >= '1' && *p <= '9') 			*q++ = *p; 		*p++; 	} 	*q = '\0'; 	printf("转换后结果为:%s\n", buffer); }
user-0 提问: 求助: linux服务器socket read或write 出现errno=5的错误

回复:
user: user-1
content: 引用 9 楼 xiaowulai1225 的回复:谢谢大家。问题终于找到了。 原来的代码是这样的（send调用的情况类似）： s32 len = recv( m_socket, data, len, 0 ); // printf("recv = %d\n", len); if( len==-1 && (errno==EAGAIN || errno==EWOULDBLOCK) ) { 	break; } recv/send之后有一行printf，是为了调试而新增的。 进程退到后台执行后，程序调用printf会产生errno=5的错误。 而socket在调用recv返回EAGAIN错误后，因为又调用了printf导致errno被修改了， 导致后面的判断条件认为是socket收发数据异常而断开了连接 所以就出现了上面的情况。 谁让你不紧接在出错函数后获取errno的？活该！！

user: user-2

user: user-3
content: 前面说过后台进程读写终端都会引起SIGTTOU或者SIGTTIN的信号这个是会终止进程的

user: user-0
content: 谢谢大家。问题终于找到了。 原来的代码是这样的（send调用的情况类似）： s32 len = recv( m_socket, data, len, 0 ); // printf("recv = %d\n", len); if( len==-1 && (errno==EAGAIN || errno==EWOULDBLOCK) ) { 	break; } recv/send之后有一行printf，是为了调试而新增的。 进程退到后台执行后，程序调用printf会产生errno=5的错误。 而socket在调用recv返回EAGAIN错误后，因为又调用了printf导致errno被修改了， 导致后面的判断条件认为是socket收发数据异常而断开了连接 所以就出现了上面的情况。

user: user-0
content: 谢谢两位回复，我在试试看。有其他进度或发现在贴出来

user: user-0
content: 这是我最近测试下来的结果：实际测试在centos 5.8  6.5 和 unbutn 14.04上都会出现。 上面说的在 centos5.8 没有出现是因为那个版本在 send recv  后没有调用到printf。 测试版本因为要确认消息的收发，所以特意加上了log输出。  最终测试发现 只要在 send  recv 后面加上printf ，并且程序这样启动  ./xxxx &  ，那么必然会出现 errno=5的错误； 如果不加 printf，或是 printf改为写文件，或是 程序 nohup ./xxxx & 启动，那么就不会出现errno=5的错误；  哪个大神可以帮忙分析下原因吗？

user: user-1
content: printf改为fprintf写文件吧。 可能是因为printf导致console上卷时耗时过长影响send和recv的速度。我猜。

user: user-3
content: 后台进程写控制终端产生了SIGTTOU信号。你可以捕捉下看看是否是这样

user: user-0
content: 谢谢！这个意思就是还是因为系统（无论是硬件还是软件）引起的了？

user: user-1
content: 流量限制 水晶头接触不良 机房有人碰了网线 传输内容中有禁词 被黑客攻击 电源不稳 散热有问题 ……

user: user-0
content: 感谢回复！那是说是硬件或是驱动问题引起的？ 因为我同样的版本（代码一样）在 centos 5.8 32位系统上重编运行就没有这种错误。 昨天晚上在有问题的机器上做了下echo的测试，客户端每条发200+字节数据，服务器收到后回包。 上了400个连接，基本几分钟就出现一次，感觉像是这个socket到达了某个流量阈值后被断开。 用来测试的两个机器都是阿里云的服务器，只是所属的位置和版本不一样。

user: user-4
content: errno5 :   Input/output error errno=5的错误是EIO,表示IO错误 EIO比较棘手，你可能需要查看当时更多的信息。 网卡设备异常，驱动异常啊，硬件出错都可能导致这个问题。
user-0 提问: 我是菜鸟  关于链表  

回复:
user: user-1
content: printf("请输入原来的姓名："); getchar(); gets(name)； 楼主你这里读进来的name你用到了么？ 你比较的时候也是和Taccept比的, if((strcmp(head2->teach.name, Taccept)==0))

user: user-2
content: 麻烦把代码完整得发一下，楼主。。。。
user-0 提问: 为什么保存不了数据进文件

回复:
user: user-1
content: struct a {     int all; }b;  这种东西不需要用结构体。

user: user-0
content: 懂了，谢谢大家

user: user-2
content: #include<stdio.h> struct a { 	int all; }b; int main() { 	FILE *fp; 	int i=0; 	struct a c[10]; 	fp=fopen("a.txt","wb"); 	c[i].all = 1; 	printf("%d",c[i].all); 	fprintf( fp,"%d", c[i].all ); 	fclose(fp); 	return 0; }

user: user-2
content: 你最后都跑到 ab  二进制读写了 txt 是写入了的， 格式不一样

user: user-3
content: fp=fopen("a.txt","wb");

user: user-4
content: 其实是写入了文件的（楼主从文件的大小应该也能看出来） LZ这个问题涉及到ASCII码问题，首先你存储时使用的fwrite函数，将你的数据按照函数参数存储后，是以二进制文件格式保存的，你出现的问题是因为你直接当txt文件打开时，他会认为你是文本文件，而文本文件是按照ASCII码存储的，因此他会每8个bit读取一次，并显示对应ASCII码中的字符，就会显示出你那种结果。 楼主可以用以下代码验证：  fp=fopen("a.txt","rb"); fread(&b,sizeof(b),1,fp); printf("\n%d\n",b.all);
user-0 提问: c语言新人提一个问题，麻烦各位大神帮我看一下

回复:
user: user-1
content: 3-5等价于-(-3+5)

user: user-2
content: && || 和！非的逻辑问题，上面答的都很好了，楼主多想想

user: user-3
content: !(x%5==1&&x%6==5&&x%7==4&&x%11==10)  等价于   (x%5!=1||x%6!=5||x%7!=4||x%11!=10)  注意中间是||

user: user-4
content: 逻辑运算基础:  !(A && B) 等价于 !A || !B  !(A || B) 等价于 !A && !B

user: user-5
content: 你的逻辑应该是同时满足除以5余1，除以6余5，除以7余4，除以11余10时跳出while循环 所以你的while判断条件就应该是(x%5==1&&x%6==5&&x%7==4&&x%11==10)的取反，得到 !(x%5==1&&x%6==5&&x%7==4&&x%11==10) 也可以把取反拿到括号中就变成了x%5!=1 || x%6!=5 || x%7!=4 || x%11!=10

user: user-6
content: 应该是||，就是说有一个不满足就要继续。

user: user-7
content: 逻辑关系没弄清楚，题意是必须4个条件同时满足才能得到要求的数，否则，只要有一个条件不能满足就得不到要求的数，你的条件语句应该改成，x%5!=1 || x%6!=6 || x%7!=4 || x%11!=10

user: user-8
content: package main import ( 	"fmt" )  //要求：找出一个数，使其除以5余1，除以6余5，除以7余4，除以11余10. func main() { 	n := 0 	for{ 		if(n%5==1 && n%6 == 5 && n%7==4 && n%11==10){ 			fmt.Println(n) 			break; 		} 		n++ 	} }  //2111 希望大家能接触一下golang

user: user-9
content: 上面写的！＝是不等于，下面写的＝＝是等于啊
user-0 提问: 数组指针与指针数组的问题

回复:
user: user-1
content: 引用 5 楼 qq423399099 的回复:[quote=引用 4 楼 face_t0_sea 的回复:] 第三个 int (*)[3]&pa， 我试了，编译不通过啊？你解释的我也没看懂，帮忙再看看~~~~~~ 加个括号呗，不加括号没那种写法的。。 [/quote]  岂止是加个括号，你厉害 ~~    告诉他写错了不得了

user: user-1
content: pa[3] is pointers to int        pa is a pointer to int*[3]         int (*)[3]&pa;     incorrect expression

user: user-2
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-0
content: 谢谢各位了，你们太牛了！

user: user-3
content: 引用 4 楼 face_t0_sea 的回复:[quote=引用 3 楼 qq423399099 的回复:] int (*pa[3]) --- 一个含有3个元素的数组,其中每个元素都是指向int数据的指针  int (*pa)[3] --- pa是一个指向数组的指针,所指向的数组含有三个int元素 int (*)[3]&pa --- 可以分两步看，第一步（(*)[3]）声明该变量为一个数组指针，第二步&pa,指向了pa首地址  第三个 int (*)[3]&pa， 我试了，编译不通过啊？你解释的我也没看懂，帮忙再看看~~~~~~[/quote] 加个括号呗，不加括号没那种写法的。。

user: user-1
content: 引用 3 楼 qq423399099 的回复:int (*pa[3]) --- 一个含有3个元素的数组,其中每个元素都是指向int数据的指针  int (*pa)[3] --- pa是一个指向数组的指针,所指向的数组含有三个int元素 int (*)[3]&pa --- 可以分两步看，第一步（(*)[3]）声明该变量为一个数组指针，第二步&pa,指向了pa首地址  第三个 int (*)[3]&pa， 我试了，编译不通过啊？你解释的我也没看懂，帮忙再看看~~~~~~

user: user-3
content: int (*pa[3]) --- 一个含有3个元素的数组,其中每个元素都是指向int数据的指针  int (*pa)[3] --- pa是一个指向数组的指针,所指向的数组含有三个int元素 int (*)[3]&pa --- 可以分两步看，第一步（(*)[3]）声明该变量为一个数组指针，第二步&pa,指向了pa首地址

user: user-4
content: 仔细读完保证你之后见到不再会晕  http://blog.csdn.net/angle_birds/article/details/8991816

user: user-5
content: 指针 http://blog.csdn.net/zhangxiangdavaid/article/details/38085743

user: user-6
content: 定义这么复杂的数据做什么？需要的话， 多 typedef 几次，程序看着清晰

user: user-6
content: int (*&pa)[3];大概是想这么写的吧 实际上大约应该这么写： int a[4][3]={0}; int(*pa)[3]=a;//数组指针 int(*&rpa)[3] = pa;// 数组指针的引用。

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

user: user-7
content: int(*pa)[3] --->array to pointer  int (*)[3]&pa ---> (array to pointer) of head address
user-0 提问: 请问大家如何向github上的开源项目提交自己代码？

回复:
user: user-0
content: 谢谢你的回答，非常感谢

user: user-1
content: 1. 先fork一份。 2. 根据需要进行修改。 3. 向原gem发Pull Request， 等待对方响应。（有可能不接受你的修改）
user-0 提问: 关于return 0的问题

回复:
user: user-1
content: 出现警告是因为这个函数必须有返回值，而你的代码不是所有条件分枝都有返回值。 char类型函数返回0页是正常的，char类型数据和int类型数据一样，也是一个数，只是char数据长度是1个字节，而int数据长度至少是2个字节。

user: user-2
content: int main()的return 0是和操作系统的约定，操作系统调用你的程序，你的程序从main运行，从main结束，main return 0表示告诉系统你的程序正常退出，return 1表示你的程序异常退出，1是异常的号码。操作系统可以利用这个return值来做事。 至于你自定义的函数的返回值你可以自己设定，通过返回值来进行一些不同的处理

user: user-3
content: 你自定义的返回值代表什么含义要由有你自己来决定。  用 "return 0; 表示成功" 仅仅是C的编程的一个古老的约定。 在C的传统中，当声明函数返回类型为int 时(比如 int foo(...); ), 如果该返回值不是某个计算的结果，那么往往是指err_code， 其中，0 表示 NO_ERROR。

user: user-4
content: 返回值为char，return 0;可以的，返回值为0x00的char变量 函数的返回值，是调用者使用的，意义完全在于函数设计者和调用者怎么约定。 main函数的返回值是系统在调用，约定的0为成功，这个没法改的。其他自定义函数可以按照需要约定

user: user-5
content: 引用 1 楼 yuelengdihai 的回复:int main()决定了返回值为int （1或0） 看错了  50行那个return 0； 其实0和'\0'值是一样的 这里的0也就是字符‘\0'  是正常结束，函数返回值是'\0'

user: user-5
content: int main()决定了返回值为int （1或0）
user-0 提问: C语言怎么实现指定字符串在txt文本文件出现的次数，所在行列

回复:
user: user-1
content: 引用 7 楼 mwj8686 的回复:引用用strstr查找啊，然后把找到的结果字符串指针减去该行字符串的首字符就是在这行的位置（也就是列的位置） 如果一行有多个所查找字符串呢？  放到循环里，每次查找后将起点移动到上一次查找到的字符串后面，一直到找不到为止，就可以统计出出现的次数了  strstr的返回值就是最先找到的字符串的开头，如果找不到则返回NULL

user: user-2
content: 引用 7 楼 mwj8686 的回复:引用用strstr查找啊，然后把找到的结果字符串指针减去该行字符串的首字符就是在这行的位置（也就是列的位置） 如果一行有多个所查找字符串呢？ 那你就这样干：  #include <stdio.h> #include <string.h> int main(void){    char *str="zxabczxdefzxghi";    char *findstr = "zx";    char *p = str;    int times = 0;    while(p = strstr(p, findstr)){       p = p + strlen(findstr);       times++;    }    printf("\"%s\" occurs %d times in \"%s\"\n", findstr, times, str);    return 0; } //"zx" occurs 3 times in "zxabczxdefzxghi"

user: user-0
content: 引用用strstr查找啊，然后把找到的结果字符串指针减去该行字符串的首字符就是在这行的位置（也就是列的位置） 如果一行有多个所查找字符串呢？

user: user-3
content: 用strstr查找啊，然后把找到的结果字符串指针减去该行字符串的首字符就是在这行的位置（也就是列的位置）

user: user-1
content: 可以把文件全部读入，用strstr循环查找以确定出现的总次数

user: user-0
content: 引用看楼主是用哪种方式查找的了 如果是string的find_first_of可以直接得到所在列 char *strstr什么的要自己减一下 要用c语言，不是c++

user: user-0
content: 2楼的真不懂

user: user-4
content: 看楼主是用哪种方式查找的了 如果是string的find_first_of可以直接得到所在列 char *strstr什么的要自己减一下

user: user-5
content: 仅供参考：#include <stdio.h> #include <string.h> char s[256]; char *p; int r,n,i; int main() {     while (1) {         printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXXXXX\":\n");         fgets(s,256,stdin);         if ('\n'==s[0]) break;         p=s;         while (1) {             p=strstr(p,"%20");             if (p) {                 memmove(p+1,p+3,strlen(p)-3+1);                 p[0]=' ';             } else break;         }         p=s;         while (1) {             p=strstr(p,"你懂得");             if (p) {                 memmove(p+6,p+6,strlen(p)-6+1);                 for (i=0;i<6;i++) p[i]='X';             } else break;         }         printf("%s",s);     }     return 0; } //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //abcdefg%20helloworld%20something.pdf //abcdefg helloworld something.pdf //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //这是测试文字你懂得，在这个你懂的地方，就得做你懂得的事 //这是测试文字XXXXX，在这个你懂的地方，就得做XXXXX的事 //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //
user-0 提问: 去大神帮我看看哪里出问题了！！！

回复:
user: user-0
content: 运行时     是提示.exe出现问题     win7系统

user: user-0
content: 已经把上面那个程序的注释贴上来了  求各位大神看看到底问题在哪。。。。。。。。

user: user-0
content: 把先前定义的结构体贴上来 typedef struct ldpc_node{ 	int degree; 	int *pass_node; 	int *pass_edge; 	double *output_message; }node;//节点的结构体，degree表示节点的度（决定一个节点有几个pass_node和pass_edge；如此例中variable_node的degree就是2，所以每个variable_node会有两个pass_node和两个pass_edge）；pass_node和pass_edge实质是一种坐标，可以从txxt中读进去pass_node，pass_edge要从pass_node转换；  struct decode{ 	double *receive_code; 	int *output_code; 	node *variable_node; 	node *check_node; 	int check_num; 	int variable_num; };//variable_node和check_node分别是上面那个结构体中的两个节点，check_num表示check_node的个数，同理variable_num表示variable_node的个数。  我这边把这个variable_node的pass_node读进来了！现在想把pass_node转换成pass_edge。  这地方函数名 void ini(decode *ldpc_decode)//形参就是上面第二个结构体；  定义一个当前节点node *current_node; / /上面第一个结构体 for (i = 0; i < ldpc_decode->variable_num; i++) //i小于变量节点的个数 { current_node = ldpc_decode->variable_node + i; //当前节点为ldpc_decode的variable_node for (j = 0; j < current_node->degree; j++)  //j小于当前节点的度 { *(current_node->pass_node + j) = Read_Num(fp);  //把当前这个节点也就是variable_node的pass_node读进来 } }  现在就是总共有6个variable_node，每个variable_node会读进去两个pass_node（也就是上面说的每个variable_node的degree为2），比如我读进去的所有的pass_node是1 4 ；2 4； 1 3 ；3 4 ；2 3 ；1 2       所有的pass_node从前往后看，第一次出现这个数就标记为1，第二次出现就标记为2，以此类推。  所以转换后的pass_edge就是1 1 ；1 2； 2 1； 2 3； 2 3； 3 3  我的想法就是把这所有的pass_node读到一个数组里去，然后把数组的最后一个数一次和前面每个数比较，出现相同的就加一，用另一个数组保存这个新的结果，再把数组的结果读到pass_edge里去。  下面就是转换过程，求大神帮我看看有什么问题，现在就是运行不了，也没报错。。。。。。   定义4个指针，并分别分配空间。因为要用这个4个指针操作pass_node和pass_edge，所以分配的空间是variable_num(variable_node的个数)*variable_node的degree。   a = (int*)malloc((ldpc_decode->variable_node->degree*ldpc_decode->variable_num)*sizeof(int)); if (a == NULL) { printf("memory allocation failure!\n"); exit(1); }  b = (int*)malloc((ldpc_decode->variable_node->degree*ldpc_decode->variable_num)*sizeof(int)); if (b == NULL) { printf("memory allocation failure!\n"); exit(1); }  for (i = 0; i < ldpc_decode->variable_num; i++) //i小于variable_node的个数 { current_node = ldpc_decode->variable_node + i; //当前节点为ldpc_decode的variable_node for (j = 0; j < current_node->degree; j++)  //j小于当前节点的degree { a[(i*current_node->degree) + j] = *(current_node->pass_node + j); //把刚才读进去的variable_node的pass_node存到a里面 } }   for (i = 0; i < (ldpc_decode->variable_num*ldpc_decode->variable_node->degree); i++) { b[i] = 1;  //令b的每个值都为1 }  for (i = (ldpc_decode->variable_num*ldpc_decode->variable_node->degree) - 1; i >= 0; i--) { for (j = i - 1; j >= 0; j--) { if (a[i] - a[j] == 0)   //从a的最后一个元素开始，往前对比，发现相同的用b来加一，一直进行到a的第一个元素 b[i] += 1; } }  for (i = 0; i < ldpc_decode->variable_num; i++) { current_node = ldpc_decode->variable_node + i; for (j = 0; j < current_node->degree; j++) { *(current_node->pass_edge + j) = b[(i*current_node->degree) + j];  //把刚才的b转到要转换的variable_node的pass_edge里 } }

user: user-1
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。

user: user-2
content: 楼主最好加点注释，略难看懂

user: user-0
content: 在线等大神。。。。。。。
user-0 提问: 怎样用C语言实现客户端随时收到服务器的数据

回复:
user: user-1
content: 大神，你好。可不可以借你的代码我参考参考。我就要交作业了，对网络编程还没有很熟悉。感激不尽

user: user-2
content: 引用 5 楼 huang5hun 的回复:[quote=引用 1 楼 face_t0_sea 的回复:] 先去学习下socket通信吧 嗯嗯！搞定了！用两个进程就行了！然后用管道传递数据！用signal传递信号！就可以了！[/quote] 提醒：加必要的日志以备未来出错时好调试。

user: user-0
content: 引用 1 楼 face_t0_sea 的回复:先去学习下socket通信吧 嗯嗯！搞定了！用两个进程就行了！然后用管道传递数据！用signal传递信号！就可以了！

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:[quote=引用 5 楼 huang5hun 的回复:] [quote=引用 1 楼 face_t0_sea 的回复:] 先去学习下socket通信吧 嗯嗯！搞定了！用两个进程就行了！然后用管道传递数据！用signal传递信号！就可以了！[/quote] 提醒：加必要的日志以备未来出错时好调试。  [/quote] 嗯嗯！谢谢！我会注意的！

user: user-0
content: 引用 楼主 huang5hun 的回复:小弟最近想写出一个软件，苦于不知道该怎样实现客户端随时收到来自服务器的数据。还望大神们帮帮忙！  我就是用socket编写的，但是我想让他在后台服务，也就是怎样做成守护进程那样子？

user: user-0
content: 引用 1 楼 face_t0_sea 的回复:先去学习下socket通信吧  我就是用socket编写的，但是我想让他在后台服务，也就是怎样做成守护进程那样子？

user: user-3
content: 嗯，不是用socket吗

user: user-4
content: 先去学习下socket通信吧
user-0 提问: C语言链表输出为什么是倒序？

回复:
user: user-1
content: 引用 6 楼 saberbeats 的回复:[quote=引用 4 楼 face_t0_sea 的回复:] p->next = head->next;   head->next=p; 每次都是把新建的节点插入到head的后边。 我的代码就是这样的啊[/quote] 恩，是啊，你的链表就是和输入反着的啊，倒着连接的啊。最新的永远在第一个，其他挪到后边了。

user: user-0
content: 引用 4 楼 face_t0_sea 的回复:p->next = head->next;   head->next=p; 每次都是把新建的节点插入到head的后边。 我的代码就是这样的啊

user: user-0
content: 引用 3 楼 paschen 的回复:因为你的链表添加元素时，是先分配空间，然后给该元素赋值，然后让该元素的next指向原来的链表，所以输出时顺序是反的 难道只不是一般的给链表结点数据的方法吗？ 一般应该怎样赋值啊能举个例子吗？

user: user-0
content: 好的，谢谢，我用尾插法做

user: user-1
content: p->next = head->next;   head->next=p; 每次都是把新建的节点插入到head的后边。

user: user-2
content: 因为你的链表添加元素时，是先分配空间，然后给该元素赋值，然后让该元素的next指向原来的链表，所以输出时顺序是反的

user: user-3
content: 因为你用的是头插法插入的节点，所以输出的元素是倒序的
user-0 提问: 关于while能否正常判断

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

user: user-2
content: 去掉的话就少去了判断输入的x为1位数的情况

user: user-3
content: 如果你的x值为0，不去的话与去掉不同，如果x大于0，那效果是一样的 去与不去取决于你代码想实现什么

user: user-4
content: 代码是求输入整数是几位数的，只去掉循环外的x＝／10 ，会导致结果比实际多一位； 把循环外的n++, 和 x＝／10  都去掉，会导致输入0的结果是0位数。所以，都不能去掉！

user: user-5
content: 1，去掉和不去掉判断条件不一样了   2，x＝／10；说明x大于10的时候while里面才执行

user: user-6
content: 感觉对于大于0的输入，去掉while前的两句和不去掉结果都是一样的 唯一的区别应该是输入0的时候，如果去掉while前的两句那么得到的答案是0，而不去掉得到的是1
user-0 提问: 关于自增自减问题的提问，望各位大神解答！

回复:
user: user-0
content: 引用 12 楼 min-min的回复:百度下“系列点”，就知道c标准里未规定这种语句执行先后顺序的标准，因此各编译器按自己的优化顺序做，得到不同的结果。不建议使用这类语句。 谢谢你！让积累了经验

user: user-1
content: 百度下“系列点”，就知道c标准里未规定这种语句执行先后顺序的标准，因此各编译器按自己的优化顺序做，得到不同的结果。不建议使用这类语句。

user: user-2
content: 这是一个不确定行为，涉及到顺序点，所以不要写这种语句，结果可能因编译器不同而不同  参看：关于C,C++表达式求值顺序  http://bbs.csdn.net/topics/370153775

user: user-3
content: 关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

user: user-4
content: 这问题倒真是不好说啊

user: user-5
content: http://bbs.csdn.net/topics/370153775这么好的帖子居然不置顶了，哎

user: user-6
content: 不同的编译器结果很有可能不同，C99没有规定  所以每个编译器会按自己的优化方式编译   比如我用VS打印的结果就是15,24,8,8

user: user-7
content: 但是，各编译器对这种复杂的自增自减表达式处理顺序还是有区别的，所以不建议写这样的表达式，尤其是跨平台代码，会得到不同的结果。慎重。

user: user-7
content: q = 7 + 7 + 8 = 22. 先算前面的加法，加法前先自增2次，a变为7。

user: user-0
content: 引用 3 楼 小灸舞的回复:不同的编译器结果很有可能不同，C99没有规定  所以每个编译器会按自己的优化方式编译   比如我用VS打印的结果就是15,24,8,8 嗯嗯，谢谢指教，我也实践过了，果然不一样

user: user-0
content: 引用 2 楼 sdghchj的回复:但是，各编译器对这种复杂的自增自减表达式处理顺序还是有区别的，所以不建议写这样的表达式，尤其是跨平台代码，会得到不同的结果。慎重。 嗯嗯，谢谢回帖，今天我又用别的编译器编译了，结果果然不同

user: user-0
content: 引用 1 楼 sdghchj的回复:q = 7 + 7 + 8 = 22. 先算前面的加法，加法前先自增2次，a变为7。 a是加了两次得7，但是q是由b经(++b)+(++b)+(++b)得到啊！应该是6+7+8=21

user: user-8
content: 因为一向不会算这些东西，所以我一直说，少弄这些比较虚的。
user-0 提问: 关于C语言函数参数问题

回复:
user: user-1
content: 另  直接传参 会复制一个副本，而不是用形参

user: user-2
content: 指针即地址 引用即别名

user: user-3
content: 比如： int x=3,y=5;  如果定义一个swap(int *a,int *b)函数，参数是指针，调用的时候要写： swap(&x,&y);	//形参是指针，实参为变量地址  如果定义一个swap(int &a,int &b)函数，参数是引用，调用的时候要写： swap(x,y);

user: user-4
content: 指针传递参数本质上是值传递的方式，它所传递的是一个地址值。值传递过程中，被调函数的形式参数作为被调函数的局部变量处理，即在栈中开辟了内存空间以存放由主调函数放进来的实参的值，从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行，不会影响主调函数的实参变量的值。 （换句话来说，指针传递只能修改指针所指向的内存区域的值，而不能改变指针的指向） 而在引用传递过程中，被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间，但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址，即通过栈中存放的地址访问主调函数中的实参变量。正因为如此，被调函数对形参做的任何操作都影响了主调函数中的实参变量。

user: user-5
content: C语言没有引用 ，第二种写法，不合法。

user: user-6
content: 一个是指针，一个是引用
user-0 提问: 关于c语言

回复:
user: user-1
content: 那样的b是临时变量

user: user-2
content: 你用数组作为实参传入setValue，该参数自动退化为指针了 你要给b赋值的话 应该用b[index]的形式或者*b的形式 传一级指针只能改变指针所指向区域的值，你想让b指向a的内存区域的话(并且在main函数里也起作用)必须要传二级指针

user: user-3
content: 引用 2 楼 u014737253 的回复:b数组不应该是指向a数组吗？我的目的是想把整个a数组存入b数组，做个备份  把a数组值放入b数组，不能叫b指向a，注意指针的概念。 你的让b指向a，也只在你的setValue函数里生效，b只是函数里的临时指针变量。出了函数，又回到原来的地址了。

user: user-0
content: b数组不应该是指向a数组吗？我的目的是想把整个a数组存入b数组，做个备份

user: user-3
content: b=a; 把b数组地址变为a数组了，b数组已经不存在。 你的目的应该是b[index] = a [index];
user-0 提问: c 语言小白求教大神 无法运行

回复:
user: user-1
content: 函数声明末尾要加分号 调用函数的时候要有括号 函数的实现要用大括号括起来

user: user-2
content: 关注c语言基础

user: user-3
content: 你函数定义有问题，应该把类型写在前面，声明带分号。  。

user: user-4
content: #include<stdio.h> void function1(void); void function2(void); int main (void) { printf("for he is a jolly good fellow!\n,for he is a jolly good fellow!\n"); function1(); function2(); return 0; } void function1(void) { printf("for he is a jolly good fellow!\n"); } void function2(void) { printf("which nobody can deny!\n"); } 从哪里学的语法~~   实践前也得学习才有效果~~

user: user-5
content: #include "StdAfx.h" #include"stdio.h" #include"string.h" #include<stdio.h> function1(void); function2(void); int main (void) { printf("for he is a jolly good fellow!\n,for he is a jolly good fellow!\n"); function1(); function2(); return 0; } function1(void) { printf("for he is a jolly good fellow!\n"); } function2(void) { printf("which nobody can deny!\n"); }
user-0 提问: C代码，求找错

回复:
user: user-1
content: 传参 fun(a[5][10]),这个直接就写了个越界的东西，直接用a传二级地址就行了

user: user-2
content: fun(a[5][10]);调用错误，应该是fun(a); puts(a[i][j]);  调用错误，如果想一个字符一个字符打印是putchar(a[i][j]); M,K依赖用户输入，一旦输入大于5,10，访问内存越界；就算输入正确，后边输入的字符串长度过长会得到想不到的结果，刚开始试试可以，真正编程不能这么来的； printf("\n"), 不是/n ~~~~

user: user-3
content: 请那些喜欢将数组作为函数参数传来传去的码农思考一下为什么不把整个互联网内容当作函数参数传来传去呢？

user: user-4
content: 错误已经注释在代码里了  #include"stdio.h" #include"string.h" int M,K; void fun(char (*a)[10]) {     int i,j;     for(i=0;i<M;i++)     {         for(j=0;j<K;j++)         {             putchar(a[i][j]);        //这里应该是putchar         }         printf("\n");             //应该是\n不是/n     } } int main() {     int i;     char a[5][10];     scanf("%d",&M);     scanf("%d",&K); 	fflush(stdin);     //这里要清空输入缓冲区     for(i=0;i<M;i++)         gets(a[i]);     fun(a);                  //传参不对，应该传a }