Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 指针地址传递问题，求解答

回复:
user: user-1
content: 这个说明指针不够熟悉，你把i,j的二级指针传进f函数就OK了

user: user-2
content: 引用 楼主 qq_23833037 的回复:# include<stdio.h>  int main(void) {    int i = 6;    int j = 8;         printf("地址:%p\n",&i);    printf("地址:%p\n",&j);      f(&i,&j);     printf("i = %d\tj = %d\t",i,j);     return 0; } int f(int * p,int * q) { 	int * t; 	*t = *p; 	*p = *q; 	*q = *t;  	return 0; } 在被调函数里面建立临时指，返回时还是p和q的地址，互换还是地址里面的值。为什么在编译没出错，在执行后会程序错误无法执行。 参考代码如下:  #include<stdio.h>  int f(int * p,int * q);  int main(void) { 	int i = 6; 	int j = 8;	 	int *ii,*jj,*t; 	ii = &i; 	jj = &j;    printf("i地址:%p,ii地址:%p\n",&i,ii);    printf("j地址:%p,jj地址:%p\n",&j,jj);     f(&i,&j);    printf("f(&i,&j);调用后i = %d\tj = %d\n",i,j);     f(ii,jj);    printf("f(ii,jj);调用后ii = %d\tjj = %d\n",*ii,*jj);    //交换地址     t = ii;    ii = jj;    jj = t;    printf("main函数中处理后ii = %d\tjj = %d\n",*ii,*jj);     return 0; }  int f(int * p,int * q) { int * t; t = p; p = q; q = t;  return 0; }

user: user-3
content: int f(int * p,int * q) { int * t;   // 指针用的时候要有指向的地址才能用，这里只有声明，没有具体指向的空间，随机乱涂乱画可不行啊

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

user: user-5
content: int* t直接拿来用是不行的，要先初始化。 int  *t=p; *p = *q; *q = *t;

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

user: user-6
content: 个人感觉，程序错误在没声明函数，这个代码应该能编译，

user: user-7
content: 从完全的意义上说，没有。从一定角度来说，勉强可以有

user: user-8
content: 有的错是“编译时错”，有的错是“运行时错”，我也想知道世界上有没有编译时就能知道运行时错的神编译器！

user: user-9
content: int * t;  此时t为一个野指针，没有为其开辟空间，其指向的地址是不确定的，对其访问很危险。 将 int * t; *t = *p; *p = *q; *q = *t; 改成 int  t; t = *p; *p = *q; *q = t; 就好了
user-0 提问: 一道编程题，求解惑。

回复:
user: user-1
content: // 删掉这两个 include #include #include       for(;a[0][i]!='\0'&&a[1][i]!='\0';i++)     {         if((a[0][i]==a[1][i])&&((a[0][i]<='N'&&a[0][i]>='A')||(a[0][i]>='0'&&a[0][i]<='9')))             switch(a[0][i])                     {                     case 1:min=1;                             break;                     case 2:min=2;                             break;                     case 3:min=3;                             break;                     case 4:min=4;                             break;                     case 5:min=5;                             break;                     case 6:min=6;                             break;                     case 7:min=7;                             break;                     case 8:min=8;                             break;                     case 9:min=9;                             break;                     case 'A':min=10;                             break;                     case 'B':min=11;                             break;                     case 'C':min=12;                             break;                     case 'D':min=13;                             break;                     case 'E':min=14;                             break;                     case 'F':min=15;                             break;                     case 'G':min=16;                             break;                     case 'H':min=17;                             break;                     case 'I':min=18;                             break;                     case 'J':min=19;                             break;                     case 'K':min=20;                             break;                     case 'L':min=21;                             break;                     case 'M':min=22;                             break;                     case 'N':min=23;                             break;                     };  break; // 删掉这行      }

user: user-2
content: 没有include头文件
user-0 提问: linux C UDP如何发送，接受大数据

回复:
user: user-1
content: 自己把数据分好包，编上号，然后拼接的时候，按包号拼起来，收到的包的序号不一定是有序的，听楼上的，先把udp和Tcp搞清楚再整吧

user: user-2
content: 先把udp和tcp的区别搞明白再说

user: user-0
content: 引用 3 楼 lianshaohua 的回复:1、如果你的socket是阻塞式的，这么写没有问题；  2、建议使用tcpdump抓包分析一下发送的数据是否正确，如果从本机抓包是正确的，那么减缓一下发送速率（发送一包休息10ms），有可能是网络拥塞导致了丢包；  3、一包UDP数据最好不要超太大，根据网络情况而定 我接受的数据全部是乱的。为发送的数据是从1到1000000的数组，但是为接受的数据里都是 -11131318 381398183190 -313131314 -5423523523 -64939634998 类似这样的数，我不知道这个是什么原因！

user: user-3
content: 1、如果你的socket是阻塞式的，这么写没有问题；  2、建议使用tcpdump抓包分析一下发送的数据是否正确，如果从本机抓包是正确的，那么减缓一下发送速率（发送一包休息10ms），有可能是网络拥塞导致了丢包；  3、一包UDP数据最好不要超太大，根据网络情况而定

user: user-0
content: 引用 1 楼 user-4 的回复:UDP传输不可靠，需要自己做重传机制。并且sendto，包的长度不要超过1400字节（意思是发送要分包，接收要组包）。你应该用TCP，因为你的代码写成这样，只能用TCP了。 你意思用TCP的话我的那个代码可以正常发送接受数据了吗？

user: user-4
content: UDP传输不可靠，需要自己做重传机制。并且sendto，包的长度不要超过1400字节（意思是发送要分包，接收要组包）。你应该用TCP，因为你的代码写成这样，只能用TCP了。
user-0 提问: 一个GL外行的提问 

回复:
user: user-0
content: 引用 3 楼 user-1 的回复:[quote=引用 2 楼 u013550545 的回复:] [quote=引用 1 楼 user-1 的回复:] opengl里那个叫scissor  用高版本opengl需要glew。现在不太可能有显卡还只支持1.x的OpenGL。  除非有绝对把握自己能赢得过编译器（对十分熟悉优化的人这倒是可能的...），不要直接写汇编。尤其别在C++里插入汇编玩，64位模式停止支持内联汇编也是有道理的。 、、汗。。我去看看。至于内联汇编嘛。我有看过一点Intel的手册和release版本下的反汇编。关键就是利用了SIMD指令。眼熟你了[/quote]  想操作CPU指令直接用intrinsic就好了，编译器还能进一步给你优化。用汇编反倒会干扰编译器的正常优化。[/quote] +_+

user: user-1
content: 引用 2 楼 u013550545 的回复:[quote=引用 1 楼 user-1 的回复:] opengl里那个叫scissor  用高版本opengl需要glew。现在不太可能有显卡还只支持1.x的OpenGL。  除非有绝对把握自己能赢得过编译器（对十分熟悉优化的人这倒是可能的...），不要直接写汇编。尤其别在C++里插入汇编玩，64位模式停止支持内联汇编也是有道理的。 、、汗。。我去看看。至于内联汇编嘛。我有看过一点Intel的手册和release版本下的反汇编。关键就是利用了SIMD指令。眼熟你了[/quote]  想操作CPU指令直接用intrinsic就好了，编译器还能进一步给你优化。用汇编反倒会干扰编译器的正常优化。

user: user-0
content: 引用 1 楼 user-1 的回复:opengl里那个叫scissor  用高版本opengl需要glew。现在不太可能有显卡还只支持1.x的OpenGL。  除非有绝对把握自己能赢得过编译器（对十分熟悉优化的人这倒是可能的...），不要直接写汇编。尤其别在C++里插入汇编玩，64位模式停止支持内联汇编也是有道理的。 、、汗。。我去看看。至于内联汇编嘛。我有看过一点Intel的手册和release版本下的反汇编。关键就是利用了SIMD指令。眼熟你了

user: user-1
content: opengl里那个叫scissor  用高版本opengl需要glew。现在不太可能有显卡还只支持1.x的OpenGL。  除非有绝对把握自己能赢得过编译器（对十分熟悉优化的人这倒是可能的...），不要直接写汇编。尤其别在C++里插入汇编玩，64位模式停止支持内联汇编也是有道理的。
user-0 提问: 遇到个很奇怪的问题

回复:
user: user-1
content: 你把输出信息重定义到文件里面或者通过log出到文件里面再看。 另：数组下标不是从0开始么， 你从1开始输出是疏忽了还是业务的需要？

user: user-2
content: 在cmd窗口中执行以下命令： cd /d 你的exe文件所在盘符和目录 你的exe文件 >out.txt notepad out.txt

user: user-3
content: 单步调试就知道是从哪里开始的了

user: user-4
content: 太多行了 前面的滚屏看不到了吧

user: user-0
content: 运行如下：
user-0 提问: C语言中忘记导入头文件，函数还可以运行

回复:
user: user-1
content: 1、头文件只是在编译的时候起作用 2、c语言的头文件更多的是声明函数的参数，返回值等信息，然后进行编译检查，如果是系统头文件，有的编译器会自动帮你完成，但不要依赖编译器 3、如果是自定义的头文件，是编译不过的。

user: user-2
content: 有些警告也是不可忽视的

user: user-3
content: 好像会自己添加，和Java一样，最好自己添加

user: user-4
content: 没有定义的话编译器似乎是会猜测， 参数就按你调用时候给出的来，返回值就按int来 简单情况下猜对了这样也没问题的 不过参数类型检查什么的肯定是做不了了

user: user-5
content: 现代少数智能编译器会自动帮忙做这件事情，但是其它的并不会，因此最好手动加上比较好。
user-0 提问: 关于逗号表达式，有些疑惑

回复:
user: user-1
content: for（执行一次； 循环体判断（成功进入循环体）；一次循环体结束执行） {      循环体 }

user: user-2
content: 题目for循环中“i++,ch += 2 * i”，ch+=2*i引用的i是更新了i之后的值。这一点是由于逗号表达式保证了各个子表达式的求值顺序。 但在如下的表达式中(i++) + (ch+i)。ch+i所引用的i就不一定是更新之后的值了，该表达式的行为是未定义的。

user: user-3
content: 你还没有搞懂for循环是什么意思而已！  for（表达式1，表达式2...；判断语句..；循环判断..）{循环体；} 先做表达式1.2的值 （表达式1.2不管运行多少次都只做1次，除非是嵌套循环，这里不予考虑） 然后是做判断语句（值为真就做循环体！做完循环体回来做循环判断，做完循环判断在做判断语句，就这样循环一直到判断为假，循环结束）   所以 你这里输出的是ACGM； 如果你想输出的是CGM 方法很多在for循环里加条    if(ch!='A') 就行.  也可以用do while   while  ...方法很多很多 int main() {     int i=0;     char ch='A';     do{         i++;ch+=2*i;         printf("%c",ch);     }     while(i<4);     printf("\n");     return 0;  }

user: user-4
content: 先判断i<4，再输出CH

user: user-5
content: goto loop； ==>goto loop_start

user: user-6
content: 好像就是更新了的值

user: user-7
content: i=0,ch='A'

user: user-7
content: i=0,ch='A'

user: user-8
content: 你试一试++i；如果++i可以的话，应该就是你的编译器的问题了。我之前好像看到过说是有的编译器采用的标准不一样，所以对于自增的生效时刻的规定也不一样。

user: user-9
content: 引用 7 楼 zhao4zhong1 的回复:for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }   D里面有continue就悲剧了。   for  版本 http://codepad.org/uwY5X9xB 正常输出 while 版本，一次输出killed http://codepad.org/7WuM2BJl 一次输出 timeout http://codepad.org/SkFQPkpr

