Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 求1到1000加起来结果，四种算法有两种不理解求指导

回复:
user: user-1
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-2
content: 转成数学很容易看懂

user: user-3
content: 楼上正解，再加一种递归算法 int sum(int a) { 	if(a == 0) 		return 0; 	return sum(--a)+a; }   int main(int argc, char* argv[]) { 	int s = sum(1000); 	printf("%d\n",s); 	return 0; }

user: user-4
content: 引用 1 楼 user-7 的回复:/*第二种算法*/ // 第一个for循环先算出1+2+...+100的和，第二个for循环算出1+2+...1000的和 #include <stdio.h> int main() {     int a,b=0,sum=0;      for(a=1; a<=100; a++)         b += a;     //b就是1~100     sum = b;        // sum是1+2+...100的和      for(a=1; a<=9; a++)     {          b = b+10000;    // 101+102+...+200 的和比 1+2+...+100 的和大 10000，以此类推，应该懂了吧         sum = sum+b;     }     printf("%d\n", sum);      return 0; }   /*第三种算法*/ #include <stdio.h> int main() {     int s=0, low=1, high=1000;      //  for(; low<high; s+=(low+high), low++,high--) //      ; //  将上面的for写成这样 //  将1到1000依次首尾相加。应该很容易看懂的。     for (; low<high; low++, high++)     {         s += (low+high);     }     printf("%d",s);          return 0; }  记得结贴啊 +1

user: user-5
content: 引用 1 楼 user-7 的回复:/*第二种算法*/ // 第一个for循环先算出1+2+...+100的和，第二个for循环算出1+2+...1000的和 #include <stdio.h> int main() {     int a,b=0,sum=0;      for(a=1; a<=100; a++)         b += a;     //b就是1~100     sum = b;        // sum是1+2+...100的和      for(a=1; a<=9; a++)     {          b = b+10000;    // 101+102+...+200 的和比 1+2+...+100 的和大 10000，以此类推，应该懂了吧         sum = sum+b;     }     printf("%d\n", sum);      return 0; }   /*第三种算法*/ #include <stdio.h> int main() {     int s=0, low=1, high=1000;      //  for(; low<high; s+=(low+high), low++,high--) //      ; //  将上面的for写成这样 //  将1到1000依次首尾相加。应该很容易看懂的。     for (; low<high; low++, high++)     {         s += (low+high);     }     printf("%d",s);          return 0; }  记得结贴啊正解

user: user-6
content: 引用 2 楼 afire22 的回复:楼上正解，再加一种递归算法 int sum(int a) { 	if(a == 0) 		return 0; 	return sum(--a)+a; }   int main(int argc, char* argv[]) { 	int s = sum(1000); 	printf("%d\n",s); 	return 0; } 这个递归不对，return sum(--a)+a;第一次a的值只有999 #include <stdio.h>  int sum(int a) { if(a == 0) return 0; int b = a; return b + sum(--a); } int main(int argc, char* argv[]) { int s = sum(1000); printf("%d\n",s); return 0; } 这样才对

user: user-7
content: /*第二种算法*/ // 第一个for循环先算出1+2+...+100的和，第二个for循环算出1+2+...1000的和 #include <stdio.h> int main() {     int a,b=0,sum=0;      for(a=1; a<=100; a++)         b += a;     //b就是1~100     sum = b;        // sum是1+2+...100的和      for(a=1; a<=9; a++)     {          b = b+10000;    // 101+102+...+200 的和比 1+2+...+100 的和大 10000，以此类推，应该懂了吧         sum = sum+b;     }     printf("%d\n", sum);      return 0; }   /*第三种算法*/ #include <stdio.h> int main() {     int s=0, low=1, high=1000;      //  for(; low<high; s+=(low+high), low++,high--) //      ; //  将上面的for写成这样 //  将1到1000依次首尾相加。应该很容易看懂的。     for (; low<high; low++, high++)     {         s += (low+high);     }     printf("%d",s);          return 0; }  记得结贴啊
user-0 提问: typedef   结构体  指针

回复:
user: user-1
content: 引用 4 楼 u011577666 的回复:[quote=引用 1 楼 shimachao 的回复:] 表示一个指针。以后你可以用LinkList p来定义指针p；  意思是LNode *p;和*LinkList p是等价的  就是说 LinkList p; 和 LNode *p;效果一样？[/quote] 是的，你已领悟了精髓

user: user-0
content: 引用 6 楼 mcmay 的回复:敲错了，以上我写的内容中Node应为LNode。 相当于 struct LNode{ ElemType data; struct LNode *next; }; typedef struct LNode LNode; //这里LNode就相当于struct LNode typedef struct LNode * LinkList; //同理，LinkList就相当于struct LNode * （一个struct LNode类型的指针）  声明一个LinkList a就相当于声明一个struct LNode * a。LinkList就是一个struct LNode类型的指针。谢谢哈，终于知道怎么用了

user: user-2
content: 敲错了，以上我写的内容中Node应为LNode。 相当于 struct LNode{ ElemType data; struct LNode *next; }; typedef struct LNode LNode; //这里LNode就相当于struct LNode typedef struct LNode * LinkList; //同理，LinkList就相当于struct LNode * （一个struct LNode类型的指针）  声明一个LinkList a就相当于声明一个struct LNode * a。LinkList就是一个struct LNode类型的指针。

user: user-2
content: 引用 楼主 u011577666 的回复:typedef struct LNode{ 	ElemType data; 	struct LNode *next; }LNode,*LinkList;  *LinkList 这个怎么理解，就教~ 相当于 struct LNode{ 	ElemType data; 	struct LNode *next; }; typedef struct Node LNode; //这里LNode就相当于struct Node typedef struct Node * LinkList; //同理，LinkList就相当于struct Node * （一个struct Node类型的指针）  声明一个LinkList a就相当于声明一个struct Node * a。LinkList就是一个struct Node类型的指针。

user: user-0
content: 引用 1 楼 shimachao 的回复:表示一个指针。以后你可以用LinkList p来定义指针p；  意思是LNode *p;和*LinkList p是等价的  就是说 LinkList p; 和 LNode *p;效果一样？

user: user-3
content: 我上一个的回答应该有点不精确，用typedef将LinkList定义为一个类型，该类型是指向结构体的指针类型，以后可以用LinkList来直接定义指向该结构体指针的对象

user: user-3
content: LinkList就是指向该结构体的指针，该结构体应该定义了一个链表。

user: user-1
content: 表示一个指针。以后你可以用LinkList p来定义指针p；  意思是LNode *p;和*LinkList p是等价的
user-0 提问: C语言：文件中字符串的查找与替换

回复:
user: user-1
content: 这个 或许能解决你的问题 http://blog.csdn.net/gsx_xiaoxia/article/details/51835425

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

user: user-3
content: 首先，要先把源文件内容读到内存中，然后直接判断下支付传内容是否满足条件，如果满足则读取头文件中的内容到内存中，并且把源文件中的内容清空（清空方法很多，可以直接杂文件头位置写入新数据或者直接删除源文件再创建个），这个时候，把头文件中的内容写到源文件中就OK了

user: user-4
content: 文件读写是否会？
user-0 提问: 可以这样初始化结构吗

回复:
user: user-1
content: 引用 2 楼 braveboyny 的回复:你还不如把发帖的时间用来自己用编译器试一试。 这个可以有

user: user-2
content: 引用 17 楼 xiaohuh421 的回复:1楼的做法已经是标准做法了.    [quote=引用 16 楼 yangyunzhao 的回复:] [quote=引用 1 楼 xianzq888 的回复:] DATA B = { 0 }; 这个效率比memset高[/quote]  这个不一定比memset高, 要看结构体大小, 结体比较大时, 它也是使用memset. 你可以看反汇编代码, 看它是怎么实现={0}的.[/quote]  这个好像是的。 不过还是建议用=，大体来说比memset高

user: user-3
content: 1楼的做法已经是标准做法了.    引用 16 楼 yangyunzhao 的回复:[quote=引用 1 楼 xianzq888 的回复:] DATA B = { 0 }; 这个效率比memset高[/quote]  这个不一定比memset高, 要看结构体大小, 结体比较大时, 它也是使用memset. 你可以看反汇编代码, 看它是怎么实现={0}的.

