Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 写单链表时，为什么传入结构指针不可以初始化，而对于插入删除时传入结构指针却可以改变其值？

回复:
user: user-1
content: 因为你的InitList函数是要在函数内改变指针的指向，所以必须传二级指针或者一级指针的引用才行。 而一般的InsertList或者DeleteList都仅仅只需要改变指针所指向的值，传一级指针就够了

user: user-2
content: 引用 5 楼 DBZ002 的回复:[quote=引用 3 楼 paschen 的回复:] 你需要这样写；   void InitList (Linklist* L) {     	*L =(Linklist)malloc(sizeof(Node)); 	//............... }   否则你是按值传递，函数中的参数只是一个复制品，你申请到的内存也是给一个复制品的，并不会对函数外的变量有影响   自己好好体会一下那为什么做插入删除会影响呢？[/quote]  那你提供你插入删除的代码

user: user-0
content: 引用 2 楼 dustpg 的回复:请把一个文件夹的一个快捷方式复制到桌面上, 然后属性中重定向到另一个文件夹. 请问原来那个文件夹有任何修改么  请把一个文件夹的一个快捷方式复制到桌面上, 然后双击进去该文件夹, 新建一个文件 请问原来那个文件夹有任何修改么貌似没有解决我的问题，大神所说的我明白。

user: user-0
content: 引用 3 楼 paschen 的回复:你需要这样写；   void InitList (Linklist* L) {     	*L =(Linklist)malloc(sizeof(Node)); 	//............... }   否则你是按值传递，函数中的参数只是一个复制品，你申请到的内存也是给一个复制品的，并不会对函数外的变量有影响   自己好好体会一下那为什么做插入删除会影响呢？

user: user-0
content: 引用 1 楼 user-4 的回复:引用而对于插入删除时传入结构指针却可以改变其值  改变不了“其值”。 改变的是它指向的东西。谢谢纠正

user: user-2
content: 你需要这样写；   void InitList (Linklist* L) {     	*L =(Linklist)malloc(sizeof(Node)); 	//............... }   否则你是按值传递，函数中的参数只是一个复制品，你申请到的内存也是给一个复制品的，并不会对函数外的变量有影响   自己好好体会一下

user: user-3
content: 请把一个文件夹的一个快捷方式复制到桌面上, 然后属性中重定向到另一个文件夹. 请问原来那个文件夹有任何修改么  请把一个文件夹的一个快捷方式复制到桌面上, 然后双击进去该文件夹, 新建一个文件 请问原来那个文件夹有任何修改么

user: user-4
content: 引用而对于插入删除时传入结构指针却可以改变其值  改变不了“其值”。 改变的是它指向的东西。
user-0 提问:  a bullet with your name, a ticking time grenade

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2
user-0 提问: leetcode5. Longest Palindromic Substring的C实现

回复:
user: user-1
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-0
content: 引用 5 楼 user-2 的回复:[quote=引用 3 楼 yang1018679 的回复:] [quote=引用 1 楼 user-2 的回复:] 如果字符串为空，那么将会malloc 0 大小内存，而这是一个未定义行为  也不行，刚才加了个if判断语句，还是卡在同样的testcase上[/quote]  检查使用分配到的内存是否会越界  char *sp = (char *)malloc(sizeof(char) * (len / 2));   这句有没有考虑 len 为奇数的情况是否会越界  另外，动态分配的内存记得free是一个好的习惯[/quote] 问题已解决。在expand()中给str分配空间是应该是2*len + 3，多出来的一个用来存储字符串结束符'\0'。 len/2 不会越界，因为str原先长度为2*len + 2，此处除以2之后为len+1，必然大于最长回文子串长度。 结束时的确应该释放掉str，谢谢提醒。

user: user-2
content: 引用 3 楼 yang1018679 的回复:[quote=引用 1 楼 user-2 的回复:] 如果字符串为空，那么将会malloc 0 大小内存，而这是一个未定义行为  也不行，刚才加了个if判断语句，还是卡在同样的testcase上[/quote]  检查使用分配到的内存是否会越界  char *sp = (char *)malloc(sizeof(char) * (len / 2));   这句有没有考虑 len 为奇数的情况是否会越界  另外，动态分配的内存记得free是一个好的习惯

user: user-1
content: 边界条件 输入输出格式 ……

user: user-0
content: 引用 1 楼 user-2 的回复:如果字符串为空，那么将会malloc 0 大小内存，而这是一个未定义行为  也不行，刚才加了个if判断语句，还是卡在同样的testcase上

user: user-0
content: 也不行，刚才加了个if判断语句，提交还是失败

user: user-2
content: 如果字符串为空，那么将会malloc 0 大小内存，而这是一个未定义行为
user-0 提问: 关于C/C++中函数形参和局部变量地址分配的问题

回复:
user: user-1
content: 对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）

user: user-2
content: 这种东西都是编译器看情况处理，没有规定一定要按照某种规则。 所以挨着还是不挨着没啥关系。

user: user-0
content: 引用 2 楼 pengzhixi 的回复:在i和a之间还需要保存 函数的返回地址，旧的ebp值和一些必要的寄存器值。 函数的返回地址和寄存器的值是保存在形参和局部变量之间吗？我之前看过一些资料是说压栈顺序分别是： 寄存器值->函数返回地址->函数返回值->形参->局部变量，所以一直以为形参和局部变量地址是紧挨着的？

user: user-0
content: 看了汇编代码，虽然不怎么懂，但是还是看了些端倪，linux中每次都是先压入形参，然后再预留20个字节存放函数的返回地址和返回值，最后在存入局部变量，windows系统可能预留的字节数不一样，但是原理大同小异。

user: user-1
content: 调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx

user: user-3
content: 看汇编压入栈的内容，还会有函数的返回地址等

user: user-4
content: 在i和a之间还需要保存 函数的返回地址，旧的ebp值和一些必要的寄存器值。

user: user-5
content: 看汇编  看看他们都在哪
user-0 提问: 输入数据之后程序没有反应是什么情况 求指点

回复:
user: user-0
content: 设了断点但是调试不了  一运行输入之后程序就没反应了

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

user: user-2
content: 内存循环是 j =0 ，而不是 i = 0

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

user: user-3
content: 第二个for循环里，应该是for(j=0;j<3;++j)
user-0 提问: 大神们 这是判断字符串对称的函数 现小弟想变成可以输入任意长度的字符串的函数，怎么改啊？（这个函数现在只能判断4个字符）

回复:
user: user-0
content: 引用 1 楼 user-1的回复:如果必须用数据结构的话，建议用顺序栈，涟栈太复杂了，任意大小字符串只是代表栈的字符串数组的大小而已！ 谢谢提醒 现在已经搞出来了

user: user-1
content: 如果必须用数据结构的话，建议用顺序栈，涟栈太复杂了，任意大小字符串只是代表栈的字符串数组的大小而已！
user-0 提问: 大一新生小白求助

回复:
user: user-1
content: 引用 4 楼 qwertypkgg 的回复:[quote=引用 3 楼 user-1 的回复:] [quote=引用 2 楼 qwertypkgg 的回复:] [quote=引用 1 楼 user-1 的回复:] putchar函数需要的参数类型不是double    我应该怎么改呢[/quote]  printf("%f", a);[/quote] 谢谢拉  有没有学习的技巧什么的？？[/quote]  多看书，多思考，多实践！

user: user-0
content: 引用 3 楼 user-1 的回复:[quote=引用 2 楼 qwertypkgg 的回复:] [quote=引用 1 楼 user-1 的回复:] putchar函数需要的参数类型不是double    我应该怎么改呢[/quote]  printf("%f", a);[/quote] 谢谢拉  有没有学习的技巧什么的？？

user: user-1
content: 引用 2 楼 qwertypkgg 的回复:[quote=引用 1 楼 user-1 的回复:] putchar函数需要的参数类型不是double    我应该怎么改呢[/quote]  printf("%f", a);

user: user-0
content: 引用 1 楼 user-1 的回复:putchar函数需要的参数类型不是double    我应该怎么改呢

user: user-1
content: putchar函数需要的参数类型不是double
user-0 提问: 我要下载visual studio 2010学习版 该下载哪个版本？（图片进入可见）

回复:
user: user-1
content: http://blog.csdn.net/cometnet/article/details/19551125

user: user-2
content: zhao4zhong1版： Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

user: user-3
content: 直接去 msdn 我告诉你，下载完整版、旗舰版的VS。

user: user-4
content: 建议装vs2015社区版，可以用c11的东西

user: user-5
content: 一楼说得对，安装完之后，百度一个密钥，就可以了！

user: user-6
content: 直接下载Ultimate那个版本，功能最强
user-0 提问: char *p 赋值而不改变地址

回复:
user: user-1

user: user-2
content: 如果你是要拷贝字符串，用strcpy

user: user-3
content: strcpy

user: user-4
content: char *s1="A",*s2="B"; char *p; p=s1; p=s2;

user: user-5
content: 重新组织一下你的问题吧
user-0 提问: C语言学的不精，大神求100位数和100位整数的加法运算？？

回复:
user: user-0
content: 谢谢大家了，哈哈哈，多多学习

user: user-1
content: 仅供参考：#include <stdio.h> #include <string.h> #define MAXLEN 1000 char a1[MAXLEN]; char a2[MAXLEN]; static int v1[MAXLEN]; static int v2[MAXLEN]; static int v3[MAXLEN]; int i,j,n,L,z; void main(void) {     scanf("%d",&n);     for (j=0;j<n;j++) {         scanf("%s%s",a1,a2);          L=strlen(a1);         for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';          L=strlen(a2);         for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';          for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];          for (i=0;i<MAXLEN;i++) {             if (v3[i]>=10) {                 v3[i+1]+=v3[i]/10;                 v3[i]=v3[i]%10;             }         }          printf("Case %d:\n", j+1);         printf("%s + %s = ", a1, a2);          z=0;         for (i=MAXLEN-1;i>=0;i--) {             if (z==0) {                 if (v3[i]!=0) {                     printf("%d",v3[i]);                     z=1;                 }             } else {                 printf("%d",v3[i]);             }         }         if (z==0) printf("0");          printf("\n");     } } //Sample Input //3 //0 0 //1 2 //112233445566778899 998877665544332211 // //Sample Output //Case 1: //0 + 0 = 0 //Case 2: //1 + 2 = 3 //Case 3: //112233445566778899 + 998877665544332211 = 1111111111111111110

user: user-2
content: #include<stdio.h> #include<string.h> char d1[1010],d2[1010],result[1010]; int count;  void converse(){     int i,len=strlen(result);     char c;     for(i=0;i<len/2;i++){         c=result[i];         result[i]=result[len-i-1];         result[len-i-1]=c;     } }  void add(){     int len1=strlen(d1)-1;     int len2=strlen(d2)-1;     count=0;     int flag=0,t;     while(len1>=0 && len2>=0){         t=d1[len1]-'0'+d2[len2]-'0'+flag;         if(t>=10)flag=1;         else flag=0;         result[count++]=t%10+'0';         len1--;         len2--;     }     while(len1>=0){         t=d1[len1]-'0'+flag;         if(t>=10)flag=1;         else flag=0;         result[count++]=t%10+'0';         len1--;     }     while(len2>=0){         t=d2[len2]-'0'+flag;         if(t>=10)flag=1;         else flag=0;         result[count++]=t%10+'0';         len2--;     }     if(flag>0)result[count++]=flag+'0';     result[count]='\0';     converse(); }  int main(){     int T,i;     scanf("%d",&T);     for(i=1;i<=T;i++){         scanf("%s%s",d1,d2);         add();         printf("Case %d:\n",i);         printf("%s + %s = %s\n",d1,d2,result);         if(i!=T)printf("\n");     }     return 0; } 代码仅供参考

user: user-3
content: http://www.cnblogs.com/liangchao/archive/2012/09/13/2683716.html

user: user-4
content: C Primer Plus  C语言程序设计：现代方法：第2版(被誉为"近10年来最好的一部C语言著作") C和指针 或者谭浩强 以上任选一本就差不多了，以下为参考书： 《深入理解C指针》 《C陷阱与缺陷》 《C专家编程》 《C语言点滴》 《C语言课程设计案例精编》 C语言程序开发范例宝典 C语言经典编程282例

user: user-5
content: 百度一下，高精度算法！

user: user-6
content: 用字符串来存，然后从低位依次相加，自己处理进位等
user-0 提问: 新手 求助 一道简单ACM的+++++++

回复:
user: user-0
content: 引用 3 楼 qq423399099 的回复:1.不多于5位，意味着可能是5位数，你必须char a[6];因为最后必须要留一位放'\0' 2.你这个输入了1个四位数，不管正序还是逆序都会多输出一个0，这样符合要求么？好的 多谢了

user: user-1
content: 字符串还要加上最后的\0，所以char a[5] 数组大小不够

user: user-2
content: 1.不多于5位，意味着可能是5位数，你必须char a[6];因为最后必须要留一位放'\0' 2.你这个输入了1个四位数，不管正序还是逆序都会多输出一个0，这样符合要求么？

user: user-0
content: 引用 1 楼 AnonymousRookie 的回复: # include <stdio.h>  void main() {     int n;     int i;     int temp;     int count=0;     int a[10];     printf("输入一个不多于5位的整数：\n");     scanf("%d",&n);     temp=n;     while(temp!=0)     {         a[count++]=temp%10;         temp/=10;     }     printf("%d是%d位数.\n各位数分别是：",n,count);      for(i=count-1;i>=0;--i)     {         printf("%d",a[i]);     }     printf("\n");       printf("逆序输出各位数字:");     for(i=0;i<count;++i)     {         printf("%d",a[i]);     }     printf("\n"); } 我主要想知道我这个哪有有问题 越详细越好

user: user-3
content: # include <stdio.h>  void main() {     int n;     int i;     int temp;     int count=0;     int a[10];     printf("输入一个不多于5位的整数：\n");     scanf("%d",&n);     temp=n;     while(temp!=0)     {         a[count++]=temp%10;         temp/=10;     }     printf("%d是%d位数.\n各位数分别是：",n,count);      for(i=count-1;i>=0;--i)     {         printf("%d",a[i]);     }     printf("\n");       printf("逆序输出各位数字:");     for(i=0;i<count;++i)     {         printf("%d",a[i]);     }     printf("\n"); }
user-0 提问: 怎么运行时会弹出这个框，程序什么问题？

回复:
user: user-1
content: a[0] 和 a[1] 是两个指针，你要给他指向的 int 赋值，你都没分配内存也没指向某个变量，当然会崩溃。

user: user-2
content: 引用 15 楼 pkuzhx 的回复:[quote=引用 14 楼 pkuzhx 的回复:] [quote=引用 7 楼 imkelt 的回复:] a[2] = {0}; a[0]被初始化为0，a[1]你没有为他赋值，则被值初始化为0  人家问的是数组指针，你非要跟他说数组……[/quote] 不对，应该是指针数组，数组的元素是int指针[/quote] 看漏了

user: user-3
content: 你这个本身就是数组，数组的元素是int*类型，即指针。但是你给两个指针分配的地址都是0,0地址你不能写数据的。 #include <stdio.h> int main() { 	int *a[2] = {0}; 	int b = 0, c = 0; 	a[0] = &b; 	a[1] = &c; 	*a[0] = 1; 	*a[1] = 11; 	printf("%d %d\n", b, c); 	return 0; }

user: user-3
content: 引用 14 楼 pkuzhx 的回复:[quote=引用 7 楼 imkelt 的回复:] a[2] = {0}; a[0]被初始化为0，a[1]你没有为他赋值，则被值初始化为0  人家问的是数组指针，你非要跟他说数组……[/quote] 不对，应该是指针数组，数组的元素是int指针

user: user-3
content: 引用 7 楼 imkelt 的回复:a[2] = {0}; a[0]被初始化为0，a[1]你没有为他赋值，则被值初始化为0  人家问的是数组指针，你非要跟他说数组……

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

user: user-5
content: 正解在#1和#2楼

user: user-2
content: 引用 10 楼 u014325402 的回复:[quote=引用 9 楼 imkelt的回复:]比如你*a[0]取到的是值0，而0=1这个表达式你觉得能成立吗，你赋值不就是想改数组元素的值吗，那为什么还要取值呢 那要如何改？。。。。。[/quote] 上面说啦 a[0] = 1; a[1] = 11;

user: user-0
content: 引用 9 楼 imkelt的回复:比如你*a[0]取到的是值0，而0=1这个表达式你觉得能成立吗，你赋值不就是想改数组元素的值吗，那为什么还要取值呢 那要如何改？。。。。。

user: user-2
content: 比如你*a[0]取到的是值0，而0=1这个表达式你觉得能成立吗，你赋值不就是想改数组元素的值吗，那为什么还要取值呢

user: user-2
content: 引用 6 楼 u014325402 的回复:[quote=引用 5 楼 imkelt的回复:]a[0]、a[1]已经是引用了，不用在用取地址符，可以直接赋值 这是指针数组，* 是取值。[/quote] 取值取到的是右值，是不能被赋值的

user: user-2
content: a[2] = {0}; a[0]被初始化为0，a[1]你没有为他赋值，则被值初始化为0

user: user-0
content: 引用 5 楼 imkelt的回复:a[0]、a[1]已经是引用了，不用在用取地址符，可以直接赋值 这是指针数组，* 是取值。

user: user-2
content: a[0]、a[1]已经是引用了，不用在用取地址符，可以直接赋值

user: user-0
content: 引用 2 楼 user-6的回复:要赋值你得先为指针分配一块内存 如何用简单的方式分配，而不用malloc函数

user: user-0
content: 用malloc来分配吗？  还有其他简单的方法吗？

user: user-6
content: 要赋值你得先为指针分配一块内存

user: user-6
content: a[0]的值是0 （NULL）  这块内存是不可读的，不能被解引
user-0 提问: 如何把一个数组或者一段内存一次性的写入文件中

回复:
user: user-0
content: 引用 4 楼 paschen 的回复:使用文件内存映射方式打开文件，然后直接使用memcpy拷贝整段内存内容到文件虽然我没明白你说的映射方式。

user: user-0
content: 引用 6 楼 user-4 的回复:楼主似乎是要写人类可读的那种格式，这个没有标准库函数，需要自己写循环或者递归整个程序我已经写完了。就是速度慢。我现在在想办法提高运行速度。对于这个问题，如何写入。我的办法是在写入之前，或者说运算到结尾，我直接把数字加上48，使其对应上asc码，然后用fwrite一次性写入。  感谢各位的帮助。谢谢大家。

user: user-1
content: https://www.baidu.com/s?wd=msdn2005%E4%B8%AD%E6%96%87%E7%89%88&rsv_spt=1&rsv_iqid=0xbb6c261c00041f7b&issp=1&f=3&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=10&rsv_sug1=8&rsv_sug7=100&rsv_sug2=1&prefixsug=%E2%80%9CMSDN2005%E2%80%9D&rsp=1&inputT=6005&rsv_sug4=6005

user: user-2
content: 这个中文版的 MSDN 哪里可以下载 引用 5 楼 zhao4zhong1 的回复:无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

user: user-3
content: 使用文件内存映射方式打开文件，然后直接使用memcpy拷贝整段内存内容到文件

user: user-4
content: 楼主似乎是要写人类可读的那种格式，这个没有标准库函数，需要自己写循环或者递归

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了赵老师，我没明白你的意思。按我的理解，确实，计算机中所有数据的存储都是按照二进制的形式存储的。但是，我需要把我数组a[200]的信息写入到1.txt中，并且是按照fprintf(fp,"%d",a[i]);这种形式写进去啊。当然了，问题在于 fprintf 这个函数一次只能写数组的一个元素，我是想一次把数组的一行甚至整个二维数组写进去。否则用for循环，一次写一个太慢了。每写一个字符就要进行一次判断，i 也要进行一次加一。太耗费时间了。

user: user-1
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-0
content: 对了，我的存储方式是ASC|| 型，不是二进制。即文件中要显示的是123456789

user: user-1
content: 无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！
user-0 提问: C语言 函数调用栈问题

回复:
user: user-1
content: 引用 4 楼 baise47 的回复:报错那行是汇编语言，把ebp寄存器的内容复制到新建的临时变量里，从而获取上一个函数的栈底地址。 这道题的目的，就是不传递参数，通过函数调用栈的栈底地址，根据变量保存的顺序，获取变量的值。 主要考察，对函数调用栈的理解。  引用 2 楼 qq_34143240 的回复:参数没有传递，报错那行什么意思？  使用ebp寻址涉及到很多，建议看汇编看生成的汇编来判断变量位置

user: user-2
content: 楼主首先要学会在内存窗口中查看堆栈。我觉得。 http://bbs.csdn.net/topics/391944619

user: user-0
content: 报错那行是汇编语言，把ebp寄存器的内容复制到新建的临时变量里，从而获取上一个函数的栈底地址。 这道题的目的，就是不传递参数，通过函数调用栈的栈底地址，根据变量保存的顺序，获取变量的值。 主要考察，对函数调用栈的理解。  引用 2 楼 qq_34143240 的回复:参数没有传递，报错那行什么意思？

user: user-0
content: 不好意思，笔误。 main函数和print函数应该分开。  引用 1 楼 paschen 的回复:你把main函数放在print函数里什么意思：   #include <stdio.h> void print() { 	unsigned int _ebp; 	__asm{ 		mov _ebp,ebp 	} 	int *p = (int*)(*(int *)_ebp- 4-4-4-7*4); 	for (int i=0; i<7; i++) 	{ 		printf("\r\n %d \t", p[i]); 	} }  int main() { 	int a =1; 	int b = 2; 	char c = 'a'; 	int arr[]={11,12,13,14,15,16,17}; 	print(); 	return 0; }  引用 1 楼 paschen 的回复:你把main函数放在print函数里什么意思：   #include <stdio.h> void print() { 	unsigned int _ebp; 	__asm{ 		mov _ebp,ebp 	} 	int *p = (int*)(*(int *)_ebp- 4-4-4-7*4); 	for (int i=0; i<7; i++) 	{ 		printf("\r\n %d \t", p[i]); 	} }  int main() { 	int a =1; 	int b = 2; 	char c = 'a'; 	int arr[]={11,12,13,14,15,16,17}; 	print(); 	return 0; }

user: user-2
content: 对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）

user: user-2
content: 调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx

user: user-3
content: 参数没有传递，报错那行什么意思？

user: user-1
content: 你把main函数放在print函数里什么意思：   #include <stdio.h> void print() { 	unsigned int _ebp; 	__asm{ 		mov _ebp,ebp 	} 	int *p = (int*)(*(int *)_ebp- 4-4-4-7*4); 	for (int i=0; i<7; i++) 	{ 		printf("\r\n %d \t", p[i]); 	} }  int main() { 	int a =1; 	int b = 2; 	char c = 'a'; 	int arr[]={11,12,13,14,15,16,17}; 	print(); 	return 0; }
user-0 提问: 新人求助  大神快来看看！！！！！！！

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

user: user-2
content: ss指针没有分配空间啊，你的SqStack *ss;定义的是指针。你可以定义实体或者给这个指针分配空间。

user: user-3
content: 给SqStack *ss分配个空间才行  #include<stdio.h> #include<math.h> #include<string.h> #include<malloc.h> #include<stdlib.h> #include<conio.h> #define SIZE 100 typedef int DataType;  typedef struct SqStack { 	DataType *base; 	DataType *top; 	int size; }SqStack;  void initial(SqStack *s) { 	s->base = (DataType*)malloc(SIZE*sizeof(DataType)); 	if (!s->base)  exit(-1); 	s->top = s->base; 	s->size = SIZE; }  int empty(SqStack  *ss) { 	return ss->base == ss->top; } int full(SqStack *ss) { 	return ss->top - ss->base == SIZE - 1; } void push(SqStack  *ss, int x) { 	if (full(ss)) 	{ 		printf("满了"); 		exit(1); 	} 	*ss->top++ = x; } DataType pop(SqStack *ss) { 	if (empty(ss)) 	{ 		printf("空了"); 		exit(1); 	} 	return *--ss->top; } DataType top(SqStack *ss) { 	if (empty(ss)) 	{ 		printf("空了"); 		exit(1); 	} 	return *(ss->top - 1);  } void zh(int a, int b) { 	int i; 	SqStack *ss = (SqStack*)malloc(sizeof(SqStack)); 	initial(ss); 	while (a) 	{ 		push(ss, a%b); 		a = a / b; 	} 	while (!empty(ss)) 	{ 		i = pop(ss); 		printf("%d", i); 	} }  int main() { 	int n, m; 	printf("输入一个数"); 	scanf("%d", &n); 	printf("转换进制"); 	scanf("%d", &m); 	zh(n, m);  	return 0;  }

user: user-4
content: 你的initial函数是按值传递的，也就是函数中得到的参数只是外面参数的一个复制品，你把申请的内存给了一个复制品，并不会改变函数外的参数  你应该传递指针的指针到函数中!

user: user-0

user: user-0
content: #include<stdio.h> #include<math.h> #include<string.h> #include<malloc.h> #include<stdlib.h> #include<conio.h> #define SIZE 100 typedef int DataType;  typedef struct SqStack { 	DataType *base; 	DataType *top; 	int size ; }SqStack;  void initial(SqStack *s) { 	s->base=(DataType*)malloc(SIZE*sizeof(DataType));     if(!s->base)  exit(-1); 	s->top=s->base; 	s->size=SIZE; }  int empty(SqStack  *ss) { 	return ss->base==ss->top; } int full(SqStack *ss) { 	return ss->top-ss->base==SIZE-1; } void push(SqStack  *ss,int x) { 	if(full(ss)) 	{printf("满了"); 	exit(1);} 	*ss->top++=x; } DataType pop(SqStack *ss) { 	if(empty(ss)) 	{ 		printf("空了"); 		exit(1); 	} 	return *--ss->top; } DataType top(SqStack *ss) { 	if(empty(ss)) 	{ 		printf("空了"); 		exit(1); 	} 	return *(ss->top-1);  } void zh(int a,int b) { 	int i; 	SqStack *ss; 	initial(ss); 	while(a) 	{ 		push(ss,a%b); 		a=a/b; 	} 	while(!empty(ss)) 	{	i=pop(ss); 	printf("%d",i);} }  int main() { 	int n,m; 	printf("输入一个数"); 	scanf("%d",&n); 	printf("转换进制"); 	scanf("%d",&m); 	zh(n,m);  return 0;  }

user: user-0
content: 有图吗.....
user-0 提问: 一道简单的题不至于删我的提问吧?????csdn!!!!!!!!!!!

回复:
user: user-0
content: #include<stdio.h> #include<malloc.h> struct stu { int num; struct stu *next; }; struct stu* creat(void)//建立一个链表 { int n; struct stu *p1,*p2,*head; scanf("%d",&n); p1=head=(struct stu *)malloc(sizeof(struct stu)); p1->next=NULL; for(int i=0;i<n;i++) { p2=(struct stu *)malloc(sizeof(struct stu)); p2->next=NULL; scanf("%d",&p2->num); p1->next=p2; p1=p2; } p1->next=NULL; return head; } int main() { 		struct stu *pc,*pt_a,*pt_b,*pa,*pb,*pp; 		struct stu* head=(struct stu *)malloc(sizeof(struct stu));//新链表的表头 		pc=head; 		pc->next=NULL; 		pt_a=creat(); 		pa=pt_a->next; 		pt_b=creat(); 		pb=pt_b->next; 		while(pa&&pb)//判断一个链表是否遍历到结尾 		{				//printf("%d",pa->num); 					if(pa->num<=pb->num)//判断大小 					{ 						pc->next=pa;//连接到新链表上 						pc=pa;//新表指针指向最后一个 						pa=pa->next;//原先的链表后移 					} 					 					else//(pt_a->next->num<pt_b->next->num) 					{ 						pc->next=pb;//连接到新链表上 						pc=pb;//新表指针指向最后一个 						pb=pb->next;//原先的链表后移 					} 		} 		pc->next=NULL; 		while(head->next!=NULL) 		{ 			printf("*%d      ",head->next->num); 			head=head->next; 		} 	return 0; }

user: user-0
content: 好的 谢谢各位啦!这几天比较忙没有来看帖子,谢谢啦

user: user-1
content: 1.你的creat函数是对的。 2.if (pt_a->next->num>pt_b->next->num);后面多了分号 3.你的连接链表不对，你想，假设第一次进入了else分支，第二次进入了if分支，那么第三次比较的时候，其实你已经丢失了pt_a链表的剩余部分了，自己在纸上画一下就明白了，或者单步调试一步步看下去。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: 你这是要干嘛？合成新链表？麻烦大虾以后发帖，注意标题

user: user-3
content: p1->next==NULL; 是否想写：p1->next=NULL;  这里的if后面多了一个分号： if(pt_a->next->num>pt_b->next->num);

user: user-0
content: 这个是把两个链表合成一个链表上
user-0 提问: c  问题求解

回复:
user: user-1
content: 重开软件--重启电脑

user: user-2
content: 不是代码问题，应该是重新生成EXE文件时，原来的EXE文件被占用着，重新启动下再试

user: user-3
content: 估计你开了两个程序，关掉期中一个就好了！
user-0 提问: C语言学的半吊子，为什么输出结果不一样呢？

回复:
user: user-1
content: 输入两个随便什么字符间隔的整数。 仅供参考：#include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }

user: user-2
content: scanf()是一个比较严格的函数，何谓严格，首先函数中是否包含空白/非空白字符对输入格式的影响很大：       比如：scanf("%d,%d",&a,&b);   scanf中有一个逗号，所以输入的格式应该是2,3==>a=2,b=3              scanf("%d%d",&a,&b);    可以用空格或回车来分隔两个输入 如 45==>a=4,b=5          scanf("%d  %d",&i,&j);   与上面相同

user: user-3
content: 或者输入的时候，输入 C 2,3

user: user-3
content: scanf("%d,%d",&rows,&cols);  改成  scanf("%d%d",&rows,&cols);

user: user-4
content: 但你那逗号不能省略啊

user: user-0
content: 引用 1 楼 user-5 的回复:要和 "%d,%d" 格式对应,   应该判断 scanf 读取 返回的个数 C 2, 3[enter] 在输入过程中，scanf（）不是可以跳过空格、制表符和换行符的吗？输入c 2 3，是不是可以理解为ch='c',rows=2,cols=3？

user: user-5
content: 要和 "%d,%d" 格式对应,   应该判断 scanf 读取 返回的个数 C 2, 3[enter]
user-0 提问: 关于sizeof的用法

回复:
user: user-1
content: 感觉这就是C语言的特性，不需要过多纠结吧。 只要记住 1. sizeof(数组名)是获取数组的长度； 2. sizeof(指针)是4字节（32位机器上）； 3. 数组名做函数实参时会退化为指针（4字节）。 就行了。

user: user-2
content: 在sizeof(a2)中，a2表示的含义是a2[]，因此返回整个数组的大小（这个大小在之前的数组定义中已经确定了）；而a1只是个指针，sizeof(a1)只能返回指针本身占用的字节数而不能确定为它指向的内容分配的空间的大小。

user: user-3
content: 你需要理解数组和指针的区别。  1. 指针就是一个变量，你可以给它赋值，是可变的；而数组首元素，你可以看成是数组的指针，但是这个指针地址是不可变的  2. 在你的代码中，sizeof(p)是指针的大小，sizeof(a)是数组的大小  3. 当数组作为参数传递给函数时，这个时候，就是作为指针来使用的

user: user-4
content: 数组类型和指针类型是两种不同的类型  唯一的联系是某些情况下，数组可以退化为指针

user: user-5
content: 因为数组不是指针

user: user-6
content: sizeof 不进行退化。

user: user-7
content: 数组在作为函数参数传递过程中，才会退化成指针

user: user-8
content: 指针在32位上 都是4字节！ 数组你在主函数里 不会退化，所以你sizeof(a)的时候是整个数组的大小！如果你把数组作为参数传递就会退化为指针（也就是4个字节）！ 你得区分 指针和数组
user-0 提问: 求运用一维数组统计学生成绩及每个人三门的平均成绩，学生数由键盘输入

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

user: user-2
content: 外层循环每次要将sum清零：  #include <stdio.h> int main() {    	int n,i,j,chinese,math,english,sum=0; 	float av; 	printf("how many students are in your class?"); 	scanf("%d",&n); 	printf("please input students three scores:\n"); 	int b[3]; 	for (i=1;i<=n;i++) 	{ 		printf("the no.%d:",i); 		sum = 0; 		for(j=0;j<3;j++) 		{ 			scanf("%d",&b[j]); 			sum+=b[j]; 			av=sum/3.0;//平均值为输入的所有数据除以3，并非个人的三门成绩平均值。  		} 	} 	printf("num  chinese math english    av\n"); 	for(i=1;i<=n;i++) 	{ 		printf("%2d",i); 		for(j=0;j<3;j++) 		{ 			printf("%7d",b[j]);//数组b只可以一次赋值，输入多组数据只能存储到最后一组  		} 		printf("%9.2f",av); 		printf("\n"); 	} 	return 0;  }
user-0 提问: C语言scanf

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

user: user-2
content: fscanf（fp，“s%”，name）puts（name）是几个意思？ 应该编译通不过吧？ fscanf(fp，“%s”，name); puts(name);  "我的想法是fscanf读完一个单词进入第二次循环后，会在单词末尾加空字符，不知道对不对！" 不是在字符串末尾加空字符，而是加字符串结束符，即'\0'

user: user-3
content: http://www.cplusplus.com/reference/cstdio/fscanf/?kw=fscanf

user: user-0
content: 引用 2楼paschen 的回复:http://en.cppreference.com/w/c/io/fscanfIf width specifier is used, matches up to width or until the first whitespace character, whichever appears first. Always stores a null character in addition to the characters matched (so the argument array must have room for at least width+1 characters)

user: user-0
content: 引用 1楼user-5 的回复:第一次循环也会加空字符啊。  %s 会自动加 '\0' 的。就是读完%s后scanf会在结尾加空字符吗？

user: user-4
content: http://en.cppreference.com/w/c/io/fscanf

user: user-5
content: 第一次循环也会加空字符啊。  %s 会自动加 '\0' 的。
user-0 提问: 一个批量重命名文件出错

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

user: user-2
content: 出错时应输出尽量多的相关变量当前的值。

user: user-0
content: 引用 1 楼 user-3 的回复:目录输入一个 \ 就够了。 嗯，那么还有什么错误吗？

user: user-3
content: 目录输入一个 \ 就够了。
user-0 提问: 这里的scanf函数是怎么会是？

回复:
user: user-1
content: 不那样会更麻烦。不信你可以随便试。

user: user-0
content: 引用 6 楼 赵4老师的回复:printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0]; 老师，你好，程序为什么要改为那样写，那样写是不是麻烦了？

user: user-2
content: 用scanf("%c",...)或者getchar()的时候，要特别注意输入缓冲区内的数据（因为它能读入空格，制表符，回车符） 可以用fflush(stdin);来清空输入缓冲区

user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

user: user-3
content: 直接输入abcd，中间是不需要加空格的,空格也是一种一种字符

user: user-4
content: %c 会将你回车产生的换行符\n也读进去

user: user-5
content: 空格也会读的

user: user-6
content: char m,p; m前面是光标吗？

user: user-7
content: 格式是%c%c%c%c而不是%c %c %c %c
user-0 提问: 执行printf之后出现某指针被修改问题

回复:
user: user-0
content: 问题原因找到了,是其它地方没有注意函数参数的值传递问题.不过还是多谢2位回答

user: user-1
content: 判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

user: user-0
content: 引用 1 楼 user-2 的回复:检查数组是已经越界了 看log没有越界                         fmin = Astar_map[x_index][y_index].f;                         printf("next node x = %d,y = %d,f = %d\n",(x_index),(y_index),fmin);的log如下        next node x = 5,y = 0,f = 250 Astar_map数组是[20][20]的

user: user-2
content: 检查数组是已经越界了
user-0 提问: 位域定义的问题？

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #pragma pack(push,1) union U {     unsigned char byte;     struct BF {         unsigned int b0:1;//a         unsigned int b1:1;//b         unsigned int b2:1;//c     } bf; } u; #pragma pack(pop) unsigned char bt; int a,b,c; int main() {     for (bt=0;bt<8;bt++) {         u.byte=(unsigned char)bt;         a=u.bf.b0;         b=u.bf.b1;         c=u.bf.b2;         printf("byte 0x%02x -- c:%d b:%d a:%d\n",bt,c,b,a);     }     for (c=0;c<2;c++)     for (b=0;b<2;b++)     for (a=0;a<2;a++) {         u.bf.b0=a;         u.bf.b1=b;         u.bf.b2=c;         bt=u.byte;         printf("c:%d b:%d a:%d -- byte 0x%02x\n",c,b,a,bt);     }     return 0; } //byte 0x00 -- c:0 b:0 a:0 //byte 0x01 -- c:0 b:0 a:1 //byte 0x02 -- c:0 b:1 a:0 //byte 0x03 -- c:0 b:1 a:1 //byte 0x04 -- c:1 b:0 a:0 //byte 0x05 -- c:1 b:0 a:1 //byte 0x06 -- c:1 b:1 a:0 //byte 0x07 -- c:1 b:1 a:1 //c:0 b:0 a:0 -- byte 0x00 //c:0 b:0 a:1 -- byte 0x01 //c:0 b:1 a:0 -- byte 0x02 //c:0 b:1 a:1 -- byte 0x03 //c:1 b:0 a:0 -- byte 0x04 //c:1 b:0 a:1 -- byte 0x05 //c:1 b:1 a:0 -- byte 0x06 //c:1 b:1 a:1 -- byte 0x07

user: user-2
content: 编译器怎么做都可以  http://en.cppreference.com/w/c/language/bit_field

user: user-3
content: 编译器愿意怎么放都可以。
user-0 提问: 贪吃蛇问题

回复:
user: user-0
content: 引用 2 楼 u010165006 的回复:#include "stdafx.h" #include "colorConsole.h"  /* HANDLE initiate() { 	HANDLE hOutput;  	hOutput = GetStdHandle(STD_OUTPUT_HANDLE); 	return hOutput; } */  BOOL textout(HANDLE hOutput,int x,int y,WORD wColors[],int nColors,LPTSTR lpszString) {     DWORD cWritten;      BOOL fSuccess;      COORD coord;      	coord.X = x;              // 输出第一个字符所在的列即X坐标      coord.Y = y;              //   所在的行即Y坐标           fSuccess = WriteConsoleOutputCharacter(		//输出字符串         hOutput,              // 屏幕缓冲区的句柄         lpszString,           // 指向字符串的指针          lstrlen(lpszString),  // 字符串长度         coord,                // 输出第一个字符的坐标         &cWritten);           // 实际输出字符的个数     if (! fSuccess)          cout<<"error:WriteConsoleOutputCharacter"<<endl;      	     	for (;fSuccess && coord.X < lstrlenA((LPCSTR)lpszString)+x; coord.X += nColors)      {         fSuccess = WriteConsoleOutputAttribute(		//为已输出的字符串上色             hOutput,          // 屏幕缓冲区的句柄             wColors,          // 颜色数组             nColors,          // 颜色数目             coord,            // 输出第一个字符的坐标             &cWritten);       // 实际输出字符的个数     }     if (! fSuccess)      	cout<<"error:WriteConsoleOutputAttribute"<<endl;  	return 0; }  谢谢，但是不知道怎么用。

user: user-0
content: 引用 1 楼 paschen 的回复:可以考虑不全部清除重画，可以将光标移到要擦除的地方，输出空格覆盖，移到需要更新的地方，输出更新的东西 好的，谢谢。但是我打印的方法好像对你的解决方法不行

user: user-1
content: #include "stdafx.h" #include "colorConsole.h"  /* HANDLE initiate() { 	HANDLE hOutput;  	hOutput = GetStdHandle(STD_OUTPUT_HANDLE); 	return hOutput; } */  BOOL textout(HANDLE hOutput,int x,int y,WORD wColors[],int nColors,LPTSTR lpszString) {     DWORD cWritten;      BOOL fSuccess;      COORD coord;      	coord.X = x;              // 输出第一个字符所在的列即X坐标      coord.Y = y;              //   所在的行即Y坐标           fSuccess = WriteConsoleOutputCharacter(		//输出字符串         hOutput,              // 屏幕缓冲区的句柄         lpszString,           // 指向字符串的指针          lstrlen(lpszString),  // 字符串长度         coord,                // 输出第一个字符的坐标         &cWritten);           // 实际输出字符的个数     if (! fSuccess)          cout<<"error:WriteConsoleOutputCharacter"<<endl;      	     	for (;fSuccess && coord.X < lstrlenA((LPCSTR)lpszString)+x; coord.X += nColors)      {         fSuccess = WriteConsoleOutputAttribute(		//为已输出的字符串上色             hOutput,          // 屏幕缓冲区的句柄             wColors,          // 颜色数组             nColors,          // 颜色数目             coord,            // 输出第一个字符的坐标             &cWritten);       // 实际输出字符的个数     }     if (! fSuccess)      	cout<<"error:WriteConsoleOutputAttribute"<<endl;  	return 0; }

user: user-2
content: 可以考虑不全部清除重画，可以将光标移到要擦除的地方，输出空格覆盖，移到需要更新的地方，输出更新的东西

user: user-3
content: console屏幕处理例子程序。终端窗口屏幕处理相关API使用例子。来自MSVC20\SAMPLES\win32\console\ http://download.csdn.net/detail/zhao4zhong1/3461309
user-0 提问: 单入单出无锁实现

回复:
user: user-1
content: 确保先写后读，还有一种方法。 就是每次写数据都给它设置一个“首部” “首部”中设置一个读写字段 flag  如果是1，就是已写，如果是0就是未写。 每次读写操作都相应地设置好这个flag。 每次读之前都对检查这个flag。如果是1就执行读操作，如果是0就等待。

user: user-1
content: "假如写100个的话，写到64之后就会说满了" 每次写之前都判断是否有足够的内存。 由于两个线程同时执行，总会有数据被读取出去。那么就会有新的内存可以写了。 如果暂时满了，可以让写线程稍等一下。等读线程读出数据再接着写。

user: user-2
content: 无锁。。。。 好吧，我觉得即使没有锁，也需要其他形式的锁。。。

user: user-1
content: 你说“每次都是先读后写”。这就有问题了。 必须确保先写后读。也就是在读之前须要判断写过了没有。 通过head和tail的关系来判断。 1、head==tail，没有数据，不可以读。 2、head!=tail，有数据，可以读。 注意：写满之后，head==tail又成立了。所以，不允许写满。空出一个字节，不让head追上tail.

user: user-0
content: 用head和tail作为数组的号，比如创建64个buf，head等于64写入完成之后让它归0，重复利用。就是两线程读和写同时调用的话，每次都是先读后写，读的都是空，假如写100个的话，写到64之后就会说满了。如何才能让读和写同时运行呢。在用是sleep让速度慢下来，是可以实现的。就是不用sleep会出现问题。。。。内存屏障能解决这个问题么？

user: user-3
content: volatitle和多线程没有关系。我觉得。

user: user-4
content: 这么高大上的东西楼主都敢自己做。难道无锁的结构只需要volatile就可以实现了？好歹得用个自旋锁吧？问题是就算手动做出来，如何测试正确性？还是老老实实使用库里的组件吧
user-0 提问: 堆栈出问题了

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

user: user-2
content: word w=malloc(sizeof*w);这是啥？ 你得说下你输入的是啥，还有就是scanf("%c", &A);类似这样读一个字符的时候，要搞清楚输入缓冲区有没有遗留的回车符 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-3
content: 出错时点中断，通过调用堆栈定位到相关代码观察分析原因  如果要别人帮你调试，起码说出你是要怎么输入
user-0 提问: printf格式打印的问题

回复:
user: user-1
content: 参与匹配的是"%s Value:%d"  与"ID:%d" 中的%d 无关

user: user-0
content: int i =8; printf("++i=%d\n ++i=%d\n --i=%d\n --i=%d\n",++i,++i,--i,--i);  这个为啥打印的是 ++i=8 ++i=8 --i=8 --i=8

user: user-0
content: 是这么回事啊，基础的都忘记了，奇怪的是3没有格式输出居然没有报错，不知道内部编译器语法是怎么运行的。

user: user-2
content: printf()函数的调用格式为: printf("<格式化字符串>", <参量表>) 第一个参数是格式化字符串，后面的都是参量，你后面的包括格式化的字符串是作为参量传入printf的，所以里面的格式符不会对应输出

user: user-3
content: 因为%s 是输出字符串，你，后面的"ID:%d"就是%s的内容，然后Value:%d中的%d会自动使用"ID:%d"后，之后的值，即2024,。 所以3没有意义。

user: user-4
content: 引用 4楼我是你的主体 的回复:int i =8; printf("++i=%d\n ++i=%d\n --i=%d\n --i=%d\n",++i,++i,--i,--i);  这个为啥打印的是 ++i=8 ++i=8 --i=8 --i=8未定义行为，不要在一个表达式里对同一个变量进行++和--操作 http://bbs.csdn.net/topics/370153775
user-0 提问: 问一道题好嘛/(ㄒoㄒ)/~~

回复:
user: user-1
content: 楼主要不先估计一下闰年的密度，先算出一个下界来再向上枚举。求两个年份之间的闰年数应该是常数复杂度的

user: user-2
content: 比如说输入2005 25，求第25个闰年，你可以从2005开始，每次开始得到一个闰年后对25减1，并且把这个闰年先用一个变量保存，知道一直把25减到0，说明是从2005开始的第25个闰年，打印变量保存的年份。至于数字3，可以用一个循环来做。

user: user-0
content: 把大致思路说一下就好%>_<%
user-0 提问:  GUI 组件间的父子关系是必要的吗？如果不支持父子关系，有什么效果是无法实现或不容易实现的吗？

回复:
user: user-1
content: 应该没有无法实现的，但会导致很多功能不得不面对复杂得多的问题。 比如复合组件本身附带“子组件”概念的这种。 消息拦截逻辑也会变得很恶心。

user: user-2
content: 父子窗口便以管理、查找、控制等，有些类库比如VCL，父窗口显示的时候也会显示所有的子控件窗口，父窗口销毁的时候会自动销毁所有的子窗口控件。子窗口的（0,0）坐标是相对于父窗口的客户区的。父子窗口在任务栏只有一个图标，两个独立的窗口是各有图标的。

user: user-3
content: 很多GUI操作要求对父控件调用后, 会影响子控件, 比如可选...可见.. 你绝对不想隐藏窗口后, 只隐藏了窗口边框, 窗口内容还看得到

user: user-0
content: 没有父子关系，就做不到子窗口只能在父窗口范围内移动吗？

user: user-4
content: 比如子窗口只能在父窗口范围内移动

user: user-5
content: 你用的是什么组件？？
user-0 提问: 二维数组初始化

回复:
user: user-1
content: 引用 5 楼 adusuccessfully 的回复:貌似一维数组可以，二维数组不能这样赋值~~~  都不鞥，没写的全是 false 。  如果期望全是false，那么都可以。

user: user-2
content: 貌似一维数组可以，二维数组不能这样赋值~~~

user: user-3
content: 需要写个循环，每个元素都赋值true  或者用memset填充

user: user-3
content: 这样只是初始下标为3,3的元素

user: user-4
content: 每一个元素都得赋值。

user: user-5
content: for (int i=0;i<3;i++) for (int j=0;j<3;j++) board_empty[i][j]=true;
user-0 提问: *(p+2)='a'；这种赋值是否可行？

回复:
user: user-1
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-2
content: 你的p是指向常量的字符串，修改会导致出错  如果要修改，改成char p[]="hello";  这样是在栈上分配的，可修改

user: user-3
content: char *p="hello";表示指向常量区的常量字符串。 大部分编译器都不允许对该区域进行写操作。 改成在堆或者栈上申请的字符串才行。
user-0 提问: 可以直接给字符指针赋值一个字符串吗？

回复:
user: user-1
content: 不要纠结各种常量了，这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢！

user: user-2
content: 没问题，这里只是指针赋值，而不是修改指针指向的内容  本应该用const char* =  xxx  可以用char*是由于历史原因

user: user-3
content: 你用strcpy才是你说的修改了随机值指向的内存里的内容 直接=赋值改变的只是指针的指向，是可以的

user: user-4
content: 不会有问题。 str是一个变量，可以存储任何指向char的地址。 M跟“hello world”一样，编译器会为这个字符串分配合适的空间，存入字符换。这一串空间有起始地址。 把该起始地址复制给str。 str就指向了确定的位置，即“hello world”的起始位置了

user: user-5
content: 引用 5楼u014523360 的回复:定义的时候，这么写：const char* ...因为字符串字面量表达式的结果是一个常见^_^量的地址常量地址

user: user-5
content: 定义的时候，这么写：const char* ...因为字符串字面量表达式的结果是一个常见^_^量的地址

user: user-1
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

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

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:理解和讨论之前请先学会如何观察！  VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898  嗯，试过了，就是用字符串替换掉了，char * str = “hello world”，请问这样的写法有问题吗？

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

user: user-6
content: 你的理解应该有错。str内部确实是个随机值。因为正是那个随机值。str才是指向的随机值对应的内存啊。所以一旦你赋值了。str就指向你的宏定义M对应字符串常量的值了。（字符串其实就是一个地址而已） str值：00000001；//随机值，这时不知道指向哪。。 “hello world”首地址；11111111； （你应该知道，既然指针是变量，那么指针也是有地址的。不信printf("%x",&str) 区别printf(%x,str)   ） char *str=“hello world”； 这时str值变为：11111111；//指向hello world

user: user-7
content: 字符串常量是一个不可更改的值，所以应该赋给const char * 才对，不过赋给char*也可以，只要你不通过这个指针来试图修改指向的字符串就行

user: user-7
content: 字符串常量是一个不可更改的值，所以应该赋给const char * 才对，不过赋给char*也可以，只要你不通过这个指针来试图修改指向的字符串就行

user: user-8
content: 引用 9 楼 paschen 的回复:没问题，这里只是指针赋值，而不是修改指针指向的内容  本应该用const char* =  xxx  可以用char*是由于历史原因  这才是最正确的答案
user-0 提问: 强制类型转换失败，什么原因列？

回复:
user: user-0
content: 比某某老师强。~~ 。开个玩笑啦~

user: user-0
content: 4 楼正解啊。  int testFunc(int * pIntA) { 	if (NULL == pIntA) 	{ 		return ERROR; 	}  	int *pcTestA1; 	pcTestA1 = (int *)malloc(sizeof(int));  	if(NULL == pcTestA1) 	{ 		return ERROR; 	} 	pIntA = pcTestA1;  	*pIntA = 0x1000;         free(pcTestA1); 	return OK; } 函数写成这样就没有问题。多谢指点。

user: user-1
content: pcTestA = (char *)malloc(sizeof(char)); 后，pcTestA所指向的位置只有1个字节（(sizeof(char)）的空间可以合法使用 *pIntA = 0x1000; 强转后，要使用的空间为sizeof(int)个字节，一般比1大，用到了不该用的，很可能要出问题

user: user-0
content: ，赵4老师说的是啊，自己单步调试想一想吧。

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

user: user-0
content: 不好意思，自己把错误去掉了，//*pIntA = 0x1000; 但是具体是什么原因列？为啥不能给int * pIntA 赋值列，一直没有想明白。
user-0 提问: c   线性查找数组元素  问题求解

回复:
user: user-1
content: return以后就不会执行之后的代码了。 只要你要查找的key在array前100个元素里面，那么就不会return -1; 如果找不到key的话就会返回-1了

user: user-2
content: 从函数实现上看，如果下标0~99元素都不为key，才返回-1，否则返回下标号

user: user-3
content: 只会返回一次，第一个return 执行之后， 后面的代码不会执行到
user-0 提问: error C2065: 'o' : undeclared identifier编译出现该情况，怎么解决？

回复:
user: user-1
content: main函数里的for循环，i = 0,看好了是数字零，不是字母o

user: user-2
content: 1.0写成了o 2.main前面少了void 3.你的NONO函数只有声明没有实现 4.用rand之前要srand一下  #include<stdlib.h> #include<stdio.h> #include<time.h> void fun(int a[], int n, int*max, int*d) { 	int i; 	*max = a[0]; *d = 0; 	for (i = 1; i<n; i++) 	if (*max<a[i]) 	{ 		*max = a[i]; 		*d = i; 	} }  void NONO() {  }  void main() { 	int i, x[20], max, index, n = 10;  	srand(time(NULL)); 	for (i = 0; i<n; i++) 	{ 		x[i] = rand() % 50; printf("%4d", x[i]); 	} 	printf("\n"); 	fun(x, n, &max, &index); 	printf("Max=%5d,index=%4d\n", max, index); 	NONO(); }

user: user-3
content: 等级考试的改错题，应该有一半多的可以看编译错误或较高解决

user: user-4
content: for(i=o;i<n;i++) 这里应该是 0 吧， 而不是o

user: user-0
content: 各路大神，小弟在此请教各位！速显神通把！
user-0 提问: 报这个错，具体是什么原因，hu不是已近被填入内容了吗？

回复:
user: user-1
content: 首先，*hu++加加这样是不行的，hu代表是个常量，常量是不支持自加自减得，比如说数字3，你就不能3++，或者3--。可以这样hu[i++]来替换*hu++,实际效果是一样的。  *p++ = *q++,这个是可以复制第一个对象的，原因在于，后置++，是先进行运算，再进行++，即是说++的优先级高于*，也是还是这样。等价于，*p = *q,q++,p++;这个很重要

user: user-0
content: 引用 6 楼 家人是最好的礼物的回复:我想你的意思是*(hu++)应该要先hu++再进行取值操作吧。不然就是（*hu）++了，就算能运行结果也不是预期的。 嗯嗯，我查了下++的优先级高于*的，不用括号也可以的。但是现在我又有了疑问:这种*p++，得到的是是p所指向的下一个对象，那么这句:*p++ = *q++这种他们指向的第一个对象就不能赋值了，而是直接把二个对象赋值了过去。但是运行程序时，能打印出来第一个，这是为什么？

user: user-2
content: 先把vc6.0换了再说

user: user-3
content: 数组不支持++运算  你可以 char* p = hu;  然后对p进行运算

user: user-4
content: 你的hu是个数组，不支持++操作，你得用一个指针指向它，然后对指针才能++ 你的cp函数里的A和B之所以可以++，是因为数组传参会退化成指针。

user: user-5
content: 我想你的意思是*(hu++)应该要先hu++再进行取值操作吧。不然就是（*hu）++了，就算能运行结果也不是预期的。

user: user-6
content: include<stdio.h> void cp(char *A,char *B,int count) { 	do 	{ 		*(A++)=*(B++); 	} 	while (count--); } int main() { 	int i=0; 	char *t=NULL; 	char string[]={'1','2','3','4','5','6','7'}; 	char hu[10]; 	while （i＜=7） 	     hu[i++]='\0'; 	cp(hu,string,6); 	t=hu; 	while (*t!='\0') 	       printf("%c",*(t++));     putchar('\n');     return 0; }

user: user-0
content: 为什么要换vc.60，有什么影响？谢谢啊
user-0 提问: 结构指定初始化问题

回复:
user: user-0
content: 谢谢各位，明白了！……

user: user-1
content: c-free5.0版本已经可以支持c99标准，但不一定全部支持

user: user-2
content: http://blog.csdn.net/cwl353253492/article/details/47127955

user: user-3
content: 不要纠结这些可有可无的语法技巧。

user: user-4
content: “使用点运算符+成员名的方法，对指定成员初始化”是一种语法糖。 语法糖越甜，编译调试查错越苦！ 把有限的生命浪费在品尝/品鉴无穷多种的语法糖中，我认为不值当。
user-0 提问: 求教：求字符串中各字符的数量 输入方法改变就不行了

回复:
user: user-1
content: 谁跟你说这几个函数是一模一样的了？ ch=getchar()等价于scanf("%c", &ch)

user: user-2
content: 这几个函数作用是不同的，参数也是不一样的，返回值代表的含义也不同  你只是单纯把getchar换成其他的怎么会行呢

user: user-3
content: getchar（）跟gets（）或者scanf（）一样吗？
user-0 提问: 请教大神一个程序，关于选择法排序

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

user: user-2
content: 上面说错了 for(j=i+1; j<10; ++j)  {     if (a[k] < a[j])           k = j; } if (k!=i)  // 在for 循环外部 {      t = a[k];      a[k] = a[i];      a[i] = t; }

user: user-2
content: k = i; for(j=i+k; j<10; j++)  而不是 for(j=i+1; j<10; j++)

user: user-3
content: 单步跟踪程序运行，观察分析原因，看是执行是否符合你期望的逻辑

user: user-4
content: 各种排序算法动画演示http://www.webhek.com/misc/comparison-sort/
user-0 提问: 求助 fwrite

回复:
user: user-1
content: 在ASCII吗中，’/0’对应0；输出数字0，而按照字符输出时，就是空什么都没有。在文件中也不是空格

user: user-2

user: user-0
content: 引用 7 楼 qq_36210087 的回复:[quote=引用 5 楼 yuelengdihai 的回复:] for(i=0;i<5;i++) 25     { 26         if(fwrite(&z[i],sizeof(z),1,fp)!=1) 27             printf("file write error\n"); 28     }这样试试 没有错 传入'/0' 在文件里面显示的是空格吗？[/quote]

user: user-0
content: 引用 5 楼 yuelengdihai 的回复:for(i=0;i<5;i++) 25     { 26         if(fwrite(&z[i],sizeof(z),1,fp)!=1) 27             printf("file write error\n"); 28     }这样试试 没有错 传入'/0' 在文件里面显示的是空格吗？

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。没有错 传入'/0' 在文件里面显示的是空格吗？

user: user-1
content: for(i=0;i<5;i++) 25     { 26         if(fwrite(&z[i],sizeof(z),1,fp)!=1) 27             printf("file write error\n"); 28     }这样试试

user: user-2
content: 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-0
content: 写入文件时 末尾多出了几个空格 数组z[5],里面就两个‘8’ 三个‘0’

user: user-3
content: 不知你说什么  参看：http://en.cppreference.com/w/c/io/fwrite

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-0 提问: 在使用文件描述符和printf时发生的奇怪的现象

回复:
user: user-0
content: 查看到这个博客http://www.cnblogs.com/fanzhidongyzby/p/3519838.html 然后自己试验了一下，果真如此。  对问题一，这是编译器对printf 的一种优化，对于printf的参数如果是以'\n'结束的纯字符串，printf会被优化为puts函数，而字符串的结尾'\n'符号被消除。除此之外，都会正常生成call printf指令。  第一个printf 反汇编结果为 callq  <_IO_printf> 第二个为 callq  <_IO_puts>  查看源代码，发现 ldbl_strong_alias (__printf, printf); 我理解的意思就是将printf绑定到符号__printf。 而在__printf 实现中，调用 vfprintf (stdout, format, arg); 直接使用的就是 stdout。  而在ioputs.c中， weak_alias (_IO_puts, puts) 将puts绑定到_IO_puts符号  这两个printf 确实是由差别的，第二个问题还没有找出原因。

user: user-1
content: 提醒：printf是有源代码的。

user: user-0
content: 然后发现，只要是 printf 带了可变参数，就是预期的情况，会输出，即strace 查看的系统调用就是write 到 fd(此处为3)，主要不带可变参数，直接输出字符串，就会出现上述问题。  帖子中fd的值写错了。
user-0 提问: 数组排序问题求解决

回复:
user: user-1
content: 中间应该要是这样吧：              hold = a[i];             a[i] = a[i+1];             a[i + 1]=hold;

user: user-2
content: =是赋值啊，你直接这样赋值，其中一个变量的值早就没了。你交换值还有用么。

user: user-3
content: 仅供参考：#include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2

user: user-4
content: a[i]^=a[i+1]; a[i+1]^=a[i]; a[i]^=a[i+1]; 就可以了，异或交换2个变量，无需第三个变量

user: user-5
content: 你两个手都放满了东西，现在你想换两个手拿的东西，你不把其中一个手的东西放到别的地方能交换吗？

user: user-6
content: 你得先把其中一个值存下来才行 http://blog.163.com/eng_2005@126/blog/static/17209075820111129512486/
user-0 提问: linux下一个进程开300个线程的问题

回复:
user: user-1
content: 引用 10 楼 q3733353520 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] [quote=引用 7 楼 u010370871 的回复:] [quote=引用 5 楼 zhao4zhong1 的回复:] 搜“epoll” 多线程的东西epoll跟select是基本吧，赵老师[/quote] 不知道，因为我也没实际使用过。[/quote][/quote] 知之为知之，不知为不知，是知也。

user: user-0
content: 我这个主要不是考虑服务器端问题，服务器端没什么压力，主要是我客户端要开很多线程去通过服务器端访问设备，而且必须是一个进程开很多线程，主要是不清楚并发时客户端进程是否会压力很大，我也模拟不了

user: user-0
content: 我这个不适合用epoll主要是因为对每个设备有个持续的交互完成一系列的动作，而且几次交互才能完成一条指令用epoll状态机我不好维护，数据会有很频繁持续的交互但是时间也就2分钟而已

user: user-2
content: 引用 2楼slmax1 的回复:我目前的项目与你的有点相似, 不过我是这样处理的. 线程不与设备对应,线程只处理设备发来的信息.一个信息由一个线程处理. 处理完成后,线程休眠,有新的信息来,由主线程分配任务给处理线程.这样处理比较合理，多了一层线程管控处理

user: user-1
content: 搜“epoll”

user: user-3
content: 引用 3 楼 xian_wwq 的回复:多线程模型可以方便高效的解决小规模的服务请求，但面对大规模的服务请求，多线程模型并不是最佳方案。 lz可以参考这篇文章 http://www.ibm.com/developerworks/cn/linux/l-cn-edntwk/  文章不错..

user: user-4
content: 多线程模型可以方便高效的解决小规模的服务请求，但面对大规模的服务请求，多线程模型并不是最佳方案。 lz可以参考这篇文章 http://www.ibm.com/developerworks/cn/linux/l-cn-edntwk/

user: user-3
content: 我目前的项目与你的有点相似, 不过我是这样处理的. 线程不与设备对应,线程只处理设备发来的信息.一个信息由一个线程处理. 处理完成后,线程休眠,有新的信息来,由主线程分配任务给处理线程.

user: user-5
content: 引用 8 楼 zhao4zhong1 的回复:[quote=引用 7 楼 u010370871 的回复:] [quote=引用 5 楼 zhao4zhong1 的回复:] 搜“epoll” 多线程的东西epoll跟select是基本吧，赵老师[/quote] 不知道，因为我也没实际使用过。[/quote]

user: user-6
content: 如果300个设备的数据量不是很多，通信也不是特别频繁，300个线程大多处在休眠状态，所谓的线程切换的损失，就完全可以忍受。

user: user-1
content: 引用 7 楼 u010370871 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] 搜“epoll” 多线程的东西epoll跟select是基本吧，赵老师[/quote] 不知道，因为我也没实际使用过。

user: user-7
content: 引用 5 楼 zhao4zhong1 的回复:搜“epoll” 多线程的东西epoll跟select是基本吧，赵老师

user: user-0
content: 补充一下每个设备我都回开一个线程与其对应