user: user-10
content: for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }

user: user-5
content: for 的流程大致如下 for:     e1; loopstart:     if(!e2)         goto exit_for;     s;     e3;     goto loop； exit_for:

user: user-11
content: for 循环先执行循环体，然后才执行最后一截的表达式。

user: user-12
content: for循环是先执行表达式1然后与表达式2判断可以则执行循环体最后执行表达式3。。。
user-0 提问: 数组与指针

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

user: user-2
content: 区别在这里  int a[M][N]; 1） 第i,j 个元素  q: q[i][j]  p: p[i*N+j]; 2）指针运算 q+1 ,p+N 指向同一位置 (*q)[0] == q[0][0] == a[0][0];  p[0] ==a[0][0]; p[M*N-1] ==a[M-1][N-1]; q[M-1][N-1] ==a[M-1][N-1]; *q ==a[0]; **q ==**a==a[0][0];

user: user-3
content: 楼主不知道二维数组是指针的指针吗   把二维数组画成指针的指针形式就应该明白了
user-0 提问: for中表达式1定义变量前面加个static就会出错，怎么回事？

回复:
user: user-1
content: 刚才用GCC编译你的代码并没有报编译错误，不知道你是哪出了问题，你看看是不是分号写成了全角的？

user: user-2
content: C++： for(e1,e2,e3){}  for(e1;e2;e3);本来 if(e){}          if(e); while(e):      while(e){} do{} while(e);do ;while(e); 这些控制结构中 的表达式 e(ei) 中 本来就只能定义非静态变量。 为何在这里定义静态变量？ 语句组中定义，不是更好？

user: user-3
content: 引用 3 楼 zhao4zhong1 的回复:for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }  D语句块里有continue就悲剧了

user: user-4
content: for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }

user: user-5
content: 既然有错把错误LOG或者提示打出来人才能帮你啊
user-0 提问: C语言最最简单的链表问题，程序语法错误

回复:
user: user-1
content: 一楼解释的对。malloc(sizeof(List))不对，typedef Node *List;   List是一个指针类型，对应的大小是4个字节。你直接打印sizeof(List)大小就知道了。这个地方错误。  malloc后，应该首先判断是否是空指针，然后才能使用。

user: user-2
content: film = (List)malloc(sizeof(List));//可能是这里的问题，内存分配失败？没这种可能 应该是malloc(sizeof(*film)) 分配了一段指针大小的内存，当然不够了 另外 film->item = item;//保存item到film中，这里出问题概率不大 应该在确定film!=NULL后
user-0 提问: localtime函数的使用问题，struct tm的实体需要定义吗？

回复:
user: user-0
content: 引用 5 楼 贾可的回复:这是该函数内部的一个 static 变量，并且其结构肯定是跟该编译器提供的头文件一致（事实上所有的 C 编译器都应该一致，因为这是 C 的标准）。因为是静态变量，所以不需要分配内存。 谢谢！现在懂了。

user: user-1
content: 在函数内部创建对象，返回对象指针。

user: user-2
content: 这是该函数内部的一个 static 变量，并且其结构肯定是跟该编译器提供的头文件一致（事实上所有的 C 编译器都应该一致，因为这是 C 的标准）。因为是静态变量，所以不需要分配内存。

user: user-0
content: 这里也说了，返回值需要另存到一个空间才能用。

user: user-0

user: user-0
content: 看了百度百科，这个http://baike.baidu.com/link?url=hG08_1UifpPNJK8d2tiH2__YF68R5Wbl4CglDeh62SUWJZVWlBN8xAeQiYfrO-avMbXI_4_2G9H9VROYGdoWPq， 给的例子也是定义了一个结构体指针，就直接用了。我就没看出来定义的struct tm 的实例在哪？怎么就可以用了？ ------------------------------------------------------------------------------------------------------- 程序例 #include <stdio.h> #include <stddef.h> #include <time.h> int main(void) { time_t timer; //time_t就是long int 类型 struct tm *tblock;timer = time(NULL); tblock = localtime(&timer); printf("Local time is: %s\n",asctime(tblock)); return 0; } -------------------------------------------------------------------------------------------------------- 执行结果：Local time is: Mon Feb 16 11:29:26 2009 --------------------------------------------------------------------------------------------------------
user-0 提问: 阱字棋游戏，自己编写。请各位大神指出那些不足和缺陷。（程序完美运行无须修改）

回复:
user: user-1
content: 自己做一个测试，考虑到各种极端情况，并写下预期的执行结果，跑一遍以后把执行结果跟预期结果进行比对，看是否达到自己预期
user-0 提问: C-Free标准版和CodeBlocks软件，学习C语言比较。

回复:
user: user-1
content: 不要那么纠结于IDE IDE只是壳而已,了解世界的本质更加重要

user: user-2
content: C-Free和CodeBlocks没法比，C-Free只支持Windows系统吧，而且还有些版本是要付费的。而CodeBlocks完全免费且开放源代码，更重要的是跨平台，比如我在Windows/Mac Book/Ubuntu上都是用它。CodeBlocks还集成了许多开源框架和库，甚至还支持C/C++语言以外的语言。

user: user-0
content: 引用 1 楼 walkiz 的回复:C-Free和CodeBlocks没法比，C-Free只支持Windows系统吧，而且还有些版本是要付费的。而CodeBlocks完全免费且开放源代码，更重要的是跨平台，比如我在Windows/Mac Book/Ubuntu上都是用它。CodeBlocks还集成了许多开源框架和库，甚至还支持C/C++语言以外的语言。  哦，CodeBlocks原来这么强大！ 赞！
user-0 提问: 指针数组的问题，不知道问题出现在哪里