user: user-2
content: 引用 1 楼 xianzq888 的回复:DATA B = { 0 };  这个效率比memset高

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

user: user-5
content: 引用 8 楼 u013523101 的回复:你要声明DATA结构体的话直接用 DATA B;就可以声明了。为何你还有DATA B=DATA{}? C#用多了？ DATA D = {xxoo}  C本来就支持 如果直接DATA D  d的各个域的数据就有许多乱数据在上面

user: user-6
content: 引用 2 楼 braveboyny 的回复:你还不如把发帖的时间用来自己用编译器试一试。 +1

user: user-7
content: 你在编译器里面试试啊

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

user: user-9
content: 嗯嗯

user: user-10
content: 你要声明DATA结构体的话直接用 DATA B;就可以声明了。为何你还有DATA B=DATA{}? C#用多了？

user: user-11
content: 好像不行

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

user: user-13
content: 引用 2 楼 braveboyny 的回复:你还不如把发帖的时间用来自己用编译器试一试。 +1

user: user-14
content: 引用 2 楼 braveboyny 的回复:你还不如把发帖的时间用来自己用编译器试一试。  顶啊，这种问题自己试一下就可以了。把所有成员都打印一下就知道了

user: user-15
content: 引用 2 楼 braveboyny 的回复:你还不如把发帖的时间用来自己用编译器试一试。 这个建议可以有

user: user-16
content: 你还不如把发帖的时间用来自己用编译器试一试。

user: user-17
content: DATA B = { 0 };
user-0 提问: 求一个C语言子函数

回复:
user: user-1
content: ，fwrite

user: user-2
content: 楼主，连百度贴“C语言”吧都鄙视这种伸手行为！所以，你去百度吧，不然后面的大神要来喷你了！

user: user-3
content: 何必学这个专业。

user: user-4
content: 课本上都有啊，fopen + fputs

user: user-5
content: fprintf

user: user-6
content: 引用 楼主 BULLrule 的回复:老师要我们做一个任务，我负责其中一个子函数的编程，因为不是考试范围，所以不想花时间学，求大神赐一个，具体要求是实现C语言的数据保存到磁盘文件中，只要一个子函数，求大神！！很简单的……呵呵，不是考试范围？不想花时间？既然不打算靠编程混饭，接的什么任务？学的什么计算机？改行吧……我估计就凭你这句话就没人想帮你，帮你的都是傻子……我看楼下谁还帮……

user: user-7
content: 引用 5 楼 maomaodelaogong 的回复:引用 楼主 BULLrule 的回复:老师要我们做一个任务，我负责其中一个子函数的编程，因为不是考试范围，所以不想花时间学，求大神赐一个，具体要求是实现C语言的数据保存到磁盘文件中，只要一个子函数，求大神！！很简单的……呵呵，不是考试范围？不想花时间？既然不打算靠编程混饭，接的什么任务？学的什么计算机？改行吧……我估计就凭你这句话就没人想帮你，帮你的都是傻子……我看楼下谁还帮…… 看过之后我有股想骂人的冲动，自己做吧，少年！

user: user-8
content: fopen，fwrite？

user: user-9
content: 不想学就不要接受任务。 显然你没搞清楚输入数据。什么叫C语言数据 所以只能给你些通用方法： fwrite ofstream

user: user-10
content: 论坛上很多,楼主可以找找

user: user-11
content: fwrite
user-0 提问: C语言分析网页源文件

回复:
user: user-1
content: 引用 1 楼 user-3 的回复:听说过硕鼠么，下面是它的网址 http://www.flvcd.com/ 收藏了。

user: user-2
content: 用脚本语言比较适合干这个事

user: user-0
content: 引用 1 楼 user-3 的回复:听说过硕鼠么，下面是它的网址 http://www.flvcd.com/谢谢诶，很好用的软件啊

user: user-3
content: 听说过硕鼠么，下面是它的网址 http://www.flvcd.com/
user-0 提问: 单向动态链表的问题

回复:
user: user-1
content: 删除的时候应该得到它的前驱才好删除……

user: user-2
content: if (h->xh==x)/*删除相应的结点*/ { h=s1->xg; s1->xg=NULL; free(s1); return 0; } while (1) { n++; s2=s2->xg; if (s2->xh==x) { s1->xg=s2->xg; s2->xg=NULL; free(s2); break; } s1=s2; if (n>=10) { printf("查无此数\n"); break;  } }
user-0 提问: linux网络编程 求解中文字符串转换问题

回复:
user: user-0
content: 我刚刚接触网络编程，目前的水准估计就是基本的c编程水准了，别的方面的确不清楚。问下针对这个程序，怎么调库，库又是什么？

user: user-1
content: 传说，这个东西不是有现成的库可以用么？
user-0 提问: 字符串赋值函数

回复:
user: user-1
content: char str[6] = "hello";  char reverse_str[7] = {0};   printf("%s\n", str);  for (i = 0; i < 5;i++)  {  reverse_str[4-i] = str[i];  }  printf("%s\n", reverse_str);

user: user-2
content: 你应该打印不出来吧，你循环条件i<5，这样的话reverse_str的第一位你是没有赋值的，这样你还能打印出来？

user: user-3
content: // copystr.cpp : 定义控制台应用程序的入口点。 // #include <stdio.h> #include <stdlib.h>  int main() {     char str[6] = "Hello";     char copystr[7];    // printf("%s\n",str);     int i = 0;     for(;i<5;i++)         copystr[4-i] = str[i];     copystr[5] ='\0';     printf("%s\n",copystr);     return 0; }
user-0 提问: c语言开发工具

回复:
user: user-1
content: eclipse  + 虚拟机

user: user-2
content: 这些是标准函数，你的感觉有问题。

user: user-3
content: 引用 楼主 mingren00 的回复:我现在用的开发软件是VC++，但是我感觉这个环境对于getchar()、putchar()等函数支持不好，再编辑的时候总是报错，求大神推荐一个小巧好用的开发环境。谢了  那一定是你编错了。因为VC再差，getchar这种功能是不会错的

user: user-4
content: 楼主就不能不用getchar、putchar吗？ #include <stdio.h> int main() {     int IP[4];     int i;     char c;      printf("请输入一个ip地址:");fflush(stdout);     while (1) {         rewind(stdin);         if (5==scanf("%d.%d.%d.%d%c",&IP[0],&IP[1],&IP[2],&IP[3],&c)) {             if (0<=IP[0] && IP[0]<=255              && 0<=IP[1] && IP[1]<=255              && 0<=IP[2] && IP[2]<=255              && 0<=IP[3] && IP[3]<=255              && '\n'==c) {                 break;             } else printf("输入的ip地址格式不对!\n请重新输入:\n");         } else printf("输入的ip地址格式不对!\n请重新输入:\n");     }     for (i=0;i<4;i++) {         printf("IP[%d]=%d\n",i,IP[i]);     }     return 0; }  #include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-5
content: 用DEV-C++吧

user: user-6
content: CodeBlock

user: user-7
content: 我现在主要使用C-Free，感觉还可以

user: user-8
content: 有个钟家民的编译软件感觉不错

user: user-0
content: 谢谢各位大神

user: user-9
content: Code::Blocks 13.12   这个版本用的是MinGW-gcc-4.7.1 http://sourceforge.net/projects/codeblocks/files/Binaries/13.12/Windows/codeblocks-13.12mingw-setup.exe Dev-C++ 5.6.3  这个版本用的是MinGW-gcc-4.8.1 http://jaist.dl.sourceforge.net/project/orwelldevcpp/Setup%20Releases/Dev-Cpp%205.6.3%20MinGW%204.8.1%20Setup.exe

user: user-10
content: C/C++程序设计学习与实验系统

user: user-11
content: Pelles C for Windows，这个小巧好用。主页：http://www.christian-heffner.de/

user: user-12
content: CodeBlocks, 百度就有
user-0 提问: 猜数字游戏C程序设计

回复:
user: user-1
content: 多少钱。。。

user: user-2
content: 貌似不好玩……