回复:
user: user-0
content: 引用 2 楼 adlay 的回复:你的排序算法访问越界了！     for(i=0; i<num; i++){         for(j=0; j<num-i; j++){             if(strcmp(pointer[j], pointer[j+1])>0){                 temp=pointer[j];                 pointer[j]=pointer[j+1];                 pointer[j+1]=temp;             }         }     }   当 i = 0 的时候，j 的循环条件就成了 j < num， j 的最大值是 num -1 循环里面访问 pointer[j + 1] 的时候就访问到了 pointer[num] 了。 而数组下标的有效范围是  0 ~ num-1 把  for(j=0; j<num-i; j++) 改成  for(j=0; j<num-i-1; j++) 试试吧  然而我还是有一点不是很明白，好多人都说我这个函数声明不应该在main里面是怎么一回事啊，求教。

user: user-0
content: 引用 2 楼 adlay 的回复:你的排序算法访问越界了！     for(i=0; i<num; i++){         for(j=0; j<num-i; j++){             if(strcmp(pointer[j], pointer[j+1])>0){                 temp=pointer[j];                 pointer[j]=pointer[j+1];                 pointer[j+1]=temp;             }         }     }   当 i = 0 的时候，j 的循环条件就成了 j < num， j 的最大值是 num -1 循环里面访问 pointer[j + 1] 的时候就访问到了 pointer[num] 了。 而数组下标的有效范围是  0 ~ num-1 把  for(j=0; j<num-i; j++) 改成  for(j=0; j<num-i-1; j++) 试试吧  啊，问题就这么解决了！非常感谢耐心看完我的代码并进行细致的解答！

user: user-1
content: 引用 4 楼 grtorange 的回复:[quote=引用 2 楼 adlay 的回复:] 你的排序算法访问越界了！     for(i=0; i<num; i++){         for(j=0; j<num-i; j++){             if(strcmp(pointer[j], pointer[j+1])>0){                 temp=pointer[j];                 pointer[j]=pointer[j+1];                 pointer[j+1]=temp;             }         }     }   当 i = 0 的时候，j 的循环条件就成了 j < num， j 的最大值是 num -1 循环里面访问 pointer[j + 1] 的时候就访问到了 pointer[num] 了。 而数组下标的有效范围是  0 ~ num-1 把  for(j=0; j<num-i; j++) 改成  for(j=0; j<num-i-1; j++) 试试吧  然而我还是有一点不是很明白，好多人都说我这个函数声明不应该在main里面是怎么一回事啊，求教。[/quote]  函数声明可以放在 main 里面的 只不过大家习惯放在 main 前面而已

user: user-2
content: 下面两个函数声明的位置不对了吧。不要放在main函数里面

user: user-1
content: 你的排序算法访问越界了！     for(i=0; i<num; i++){         for(j=0; j<num-i; j++){             if(strcmp(pointer[j], pointer[j+1])>0){                 temp=pointer[j];                 pointer[j]=pointer[j+1];                 pointer[j+1]=temp;             }         }     }   当 i = 0 的时候，j 的循环条件就成了 j < num， j 的最大值是 num -1 循环里面访问 pointer[j + 1] 的时候就访问到了 pointer[num] 了。 而数组下标的有效范围是  0 ~ num-1 把  for(j=0; j<num-i; j++) 改成  for(j=0; j<num-i-1; j++) 试试吧
user-0 提问: 求大神看看，编译没提问题，编译出现了问题，要调试（关于数据结构的一个链表新手问题）

回复:
user: user-0
content: 主函数 改成这个 就可以运行  void main(){  	/*LinkList L; 	int i, n, e; 	printf("请输入链表元素的个数："); 	scanf_s("%d", &n); 	Listcrea(&L, n); 	prints(L); 	printf("请输入要插入的位置："); 	scanf_s("%d", &i); 	printf("请输入要插入的数："); 	scanf_s("%d", &e); 	Listinsert(&L, i, e); 	prints(L); 	printf("请输入要删除的的位置："); 	scanf_s("%d", &i); 	Listdel(&L, i); 	prints(L); 	printf("请输入要查找的数："); 	scanf_s("%d", &e); 	Listfind(&L, e);*/}

user: user-0
content: 可以编译成功，但是运行的时候 出了问题 我要是把 珠海市改成这个就没问题    	/*LinkList L; 	int i, n, e; 	printf("请输入链表元素的个数："); 	scanf_s("%d", &n); 	Listcrea(&L, n); 	prints(L); 	printf("请输入要插入的位置："); 	scanf_s("%d", &i); 	printf("请输入要插入的数："); 	scanf_s("%d", &e); 	Listinsert(&L, i, e); 	prints(L); 	printf("请输入要删除的的位置："); 	scanf_s("%d", &i); 	Listdel(&L, i); 	prints(L); 	printf("请输入要查找的数："); 	scanf_s("%d", &e); 	Listfind(&L, e);*/

user: user-1
content: 第一眼看上去，两个问题 1、你定义的Linklist为结构体指针类型数据，那么在定义结构体指针时指针变量前就不应该加* 2、开辟动态内存空间时，应该是L=(Linklist)malloc()，而不是*L=(Linklist)malloc()

user: user-2
content: 你编的函数编译能通过吗。错误的时候你看那个提示了吗。有没有提示你什么不能把**给*呢？我觉得你定义的就有问题，你该先把你定义的结构指针变量搞明白了。
user-0 提问: 帮我看看读入二进制文件，这一堆数字哪里来的。

回复:
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;  //... } 类似的例子还可以举很多。

user: user-2
content: while(!feof(global.pfile))//如果没到文件尾会一直执行while循环    The  function  fread()  reads  nmemb  elements of data, each size bytes        long, from the stream pointed to by stream, storing them at  the  loca‐        tion given by ptr.

user: user-3
content: for(int x=0;x<num;++x) 这个越界了, primes是个数组,最多36个, 你输入num是100个, 超了

user: user-0
content: 引用 3 楼 q3733353520 的回复:   while(!feof(global.pfile))//如果没到文件尾会一直执行while循环    The  function  fread()  reads  nmemb  elements of data, each size bytes        long, from the stream pointed to by stream, storing them at  the  loca‐        tion given by ptr. 3楼我觉得你说对点了，我一直怀疑这有问题，但是不懂二进制文件。当你打开一个二进制文件的时候，他有多大呢？里面的内容时什么。文件结尾是一个什么符号呢？我在网上搜了一下，但是也没看明白。能给再深入的讲讲吗？谢谢。下面是我网上搜的 在stdio.h中可以看到如下定义：       1 2 3 4 5 6 7 8 9   #define EOF (-1) #define _IOEOF 0x0010 #define feof(_stream) ((_stream)->_flag & _IOEOF) int c; while(!feof(fp)) {     c = fgetc(fp);     printf("%X\n", c); }    会发现多输出了一个FF，原因就是在读完最后一个字符后，fp->flag仍然没有被置为_IOEOF，因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作，feof()才能探测到文件结尾。这样就多输出了一个-1(即FF)。  正确的写法应该是： int c; c = fgetc(fp); while(!feof(fp)) {     printf("%X\n", c);     c = fgetc(fp);//最后一个c的值为-1，但是无妨，因为其他所有的循环操作都要放在此句话上面 }  没看明白。他说的意思是最后一个不是文件内容，是结束符，然后读取，不输出。是这个意思吗。那我这个为什么输出一串数字呢。你写中文吧，英文看不懂     feof()可以用EOF代替吗？不可以。fgetc返回-1时，有两种情况：读到文件结尾或是读取错误。因此我们无法确信文件已经结束, 因为可能是读取错误! 这时我们需要feof()。

user: user-4
content: //你这个判断质数的程序不能从5开始判断 应该是从2到m-1  //你的那个质数表里面9不是质数，9可以被3整除，但是你这个程序没有遍历到  bool is_prime(unsigned long long m)  {       bool shifou=true;          unsigned long long i=5;          for(;i<m;++i)          {              if(m%i==0)              return false;          }           return shifou;  }

user: user-4
content: for(int x=0;x<count/*num*/;++x)      {          printf("%6llu",global.primes[x]);          if((x+1)%6==0)              printf("\n");      } //不是num，而是count   //list数组要传递参数  void list_array(int count, unsigned long long *primes)  {      for(size_t j=0;j<count;++j)      {          printf("%10llu",primes[j]);          if(((j+1)%PER_line)==0)              printf("\n");      }  }

user: user-4
content: 你也不来点注视

user: user-0
content: 帮忙给解答一下吧。
user-0 提问: 菜鸟的函数哪里出了问题？（C语言函数返回指针的题型）

回复:
user: user-0
content: 噢噢我看到了==