user: user-3
content: 谁挖的坟？

user: user-4
content: 题，收下了。

user: user-5
content: 可以自己慢慢写啊，一个功能一个功能的实现，这样总能写出来的，求人不如求己

user: user-6
content: 你要的代码有点复杂，建议去找一些类似的开源代码

user: user-0
content: 怎么没人回复呢？？
user-0 提问: LinkList *L这个是不是表示一个二重指针

回复:
user: user-1
content: 就是二重指针，建议楼主看一看传值和传地址的资料，不然以后会不清楚什么时候该用二重指针，什么时候可以不用二重指针

user: user-2
content: 是二重指针   楼主在学数据结构吧   C语言版的数据结构有很多typedef，这样看着方便，但写程序的还是需要知道各个宏之间的关系。

user: user-3
content: 可以认为是二重指针

user: user-4
content: typedef struct Node *LinkList; 你这样子写的话很容易误解的  typedef struct Node* LinkList;  这样子书写会比较容易理解， LinkList 就是struct Node*，LinkList *L 就是 (struct Node*) *L 也就是 struct Node** L 所以是二级指针。

user: user-5
content: 对的，LinkList 就是struct node* 类型，LinkList * 就等同于 struct node**

user: user-6
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  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",...)】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=...】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “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-7
content: 对，是二级指针

user: user-8
content: 是的，为了修改Listlist的值就必须使用它的地址形式作为参数传给函数。

user: user-9
content: 是的，就是这样

user: user-10
content: LinkList *L 等同于 struct Node **L
user-0 提问: C#动态库调用时提示： 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

回复:
user: user-1
content: 引用 6 楼 dailongzhen 的回复:[quote=引用 2 楼 user-1 的回复:] [quote=引用 1 楼 user-1 的回复:] byte 的范围可能不够 然后超出了 就读取别的地方的内存 于是就： 尝试读取或写入受保护的内存。这通常指示其他内存已损坏  尝试换一个类型吧  好像搞错了.... 你少写参数了。 GetString（byte[] bytes）这个版本是不公开的， Unicode类公开的只有下面这个。 GetString(byte[] bytes, int index, int count)[/quote] 没有啊，编辑器提示的只有Encoding.Unicode .GetString(byte[] bytes);[/quote]  先调试一下 看string中是什么  编译器有问题... 你改一下试一试

user: user-0
content: 引用 5 楼 user-1 的回复:[quote=引用 3 楼 dailongzhen 的回复:] [quote=引用 1 楼 user-1 的回复:] byte 的范围可能不够 然后超出了 就读取别的地方的内存 于是就： 尝试读取或写入受保护的内存。这通常指示其他内存已损坏  尝试换一个类型吧 报错是出在”mibdecode(array);“，传的是string，与byte有什么关系呢？[/quote]  转换时出错 未接受到值[/quote] 那该怎么解决呢？

user: user-0
content: 引用 2 楼 user-1 的回复:[quote=引用 1 楼 user-1 的回复:] byte 的范围可能不够 然后超出了 就读取别的地方的内存 于是就： 尝试读取或写入受保护的内存。这通常指示其他内存已损坏  尝试换一个类型吧  好像搞错了.... 你少写参数了。 GetString（byte[] bytes）这个版本是不公开的， Unicode类公开的只有下面这个。 GetString(byte[] bytes, int index, int count)[/quote] 没有啊，编辑器提示的只有Encoding.Unicode .GetString(byte[] bytes);

user: user-1
content: 引用 3 楼 dailongzhen 的回复:[quote=引用 1 楼 user-1 的回复:] byte 的范围可能不够 然后超出了 就读取别的地方的内存 于是就： 尝试读取或写入受保护的内存。这通常指示其他内存已损坏  尝试换一个类型吧 报错是出在”mibdecode(array);“，传的是string，与byte有什么关系呢？[/quote]  转换时出错 未接受到值

user: user-1
content: 引用 2 楼 user-1 的回复:[quote=引用 1 楼 user-1 的回复:] byte 的范围可能不够 然后超出了 就读取别的地方的内存 于是就： 尝试读取或写入受保护的内存。这通常指示其他内存已损坏  尝试换一个类型吧  好像搞错了.... 你少写参数了。 GetString（byte[] bytes）这个版本是不公开的， Unicode类公开的只有下面这个。 GetString(byte[] bytes, int index, int count)[/quote] index 或 count 小于零。 - 或 - index 和 count 不表示 bytes 中的有效范围。 抛出异常 ArgumentOutOfRangeException

user: user-0
content: 引用 1 楼 user-1 的回复:byte 的范围可能不够 然后超出了 就读取别的地方的内存 于是就： 尝试读取或写入受保护的内存。这通常指示其他内存已损坏  尝试换一个类型吧 报错是出在”mibdecode(array);“，传的是string，与byte有什么关系呢？

user: user-1
content: 引用 1 楼 user-1 的回复:byte 的范围可能不够 然后超出了 就读取别的地方的内存 于是就： 尝试读取或写入受保护的内存。这通常指示其他内存已损坏  尝试换一个类型吧  好像搞错了.... 你少写参数了。 GetString（byte[] bytes）这个版本是不公开的， Unicode类公开的只有下面这个。 GetString(byte[] bytes, int index, int count)

user: user-1
content: byte 的范围可能不够 然后超出了 就读取别的地方的内存 于是就： 尝试读取或写入受保护的内存。这通常指示其他内存已损坏  尝试换一个类型吧
user-0 提问: 我发送一个HTTP请求到服务器，服务器返回响应报文，报文主体是源源不断的音频流，怎么接收？

回复:
user: user-1
content: 你接受到的东西，要么存下来，要么即时处理掉。

user: user-2
content: 这好像应该是传输层处理的问题，不是应用层问题

user: user-3
content: revc（）

user: user-4
content: 请先学会使用抓包软件比如wireshark
user-0 提问: %f格式和%e格式的输出

回复:
user: user-1
content: 引用 8 楼 zhao4zhong1 的回复:英语也是一门计算机语言的说。你还是说汉语吧，我看不懂你写的文字

user: user-2
content: long double能用%f输出？

user: user-3
content: 英语也是一门计算机语言的说。

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:e  double Signed value having the form [ – ]d.dddd e [sign]ddd where d is a single decimal digit, dddd is one or more decimal digits, ddd is exactly three decimal digits, and sign is + or –.  E double Identical to the e format except that E rather than e introduces the exponent.  f double Signed value having the form [ – ]dddd.dddd, where dddd is one or more decimal digits. The number of digits before the decimal point depends on the magnitude of the number, and the number of digits after the decimal point depends on the requested precision.  g double Signed value printed in f or e format, whichever is more compact for the given value and precision. The e format is used only when the exponent of the value is less than –4 or greater than or equal to the precision argument. Trailing zeros are truncated, and the decimal point appears only if one or more digits follow it.  G double Identical to the g format, except that E, rather than e, introduces the exponent (where appropriate).您还是说汉语吧。。。。。

user: user-4
content: 感觉最后一行%f 是溢出了，程序是没问题的 printf的%f说明符的确既可以输出float型又可以输出double型。根据“默认参数提升”规则（在printf这样的函数的可变参数列表中，不论作用域内有没有原型，都适用这一规则）float型会被提升为double型。因此printf()只会看到双精度数。

user: user-3
content: e  double Signed value having the form [ – ]d.dddd e [sign]ddd where d is a single decimal digit, dddd is one or more decimal digits, ddd is exactly three decimal digits, and sign is + or –.  E double Identical to the e format except that E rather than e introduces the exponent.  f double Signed value having the form [ – ]dddd.dddd, where dddd is one or more decimal digits. The number of digits before the decimal point depends on the magnitude of the number, and the number of digits after the decimal point depends on the requested precision.  g double Signed value printed in f or e format, whichever is more compact for the given value and precision. The e format is used only when the exponent of the value is less than –4 or greater than or equal to the precision argument. Trailing zeros are truncated, and the decimal point appears only if one or more digits follow it.  G double Identical to the g format, except that E, rather than e, introduces the exponent (where appropriate).