user: user-0
content: 引用 1 楼 user-1 的回复:# include<stdio.h>   int main(){     float *search(float (*pointer)[3], float line);			//here(*pointer)[3]       float score[][3]={         {23, 56, 89},         {56, 12, 91},         {81, 73, 80},         {34, 62, 95}     };     float line_num;     int i;     float *p_addr;       printf("input the limit line:\n");     scanf("%f", &line_num);     p_addr=search(score, line_num);     printf("the student's scores are listed here:\n");     for(i=0; i<3; i++) printf("%f\t", *(p_addr+i));                          //当然，这里也要改，不然只能输出一组数据     putchar('\n');       return 0; }   float *search(float (*pointer)[4], float line){			//here     float *p_addr;     int i, j;       for(i=0; i<4; i++){         for(j=0; j<3; j++){             if(*(*(pointer+i)+j)<line) return p_addr=*(pointer+i);         }     } }  什么意思啊我没看懂==

user: user-1
content: # include<stdio.h>   int main(){     float *search(float (*pointer)[3], float line);			//here(*pointer)[3]       float score[][3]={         {23, 56, 89},         {56, 12, 91},         {81, 73, 80},         {34, 62, 95}     };     float line_num;     int i;     float *p_addr;       printf("input the limit line:\n");     scanf("%f", &line_num);     p_addr=search(score, line_num);     printf("the student's scores are listed here:\n");     for(i=0; i<3; i++) printf("%f\t", *(p_addr+i));                          //当然，这里也要改，不然只能输出一组数据     putchar('\n');       return 0; }   float *search(float (*pointer)[4], float line){			//here     float *p_addr;     int i, j;       for(i=0; i<4; i++){         for(j=0; j<3; j++){             if(*(*(pointer+i)+j)<line) return p_addr=*(pointer+i);         }     } }
user-0 提问: 关于VS2013中scanf的问题

回复:
user: user-0
content: 引用 3 楼 zero0454 的回复:getc()一下  我知道了，刚查了下，scanf_s用法与scanf不一样，    scanf_s("%s", firstname);改成scanf_s("%s", firstname,sizeof(firstname));就好了，下一句也是一样，谢谢了

user: user-1
content: getc()一下

user: user-0
content: 引用 1 楼 zero0454 的回复:因为你第一个scanf把回车留在了缓存区里了，第二个scanf直接就运行了  那怎么改才行呢？谢谢

user: user-1
content: 因为你第一个scanf把回车留在了缓存区里了，第二个scanf直接就运行了
user-0 提问: 为什么printf函数可以将字符串输出到屏幕上呢，有没有大神为我指点一下？我想知道它的原理

回复:
user: user-1
content: 引用 2 楼 u014626834 的回复:[quote=引用 1 楼 user-1 的回复:] 操作系统会提供向屏幕输出字符的方法，printf使用了这个方法而已。当然中间和前面省略了很多步骤   哦哦，原来如此，那你能告诉我，printf是怎么让后面的参数可以随意指定呢，比如int ,float,char类型？[/quote]  因为可以根据格式字符串判断后面参数的类型啊，当然如果和格式字符串里的类型不匹配就挂了

user: user-0
content: 引用 1 楼 user-1 的回复:操作系统会提供向屏幕输出字符的方法，printf使用了这个方法而已。当然中间和前面省略了很多步骤   哦哦，原来如此，那你能告诉我，printf是怎么让后面的参数可以随意指定呢，比如int ,float,char类型？

user: user-1
content: 操作系统会提供向屏幕输出字符的方法，printf使用了这个方法而已。当然中间和前面省略了很多步骤
user-0 提问: 请问结构体不能这么声明吗

回复:
user: user-0
content: 引用 4 楼 xian_wwq 的回复:真的不行， 可以换个模式方式，不要放数组，放个指针 在使用的时候，根据row与col动态申请谢谢，看来只能用指针了。本来觉得能直接用二维数组的话就方便多了，还是得用指针动态申请内存才行

user: user-0
content: 谢谢，看来只能用指针了。本来觉得能直接用二维数组的话就方便多了，还是得用指针动态申请内存才行

user: user-1
content: 真的不行， 可以换个模式方式，不要放数组，放个指针 在使用的时候，根据row与col动态申请

user: user-2
content: extern 是用来声明变量的不是用来声明类型的

user: user-3
content: 欲速则不达，先把基础打好了再写

user: user-4
content: row与col大小未知，结构体无法确认分配存储空间的大小
user-0 提问: C中子函数调用问题

回复:
user: user-1
content: double add1(int n);

user: user-0
content: 引用 2 楼 user-1的回复:double add1(int n); 原来如此。。都忘了返回的不是整型了。。 多谢了！

user: user-0
user-0 提问: 为什么pthread_join后程序占用内存并没有释放干净

回复:
user: user-0
content: 引用 2 楼 user-1 的回复:如果是gcc的话，glibc会缓存住内存，不会立刻释放给系统原来是这样啊，分给你啦

user: user-0
content: 有人吗，求解啊求解~~~

user: user-1
content: 如果是gcc的话，glibc会缓存住内存，不会立刻释放给系统
user-0 提问: 指针参数是不是都必须做NULL判断？

回复:
user: user-1
content: 如果是内部代码，那么使用一个断言就可以l。 如果是导出的函数，那么一定要判断。你不能假定调用者de调用习惯。 如果，你确实不允许使用 NULL，那么调试版中需要加入断言 ，让使用者及早发现。 至于 发布版需不需要判断，看文档的说明。 最著名的就是 sqrt 函数中的参数是否大于等于 0 的判断。 调试版本中是有断言的，而发布版就是假定参数是 >=0 的。

user: user-0
content: 引用 10 楼 user-9 的回复:如果是自己的函数，判断指针为NULL的意义不大，更好的是直接用assert(p!=NULL)，而不是仅仅检查一下参数为空就返回。一般来说，参数为空，意味着调用端出了问题，不应该就这么轻易放过。如果仅仅是返回值代表错误，但调用者又没有检查返回值，这就更有问题。  我明白你的意思。你的意思是既然传入的参数是错误的，就应该在调用时避免。 但是使用assert()会有一个问题。它影响程序性能。 所以assert()一般只在调试时启用。在交付使用时禁用。 那么交付使用时，如果意外发生。也就是在程序员未知的情况下传入NULL，那么程序就漰溃了而没有任何日志信息。这样不利于排查问题。