user: user-0
content: 引用 4 楼 wxf54318 的回复:感觉最后一行%f 是溢出了，程序是没问题的 printf的%f说明符的确既可以输出float型又可以输出double型。根据“默认参数提升”规则（在printf这样的函数的可变参数列表中，不论作用域内有没有原型，都适用这一规则）float型会被提升为double型。因此printf()只会看到双精度数。 double型的精度至少是10位有效数字，5.32e-5，这能溢出吗？

user: user-5
content: 编译环境的问题吧，最后一行用VS我这编译没问题。

user: user-6
content: double    %lf float         %f
user-0 提问: 角度周期变化存在360度处跳变到0，现在需要做平滑滤波，有什么简单的方法能解决这个问题？

回复:
user: user-1
content: 采集每次都%360,然后再拿去用,怎么可能跳变嘛 多开个变量你会死吗?

user: user-2
content: 忽略360、720、1080、……、n*360度对应的数据。（n为正整数）

user: user-3
content: 楼主问的是编程思路？如果超出360想把这个n处理为平滑的。那就把y值处理为360-（n%360)，即以这个360最大值为起点，向下偏移。因为考虑n可能大于720，所以使用取模运算来得到离360整倍数的差额。

user: user-4
content: 这种东西，只能在采集的时候做区分，到底是一开始的0度，还是转完一圈之后的0度  就是比如转过一圈之后的1度，采集的时候记录为361度 或者单独再记录一个转动的圈数，比如是0圈50度，1圈20度，2圈10度
user-0 提问: 求大神帮助 这个冒泡功能的代码 如何理解

回复:
user: user-1
content: 引用 2 楼 pozimxb 的回复:[quote=引用 1 楼 redakira 的回复:] if 的作用就是如果满足大小要求就交换2个元素的位置, 这也是冒泡的根本思想 4个FOR是3个循环其中第二个是2层嵌套 第一个FOR是用来读取输入 第四个是用来输出 第二,三个是用来冒泡的  外层循环次数当然都一样  {x=a[j];a[j]=a[j-1];a[j-1]=x;} 这个我不明白是什么意思啊  x变量除了这里 下面也没有再用到啊 真看不懂是干什么的..  完全不理解啊[/quote] x就是用来交换a[j]和a[j-1]的值的一个暂时变量 我们做个假设, 饮料是变量的值, 而放饮料的杯子是存放变量的地方, 我们称为地址, 那么假如:  你有一个装可乐(a[j]的值)的杯子(a[j]的地址)和一个装雪碧(a[j-1]的值)的杯子(a[j-1]的地址) 如果你要交换这两者, 最直观的做法就是拿第三个杯子x,  然后把可乐(a[j]的值)倒到第三个杯子(x的地址)里 -> x = a[j] 把雪碧(a[j-1]的值)倒到可乐杯子(a[j]的地址)里 -> a[j] = a[j-1] 最后把可乐(x的值)倒到雪碧杯子(a[j-1]的地址)里 -> a[j-1] = x

user: user-2
content: 这就是最基本的冒泡排序，没别的，在你知道冒泡原理的情况下，单步调试程序是理解的最好办法。。。。

user: user-0
content: 引用 1 楼 redakira 的回复:if 的作用就是如果满足大小要求就交换2个元素的位置, 这也是冒泡的根本思想 4个FOR是3个循环其中第二个是2层嵌套 第一个FOR是用来读取输入 第四个是用来输出 第二,三个是用来冒泡的  外层循环次数当然都一样  {x=a[j];a[j]=a[j-1];a[j-1]=x;} 这个我不明白是什么意思啊  x变量除了这里 下面也没有再用到啊 真看不懂是干什么的..  完全不理解啊

user: user-1
content: if 的作用就是如果满足大小要求就交换2个元素的位置, 这也是冒泡的根本思想 4个FOR是3个循环其中第二个是2层嵌套 第一个FOR是用来读取输入 第四个是用来输出 第二,三个是用来冒泡的  外层循环次数当然都一样
user-0 提问: 程序员的第一堂课

回复:
user: user-1
content: 同志，还要继续努力哦

user: user-2
content: 引用 3 楼 u010165006 的回复:main()写错了。 我说怎么看着就有点不顺眼  再说用vc的话，不是自己帮你生成了main么？居然还写错啦

user: user-3
content: printf("%d\n", c);

user: user-4
content: 开始的时候，我也是这样，但没问同学，全是自己看书过的。。。

user: user-5
content: 我们都是从小长大的。低级错误不可悲， 止步不前，或学习过慢则是过错了；学技术要快呀，共勉之

user: user-6
content: 谭浩强的书就免了吧, K&R才是經典. 建議LZ買K&R學習.

user: user-7
content: printf("%d",c); %d是整型的输出格式，逗号后面的c是你要输出的整型变量

user: user-8
content: 表示， 看见比我还笨的了。。 printf（“%d\n”， c）；

user: user-9
content: #include<stdio.h>  int main (void) { 	int a,b,c; 	a=0; 	b=1; 	c=a+b; 	printf("%d \n", c) }

user: user-4
content: 我开始时也是void main 但现在一直是int main(int argc,char* argv[])

user: user-10
content: 表达式是printf("%d\n",c)

user: user-11
content: 引用 13 楼 hollebab 的回复:不是学生的问题,是老师, 因为我们老师教我们用void main(),我记忆犹新 现在的大学教C语言可以说不是真正的教,只是让你知道世界上有这么个东西而已 唉，谭浩强的书就是这样，我们刚学C时就是他的书，而老师也不纠正，唉，计算机方面还是国外的好书多啊！

user: user-12
content: 提问前先看一下书好点

user: user-13
content: #include <stdio.h> int main() { 	int a,b,c; 	a=0; 	b=1; 	c=a+b; 	printf("%d\n",c); 	return 0; }

user: user-14
content: 引用 14 楼 braveboyny 的回复:每天回帖即可获得10分可用分！ 支持

user: user-15
content: lz问这种问题，本人表示惊愕

user: user-16
content: 引用 13 楼 hollebab 的回复:只是让你知道世界上有这么个东西而已我倒觉得这就是大学本应该做的事，剩下的就是学生自己的事了。

user: user-17
content: printf("%d",c);

user: user-18
content: 输出结果你可以这样写（这是C++的写法） cout<< c <<endl;

user: user-19
content: 这种问题还问啊，估计c语言教材的第一章就会说的。 printf ("%d\n", c);
user-0 提问: 突然想到递归包含怎么样预处理？

回复:
user: user-1
content: 编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E  理解和讨论之前请先学会如何观察！

user: user-2
content: 禁止相互 #include 。编译不通过的。 使用签名就可以了。

user: user-3
content: 引用 1 楼 user-4 的回复:这没什么实际价值。递归调用倒是有点用，你只需两个都前向声明就行了++

user: user-3
content: 假设编译器，可以正确处理,编译过程如下:   编译 main.cpp //main.cpp 。。。。  #include "a.h" //此时处理对a.h的包含 //===> 嵌入a.h #ifndef _A_H_ // #define _A_H_ //  _A_H_  defined.  #include "b.h"//  此时处理对b.h的包含 //==>嵌入b.h #ifndef _B_H_ #define _B_H_ //  _B_H_  defined.  #include "a.h"//==> 第二次 嵌入a.h  #ifndef _A_H_  //  1)_A_H_  defined. 所以除了配对的#endif ，后面的预编译语句，不执行；代码也不会编译了，所以没有递归。 //#define _A_H_ //........ #endif         // 2) 只有 1)2) 这两个预编译语句会执行，结果是跳过中间所有代码，不编译。   struct B {     struct A *pa;//没有前置声明，struct A不能识别，编译出错，所以struct B不能识别 }// ；这里应该有分号，不然这里或者后面，会报缺少分号错误。  #endif  struct A {     struct B *pb;   //有定义，本来是不会出错的，不过struct B不能识别，所以这里应该还是会编译出错 }// ；这里应该有分号，不然这里或者后面，会报缺少分号错误。  #endif  PS： 交叉引用的类型的头文件里面，不能缺少类型前置声明。

user: user-4
content: 这没什么实际价值。递归调用倒是有点用，你只需两个都前向声明就行了
user-0 提问: 如何将读取的中文转为十六进制数啊？

回复:
user: user-0
content: 引用 1 楼 user-3 的回复:char buff[1024]; char * s = "变成十六进制"; for(size_t i = 0;i < strlen(s);++i) { 	sprintf(buff + 2 * i,"%02x",s[i]); } printf("%s\n",buff);  用%02x确实能将字符串的二进制编码打印出来，我试了下，读取从windows下保存的unicode编码的文件，读出来的就是每个字对应的unicode码。但是读取在linux下用C语言保存的文件，读出来的编码就不是unicode码，大神，我要怎么把读出来的转成unicode呀？或者用C语言保存的时候能不能保存成unicode编码格式啊？

user: user-1
content: UTF8转Unicode，仅供参考，尽管是VB6： Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long '常用的代码页： const cpUTF8   =65001 const cpGB2312 =  936 const cpGB18030=54936 const cpUTF7   =65000 Function MultiByteToUTF16(UTF8() As Byte, CodePage As Long) As String     Dim bufSize As Long     bufSize = MultiByteToWideChar(CodePage, 0&, UTF8(0), UBound(UTF8) + 1, 0, 0)     MultiByteToUTF16 = Space(bufSize)     MultiByteToWideChar CodePage, 0&, UTF8(0), UBound(UTF8) + 1, StrPtr(MultiByteToUTF16), bufSize End Function  Function UTF16ToMultiByte(UTF16 As String, CodePage As Long) As Byte()     Dim bufSize As Long     Dim arr() As Byte     bufSize = WideCharToMultiByte(CodePage, 0&, StrPtr(UTF16), Len(UTF16), 0, 0, 0, 0)     ReDim arr(bufSize - 1)     WideCharToMultiByte CodePage, 0&, StrPtr(UTF16), Len(UTF16), arr(0), bufSize, 0, 0     UTF16ToMultiByte = arr End Function  Private Sub Command1_Click()     MsgBox MultiByteToUTF16(UTF16ToMultiByte("ab中,c", cpUTF8), cpUTF8) End Sub

user: user-2
content: 中文占两字节，首先判断第一字节最高位是否为0，零的话，就只读一字节（ASCII），如果不是，就按两字节读取，读的两个字节根据字符编码集去解释是什么字。

user: user-3
content: 晕，说得不对啊。  转编码，应该是用 使用iconv函数族   #include <iconv.h>         size_t iconv(iconv_t cd, char **restrict inbuf,               size_t *restrict inbytesleft, char **restrict outbuf,               size_t *restrict outbytesleft);

user: user-3
content: char buff[1024]; char * s = "变成十六进制"; for(size_t i = 0;i < strlen(s);++i) { 	sprintf(buff + 2 * i,"%02x",s[i]); } printf("%s\n",buff);
user-0 提问: 关于栈的输出

回复:
user: user-1
content: 真相以示。。。闪。。。

user: user-0
content: 额 看到了 ……

user: user-2
content: double转int int再转double

user: user-3
content: 楼主如果要想用小数，参数应该使用浮点数

user: user-4
content: 顶板凳，说的有道理。确实是被强转了。

user: user-5
content: 正解， 浮点型被你转换为整形 引用 1 楼 user-6 的回复:void push(PSTACK ps,int val)//压栈 int啊

user: user-6
content: void push(PSTACK ps,int val)//压栈 int啊
user-0 提问: 谁知道这个怎么改

回复:
user: user-0
content: 楼上英明，#define GERB_MESSAGE（t...）  g_log(NULL, G_LOG_LEVEL_MESSAGE, ##t) 在VS里的确是改成 #define GERB_MESSAGE(...) g_log(NULL, G_LOG_LEVEL_MESSAGE,__VA_ARGS__) 就对了

user: user-1
content: 引用 3 楼 mwp 的回复:楼上英明，#define GERB_MESSAGE（t...）  g_log(NULL, G_LOG_LEVEL_MESSAGE, ##t) 在VS里的确是改成 #define GERB_MESSAGE(...) g_log(NULL, G_LOG_LEVEL_MESSAGE,__VA_ARGS__) 就对了

user: user-1
content: #define GERB_MESSAGE(...) g_log(NULL, G_LOG_LEVEL_MESSAGE,format, __VA_ARGS__)
user-0 提问: 我有一个挺不错的设计，可以做毕设，大创啥的，但是我只懂硬件，不懂软件，所以想找高手一起探讨一下

回复:
user: user-1
content: 或者参考这个： Printer Escapes Windows version 3.x supported as many as 64 special functions called printer escapes that applications used to access special device features. An application called these functions by specifying one of 64 predefined values as the second parameter to the Escape function. For example, one of these applications printing on a PostScript printer could draw a PostScript graphic object called a path by calling the Escape function and supplying the BEGIN_PATH and END_PATH values. Most of these escapes are obsolete in the Microsoft® Win32® application programming interface (API) but are provided to simplify the porting of 16-bit Windows-based applications. The Win32 version of GDI supports a complete set of path functions that applications can use instead of the escapes to draw paths on any device. For a list of the Win32 functions that replace some of the escapes, see the Escape function.  Of the 64 original printer escapes, only the QUERYESCSUPPORT and the PASSTHROUGH escapes can be used by Win32-based applications:   Applications written for Windows 3.x can also use QUERYESCSUPPORT and PASSTHROUGH as well as the following 10 escapes. Note that the following escapes are only supported for backwards compatibility with Windows 3.x-based applications. The Escape function may fail if a Win32-based application uses any of these.   ABORTDOC  ENDDOC  GETPHYSPAGESIZE  GETPRINTINGOFFSET  GETSCALINGFACTOR  NEWFRAME  NEXTBAND  SETABORTPROC  SETCOPYCOUNT  STARTDOC  In addition to supporting Escape, the Win32 API provides an extended escape function called ExtEscape. This function allows applications to access capabilities of a particular device not directly available through GDI.

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:借助WinIO.sys提供的API输出到并口对应端口0x378..0x37F 我去试试，先谢谢你

user: user-1
content: 借助WinIO.sys提供的API输出到并口对应端口0x378..0x37F

user: user-1
content: 纯DOS环境下用输出到PRN设备或outportb到并口对应端口0x378..0x37F Windows下可以输出到PRN设备或借助WinIO.sys提供的API输出到并口对应端口0x378..0x37F

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:你到底是纯DOS还是Windows？win xp

user: user-1
content: 你到底是纯DOS还是Windows？

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:纯DOS环境下用输出到PRN设备或outportb到并口对应端口0x378..0x37F Windows下可以输出到PRN设备或借助WinIO.sys提供的API输出到并口对应端口0x378..0x37F 我昨天把DB25插在计算机上，上面显示THE IO.SYS service is present，but the driver cannot be connected to，然后我试了一下程序，发现输出没有反应啊，这是怎么回事，我设置的地址是basic port是378啊
user-0 提问: 求助内存分配

回复:
user: user-0
content: 晕。这么低级 。竟然没发现 太不认真啦 。反省反省

user: user-1
content: #include <stdio.h> #include <string.h> #include <stdlib.h> #define NUM 3 void memtest() {     char *str[NUM];     int t;      for (t=0;t<NUM;t++) {         str[t] = (char *)malloc(20);         if (str[t] == NULL)//这里不能多一个;         {             printf("malloc error\n\r");             exit(1);         }         printf("enter str[%d]:",t);fflush(stdout);         fgets(str[t],19,stdin);         if ('\n'==str[t][strlen(str[t])-1]) str[t][strlen(str[t])-1]=0;     }     for (t=0;t<NUM;t++) printf("str[%d]=\"%s\"\n",t,str[t]);     for (t=0;t<NUM;t++) free(str[t]); } int main() {     memtest();     return 0; } //enter str[0]:000 //enter str[1]:111 //enter str[2]:222 //str[0]="000" //str[1]="111" //str[2]="222" //

user: user-2
content: if(str[t] == NULL);，这行，多了个;
user-0 提问: 请教整型长度问题