user: user-2
content: 是啊，有道理    void close_file(FILE *fp){ 	if(fp!=NULL){ 		.... 	} }  void open_file(FILE *fp){ 	if(fp==NULL){ 		close_file(fp); 		//打开文件。。。 	} }

user: user-3
content: 别人给你的钱是不是都必须辨别真伪？

user: user-3
content: 多判断几次是极好的。

user: user-4
content: 最好是在函数体中做判断，模块化思维。

user: user-0
content: 引用 6 楼 hlx_beat 的回复:错了  一定要判断是否为空，而是释放之后一定要置空  你是不是打错字了？ 你想说的意思是： 1、函数体中对指针参数必须判断是否为空。 2、如果指针指向的是堆内存，并且已被释放，那么这个指针就必须赋值为NULL 对吗？

user: user-5
content: 错了  一定要判断是否为空，而是释放之后一定要置空

user: user-0
content: 引用 3 楼 zxh707wk 的回复:就算在函数体内判断是否为NULL,调用该函数时也需要判断函数返回值  如果调用时参保证传递过去的参数不为NULL，那就不需要对返回值作判 断吧。

user: user-6
content: 引用 2 楼 HeBanBei 的回复:[quote=引用 1 楼 xian_wwq 的回复:] 这是一种预防性的处理， 保证当指针为空时不会引发崩溃。 因为函数有可能被其他人调用， 可能没有进行完整的初始化。  如果代码全是我自己写的。函数只被 我自己调用。那么不做判断是不是也属于不好的代码？[/quote] 是的，这是个好习惯，可以规避掉很多问题 所有的指针参数，返回指针都需要判断，否则就等着崩溃吧

user: user-7
content: 就算在函数体内判断是否为NULL,调用该函数时也需要判断函数返回值

user: user-0
content: 引用 1 楼 xian_wwq 的回复:这是一种预防性的处理， 保证当指针为空时不会引发崩溃。 因为函数有可能被其他人调用， 可能没有进行完整的初始化。  如果代码全是我自己写的。函数只被 我自己调用。那么不做判断是不是也属于不好的代码？

user: user-6
content: 这是一种预防性的处理， 保证当指针为空时不会引发崩溃。 因为函数有可能被其他人调用， 可能没有进行完整的初始化。

user: user-7
content: 引用 4 楼 HeBanBei 的回复:[quote=引用 3 楼 zxh707wk 的回复:] 就算在函数体内判断是否为NULL,调用该函数时也需要判断函数返回值  如果调用时参保证传递过去的参数不为NULL，那就不需要对返回值作判 断吧。[/quote]你能绝对保证这代码不会被其他人调用而传入NULL?

user: user-8
content: 如果程序比较大，你能保证你每个指针都释放，清空了么？这样判断多了一重保险，是个好习惯。

user: user-9
content: 如果是自己的函数，判断指针为NULL的意义不大，更好的是直接用assert(p!=NULL)，而不是仅仅检查一下参数为空就返回。一般来说，参数为空，意味着调用端出了问题，不应该就这么轻易放过。如果仅仅是返回值代表错误，但调用者又没有检查返回值，这就更有问题。
user-0 提问: 二叉排序树的插入看不出哪里错。。

回复:
user: user-1
content: 插入应该没什么问题，只是输出的时候如果想输出排序的数据，需要先输出左子树，然后才是当前节点，右子树。 另外，输出整数用 %d， 不是 %c   void PreOrder(BiTree T) { 	if(T) 	{ 		PreOrder(T->lchild); 		printf("%d ",T->data); 		PreOrder(T->rchild); 	} }
user-0 提问: 求C大神赐教，此程序错在哪里

回复:
user: user-0
content: 引用 3 楼 yantiqual 的回复:把程序中  改成  以上。多谢

user: user-1
content: 10楼说的对，出现data 肯定是没存数值到month

user: user-2
content: 应该是你输入的时候有问题，记得带上逗号，比如：  2015,9,26  引用 楼主 baidu_31421035 的回复:#include<stdio.h> int main(void) { 	int year,month,day,sum,leap; 	printf("\nplease input year,month,day\n"); 	scanf("%d,%d,%d",&year,&month,&day); 	switch(month) 	{ 	case 1:sum=0;break; 	case 2:sum=31;break; 	case 3:sum=59;break; 	case 4:sum=90;break; 	case 5:sum=120;break; 	case 6:sum=151;break; 	case 7:sum=181;break; 	case 8:sum=212;break; 	case 9:sum=243;break; 	case 10:sum=273;break; 	case 11:sum=304;break; 	case 12:sum=334;break; 	default:printf("data error"); 		return -1; 	} 	sum+=day; 	if(year%400==0||(year%4==0&&year%100!=0)) 		leap=1; 	else 		leap=0; 	if(leap==1&&month>2) 		sum++; 	printf("It is the %dth day.",sum); 	return 0; } //为什么总是出现data error

user: user-3
content: 引用 7 楼 linfaimom 的回复:[quote=引用 6 楼 zhangxiangDavaid 的回复:]  scanf("%d,%d,%d",&year,&month,&day); 改为 scanf("%d%d%d",&year,&month,&day); 输入时，年月日之间加空格  上面这种其实也可以，但是输入时要同样输入，[/quote] 既然空格就可以，逗号就是多此一举。多此一举，往往容易造成错误。

user: user-4
content: 输入数据方式的问题

user: user-5
content: 引用 6 楼 zhangxiangDavaid 的回复: scanf("%d,%d,%d",&year,&month,&day); 改为 scanf("%d%d%d",&year,&month,&day); 输入时，年月日之间加空格  上面这种其实也可以，但是输入时要同样输入，

user: user-3
content: scanf("%d,%d,%d",&year,&month,&day); 改为 scanf("%d%d%d",&year,&month,&day); 输入时，年月日之间加空格

user: user-6
content: 三楼正解，楼主太马虎了

user: user-7
content: 经我实际测试，还是可以正常运行的

user: user-8
content: 把程序中  改成  以上。

user: user-9
content: 你给 month 赋值了么？month 默认是 0，default:printf("data error");，所以当然出现 data error 了

user: user-10
content: 楼主用什么编译器？
user-0 提问: 从键盘输入三个正整数，判断否能构成三角形的三边？如果能，就计算三角形的面积；如果不能，就输出“不能构成三角形”的提示信息

回复:
user: user-0
content: 引用你输入的是按照你scanf格式的方式输入的?你按我写的那个输入输入数字了么？你怎么使用scanf，就得怎么输入~~~~~你源程序中scanf中输入要,那么你输入数字的时候就的加, 找到了，谢谢

user: user-1
content: 你在输入时，值之间要加逗号，  要验证是否输入正确，可以在scanf后立马用printf把3个值打印出来

user: user-2
content: 引用 4 楼 yabyijue 的回复:你的意思是scanf这个函数错了？ 你输入的是按照你scanf格式的方式输入的?你按我写的那个输入输入数字了么？你怎么使用scanf，就得怎么输入~~~~~你源程序中scanf中输入要,那么你输入数字的时候就的加,

user: user-3
content: 你这个问题，你直接 下个断点，看一下数据  就清楚 为什么你输入的时候  会变成 不能构成三角形了

user: user-0
content: 你的意思是scanf这个函数错了？

user: user-0
content: 然而问题还是没有解决，结果依然未改。运行之后，输入了数字直接出现了不能构成三角形，这个是这你怎么回事呢？？

user: user-4
content: 好像没错啊，是不是输入方式错了。。

user: user-2
content: scanf("%d,%d,%d",&a,&b,&c);  输入3, 4, 5 或者 scanf("%d%d%d",&a,&b,&c); 输入3 4 5  查看下scanf格式用法~
user-0 提问: #define  宏定义问题

回复:
user: user-1
content: 好好看书，任何一本c语言的书都会讲到什么叫做“宏替换”

user: user-2
content: template<class T> inline T abse(T i) { 	return ( (i) >= 0 ? (i) : -(i) ); }

user: user-2
content: 因为替换后变成了：( (x++) >= 0 ? (x++) : -(x++) )  所以x++被调用了两次，所以建议用内联函数，而不要用宏

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

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #include <stdlib.h> char buf[17]; union U {   unsigned short int aa;   struct {     unsigned int bb:7;//(bit 0-6)     unsigned int cc:6;//(bit 7-12)     unsigned int dd:3;//(bit 13-15)   }; } u; void main() {                 //bbbbbbbbbbbbbbbb                 //iiiiiiiiiiiiiiii                 //tttttttttttttttt                 //111111                 //5432109876543210                 //::::::::::::::::     u.aa=0xE07F;//1110000001111111     printf("bb==%d,cc==%d,dd==%d\n",u.bb,u.cc,u.dd);     u.bb=0x41;     u.cc=0x21;//dddccccccbbbbbbb     u.dd=5;   //1011000011000001     printf("aa==0x%04X==%016s(2)\n",u.aa,itoa(u.aa,buf,2)); } //bb==127,cc==0,dd==7 //aa==0xB0C1==1011000011000001(2)

user: user-2
content: 所谓共用体就是公用内存空间，所以str和c是共用相同的空间，但可以从不同的角度来认为是不同变量。所以给i赋值之后，实际上c的值也是变化的。 结合2楼， 赋值后低字节在前，高字节在后，所以c的值就是0x??。

user: user-3
content: 为什么是负数，是因为 4字节中 7FFFFFFF表示正数，0x80000000 表示负数。 CC大于80所以最终结果是负数  没了，接分。

user: user-3
content: DEBUG下默认初始化栈空间为CCCC。 楼主吧的出来的-数用计算机换成16进制就知道了。FFFFFFFFCCCC0606

user: user-3
content: int 4字节 char 4字节 共用体最大4字节  str[0] = 6; str[1] = 6;  修改后在内存中为：06 06 ?? ??  打印的是 int  windows 是高位放高位，低位放低位  str[0], str[1] 存放的是最低位。  而int的最高位应该是 内存中?? ??这两位。  cout 打印为 (0x?? ?? 06 06)  ?? 是多少就不得而知

user: user-4
content: 结果未的定义: 1. 栈数据初始化 2. 大小端
user-0 提问: uva 227怎么老是出现runing error

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

user: user-2
content: 输入数据处理不当使得数组下标异常,从而出现runing error.  如下修改解决runing error.,但输出结果还不对.LZ还需检查算法.  #include<iostream> #include<stdio.h> #include<math.h> #include<iomanip> #include<cstring> //链表,用来保存输入的额数据;  using namespace std;  int  main() {   char p[500][5][5]; //随机获得的数组;   char c;   int a[500],b[500];   int q[500];   memset(q,0,sizeof(q));   int l=0;   c=' ';   char e=' ';   while(1) //改 while(e!='Z')   {      //记录进去，然后得到对应的字符;     for(int i=0;i<5;i++)     {       for(int j=0;j<6;j++)       {         c=getchar();         if(c!='\n')         {           if(l==0)           {             p[l][i][j]=c;           }           else if(l!=0&&i==0&&j==0)            {             p[l][0][0]=e;             p[l][0][1]=c;             j=j+1;           }           else if(l!=0&&(j!=0||i!=0))           {             p[l][i][j]=c;           }         }         else         {            continue;         }         if(p[l][i][j]==' ')         {           a[l]=i;           b[l]=j;         }       }     }     //输入最终能够得到数据;//然后执行操作输入对应的操作;     //遍历数据找到对应数据为空的点;对应的序号;     char d;     c=' ';     while(c!='0')     {       switch(c)       {         //? if(q[l]==1)         //?   break;       case 'A':         if(a!=0)//进行字符的复制;如果是空格到达了顶端则输出非法的指令,如果是正确的再按照数据的行列输出;         {           d=p[l][a[l]][b[l]];           p[l][a[l]][b[l]]=p[l][a[l]-1][b[l]];           p[l][a[l]-1][b[l]]=d;           a[l]=a[l]-1;         }         else         {           q[l]=1;         }         break;       case 'B':         if(a[l]!=4)         {           d=p[l][a[l]][b[l]];           p[l][a[l]][b[l]]=p[l][a[l]+1][b[l]];           p[l][a[l]+1][b[l]]=d;           a[l]=a[l]+1;         }         else         {           q[l]=1;           break;         }         break;       case 'L':         if(b[l]!=0)         {           d=p[l][a[l]][b[l]];           p[l][a[l]][b[l]]=p[l][a[l]][b[l]-1];           p[l][a[l]][b[l]-1]=d;           b[l]=b[l]-1;         }         else         {           q[l]=1;         }         break;       case 'R':         if(b[l]!=4)         {           d=p[l][a[l]][b[l]];           p[l][a[l]][b[l]]=p[l][a[l]][b[l]+1];           p[l][a[l]][b[l]+1]=d;           b[l]=b[l]+1;         }         else         {           q[l]=1;         }         break;       }       c=getchar();     }     c=getchar();     l++;     e=getchar();     if (e == 'Z') break; //加     ungetc(e,stdin); //加   }   //输出数组对应的序号;   int h;   for(h=0;h<l;h++)   {     printf("Puzzle #%d:\n",h+1); //错 printf("Puzzle #%d:\n",h);     for(int i=0;i<5;i++)     {          if(q[h]==1)       {         printf("This puzzle has no final configuration");//这种没有合适的输出;         break;       }       //对应的就是得到数组的值;       for(int j=0;j<5;j++)       {         if(	b==0&&a[h]==i&&b[h]==j)         {             cout<<"  ";         }         else if(b!=0&&a[h]==i&&b[h]==j)           {           cout<<"  ";         }         else         {           cout<<p[h][i][j]<<" ";         }       }       cout<<endl;     }     cout<<endl;   }   return 0; }
user-0 提问: 如何将数字字符串转变为相应的整数

回复:
user: user-1
content: 如果需要精确的除法，用分数表示

user: user-1
content: 既然用整数表示，读取，储存，就用字符串 读取的时候，小数点前的数据*100 ， 跳过小数点，再读两位 ，求和，其余忽略。 别用浮点数，就行了

user: user-2
content: 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

user: user-3
content: 同时存一份字符串的, 然后判断出是几位小数, 输出时使用%.*f控制  #include <stdio.h> #include <string.h> #define INPUT "60000.17" int GetDecPointBits(char const *s) { 	char *pos; 	if (pos = strchr(s, '.')) 	{ 		return (s + strlen(s)) - (pos + 1); 	} 	return 0; } int main() { 	float f; 	char buf[32]; 	sscanf(INPUT, "%f", &f); 	sscanf(INPUT, "%s", buf); 		 	printf("%.*f", GetDecPointBits(buf), f); 	return 0; }

user: user-4
content: 表示不精确是正常的事， 参看浮点数内存模型

user: user-4
content: 引用 2 楼 huhaomcu 的回复:这个函数我试过了，我的程序是运行在单片机里的 很奇怪比如说我输入600.17 经过这个函数的处理却变成了600.169xxx，反正就是数值不对了，所以我也没办法，就想用自己写的来做，奇怪的是这个函数在PC上我试过不会出现这样的问题，不知怎么在单片机里面运行就不对了！！！  很多十进制浮点数在二进制下根本就没办法精确表示，比如0.1，楼主可以将字符串转成浮点数，使用_ttof，再四舍五入

user: user-5
content: 引用 9 楼 huhaomcu 的回复:那我要怎么做才能解决这个问题咧？？我希望“600.17”转变为整数后就是600.17？？？？ 把字符串的小数点去掉，都变为整数运算就能保证精度了

user: user-0
content: 那我要怎么做才能解决这个问题咧？？我希望“600.17”转变为整数后就是600.17？？？？

user: user-6
content: #include<stdio.h> #include<stdlib.h> #include<string> using namespace std;   int str2int(string str) {     float dNum = atof(str.c_str());     int iNum = 100 * dNum;     return iNum; }   int main() {                                                                                           string str = "1.234";     printf("%d\n", str2int(str)); }

user: user-6
content: 引用 4 楼 huhaomcu 的回复:为什么我的字符串明明是600.17 可是使用SSCANF函数后却变成了600.16咧，但atof在PC上的运行结果却和单片机运行的结果不同？？？？？ 把double改为float试试

user: user-7
content: 精度问题. 因为没办法用2进制浮点储存600.17, 只能模拟, 所以就是600.1699.... 你看看浮点数内部存储结构就知道了.

user: user-1
content: 这个移动小数点就是了，想转成浮点数转就是

user: user-0
content: 我发现atof函数确实会将比如600.17变为600.16xxx 这是不是因为atof的输出是double型咧，它为了保证足够的精度位数而增加的咧

user: user-7
content: 精度问题, ,这不应该是一个问题.  四舍五入(+0.5)或者取天花板值(ceilf())

user: user-0
content: 为什么我的字符串明明是600.17 可是使用SSCANF函数后却变成了600.16咧，但atof在PC上的运行结果却和单片机运行的结果不同？？？？？

user: user-0
content: 我单片机里执行atof后的结果和我在PC上使用如图片所示的库函数结果相同，见下图

user: user-0
content: 这个函数我试过了，我的程序是运行在单片机里的 很奇怪比如说我输入600.17 经过这个函数的处理却变成了600.169xxx，反正就是数值不对了，所以我也没办法，就想用自己写的来做，奇怪的是这个函数在PC上我试过不会出现这样的问题，不知怎么在单片机里面运行就不对了！！！

user: user-7
content: (int)(atof(str) * 100.0)
user-0 提问: 对指针常量取址的问题

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-2
content: 引用 5 楼 u010087712 的回复:值是一样的，因为它们在内存所处的位置一样。 &a是数组的地址，a是数组第一个元素的地址， 就好比有一排房屋，a第一个房间的地址，&a是这排房屋的起始地址， 都是在同一个地方。 正解

user: user-3
content: 值是一样的，因为它们在内存所处的位置一样。 &a是数组的地址，a是数组第一个元素的地址， 就好比有一排房屋，a第一个房间的地址，&a是这排房屋的起始地址， 都是在同一个地方。

user: user-4
content: 引用 1 楼 user-5 的回复:老生常谈, int a[100]; &a 获取数组自己本身的地址(的指针), a获取数组第一个元素的地址(的指针), 两者的差别就是"类型", 这两个的类型不同, 前者是int(*)[100], 后者是int*    引用 2 楼 sinat_24674017 的回复:int(*)[100]是个什么类型，没有见过  指向数组的指针

user: user-4
content: http://blog.adintr.com/43

user: user-0
content: int(*)[100]是个什么类型，没有见过

user: user-5
content: 老生常谈, int a[100]; &a 获取数组自己本身的地址(的指针), a获取数组第一个元素的地址(的指针), 两者的差别就是"类型", 这两个的类型不同, 前者是int(*)[100], 后者是int*
user-0 提问: 关于单链表

回复:
user: user-1
content: int initList(LNode *&A) {//初始化     A=(LNode*)malloc(sizeof(LNode));//申请A的头结点空间     A->next=NULL;//初始时头结点后面指向NULL     return 0; }  时A->data未赋值。 for(int i=0;i<n;++i)     {         s=(LNode*)malloc(sizeof(LNode));//开辟新插入的结点s的空间         s->data=e[i];         r->next=s;         r=r->next;     } A->next->data=e[0];(即‘@’） A->next->next->data=e[1];（即‘t')

user: user-2
content: 不知道*&2个一起用是要闹哪样

user: user-3
content: C语言也用引用了?
user-0 提问: C语言的字面值问题

回复:
user: user-1
content: int型也是一样，被存放在.rodata区域，也就是只读区。

user: user-2
content: VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533
user-0 提问: 输入一组学生信息提示0xC0000005: 读取位置时发生冲突，输入多组学生信息没问题

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

user: user-2
content: 引用 2 楼 baidu_26773407 的回复:[quote=引用 1 楼 adlay 的回复:] 第一个的 next 没有初始化  linklist Input_info() { 	linklist p, tail = NULL; 	long int Num; 	p = (linklist)malloc(sizeof(Student)); 	p->next = NULL;  // 这里增加一个初始化操作 	printf("请输入学生的学号:"); 	scanf("%ld", &Num); 	if (Num == 0) 		return NULL;  .... 怎么进行初始化。 p->next=NULLl;不就是初始化吗[/quote] 是啊，但是你没写啊，那一句是我给你加上的。

user: user-0
content: 引用 1 楼 adlay 的回复:第一个的 next 没有初始化  linklist Input_info() { 	linklist p, tail = NULL; 	long int Num; 	p = (linklist)malloc(sizeof(Student)); 	p->next = NULL;  // 这里增加一个初始化操作 	printf("请输入学生的学号:"); 	scanf("%ld", &Num); 	if (Num == 0) 		return NULL;  .... 怎么进行初始化。 p->next=NULLl;不就是初始化吗

user: user-2
content: 第一个的 next 没有初始化  linklist Input_info() { 	linklist p, tail = NULL; 	long int Num; 	p = (linklist)malloc(sizeof(Student)); 	p->next = NULL;  // 这里增加一个初始化操作 	printf("请输入学生的学号:"); 	scanf("%ld", &Num); 	if (Num == 0) 		return NULL;  ....
user-0 提问: 请问C语言可变参数后面的类型怎么能像printf函数那样，不是固定的，表达不清楚，希望有人可以懂我的意思？

回复:
user: user-1
content: 还好有百度！ https://www.baidu.com/s?wd=VS2010Express%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%E5%AD%A6%E4%B9%A0%E7%89%88&rsv_spt=1&rsv_iqid=0xd9da5137000037c3&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_n=2&rsv_sug3=1

user: user-1
content: 比尔·盖茨没请示我就把“VS2010Express简体中文学习版”的下载和谐掉了！ 也难怪微软公司江河日下了！

user: user-2
content: 引用 8 楼 u014626834 的回复:我晕，找不到  去私赵老师要

user: user-1
content: 引用 12 楼 u014626834 的回复:[quote=引用 11 楼 zhao4zhong1 的回复:] 还好有百度！ https://www.baidu.com/s?wd=VS2010Express%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%E5%AD%A6%E4%B9%A0%E7%89%88&rsv_spt=1&rsv_iqid=0xd9da5137000037c3&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_n=2&rsv_sug3=1   我的意思是找不到printf函数的在文件中的地方额...[/quote] File: "C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\printf.c"       62:         retval = _output_l(stdout,format,NULL,arglist); File: "C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c"      940: int __cdecl _output_l (

user: user-3
content: 没有什么高深的东西，声明函数的时候用  ...  就代表它接受可变参数了。 实现的时候，调用方会把实际传递的参数按照从右到左的顺序 push 到堆栈里面（可变参数只能使用 cdecl, 不能使用 stdcall 的），函数里面只要获得了第一个参数的地址，加上第一个参数的大小就可以获得第二个参数的地址了，后面的参数一样，只要知道了前面个参数的地址后大小，就可以得到后面一个参数了。 在 printf 中，每一个参数的大小是由其中的 %d 这种类型来获取的，实际上，绝大多的类型在传递的时候都是按 4 个字节来传递的。  在上面的基础上，标准库定义的一组处理可变参数的宏其实是很简单的。  va_list argptr;           // 定义一个指针 va_start(argptr, i);    // 通过第一个固定参数的地址来初始化指针为可变参数的起始地址 int n = va_arg( argptr, int );   // 取出一个值，并把指针加上这个类型的大小 va_end(argptr);         // 把指针置为 NULL

user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:还好有百度！ https://www.baidu.com/s?wd=VS2010Express%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%E5%AD%A6%E4%B9%A0%E7%89%88&rsv_spt=1&rsv_iqid=0xd9da5137000037c3&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_n=2&rsv_sug3=1   我的意思是找不到printf函数的在文件中的地方额...

user: user-0
content: 我晕，找不到

user: user-1
content: 为什么不直接参考printf的源代码呢？  先 http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装  再参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c

user: user-0
content: 你还是先告诉我为什么吧？

user: user-4
content: 这个问题比较深…… 建议先学会使用，在弄清楚为什么？

user: user-0
content: 你这个代码是实现如果不是0就把下个参数当做字符串处理吗？

user: user-5
content: void testit ( int i, ...) {    va_list argptr;    va_start(argptr, i);     if ( i == 0 ) {       int n = va_arg( argptr, int );       printf( "%d\n", n );    } else {       char *s = va_arg( argptr, char* );       printf( "%s\n", s);    } }

user: user-0
content: 搜过了，没有

user: user-6
content: lz都知道叫做"可变参数"了，为什么不去网上搜一下.
user-0 提问: vs2013,正则查找,怎样找出if中的所有"="号并改成"=="

回复:
user: user-0
content: 引用 3 楼 user-2 的回复:试试 if\s*?\([\s\w]+?=[^=]  我试了,当if中有多个条件时不能用.我自已看了一下正则教程,写了一个,简单测试一下,能用  搜索if或while条件中的单个等号 含有单个等号但不含有分号和换行符的行 [^<>!=]=[^=][^;\n]*\n   搜索for条件中的单个等号 ;.*[^<>!=]=[^=][^)\n]*;

user: user-1
content: 将常量写在==的左边，变量或表达式写在==的右边，这样万一错将==写成=的时候，编译器会报错的。  使用pc_lint软件。

user: user-2
content: 试试 if\s*?\([\s\w]+?=[^=]

user: user-0
content: 引用 1 楼 user-2 的回复:正则表达式当然可以, 编译器自然也提供了,项目属性-C/C++ - 常规, 把警告等级调到等级4就行了. 不过自己经常在if中赋值, 使所以屏蔽了这个警告.GCC可以使用双括号来取消, 比如: if(( a = b ))......微软编译不认, 只能屏蔽了。  我把警告等级改成W4或Wall都不行,但是很久以前有印像会提示,不知道是不是哪个设置把这个给去掉了,我代码分析的时候使用"所有规则"都不提示这个问题  我用if.*={1}查找,不过这个正则不对,所有if都选中了,

user: user-2
content: 正则表达式当然可以, 编译器自然也提供了,项目属性-C/C++ - 常规, 把警告等级调到等级4就行了. 不过自己经常在if中赋值, 使所以屏蔽了这个警告.GCC可以使用双括号来取消, 比如: if(( a = b ))......微软编译不认, 只能屏蔽了。
user-0 提问: 求大神这程序哪里错了，快疯了。

回复:
user: user-1
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

user: user-2
content: C99之前不允许在语句之后出现声明。

user: user-3
content: int i; i = 0; int pos[MAX];  改为：  int i; int pos[MAX]; i = 0;

user: user-4
content: 引用 7 楼 unprince 的回复:第10行的  i = 0;  要放到所有变量定义的后面 标准C不允许这样做   正解，请写成int i = 0;

user: user-5
content: 第10行的  i = 0;  要放到所有变量定义的后面 标准C不允许这样做

user: user-6
content: 引用 5 楼 qq_30239507 的回复:引用 3 楼 q3733353520 的回复:重新手打一遍我都换了一台电脑了，别的程序都好好的，这个一弄就这样。 看看各种符号((,;)，有没错，注意输入法

user: user-0
content: 引用 3 楼 q3733353520 的回复:重新手打一遍我都换了一台电脑了，别的程序都好好的，这个一弄就这样。

user: user-0
content: 引用 1 楼 user-7 的回复:那里有错了?

user: user-6
content: 重新手打一遍

user: user-0
content: 引用 1 楼 user-7 的回复:那里有错了?+1但就是报错！

user: user-7
content: 那里有错了?
user-0 提问: c语言文件操作部分

回复:
user: user-1
content: fp=fopen(filename,"rb");	//以只读的的方式打开指定的文件 ch=fgetc(fp); while(ch=!EOF)      //当读入的字符值等于EOF时结束循环 { putchar(ch);	//将读入的字符显示 ch=fgetc(fp);	//fgetc函数继续返回一个字符给ch* }  改为:  fp=fopen(filename,"rb");    //以只读的的方式打开指定的文件     if (NULL==fp) {         printf("Can not open file %s!\n",filename);         return 1;     } while(!feof(fp))      //当读入的字符值等于EOF时结束循环 { ch=fgetc(fp);	//fgetc函数继续返回一个字符给ch* putchar(ch);	//将读入的字符显示 }

user: user-2
content: 写C语言都不舍得把缓存弄大点. 原来fgetc返回的是char啊. 原来判断是否EOF用ch=!EOF啊.

user: user-3
content: #include <stdio.h> int main() {     FILE *fp;     char filename[256];     int ch;     printf("Please input filename:\n");     gets(filename); //输入文件名及其路径     fp=fopen(filename,"rb");    //以只读的的方式打开指定的文件     if (NULL==fp) {         printf("Can not open file %s!\n",filename);         return 1;     }     ch=fgetc(fp);     while (ch=!EOF) {         putchar(ch);    //将读入的字符显示         ch=fgetc(fp);   //fgetc函数继续返回一个字符给ch*     }     fclose(fp);     printf("\n");     return 0; }
user-0 提问: 同样的程序用VS2013和gcc编译的不一样

回复:
user: user-1
content: 引用 4 楼 zhao4zhong1 的回复:理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  赵老师的这句话已经用了很多年了。

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

user: user-3
content: double a=0;//由于浮点数在存储中无法精确表示，所以它的存储不是你所预期的那样 if(a == b);//实质上是if( a == (double)b)，另外浮点数的存储方式和整型的是不一样的，所以99%应该是不想等的，如果相等，那么说明编译器有其它处理

user: user-4
content: 不同的编译器有不同的实现.... 不过gcc下是应该有输出的

user: user-5
content: 比较的时候会有隐式类型转换，理论上应该是相等的 我用gcc测试没有问题
user-0 提问: 二级指针的问题求帮助

回复:
user: user-1
content: (*mot)[i].age mot指向p，而不是数组

user: user-0
content: i 的地址没错，为什么 j=i+1就错了 在排序时直接档掉了，，j内存指向0xcccccccc
user-0 提问: progress returned -1073741571<0xC00000FD>是什么意思。求大神帮助

回复:
user: user-0
content: 引用 1 楼 搁浅的贝的回复:明显的程序递归是以m的值判断的，但m的值就没变化过，照这样会无限递归，栈溢出什么的都有可能了。  你可以考虑把 m 声明为全局变量 谢谢大神!程序能成功运行了

user: user-1
content: 明显的程序递归是以m的值判断的，但m的值就没变化过，照这样会无限递归，栈溢出什么的都有可能了。  你可以考虑把 m 声明为全局变量
user-0 提问: 请问C语言char s[20]="hello";和char s[]="hello"，这两条语句谁对谁错？

回复:
user: user-1
content: 都对，第一个分配好了数组内存大小，第二个自动分配

user: user-2
content: 建议lz自己试下就知道了……

user: user-3
content: 都对

user: user-0
content: 不要在意第二条没有分号...

user: user-4
content: 前一个，数组长度是20， 后一个数组长度是6。

user: user-5
content: 都对。只是数组长度不同。
user-0 提问: sendmsg函数报90-Message too long错

回复:
user: user-1
content: 引用 3 楼 ewolfe163 的回复:32位Redhat上可正常执行，到64位就失败了，是系统安装问题？还是程序问题？ 放在64位机上的32位虚拟机中运行。

user: user-0
content: 32位Redhat上可正常执行，到64位就失败了，是系统安装问题？还是程序问题？

user: user-1
content: 单步到sendmsg内部一探究竟。

user: user-1
content: 将长消息分为多条短消息发送。
user-0 提问: 大神啊，这几句到底啥意思？

回复:
user: user-1
content: 看起来象是LCD操作,这类都是发个指令过去,然后从数据线上得到数据, 看手册上应该有的

user: user-2
content: MAIN_LCD_RW_DATA_ADDRESS 是一个地址，而这个地址可能是一个 IO 操作。 这个地址读取的数是由外部改变的。

user: user-3
content: 这个值在地址 0x60100000这个位置，你的代码里看不出来，不过你调试的时候，是可以看到的
user-0 提问: 一道c语言题目所出现的一个问题

回复:
user: user-1
content: 哦哦，你的结构体申请的内存好像少了，只能存一个学生的记录。

user: user-0
content: 引用 1 楼 github_27756899 的回复:arr[m].name=strname;  改为： strcpy(arr[m].name,strname); ---------------------------------------------------------------------- 谢了啊。不过还得在前面加句 arr[m].name=(char*)malloc(sizeof(char)); 不然程序会崩

user: user-1
content: arr[m].name=strname;  改为： strcpy(arr[m].name,strname);
user-0 提问: a =1  b=32  输出 a<< b 为什么

回复:
user: user-1
content: 引用 12 楼 lm_whales 的回复:按照数学上来说， 右移，有两种，逻辑右移和算术右移不同，一个补上符号位，一个补上0 左移只有一种，逻辑左移和算术左移相同 不论如何，右移超过数据位数，只有两种结果 ～0，和0 左移只有一种结果 0 但是某一年，Intel CPU 设计的某个工程师， 脑袋抽筋了，设计成32Bits只有5Bits有效位  这样 相当于 第二个操作数对 32 取余数，然后再移位  然后，依照惯例，整型+-*/移位等算术运算，根据CPU 内部算术运算来实现 一个移位表达式，被翻译成对应于 一条移位指令 这样后来就出现了，移位位数，不得超过寄存器位数的奇怪现象。  其实最奇葩的是某些版本的VC编译器 预编译指令中的移位，按照 结果为 0 算  代码中的移位，直接编译成对应的移位指令， 结果就是位数参数被阉割了

user: user-2
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

user: user-3
content: 按照数学上来说， 右移，有两种，逻辑右移和算术右移不同，一个补上符号位，一个补上0 左移只有一种，逻辑左移和算术左移相同 不论如何，右移超过数据位数，只有两种结果 ～0，和0 左移只有一种结果 0 但是某一年，Intel CPU 设计的某个工程师， 脑袋抽筋了，设计成32Bits只有5Bits有效位  这样 相当于 第二个操作数对 32 取余数，然后再移位  然后，依照惯例，整型+-*/移位等算术运算，根据CPU 内部算术运算来实现 一个移位表达式，被翻译成对应于 一条移位指令 这样后来就出现了，移位位数，不得超过寄存器位数的奇怪现象。  其实最奇葩的是某些版本的VC编译器 预编译指令中的移位，按照 结果为 0 算  代码中的移位，直接编译成对应的移位指令， 结果就是位数参数被阉割了

user: user-3
content: 其实是CPU的问题，Intel CPU 32Bits  只能移位 0～32Bits因为只有移位的位数操作数，只有个5有效位

user: user-4
content: 1 << 32 被编译器检测出参数异常了，直接替换成了 0，根本就没有生成移位的指令

user: user-5
content: 左移，右边是补0的，移动32位之后，肯定就全部为0了 如果是有符号的数的话，右移会填充符号位的数 最后变成1111111111111111111111

user: user-6
content: 循环移位是什么鬼

user: user-0
content: 但是我做的是选择题 A 0 0  B  0 1  C 1 0   D  1 1 怎么选呢 而且我在编译器上跑了即便都是 1 0 怎么会是行为不确定呢

user: user-0
content: 谢谢您  那1<< 32为什么是算术左移 而 a<< b却是循环左移呢。。

user: user-0
content: 我的意思是 a=1  b=32 进行 a<<b操作 结果是1  我以为是像1 << 32这样为0 为什么是1 而不是0
user-0 提问: C语言或者C++求助，需要能自动读入txt，并查找指点的内容进行修改

回复:
user: user-1
content: 所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。

user: user-2
content: 1.打开的对话框中需要输入路径吗？ 2.指定位置是指什么位置？是txt的位置吗？添加编码做什么？是用来加密吗？
user-0 提问: 关于字符串输出的问题

回复:
user: user-1
content: 第一次 i=(*(a+x)-'0')+(*(b+y)-'0')+n;时, *(a+x)和*(b+y)都是0('\0'),  i是-负数

user: user-0
content: void myprint(char *a,int x,char *b,int y) { char name[1024];//定义个字符串接收结果   int n=0,i,m;  m=(x>y?x:y)+1;//m的大小是两个字符串长度中最长的那一个 +1 //目的是为了防止计算时有进位操作   name[m+1]='\0'; //m+1的位置加上字符串结束符   while(m>=0) { i=(*(a+x)-'0')+(*(b+y)-'0')+n;//两个字符转成数字相加+n（进位时的数值）   name[m]=i%10+'0';//把数值的尾数转成相应的字符存入字符串   if(i>10)//判断结果确定是否有进位  n=1; else n=0;  if(x==0)//循环到这里表明X=0 的下标以计算，将它的结果置0，以免影响计算结果  { *(a+x)='0'; }  if(y==0)//这时也是上面相同的考虑，主要是针对两个字符串，位数不同而设定  { *(b+y)='0'; }  m--; x--; y--;  if(x<0)x=0;//为防止出现name[ -1 ]越界情况强行置 0；  if(y<0)y=0;	 } puts(name); }  个认认为主要问题会出现在这个函数，求高手指点