回复:
user: user-1
content: 引用 3 楼 silenttears 的回复:[quote=引用 1 楼 user-3 的回复:] 有区分正负数阿  int 是 -(2^32)   到    2^31-1  , unsigned int 就是 0到2^32-1了  确定64位是2^61-1?  但是我测试的时候，发现无符号是2^31-1  而不是2^32-1，为什么呢？[/quote]  你有什么证据？

user: user-2
content: 复习整数的二进制表示。

user: user-3
content: 有区分正负数阿  int 是 -(2^32)   到    2^31-1  , unsigned int 就是 0到2^32-1了  确定64位是2^61-1?

user: user-0
content: 引用 1 楼 user-3 的回复:有区分正负数阿  int 是 -(2^32)   到    2^31-1  , unsigned int 就是 0到2^32-1了  确定64位是2^61-1?  但是我测试的时候，发现无符号是2^31-1  而不是2^32-1，为什么呢？
user-0 提问: 关于指针和数组

回复:
user: user-1
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  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",...)】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=...】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “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: 估计是印刷错误，不然我也求解释

user: user-3
content: 数组的名字在程序代码中的意义要分场合： 只在很少的场合下表示整个数组，有sizeof(数组名)和&数组名，不常见的就不提了  而在大多数场合，数组名表示它首元素的指针（允许我不用地址这个术语），即“数组名”与"&数组名[0]"同义；从而有一个程序员自己可以“推导”的方法-----若数组名左有&、右有[0]，则同时销掉-----还可以继续推广为“&指针表达式[0]"的左&右[0]同时销掉

user: user-3
content: 指针与地址的概念，现有教程介绍的都存在问题。 “指针就是地址”这句话对编译器设计者说正确，对程序员说就不完全正确。  指针是带有指向对象类型信息的地址，即它的值是地址，但它有对象的类型信息。 而地址是一个不具备类型的量（俗称标量），只有void*指针才等价于地址。 上图，将类型概念抽象并提升----形成层次概念。  可以看出，有四个指针的地址值是一样的，但它们的层次（类型）信息是不一样的

user: user-4
content: a[0]+n   代表第0行第n个元素的地址 //这里a可以理解为a[0][n], 可以联想到一维的a+n表示第n个元素的地址，a[0]相当于一维时的a   &a[0]代表第0行的首地址    //这里a[0]表示第一行， 后面没有加数值，可以联想到a后面没加数值时是表示首地址

user: user-5
content: 你把二维数组当成数组元素为一维数组的数组看，更有益处。

user: user-6
content: 二维数组a[m][n]，表示m行、n列；也即m行，每行n个元素；也即是有m个一维数组，其中每个一维数组a[i]都有n个元素。 a的值等于a[m][n]整个二维数组的首地址， a[0]表示二维数组中的第1个一维数组，其值也等于第一行的首地址，还等于整个二维数组的首地址，也就等于a. a[0][0]是第1行第1个元素，那么&a[0][0]自然就是整个二维数组的首地址，也是第1行的首地址。 a是二维数组，a[0]是一维数组，可以对数组取地址，即有&a和&a[0]。 终上：a == &a[0] == a[0] == &a[0][0] == &a  虽然以上几个的值相等，但各自的意义还是有区别，如何看出来不一样呢：就是“加1”. a和&a[0]意义是一样的，表示行地址，指向的是一行，因为a+1和&a[0]+1 都比 a本身 大 n*每个元素所占字节，即跳了一行。 a[0]和&a[0][0] 是一样的，指向的是第1行第1个元素，因为a[0]+1和&a[0][0]+1仅仅跳了一个元素的字节数。 而&a则是整个二维数组的首地址，&a+1后跳过了整个二维数组，即增加了m*n*每个元素所占字节数。

user: user-7
content: 就是把数组的地址赋给数组的第一个元素
user-0 提问: c语言文件显示问题

回复:
user: user-1
content: 引用 楼主 u014203673 的回复:代码如下 #include<stdio.h> #include <stdlib.h> struct student_type { 	char num[6];	 	char sex[2]; 	char name[7]; }stud[3];  void main() { 	int i,x; 	FILE * fp;  	if((fp=fopen("e:\\stud.txt","rb"))==NULL) 	{  		printf("cannot open file\n"); 		exit(0); 	}  	printf("Input No:"); 	scanf("%d",&i); 	i--; 	x=sizeof(struct student_type); //结构体长度 	printf("%d\n",x); 	fseek(fp,i*sizeof(struct student_type),0);  //文件指针位置 	//printf("%d\n",x); 	fread(&stud[i],sizeof(struct student_type),1,fp);	        //显示第i组数据 	printf("%15s%4s%15s\n",stud[i].num,stud[i].sex,stud[i].name); 	printf("%15s\n",stud[i].sex); 	printf("%15s\n",stud[i].name); 	printf("%15s",stud[i].num); 	fclose(fp); } stud文件内容如下  显示结果如下   do not use binary mode to open a text file

user: user-2
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了  printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

user: user-3
content: 有什么问题吗？
user-0 提问: LinkQueue Q;这个Q分配了空间吗？

回复:
user: user-1
content: LinkQueueNodePtr,* LinkQueuePtr 你这个命名啊~~~~LinkQueueNodePtr这货明明不是ptr么

user: user-2
content: 引用 6 楼 oYinGui1 的回复:[quote=引用 2 楼 u012061345 的回复:] 只是指针而已，链表节点都是这样定义的。 无论什么指针，32位机器上都占4个字节的内存，所以压根不需要知道结构体的细节，只要知道这个名字是个结构体就行了。 如果不定义指针，就不行了。因为不知道结构体的细节，就无法正确分配内存。 成员函数指针就不是指针？成员函数指针就不是4。。。[/quote]  好吧，成员函数指针不是普通的指针。

user: user-0

user: user-3
content: 分配了空间的。

user: user-4
content: typedef struct LinkQueueNodePtr //这里的LinkQueueNodePtr这个名称和struct这个结构体类型名 {                                                               //共同构成了struct LinkQueueNodePtr这个类型     char  data;     struct LinkQueueNodePtr *next;    //这里的struct LinkQueueNodePtr就是指针* next的类型，见第一行说明 }LinkQueueNodePtr,* LinkQueuePtr

user: user-5
content: 引用 2 楼 u012061345 的回复:只是指针而已，链表节点都是这样定义的。 无论什么指针，32位机器上都占4个字节的内存，所以压根不需要知道结构体的细节，只要知道这个名字是个结构体就行了。 如果不定义指针，就不行了。因为不知道结构体的细节，就无法正确分配内存。 成员函数指针就不是指针？成员函数指针就不是4。。。

user: user-0

user: user-2
content: 这是好习惯。

user: user-0
content: 引用 2 楼 u012061345 的回复:只是指针而已，链表节点都是这样定义的。 无论什么指针，32位机器上都占4个字节的内存，所以压根不需要知道结构体的细节，只要知道这个名字是个结构体就行了。 如果不定义指针，就不行了。因为不知道结构体的细节，就无法正确分配内存。 都是老师教的——》打破砂锅问到底  ，现在有强迫症了

user: user-2
content: 只是指针而已，链表节点都是这样定义的。 无论什么指针，32位机器上都占4个字节的内存，所以压根不需要知道结构体的细节，只要知道这个名字是个结构体就行了。 如果不定义指针，就不行了。因为不知道结构体的细节，就无法正确分配内存。

user: user-0
content: 道友吃完饭速来搭救于我
user-0 提问: 关于C语言，怎么实现用户可以指定待查找文本的名称与位置，用VC

回复:
user: user-1
content: 等用户输入文件名后再进行打开文件，就是将这个输入的字符串指针以参数传入。 用户指定位置，使用fseek函数，来把指针指向用户制定的位置开始进行字符串匹配的搜索。

user: user-2
content: 参考notepad++源代码。
user-0 提问: 求解c穷举算法怎么写

回复:
user: user-1
content: 密码验证程序，一般做个数字就可以了，太难的时间比较长

user: user-2
content: 关键看你的密码输入以后如何返回? 是会返回给你正确个数还是只告诉你正确与否. 暴力破解密码就是多重for循环嵌套, 个人认为可以先缓存所有可能密码, 然后用数组+下标来进行尝试. 如果能够返回正确的位置, 那问题就简单多了, 可以把不满足密码条件的数组元素都删除了.
user-0 提问: 求各位给个意见（c中的小问题）

回复:
user: user-1
content: 这是一个很初级的OJ陷阱，因为a*b有可能导致溢出。

user: user-2
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
user-0 提问: 求C语言高手帮改一个程序，才学习这个很多不懂。

回复:
user: user-1
content: 这个函数就是根据用户的选择实现添加分数和查询分数的功能，不知道楼主希望的功能是什么？

user: user-2
content: http://bbs.csdn.net/topics/390623576

user: user-3
content: 你要怎么改啊？这需求忒不明确了，亲。

user: user-4
content: 先说说你是哪里不懂吧。还有就是以后贴程序不要这么贴。。格式不好大家都不好看

user: user-5
content: 把别人的一段代码拿出来让别人帮你改？ 好歹你自己写段代码出来，遇到问题解决不了来这里发问，有人可以帮你，你这样谁会帮你改的呢？

user: user-6
content: 不懂还是扎扎实实学吧
user-0 提问: 夜深了

回复:
user: user-0
content: 引用 30 楼 bug1190 的回复:你光喜欢C有毛用，还要把OS 的API和业务逻辑需求搞到一起，去写出能解决问题的代码才是程序员干的活好不，你还差一大截呢，劳资也喜欢C，简单嘛，大家都喜欢，看见纯C写的代码你是不是有种发春的感觉啊，， 看到你的头像有种发chun的感觉

user: user-1
content: 我是来纯粹支持的。。。。

user: user-2

user: user-0
content: 引用 47 楼 yingzijuntuan 的回复:顶一个，我是来骗分的 好，我被你骗一下吧 引用 48 楼 Purplepower 的回复:嗯，夜是很深了  回复于： 2014-06-02 12:45:22  从你的回复时间看， 你应该身处美国吧...

user: user-0
content: 引用 46 楼 u012421456 的回复:支持楼主，坚强的走下去， 我的 记忆力，好像是有点儿关系吧 顺便问一句，楼主汇编怎么样啊？ 汇编真心不行， 因为并没有真正应用过， 除了学校的课程设计以外...

user: user-0
content: 引用 45 楼 protel99_cz 的回复:充满激情，又满眼迷茫。其实每个人都有过这样的阶段。做了十几年的技术，也收获了不少，但是技术本身带给自己的并不多，更多的是其它方面的提高，比如社交能力，管理能力 其实我也有些彷徨，感觉做技术还是需要一定的智力和耐力，将来才能有所成就，但是真的感觉自己的智力是硬伤 耐力也欠缺，举棋不定的状态有些！！！

user: user-3
content: 嗯，夜是很深了

user: user-4
content: 顶一个，我是来骗分的

user: user-5
content: 支持楼主，坚强的走下去， 我的 记忆力，好像是有点儿关系吧 顺便问一句，楼主汇编怎么样啊？

user: user-6
content: 充满激情，又满眼迷茫。其实每个人都有过这样的阶段。做了十几年的技术，也收获了不少，但是技术本身带给自己的并不多，更多的是其它方面的提高，比如社交能力，管理能力

user: user-7
content: 跟楼主一样，13年毕业，做软件，工作未满一年 只是，我还不知道前路在何方...

user: user-0
content: 引用 42 楼 TZM_CSDN 的回复:跟楼主一样，13年毕业，做软件，工作未满一年 只是，我还不知道前路在何方...  赶快想好吧   时不我待啊

user: user-8
content: 推荐楼主阅读我的博客文章《参禅与悟道——浅谈人生》。 如果以前读过，请再读一次。

user: user-9
content: 引用 29 楼 zyaiwx 的回复:加油吧，楼主。码农不易，且码且珍惜 说的不错

user: user-10
content: 真是因为楼主在学习，在思考，所以才发现自己很多不足的地方，只有知道了自己的不足，才有改进的方向啊，学习的道路本来就不平坦，很多东西的都是有联系的，所以不单是学习编程，还要学习其他的东西。如果你感觉疲劳，感觉知识不够用，那就对了，说明你在走上坡路，说明你一直在接触一些新的领域或者说是新的知识，而不是固步自封。不断的学习才能不被淘汰，赵老师说的对： 学然后知不足。 活到老学到老。 哈哈，我是一个菜鸟，楼主不要笑我啊

user: user-11
content: 你光喜欢C有毛用，还要把OS 的API和业务逻辑需求搞到一起，去写出能解决问题的代码才是程序员干的活好不，你还差一大截呢，劳资也喜欢C，简单嘛，大家都喜欢，看见纯C写的代码你是不是有种发春的感觉啊，，

user: user-12
content: 加油吧，楼主。码农不易，且码且珍惜

user: user-0
content: 引用 25 楼 supermegaboy 的回复:[quote=引用 23 楼 N_sev7 的回复:] [quote=引用 22 楼 my_live_123 的回复:] 卤煮，你就坚持做自己喜欢的事情就好了！鄙人觉得，自己玩的high才不枉此生！当然你要定义好这个“玩”字！ 现在“玩”的就很high， 想抽烟就抽， 一天一盒都不够， 可是，青春需要买单的， 总不能玩完了就逃单吧[/quote]  每抽一根烟，寿命短一个月。[/quote]  我觉得我原来可能能活到100+，不然按这样计算，小学的时候我就已经挂了.... 不过真的该戒了，或者控制一下了

user: user-0
content: 引用 24 楼 Falleyes 的回复:[quote=引用 19 楼 N_sev7 的回复:] [quote=引用 18 楼 Falleyes 的回复:] 人生的意义又何在呢？楼主想过自己生存的意义吗？  往小的说，努力工作，工资能比较丰厚就可以了，然后要让自己的家人过的好 往大的说，做一番事业，改变一些事情，帮助那些需要帮助的人[/quote]嗯，简单而朴实。如若坚持一定会取得成功！祝楼主一帆风顺！[/quote]  引用 26 楼 zhuiyi_5 的回复:楼主加油！趁着年轻，好好拼一把~  多谢，大家共勉吧！！！

user: user-0
content: 引用 40 楼 zhao4zhong1 的回复:百度搜一下相关内容。  多谢提醒！！！
user-0 提问: 为什么我这个不能对文件进行排序

回复:
user: user-1
content: 读出排序后 在写入

user: user-2
content: 这... 你不知道读出排序后 在写入吗  你那个代表不了文件 不能直接操作  程序有误

user: user-0
content: 谢啦！懂了!

user: user-3
content: 1. 吧读取和排序分开，否则你现在排序时，后面的还没读入 2. 排序 3. 把排序结果写成文件输出

user: user-0
content: 我应该怎么改呢？
user-0 提问: linux 字符流处理

回复:
user: user-1
content: ANSI.TXT节选供参考： ESC[PnD     Cursor Backward: Moves the cursor back by the specified number of     columns without changing lines. If the cursor is already in the leftmost     column, ANSI.SYS ignores this sequence. ESC[K     Erase Line: Clears all characters from the cursor position to the     end of the line (including the character at the cursor position).

user: user-0
content: 自己顶一下，求高人指点

user: user-0
content: 引用 2 楼 merlinfang 的回复:终端就是回显啊，而且看起来你两次的数据一样的 是一样的，我清楚是回显，但是我是想要知道他是怎么处理的。最好能知道它处理的源码。。。-_-!

user: user-1
content: 引用 8 楼 yu275184637 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] ANSI.TXT节选供参考： ESC[PnD     Cursor Backward: Moves the cursor back by the specified number of     columns without changing lines. If the cursor is already in the leftmost     column, ANSI.SYS ignores this sequence. ESC[K     Erase Line: Clears all characters from the cursor position to the     end of the line (including the character at the cursor position). 赵老师，恳请进一步提点[/quote] 搜“ANSI控制字”

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:ANSI.TXT节选供参考： ESC[PnD     Cursor Backward: Moves the cursor back by the specified number of     columns without changing lines. If the cursor is already in the leftmost     column, ANSI.SYS ignores this sequence. ESC[K     Erase Line: Clears all characters from the cursor position to the     end of the line (including the character at the cursor position). 赵老师，恳请进一步提点

user: user-0
content: 引用 6 楼 buyong 的回复:cat 和 vi 结果不一样？ 是的，cat显示在终端会经过处理的，你可以自己测试一下

user: user-2
content: cat 和 vi 结果不一样？

user: user-3
content: 终端就是回显啊，而且看起来你两次的数据一样的

user: user-4
content: 不大清楚问题的核心，关注学习一下
user-0 提问: 数组中字母后移问题

回复:
user: user-1
content: 这个是很简单的吧，Z->A  z->a. 参照一下代码。 #include <stdio.h> #include <string.h>  #define STRING_LENGTH 256  void main() { 	int i=0; 	char a[STRING_LENGTH]; 	char c;  	memset(a, 0, STRING_LENGTH);  	printf("enter a(length<%d\n", STRING_LENGTH); 	for(i=0; (i<STRING_LENGTH) && ((c=getchar()) != '\n'); i++){ 		a[i]=c; 	}  	printf("a = %s\n",a);  	for(i=0; i<STRING_LENGTH; i++){ 		if((('a' <= a[i]) && (a[i] < 'z')) ||  		   (('A' <= a[i]) && (a[i] < 'Z'))){ 			a[i] = a[i] + 1; 		}else if((a[i] == 'z') || (a[i] == 'Z')){ 			a[i] = a[i] - 25; 		}else{ 			//do nothing 		} 	}  	printf("a move 1 =%s\n",a);  	return; }

user: user-2
content: #include <iostream> #include <vector> using namespace std;  int main() {     string s;    getline(cin,s);     for(auto &c:s)     {         if(('a'<=c && c<='y')||('A' <=c && c <='Y'))             c =c + 1;         else             if(c=='Z' && c =='z')             c = c - 25;             if(c == ' ')                 ;     }     cout << s;     return 0; }
user-0 提问: VS Express 2013 for Desktop怎么运行c

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

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

user: user-3
content: 1.在return 0;上面加system（"pause"）. 2.使用ctrl+f5 运行

user: user-0
content: 照上面二位说出现这个

user: user-2
content: 2010： 文件、新建、项目。 已安装的模板、Visual C++、Win32、Win32 控制台应用程序。 名称：test 位置：d:\ 解决方案名称：test 确定。

user: user-4
content: 注意格式。。都 return 了怎么getchar 等待。。。 return 放到后面。
user-0 提问: 有关共用体我还是觉得难理解，跪求各位大神指点，谢谢！！！

回复:
user: user-1
content: a.ch[0]=13;// 0x0D a.ch[1]=1;  // 0x01 0D 01 =0x010D= 269(10) x86 小端（ little endian）  即 低字节 放 低地址。

user: user-2
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  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: 引用 2 楼 caozhy 的回复:int i和char[2]公用内存，我们用两条横线表示1个字节，则是  __  __  __  __ [           i           ] [ch0][ch1] 所以 当ch1=13 ch1=1 此时i就是 0x0c 0x01 0x00 0x00 也就是 0x00 00 01 0c (x86 是大端的，高位在后面，所以要颠倒下) 也就是 256 + 13 = 269 13是0D吧？

user: user-4
content: 按INT输出 字节里值都是16进制

user: user-5
content: 计算机对数据的存储都是二进制的，01010这些！ 一个byte为8个bit

user: user-6
content: int i和char[2]公用内存，我们用两条横线表示1个字节，则是  __  __  __  __ [           i           ] [ch0][ch1] 所以 当ch1=13 ch1=1 此时i就是 0x0c 0x01 0x00 0x00 也就是 0x00 00 01 0c (x86 是大端的，高位在后面，所以要颠倒下) 也就是 256 + 13 = 269

user: user-7
content: printf("%p %p %p", &a.ch[0], &a.ch[1], &a.i);可以看他们的内存地址 首先a定义成全局变量了，所以这4个字节初始化为0 a.ch[0]相当于a.i最低的那个字节 a.ch[1]相当于a.i倒数第二低的那个字节 a.i其他两个字节都是0 所以a.i就是0x00 00 01 0d so~
user-0 提问: c语言中文件读出数据出现问题

回复:
user: user-1
content: fread(&stud[i],sizeof(struct student_type),1,fp);这个有问题吧。。 看看你.txt里面的文件结构，如果存在回车空格之类的会出现很奇怪的值这很正常的，尤其是你中间用了int还用这种方式读，肯定出问题

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

user: user-0
content: 引用 3 楼 wzc3320 的回复:fread(&stud[i],sizeof(struct student_type),1,fp);这个有问题吧。。 看看你.txt里面的文件结构，如果存在回车空格之类的会出现很奇怪的值这很正常的，尤其是你中间用了int还用这种方式读，肯定出问题 咋整

user: user-0
content: 引用 3 楼 wzc3320 的回复:fread(&stud[i],sizeof(struct student_type),1,fp);这个有问题吧。。 看看你.txt里面的文件结构，如果存在回车空格之类的会出现很奇怪的值这很正常的，尤其是你中间用了int还用这种方式读，肯定出问题   咋整？

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

user: user-3
content: 1. 别用二进制方式打开txt 2. 用getline一次读一行

user: user-4
content: 试一下把fread读取数据改成fprintf读取数据。

user: user-5
content: 楼主可以看一下文件的十六进制结构 这样读很危险的吧，你确定数据是一条连着一条，中间没有空格换行什么的？
user-0 提问: 将文本中结构体信息按指定要求输出！

回复:
user: user-1
content: 引用 1 楼 u014203673 的回复:额，编译通过，同求。。。 #include<stdio.h> #include <stdlib.h> struct student_type { 	char num[6]; 	int age; 	char sex[2]; 	char name[10]; }stud[3];  void main() { 	int i,x; 	FILE * fp; 	for(int) 	if((fp=fopen("e:\\stud.txt","rb"))==NULL) 	{  		printf("cannot open file\n"); 		exit(0); 	}  	printf("Input No:"); 	scanf("%d",&i);i--; 	//x=sizeof(struct student_type); //结构体长度 	//printf("%d\n",x); 	fseek(fp,i*sizeof(struct student_type),0);  //文件指针位置 	//printf("%d\n",x); 	fread(&stud[i],sizeof(struct student_type),1,fp); 	printf("%4s%3d%2c%7s\n",stud[i].num,stud[i].age,stud[i].sex,stud[i].name);  	fclose(fp); } 你的问题和楼主的应该差不多，参考我在二楼的回复。 一样的题目，你们是一个班的吗？

user: user-1
content: for (i = 1; i < 10; i+=2) { fseek(fp, i*sizeof(struct worker_type), 0); fread(&worker[i], sizeof(struct worker_type), 1, fp); printf("%5d  %-10s  %-5c  %5d  %5d\n", worker[i].num, worker[i].name, worker[i].sex, worker[i].age, worker[i].pay);  } 楼主看看你的这个循环，i从1开始。也就是一开始，文件指针就滑动了一段距离，再开始读入数据的。 不知道你的文件总数据结构是怎样的。你把i改为从0开始试试。我猜想应该从文件开头开始读取数据。

user: user-2
content: 额，编译通过，同求。。。 #include<stdio.h> #include <stdlib.h> struct student_type { 	char num[6]; 	int age; 	char sex[2]; 	char name[10]; }stud[3];  void main() { 	int i,x; 	FILE * fp; 	for(int) 	if((fp=fopen("e:\\stud.txt","rb"))==NULL) 	{  		printf("cannot open file\n"); 		exit(0); 	}  	printf("Input No:"); 	scanf("%d",&i);i--; 	//x=sizeof(struct student_type); //结构体长度 	//printf("%d\n",x); 	fseek(fp,i*sizeof(struct student_type),0);  //文件指针位置 	//printf("%d\n",x); 	fread(&stud[i],sizeof(struct student_type),1,fp); 	printf("%4s%3d%2c%7s\n",stud[i].num,stud[i].age,stud[i].sex,stud[i].name);  	fclose(fp); }