Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 如何删除一段文字特定区间内的文字

回复:
user: user-1
content: 你是只要删除【你好】和【】？还是凡是带【】的都删除？

user: user-2
content: 可是试一下正则表达式~！

user: user-3
content: /**  * @brief   如何删除一段文字特定区间内的文字  * http://bbs.csdn.net/topics/390923421  */  #include <stdio.h> #include <string.h>  char * strdel(char *str, const char *del) {     size_t dellen, movelen;     char *ptr;      ptr = strstr(str, del);     if (ptr != NULL) {         dellen = strlen(del);         movelen = strlen(ptr + dellen);         memmove(ptr, ptr + dellen, movelen + 1);     }      return str; }  int main(int argc, char *argv[]) {     char s[] = "你好啊【你好】论坛地力【】喜剧之王";      printf("%s\n", strdel(s, "【你好】"));     printf("%s\n", strdel(s, "【】"));      return 0; }  /* 输出为 你好啊论坛地力【】喜剧之王 你好啊论坛地力喜剧之王 */

user: user-4
content: 需求不是特别明确，那如果遇到这样的情况怎么删除呢：  “你好【啊【你好】论坛地力【】喜】剧【之王”   这样 “【”和“】”不是完全匹配的时候，该怎么删呢？
user-0 提问: 面试题，外包公司让我去中兴的面试题，一共5题还记得2题！！求意见

回复:
user: user-1
content: 别去外包，过来人忠告

user: user-0
content: 算是自己理解的一个面试题。

user: user-0
content: 引用 2 楼 xihu1364 的回复:错位了 a[0]没赋到值   a[5] = 4 越界了 引用 1 楼 user-3 的回复:原题中，当进行最后一次循环的时候，p++执行后，p就越界了。 这个题我会了，求指导第二个题http://bbs.csdn.net/topics/390923394

user: user-2
content: 错位了 a[0]没赋到值   a[5] = 4 越界了

user: user-3
content: 原题中，当进行最后一次循环的时候，p++执行后，p就越界了。
user-0 提问: 新人求教 学习C语言应该从什么开始呢？

回复:
user: user-0
content: 引用 3 楼 u012421456 的回复:参考一下——http://blog.csdn.net/u012421456/article/details/40681247 一般来说看书比较好，对知识的掌握较好，但在入门时，如果觉得自己很难入门，可以看看基础性的视频，编译器，现在有些不错的，如code::blocks、c-free、devc++等，都可以的 刚刚看了这篇文章，感觉写的很好，谢谢哈

user: user-0
content: 不知道怎么一一回复大家，只好在下面写评论了，谢谢大家的帮忙！

user: user-0
content: 其实我大学的时候学过谭浩强那本书，自己对c语言的认识应该只是皮毛的，基本的语法还是认识的。但是现在呢，看视频感觉看不下去，有点啰嗦。看书感觉抓不住重点。。。

user: user-1
content: C语言入门，如楼上所说，用谭浩强的C语言程序教材 就可以了。网上有专门的学习网站：C语言中文网 效果不错。也可以在网上下载电子书和视频看。视频讲解比较生动易懂，但学习速度慢；电子书，比较枯燥，如果耐力比较好会学得快些。 建议你多找一些实例，敲敲代码。比如上面给你列出的那个网站，上面的实例就很不错。不过，要想学好C，靠那点实例代码是不够的。这就需要你有强大的动力和持久的毅力了！ 至于编译器，刚入门，建议你用Visual C++6.0，经典、入门快、效率高！这是在Windows操作系统下用的编译器。等你学牛X了，可以尝试学学Linux，Linux下的编译器我也没用过，好像是gcc. 我现在也在学C语言的过程中。愿我们一起努力，在软件开发这条路上能实现自己的梦想！ //记得给分哦！

user: user-2
content: 看代码，多动手。。

user: user-3
content: 从hello world开始。 用visual studio编译器。 看书，比如《C primer plus》，不要看视频。  多敲代码，少提问。

user: user-4
content: 我虽然大学时候学了c, 但是只是知道点皮毛 这个要看你自己的情况, 你要是有其他语言的基础, 语法部分直接翻翻 过了,看下指针和数组,结构体 没有其他语言基础, 没接触过编程的, 还是慢慢看吧   这个自学的话 还是看书吧, 不会的直接百度, 书就用谭浩强的c语言就行 网上有pdf的能下载   这是我的个人感觉, 希望能帮到你

user: user-5
content: 看视频没鸟用 看完就忘 看书吧 看c primer plus ，一边看书一边写程序， 动手才能学得快，记得住，看视频 就像看电影一样，看完就忘

user: user-6
content: 我不喜欢看视频，感觉太墨迹了

user: user-6
content: The C Programming Language+gcc+vim/emacs+gdb

user: user-7
content: 一个适合自己的编辑器 一个适合自己的编译器 一本适合自己的书  但在这之前，请学会搜索。

user: user-8
content: 谭浩强C教材，从头到尾先看一遍，书上的例子、课后题都要实际上级实现 第一遍语法熟悉了就成，先入门再说 可以使用VC++6.0编译器

user: user-9
content: 如果觉得自己理解力没什么问题，那么就The C Programming Language。不然，国内的大学教材

user: user-10
content: 看书看视频都可以《c primer plus》

user: user-11
content: 参考一下——http://blog.csdn.net/u012421456/article/details/40681247 一般来说看书比较好，对知识的掌握较好，但在入门时，如果觉得自己很难入门，可以看看基础性的视频，编译器，现在有些不错的，如code::blocks、c-free、devc++等，都可以的

user: user-12
content: 看书，理解<我认为比较重要>，写代码<也很重要，只理解不写还是不行>，看代码，在写代码。

user: user-13
content: k&R初学足够了。其他都是浮云！

user: user-14
content: 共同努力吧，我现在也在学。
user-0 提问: 求救！linux 文件操作 read函数为什么总是读不出数据，哪里出错了

回复:
user: user-0
content: 没错，头脑发昏，只写看成读写了，多谢版主

user: user-0
content: 用 O_WRONLY会有什么问题吗

user: user-1
content: if((fd = open(filename, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IXUSR))<0){ ===> if((fd = open(filename, O_RDWR     | O_CREAT, S_IRUSR | S_IWUSR | S_IXUSR))<0){
user-0 提问: 快速排序，如何将每一步排序显示出来？

回复:
user: user-0
content: 引用 7 楼 Naccery 的回复:实际上我看了第一感觉就是在return前面直接运行for循环打印整个数组,不知道可对   你试试看看？

user: user-0
content: 引用 4 楼 zy1404 的回复:你是说每一轮快排的结果吗？比如 5 2 9 8 6 1 4 第一轮 4  2  1 5 6 8  9  这样的一轮一轮的输出吗？  可以在我的代码里面修改么？谢谢。

user: user-1
content: 实际上我看了第一感觉就是在return前面直接运行for循环打印整个数组,不知道可对

user: user-2
content: int KuaiSuPaiXu(int a[],int low,int high) { int key=a[low],low1=low,high1=high;/// while(low<high) { while(low<high && a[high]<key) high--; if(low<high) a[low++]=a[high]; while(low<high && a[low]>key) low++; if(low<high) a[high--]=a[low]; } a[low]=key; for(int kk=low1;kk<=high1;kk++)//// printf("%d  ",a[kk]);///// printf("\n");//// return low; }

user: user-2
content: int KuaiSuPaiXu(int a[],int low,int high) { int key=a[low],low1=low,high1=high;/// while(low<high) { while(low<high && a[high]<key) high--; if(low<high) a[low++]=a[high]; while(low<high && a[low]>key) low++; if(low<high) a[high--]=a[low]; } a[low]=key; for(int kk=low1;kk<=high1;kk++) printf("%d  ",a[kk]); printf("\n"); return low; }

user: user-2
content: 你是说每一轮快排的结果吗？比如 5 2 9 8 6 1 4 第一轮 4  2  1 5 6 8  9  这样的一轮一轮的输出吗？

user: user-3
content: 设置几个全局变量标示整个数组，每一次排完之后全部打印出来就可以了。

user: user-0
content: 没大神来解答？嗯哼？

user: user-0
content: 沙发自己占！
user-0 提问: 万能的C版,我又来了,召唤大神!

回复:
user: user-1
content: 哥，你用那个版本的SDK。。。。我用rtk_openwrtSDK_V2.1_20140314 固件还编译不过去。。。

user: user-2
content: 召唤大神用什么咒语？

user: user-3
content: 引用 楼主 nadleeh123 的回复:遇到个没怎么接触的玩意儿：  我创建了一个socket（PF_PACKET, SOCK_RAW, htons（ETH_P_IP）；在交换机的镜像口下捕获ipv4的帧。  当捕获的帧的内容符合我的要求的时候，我要自行构建eth头，ip头，tcp/udp头,data段，然后回给被镜像口。  那么问题来了，不是挖掘机技术哪家强  我找不到该用哪个函数把我构建好的buff传回去，因为sockt的函数好像不能穿透以太网，他会给我的数据加一层以太网头  大神接下来靠你了 用libpcap
user-0 提问: pclint error 974 和438怎么破？

回复:
user: user-1
content: http://stellar.cleanscape.net/products/cpp/checks.html

user: user-2
content: 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

user: user-3
content: 974是一个Note项，它报告你的程序里使用的最大栈的大小。不管你程序是否有错都会报告。 如果你不想报告，可以把lint选项中的+stack去掉

user: user-0
content: 木有人会吗？我发错版块了吗？主要是 不知道这种栈使用过度，该从哪里入手调试？谁给点指点？

user: user-3
content: 1. 不要定义大的局部变量，改成动态内存或者静态变量 2. 参数不要用传值方式传递大型数据结构，改成传引用或指针 3. 分块定义局部变量，例如 void foo() {     struct A a;     struct B b;     //对a访问的代码     //对b访问的代码 } 改成 void foo() {     {         struct A a;         //对a访问的代码     }     {         struct B b;         //对b访问的代码     } } 或者把这两端代码拆成2个子函数

user: user-0
content: 引用 3 楼 truelance 的回复:974是一个Note项，它报告你的程序里使用的最大栈的大小。不管你程序是否有错都会报告。 如果你不想报告，可以把lint选项中的+stack去掉 我的问题是，怎样才能压缩栈的使用呢？

user: user-0
content: 引用 3 楼 truelance 的回复:974是一个Note项，它报告你的程序里使用的最大栈的大小。不管你程序是否有错都会报告。 如果你不想报告，可以把lint选项中的+stack去掉 你好，终于有个人回答我了，谢谢。目前的情况是，我的程序是没错的，运行过很多次，目前还未发现问题。（嵌入硬件后也运行过多次了，没有问题）但因为是嵌入式的，所以需要符合MISRA标准，做到产品中。pclint报了个974错误。就说明我的程序有潜藏的错误。但我不知道这个错误的严重程度，会造成怎样的影响？如果改动，该从哪里入手？比较迷茫。

user: user-0
content: error 974: (Note -- Worst case function for stack usage: 'Control' is finite, requires 308 bytes total stack in calling 'Control_K'. ) 是因为我的Control_K太大了吗？可是我的Control_K必须的这么大呀，我已经尽量把他拆分成几个小函数了。可是拆了之后还是要在Control_K里调用呀
user-0 提问: 已知阵列前4行为3,13,1113,3113,132113 如何通过编程实现第n行输出？

回复:
user: user-1
content: //是一个找规律的题 //3 //13 //1113 //3113 //132113 // //        3: 1个3，即演变为13 //      13: 1个1，1个3，即演变为1113 //  1113: 3个1，1个3，即演变为3113 //  3113: 1个3，2个1，1个3，即演变为132113 //132113: 1个1，1个3，1个2，2个1,1个3，即演变为1113122113 //如何用做出生成第n行的算法？ #include <stdio.h> #include <string.h> char s[200]; char t[200]; int i; void nexts() {     int n,j,L;     char *p;     strcpy(t,s);     j=0;     n=1;     p=s;     while (1) {         if (t[j]==t[j+1]) {             n++;         } else {             L=sprintf(p,"%d%c",n,t[j]);             p+=L;             n=1;         }         j++;         if (0==t[j]) break;     } } int main() {     s[0]='3';s[1]=0;     printf("%2d %s\n",0,s);     for (i=1;i<17;i++) {         nexts();         printf("%2d %s\n",i,s);     }     return 0;           } // 0 3 // 1 13 // 2 1113 // 3 3113 // 4 132113 // 5 1113122113 // 6 311311222113 // 7 13211321322113 // 8 1113122113121113222113 // 9 31131122211311123113322113 //10 132113213221133112132123222113 //11 11131221131211132221232112111312111213322113 //12 31131122211311123113321112131221123113111231121123222113 //13 1321132132211331121321231231121113112221121321133112132112211213322113 //14 11131221131211132221232112111312111213111213211231132132211211131221232112111312212221121123222113 //15 3113112221131112311332111213122112311311123112111331121113122112132113121113222112311311221112131221123113112211322112211213322113 //16 132113213221133112132123123112111311222112132113311213211231232112311311222112111312211311123113322112132113212231121113112221121321132122211322212221121123222113

user: user-0
content: 引用 1 楼 zxhuser-2 的回复:能具体说明吗？没看懂lz意思 是一个找规律的题   3 13 1113 3113 132113            3: 1个3，即演变为13         13: 1个1，1个3，即演变为1113     1113: 3个1，1个3，即演变为3113     3113: 1个3，2个1，1个3，即演变为132113 132113: 1个1，1个3，1个2，2个1,1个3，即演变为1113122113 如何用做出生成第n行的算法？

user: user-2
content: 能具体说明吗？没看懂lz意思
user-0 提问: 编写程序，查找c程序中的基本语法错误，如圆括号、方括号、花括号的不匹配；如单引号和双引号等。要求能够显示错误信息，并给出错误行数。注意尽可能的考虑软件的通用性

回复:
user: user-1
content: 引用 1 楼 zhao4zhong1 的回复:参考Tiny C Compiler或gcc源代码中相关片断。+1，没事别写编译器功能的代码

user: user-2
content: 看你的代码，我就想要弄死你

user: user-3
content: 参考Tiny C Compiler或gcc源代码中相关片断。
user-0 提问: 以16进制发送一个0-65536之间的任一数。。。求解释

回复:
user: user-1
content: num*256就是左移8位的意思。 num*2 ==num<<1 num*4 ==num<<2 num*8 ==num<<3 num*16 ==num<<4 num*32 ==num<<5 num*64 ==num<<6 num*128 ==num<<7 num*256 ==num<<8  num=num*256+SBUF 就是高8位存num,低8位存SBUF

user: user-2
content: 发送16位数据时 它是分成两个8位数据读取的 *256和<<8是一个意思
user-0 提问: 这是蓝桥杯的题目，没有头绪，求解

回复:
user: user-1
content: 不就是字符串编辑距离么。你把LCS搞懂，字符串编辑距离就是小改动。

user: user-0
content: #include<stdio.h>   #include<string.h>    char a[110];   char b[110];   int dp[110][110];     int main()   {      int i,j,t,n,m;      scanf("%d",&t);      while(t--)      {          scanf("%s%s",a,b);          n=strlen(a);          m=strlen(b);          //memset(dp,0,sizeof(dp));          for(i=0;i<=n;i++)             dp[i][0]=i;          for(i=0;i<=m;i++)              dp[0][i]=i;          for(i=1;i<=n;i++)              for(j=1;j<=m;j++)              {                  if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1];                  else                   {                      dp[i][j]=dp[i-1][j]+1<dp[i][j-1]+1?dp[i-1][j]+1:dp[i][j-1]+1;                      dp[i][j]=dp[i][j]<dp[i-1][j-1]+1?dp[i][j]:dp[i-1][j-1]+1;                  }              }              printf("%d\n",dp[n][m]);      }      return 0;  }  我在网上搜的答案，那个dp二维数组有什么用？这是dp算法，但不知道他用那个二维数组怎么得到答案的？

user: user-2
content: dna，就是链  我们程序里面就是各种子串，找相同子串，以第一个串为基础，3种变化行为，第3种稍微特殊一点

user: user-3
content: 我记得这个题在哈工大的OJ上有原题。LZ找下吧，很简单，就是个模拟题

user: user-4
content: 没看懂题目意思。。。

user: user-5
content: http://www.cnblogs.com/luxiaoxun/archive/2012/08/05/2623894.html

user: user-5
content: http://www.baidu.com/s?wd=%E8%AE%A1%E7%AE%97%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E8%B7%9D%E7%A6%BB&rsv_spt=1&issp=1&f=3&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_sug3=1&rsv_sug=0&rsv_sug1=1&rsv_sug4=15&oq=%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E8%B7%9D%E7%A6%BB&rsp=0&rsv_sug2=1&rsv_sug5=0&inputT=2593
user-0 提问: 为什么输入数据后，没办法运行，求大神解答。

回复:
user: user-1
content: http://blog.csdn.net/chenhanzhun/article/details/18991471看这里，是关于scanf函数的问题

user: user-0
content: 谢谢。。很有用，，会给高分的

user: user-2
content: 测试没有问题。 注意，用ctrl+f5运行程序可以看到结果，不会闪退 输入时，两个实数之间是有一个空格的。 不要输入0.否则会有除0异常。

user: user-3
content: 你的scanf有问题，应该写成  scanf("%f,%f",&r,&h);      //输入r和h的值  两个%f之间至少应该有一个其他符号，否则不能区分出这两个数，如  234.23445.7。你能区分是哪两个数吗

user: user-4
content: 没有问题，楼主什么编译器 PS：最上面最好用尖括号<> scanf中间最好加个括号 最好使用int main，后面return 0
user-0 提问: 我有曲线上数据点dat文件，想得到此曲线绕某一轴旋转一定角度后的数据点坐标，怎么编程？谢谢！

回复:
user: user-1
content: 搜“二维坐标变换”或“三维坐标变换”

user: user-0
content: 顶一下，吼吼吼
user-0 提问: 是唯一的二叉树么？

回复:
user: user-1
content: 问题中画的第一个树的后序遍历应该是：IADEKFCJHBG

user: user-2
content: 先根次序和后根次序不能确定唯一的二叉树。必须有中根才行。 http://blog.csdn.net/sgbfblog/article/details/7783935
user-0 提问: shift + tab 组合键的扫描码是什么？

回复:
user: user-1
content: //The _getch function reads a single character from the console without echoing. //Function can not be used to read CTRL+Break. //When reading a function key or an arrow key, //_getch must be called twice; the first call returns 0 or 0xE0, //and the second call returns the actual key code. #include <conio.h> #include <windows.h> void main() {     unsigned short k;      while (1) {         Sleep(100);         k=getch();         if (27==k) break;//按Esc键退出         if (0==k||0xe0==k) k|=getch()<<8;//非字符键         cprintf("%04x pressed.\r\n",k);     } }

user: user-0
content: shift + tab 的组合键没错的话应该是0xf00。

user: user-0
content: 自己找到结果了，VC下输入下面一段程式，然后运行按下想要的组合键就ok了。  #include<bios.h> #include<stdio.h> #define ESC 0x11b void main(void) {     int key;     while(1)     {         key=bioskey(0);         printf("0x%x\n",key);         if(key==ESC)             break;     }     getch(); }
user-0 提问: 求达人帮忙看下 输出结果总是不对

回复:
user: user-1
content: 'l'和'1'还是看清点啊

user: user-1
content: 我是不是一眼就看出来了  那个scanf()里面用的不是l是1吧???? 这要是能对都奇怪了啊

user: user-2
content: 请检查scanf的返回值。

user: user-3
content: scanf("%lf,%lf,%lf",&a,&b,&c);///L

user: user-4
content: #include<stdio.h> #include<math.h> #include<stdlib.h> int main() { double a,b,c,disc,x1,x2,realpart,imagpart; scanf("%lf%lf%lf",&a,&b,&c);？？？？ printf("The equation"); if(fabs(a)<=1e-6) printf("is not a quadratic\n"); else { disc=b*b-4*a*c; if(fabs(disc)<=1e-6) printf("has two equal roots:%8.4lf\n",-b/(2*a)); else if(disc>1e-6) { x1=(-b+sqrt(disc))/(2*a); x2=(-b-sqrt(disc))/(2*a); printf("has distinct real roots:%8.4lf and %8.4lf\n",x1,x2); } else {   realpart=-b/(2*a);   imagpart=sqrt(-disc)/(2*a);   printf("has complex roots:\n");   printf("%8.4lf+%8.4lfi\n",realpart,imagpart);  	  printf("%8.4lf-%8.4lfi\n",realpart,imagpart); }  }  return 0; }  请先去看看double和float在scanf中是怎么写的 同时也学学scanf输入的格式是什么 后面有问号的就是你错误的语句
user-0 提问: 用c语言if嵌套编写  简单点

回复:
user: user-1
content: 隐式if else嵌套  #include<stdio.h> int main() {     int a;     scanf("%d",&a);     a < 10 ?  		printf("%d is under 10\n",a) :     a <99 ? 		printf("%d 10 to 99\n", a) :     a < 999 ? 		printf("%d is 100 to 999\n",a) : 		printf("%d is above 1000\n",a);      return 0; }

user: user-2
content: 这个还能多复杂，就像一楼那样，这仅仅是if的正常的简单的用法，相信楼主只要是稍微的看看书，应该能写出来的，学编程要多多练习，不要因为简单就不去写啊

user: user-3
content: 參考看看  //輸入一個整數，將其數值按小于10，10～99，100～999，和1000以上分類并顯示，例輸入256，顯示256  is  100  to  999 #include <stdio.h>  void main() { 	//輸入整數 	int IpInteger = 0; 	printf("請輸入一個整數\n"); 	scanf("%d", &IpInteger); 	 	//100～999分類 	if(IpInteger<1000 && IpInteger>=100 ) 		 		printf("%d is 100 to 999\n", IpInteger); 		//10～99分類 		else if(IpInteger>=10 && IpInteger<=99)  				printf("%d is 10 to 99\n", IpInteger); 				//小于10分類 				else if(IpInteger<10)  						printf("%d is under 10\n", IpInteger); 						//大於10分類 						else  						printf("%d is above 999\n", IpInteger); }

user: user-4
content: if....else if .....else

user: user-5
content: 楼住还是多多看看书吧 /*************************************************************************     > File Name: ss.c     > Author: Jukay     > Mail: hellojukay@gmail.com      > Created Time: 2014年11月05日 星期三 21时43分52秒  ************************************************************************/  #include<stdio.h> int main() {     int a;     scanf("%d",&a);     if(a < 10) 	printf("%d is under 10\n",a);     else if(a <99 ) 	printf("%d 10 to 99\n", a);     else if(a < 999) 	printf("%d is 100 to 999\n",a);     else  	printf("%d is above 1000\n",a);      return 0; }
user-0 提问: 求解为什么先输入不愿意，再输入愿意它就直接跳出来了，不能停住？一开始输入愿意就能停住

回复:
user: user-1
content: 引用 6 楼 zhao4zhong1 的回复:fflush(stdin);好象在某些OS上不能用。是的

user: user-2
content: 引用 楼主 u013318770 的回复:#include<stdio.h> int main(void) { 	char c[10]; 	char a[10]="愿意";	 	char b[10]="不愿意"; 	printf("请问您是否愿意让我永远保护您，请回答愿意或不愿意\n"); 	while(1) 	{ 		scanf("%s",c); 		if((strcmp(a,c)==0)||(strcmp(b,c)==0)) 		{ 			if(strcmp(a,c)==0) 			{ 				printf("祝福你们白头偕老！！！\n"); 				printf("我会永远保护你！！！\n"); 				break; 			} 			if(strcmp(b,c)==0) 			{ 				printf("对不起，您的回答我不太同意，请再考虑一下重新输入\n"); 			} 			else 			{ 				printf("您输入的格式不对，请输入愿意或不愿意\n"); 			} 		} 	//system("pause"); 	} }  只是一个小问题，逻辑出错了 if（） { } if（） {} else{} 这样写是表示愿意是一种情况，不愿意和其他是另一种情况 正确的写法是 if（） {} else if（） {} else {} 这样才是表示一种情况：愿意、不愿意和其他。 所以真确代码是： #include<stdio.h> #include <string.h> int main(void) { 	char c[10]; 	char a[10]="愿意";	 	char b[10]="不愿意"; 	printf("请问您是否愿意让我永远保护您，请回答愿意或不愿意\n"); 	while(1) 	{ 		scanf("%s",c); 		if((strcmp(a,c)==0)||(strcmp(b,c)==0)) 		{ 			if(strcmp(a,c)==0) 			{ 				printf("祝福你们白头偕老！！！\n"); 				printf("我会永远保护你！！！\n"); 				break; 			} 			else if(strcmp(b,c)==0) 			{ 				printf("对不起，您的回答我不太同意，请再考虑一下重新输入\n"); 			} 			else 			{ 				printf("您输入的格式不对，请输入愿意或不愿意\n"); 			} 		}	 	} } 就可以了！！！

user: user-3
content: 不知道是什么问题 我这边是边写边读, 我不愿意还没打完呢 他就吧我的'buyuan给输出了' 我这边用的时xcode

user: user-4
content: fflush(stdin);好象在某些OS上不能用。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。不太懂你  引用 3 楼 zhao4zhong1 的回复:在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。你说的我不太懂，我搜了一下，好像fflush(stdout);和rewind(stdin);都是清空读写缓冲区的，有什么区别吗？具体该什么时候用呢？

user: user-0
content: 引用 1 楼 u012421456 的回复:楼主什么编译器？楼主的意思是第一种方式屏幕不能暂停？ 最好加上#include <string.h>恩  解决了  谢谢了~

user: user-4
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

user: user-5
content: lz这代码。。。

user: user-6
content: 楼主什么编译器？楼主的意思是第一种方式屏幕不能暂停？ 最好加上#include <string.h>
user-0 提问: 什么类型程序，用到socket？

回复:
user: user-1
content: 网络编程socket

user: user-2
content: 现在的程序不和网络打勾就太out了，和网络打勾都要用socket

user: user-3
content: 用到网络的都要socket.不用网络的，进程通信的，也可能会用到socket.你问这样的问题只能说明你对socket编程还未入门。

user: user-4
content: 当你发这个帖子的时候，你已经用到了socket

user: user-5
content: 引用 3 楼 user-6 的回复:我汗，这个跟问题牛头不对马嘴好伐，要我说，凡是你想要把一个数据传输到另外一个机器上去的场景，都可以用socket通信，甚至本机的跨进程通信，也可以用socket。+1，网络类的

user: user-6
content: 我汗，这个跟问题牛头不对马嘴好伐，要我说，凡是你想要把一个数据传输到另外一个机器上去的场景，都可以用socket通信，甚至本机的跨进程通信，也可以用socket。

user: user-0
content: IOS后台开发，还有些什么？

user: user-6
content: 其实就是用来交换数据用的 比如，你想把主机A上面的数据发给主机B，这个时候就要用到 例子嘛网上满天飞，自己百度下吧，无非就是需要有个server端和一个client端
user-0 提问: 求大神指教呀 使用richededit控件 编的记事本程序 打开TXT文件  只显示了第一行  

回复:
user: user-1
content: 设置那个控件的换行属性为ture了吗？原来我就是这样，然后输出的字符串只有一行

user: user-0
content: 谢谢  谢谢

user: user-0
content: 厉害  我知道了  搞了一天才发现这个问题

user: user-2
content: richededit控件的MultiLines属性设置为True？
user-0 提问: 关于图片格式转换（如png转icon）

回复:
user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:[quote=引用 4 楼 u013947751 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] Image Magick CXImage 谢谢 不是说用别人的不好，我无聊的时候就喜欢DIY一些小工具，弄懂原理比较好玩 谢谢您的回复！！[/quote] Image Magick是开源的，你先读读它的源代码收获应该更大。[/quote] 万分感谢您的建议，我会的

user: user-1
content: 1楼正解，需要先搞明白各种格式的具体字段，然后你就可以随心所欲的转换了。

user: user-2
content: 引用 4 楼 u013947751 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] Image Magick CXImage 谢谢 不是说用别人的不好，我无聊的时候就喜欢DIY一些小工具，弄懂原理比较好玩 谢谢您的回复！！[/quote] Image Magick是开源的，你先读读它的源代码收获应该更大。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:Image Magick CXImage 谢谢 不是说用别人的不好，我无聊的时候就喜欢DIY一些小工具，弄懂原理比较好玩 谢谢您的回复！！

user: user-0
content: 引用 1 楼 lovesmiles 的回复:拒绝源码哈哈，基本上也没有多少人会给你源码。思路大要是这样： 1先学习png文件的格式协议。 2再学习icon文件的格式协议， 3搞清楚上面二个的文件头和数据内容是怎么存放的，然后就是建一个c++项目，用一般的文件操作，将png的文件头读上来，分析，然后将数据读上来。分析完之后，就将它转换成icon的文件头，数据也转成对应的数据，再保存到新的文件就可以了。  上面的内容看起来简单，但是分析一个文件格式要不少时间和功力的。你也可以找一些现成的读取png的源码看一下。  不过如果你只是头疼图标素材，网上应该有一个很好的png转icon的软件。你百度一下就能找到了。 你要实现这个软件，工作量不少，难度也不小，并不是适合练手的项目。 谢谢！！工作量和难度大，可以慢慢来，网上的那些软件谁都能很快学会用，但核心具有竞争力的东西还是要靠自己学，反正是课余弄的，我电脑上很多小工具软件都是自己慢慢完成的，过程很好玩

user: user-2
content: Image Magick CXImage

user: user-3
content: 拒绝源码哈哈，基本上也没有多少人会给你源码。思路大要是这样： 1先学习png文件的格式协议。 2再学习icon文件的格式协议， 3搞清楚上面二个的文件头和数据内容是怎么存放的，然后就是建一个c++项目，用一般的文件操作，将png的文件头读上来，分析，然后将数据读上来。分析完之后，就将它转换成icon的文件头，数据也转成对应的数据，再保存到新的文件就可以了。  上面的内容看起来简单，但是分析一个文件格式要不少时间和功力的。你也可以找一些现成的读取png的源码看一下。  不过如果你只是头疼图标素材，网上应该有一个很好的png转icon的软件。你百度一下就能找到了。 你要实现这个软件，工作量不少，难度也不小，并不是适合练手的项目。
user-0 提问: 大一学生，排列组合问题！

回复:
user: user-1
content: 这种题，如果作为ACM的题，应该有明确的输入和输出格式的。你这样的描述，并不是一个合适的计算机题目。

user: user-1
content: 计算机是用穷举法计算问题的，要是你都已经把公式想好了。那就没计算机什么事了。  你把所有的球分配给5个人，然后将甲有a，乙有b之类的情况去掉。然后剩下的就是结果了。

user: user-2
content: 楼主应该是程序新人吧？这里给你说下计算机程序的几个特点，你的问题也就迎刃而解了  1. “计算机是傻瓜”，计算机其实什么都不会，它会的所有东西都是人教他的，比如你的问题，要统计有多少情况，也需要你来教他，这个教他的过程，其实就是编程。换句话说，你会的，你“教给”计算机了它就会，你不会的它也不会。如果你会用排列组合来算，计算机业可以这么算；你会用枚举，计算机也可以枚举等等。  2. “程序尽量高效”，还是以你的问题为例，要统计情况，其实有很多方法都能实现，对于使用者，他们并不关心你怎么实现的，他们只关心结果对不对，因此，在设计程序的时候，要尽可能考虑高效的方法。例如，你的问题，至少有3种方法解决：1. 用排列组合计算；2. 用枚举法；3. 用排除法。 无疑，排列组合之需要几次算数运算，是最高效的；枚举法可以依次枚举所有的情况，再挨个判断是不是合理，然后统计合理的数量；排除法可以先把所有情况统计计数，然后排除不符合条件的，排除法和枚举法都相对低效。 因此这个问题，就用你的排列组合方法就是最好的。  比如你可以编写如下函数来计算“CXX”的值 int CountC (int x1, int x2); // 内部实现就你自己完成了  然后在后面直接调用CountC(4, 1) * CountC(3, 1) * CountC(2, 1) * CountC(2, 1);就能得到你要的结果了。
user-0 提问: C语言中关于内存分配以及数据结构相关的问题

回复:
user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:理解和讨论之前请先学会如何观察！老师该如何观察求解  我用的是vs2013

user: user-0
content: 引用 3 楼 lkshflasgla 的回复:弄清“传值调用”和“传址调用”两个概念之后，楼主应该就明白了那位啥那个销毁链表的时候不用传地址就可以释放内存就这点不是很理解

user: user-1
content: 理解和讨论之前请先学会如何观察！

user: user-2
content: 弄清“传值调用”和“传址调用”两个概念之后，楼主应该就明白了

user: user-2
content: #include<stdio.h> #include<malloc.h> int f(int**p) {     *p=(int *)malloc(sizeof(int)); } int main() {     int *p;     f(&p);     *p=5;     printf("%d",*p);        }   第一例用二级指针，记住指针也是变量

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

回复:
user: user-0
content: 有木有人啊啊啊，我要疯了

user: user-1
content: 二楼的大师答案挺好，谢谢了！

user: user-2
content: //声明一个3*5的数组并初始化，具体数值可以可以是随意的，程序打印出数值，然后数值翻一番，接着再次打印出新数值， //编写一个函数来显示数组的内容，再编写一个数执行翻倍功能。数组名和数组行作为参数由程序传递给函数。 #include <stdio.h> int a[3][5]={     {1,2,3,4,5},     {5,4,3,2,1},     {1,2,3,2,1}, }; void show(int p[][5],int r) {     int y,x;      for (y=0;y<r;y++) {         for (x=0;x<5;x++) {             printf("%3d ",p[y][x]);         }         printf("\n");     } } void mul2(int p[][5],int r) {     int y,x;      for (y=0;y<r;y++) {         for (x=0;x<5;x++) {             p[y][x]*=2;         }     } } int main() {     show(a,3);     mul2(a,3);     printf("\n");     show(a,3);     return 0; } //  1   2   3   4   5 //  5   4   3   2   1 //  1   2   3   2   1 // //  2   4   6   8  10 // 10   8   6   4   2 //  2   4   6   4   2 //
user-0 提问: 各位大哥,学完C primer plus之后,应该再学些什么才能深造C呢?

回复:
user: user-1
content: 我还是送你一个字吧:敲敲敲!!!!!!!

user: user-0
content: 引用 6 楼 my_live_123 的回复:C陷阱与缺陷 C专家编程 K&R C99标准（参考手册） 大哥哥 你之前就是这么学的吗

user: user-2
content: 先实现二叉树来看看

user: user-0
content: 引用 1 楼 user-12 的回复:不写代码，基础扎实不了的 有写...每天都有写。

user: user-0
content: 引用 5 楼 lovesmiles 的回复:C++必看书目  侯捷的　STL源码剖析 Effective c++ ,  more Effective c++ 《Effective STL》 《Essential C++ 中文版》 《More Exceptional C++ 中文版》 深度探索 C++ 对象模型 <<UNIX环境高级编程>> C++反汇编与逆向分析技术揭秘 这是C++的 我要的是C语言的...

user: user-0
content: 引用 2 楼 FightForProgrammer 的回复:这种问题已经被问烂了。csdn一搜一大把。 最好的就是研究源码。自己下载nginx源码研究吧 即使被问烂了还是没有一个合适的答案

user: user-3
content: 不写代码是不可能打好坚实的基础的。 可以写一些小程序，既锻炼C语言，又有成就感。  可以看一些开源项目。nginx就算了吧。楼主非计算机专业，很多计算机网络的知识应该都没有，很难看懂nginx的

user: user-4
content: 这种问题已经被问烂了。csdn一搜一大把。 最好的就是研究源码。自己下载nginx源码研究吧

user: user-5
content: 下载研究eMule源代码 下载研究Quake3源代码

user: user-6
content: C陷阱与缺陷 C专家编程 K&R C99标准（参考手册）

user: user-7
content: C++必看书目  侯捷的　STL源码剖析 Effective c++ ,  more Effective c++ 《Effective STL》 《Essential C++ 中文版》 《More Exceptional C++ 中文版》 深度探索 C++ 对象模型 <<UNIX环境高级编程>> C++反汇编与逆向分析技术揭秘

user: user-8
content: 请写一个类似于数据库的小型系统，至少能实现增、改、删，并使用链表和结构体，如果写不出来，那就重新再学C primer plus吧。

user: user-9
content: C primer plus才看完，处于入门阶段，要写一些代码练习吧，建议从实现一些数据结构和算法入手。。  不用先忙于看其他进阶的书了，看了也白看，你没写一些代码，不会有感觉~~

user: user-10
content: 看开源代码 或者自己写个小软件 看看自己学的怎样

user: user-11
content: 数据结构（C语言）

user: user-6
content: 嗯，前三本能吃透，保证你C一点问题没有！C99标准只是一种手册，必要时候查阅一下了，比任何资料都权威和准确！

user: user-12
content: 不写代码，基础扎实不了的
user-0 提问: 关于局部最大值的问题

回复:
user: user-1
content: 把数组看成权重,建模成01背包问题，可以用动态规划解决, 比如a[5] f(x) = x0*a[0] + x1*a[1] + ...+ x4*a[4] MAX f(x) xi，i[0, 4]取值0和1，剩下的工作自己处理吧！

user: user-0
content: 找到了，就是这个，谢谢

user: user-2
content: 这是最大子序列和不？ 当，一个子序列和小于等于0 的时候就放弃。。。直到求出最大正数和 这个不是基本算法吗？ 要不要从书里抄一个。。。没有正数的时候，非正数中的最大值就是就是最大和了。

user: user-3
content: 穷举的话，必须有三个循环呀。   坐等算法高手。

user: user-3
content: 有数组A[n], (a[0], a[1], ... a[n - 1]) 求满足 0 <= i <=j <= n-1,  使得 a[i] + a[i + 1] + ... a[j] 值最大的i, j 值？

user: user-4
content: 局部最大？？？

user: user-5
content: 欢迎关注July的博客 http://blog.csdn.net/v_july_v/article/details/6444021
user-0 提问:    C语言将会推出历史的舞台吗？

回复:
user: user-1
content: 引用 38 楼 DelphiGuy 的回复:赵老师是绝对不会退出CSDn的舞台滴。

user: user-2
content: 引用 45 楼 zhao4zhong1 的回复:[quote=引用 39 楼 luciferisnotsatan 的回复:] [quote=引用 38 楼 DelphiGuy 的回复:] 赵老师是绝对不会退出CSDn的舞台滴。  来了几年，活跃用户除了赵老师，都换了好几波了。[/quote] 天下武功，最厉害的莫过于活的比你长。[/quote]  神龟虽寿,犹有竟时。

user: user-3
content: 引用 39 楼 luciferisnotsatan 的回复:[quote=引用 38 楼 DelphiGuy 的回复:] 赵老师是绝对不会退出CSDn的舞台滴。  来了几年，活跃用户除了赵老师，都换了好几波了。[/quote] 天下武功，最厉害的莫过于活的比你长。

user: user-4
content: 周围没人用C不代表C不在周围。 LZ多虑了。

user: user-5
content: 引用 36 楼 m13286282 的回复:可是我发现周围的人没有一个用c的 往底层走走看看？就像楼上说的那样，给上层世界打造一个很好的编程环境——代表就是Unix/Linux！包括嵌入式开发，驱动开发也是以C为战场的！

user: user-6
content: 还有大批大批一心扑在 C 上的人，楼主你的圈子不是计算机世界的全部，大家都在干着不同的事 用汇编、C 的人在辛勤的打造着你用来学习编程的世界，有兴趣你要进去看看

user: user-7
content: 想多了，底层硬件还是得靠C

user: user-8
content: 除非计算机又推出什么新架构思想，否则..不会

user: user-9
content: 引用 38 楼 DelphiGuy 的回复:赵老师是绝对不会退出CSDn的舞台滴。  来了几年，活跃用户除了赵老师，都换了好几波了。

user: user-2
content: 赵老师是绝对不会退出CSDn的舞台滴。

user: user-0
content: 可是我发现周围的人没有一个用c的

user: user-3
content: 引用 36 楼 m13286282 的回复:可是我发现周围的人没有一个用c的 你换个地方（比如华为公司）再发现一下。

user: user-10
content: C语言退不退出历史舞台没什么意思>  关键能否解决问题.

user: user-11
content: 我也觉得楼主多虑了

user: user-12
content: 那也不是退出，只是使用会变少，底层越来越完善，只需小部分的人维护

user: user-12
content: 晕死，C要退出的话，那得先操作系统退出，操作系统是C写的，系统API也是C，各语言底层都用C，

user: user-13
content: lz想多了。。。

user: user-14

user: user-5
content: 21,25楼++ 尤其21楼，在下觉得他道出了本质 目前个人看，还没有语言能够超越lisp。好多高级语言都是在模仿lisp的一些特性，而从未超越！ 楼主要坚信，几十年风雨依旧不倒，自有它不倒的原因！既然几十年都过来了，那为什么会在这个时候能够瞬间倒下？显然是不可能的！此外，越底层越抽象，越抽象越精悍，越精悍越强大！这就是计算机的哲学：简单就是美！

user: user-3
content: 引用 30 楼 wwwwpppp628 的回复:不论什么语言，都是一堆规则而已。这个世界上，还没有一套规则能对所有问题适用。凡是最后都得落实到具体的任务身上，我想应该没人愿意用java去写驱动，用C去写UI。 象Quake3这样的UI还得用C写。
user-0 提问: 谁能说一下循环左移和循环右移

回复:
user: user-1
content: 移位运算都是无符数才移位啊

user: user-2
content: 循环移位只跟带不带C标志位有关系。 《The Intel 64 and IA-32 Architectures Software Developer's Manual》

user: user-2
content: 循环移位跟最高位符号位没关系。

user: user-3
content: 0111 0111 1110 1110 1101 1101 1011 1011 0111 0111

user: user-4
content: 你都说是循环了，左移时，最低位被最高位补充，右移时，最高位被最低位补充。  要不然怎么循环？
user-0 提问: char array[5] = “csdn”;中，“csdn”储存的位置？

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

user: user-2
content: 3楼正解

user: user-1
content: 理解和讨论之前请先学会如何观察！

user: user-3
content: 看定义位置， 非静态数组 定义在函数内部的，很可能有两个位置保存这个数据。 其一在常量区（静态数据区）这个是程序员无法访问的。 其二在函数运行时候，初始化数组时，复制到数组内部。（早期C，函数内部的非静态数组，不能初始化）  对于全局变量，包括 各种静态变量，C语言，在数组内部，储存用于初始化数组的常量数据。 这是编译好就确定的，一般来说，程序装载到内存，就完成了数组的初始化。  C++ 则有可能会尽可能这么处理， 但是由于C++有构造函数，所以有些可能要延迟到程序运行时才初始化 而C++ 函数内部的静态数组，可能会在函数第一次运行时候，才会初始化。  总之，在数组内部空间储存常量，至于会不会有其他辅助空间，编译器会根据需要处理。

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

user: user-4
content: char array[5]  保存在这个数组中.  const char *p = "CSDN"   //保存在常量区 char p[] = "CSDN";  //保存在数组p中, 也就是在栈中.  数组大小会根据初始化串的大小自动分配栈空间. char p[5] = "CSDN"  //同上.

user: user-5
content: 函数外就为全局变量 在函数中就在栈中

user: user-6
content: 引用 1 楼 xiaohuh421 的回复:char array[5]  保存在这个数组中.  const char *p = "CSDN"   //保存在常量区 char p[] = "CSDN";  //保存在数组p中, 也就是在栈中.  数组大小会根据初始化串的大小自动分配栈空间. char p[5] = "CSDN"  //同上.+1
user-0 提问: C语言中的指针操作

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

user: user-2
content: 先看一个类似的例子： void f(int i) {   i = 2; // 这个改动不会修改main里面的n } int main() {   int n = 1;   f(n);   printf("%d\n", n); // n还是1 } 要通过函数f来修改main里面的n，就是1楼和2楼的两个办法： void f(int *i) {   *i = 2; } 或者 int f() {   return 2; } 在这里，指针和普通变量其实是一样的，只不过就是要用二级指针。

user: user-3
content: 你的输入字符时的格式有问题吧，用getchar不是很好吗

user: user-4
content: 引用 楼主 Vanquish_self 的回复:最近还是做二叉树啊栈啊的操作 经常发现当程序涉及指针地址操作的时候，在执行的时候就会弹出提示框，无法按正常运行。 下面是程序段： void CreateBinTree(TriNode *T){ 	char c; 	scanf(&c);  	if(c==' '){ 	   T=NULL;          } 	else if(c!=' ') 	{ 		if(!(T=(TriNode*)malloc(sizeof(TriNode)))) exit(0); 		T->data=c; 		CreateBinTree(T->lchild); 		CreateBinTree(T->rchild); 	}  } main代码段没有给出来   但是经过debug已经发现问题就出现在函数类型（main函数就是一个输入） 第二段 返回指针变量 TriNode* CreateBinTree(TriNode *T){ 	char c; 	scanf(&c);  	if(c==' '){ 	   T=NULL;          } 	else if(c!=' ') 	{ 		if(!(T=(TriNode*)malloc(sizeof(TriNode)))) exit(0); 		T->data=c; 		CreateBinTree(T->lchild); 		CreateBinTree(T->rchild); 	} 	return T; }  改成这样以后编译依旧没有错，可是执行就会出现下面的提示   求大牛解救解救小白       其实之前在sacnf输入的时候也会出现这样的问题，那是因为忘记在变量之前打地址符了。我猜测这里还是因为地址操作的原因，但是不知道怎么修改，或者说不知道本质错误。 用的工具是DEV-C++  TriNode* CreateBinTree() {     TriNode* T;     char c;      //scanf(&c);      scanf("%c", &c);      if (c == '\n') {         T = NULL;     } else {         if (!(T = (TriNode *)malloc(sizeof(TriNode)))) {             exit(0);         }         T->data = c;         T->lchild = CreateBinTree();         T->rchild = CreateBinTree();     }          return T; }

user: user-2
content: 或者这样也可以： void CreateBinTree(TriNode **T){ char c; scanf(&c);  if(c==' '){    *T=NULL;          } else if(c!=' ') { if(!(*T=(TriNode*)malloc(sizeof(TriNode)))) exit(0); (*T)->data=c; CreateBinTree(&(*T)->lchild); CreateBinTree(&(*T)->rchild); } }

user: user-2
content: TriNode* CreateBinTree(){ char c; TriNode *T; scanf(&c);  if(c==' '){    T=NULL;          } else if(c!=' ') { if(!(T=(TriNode*)malloc(sizeof(TriNode)))) exit(0); T->data=c; T->lchild = CreateBinTree(); T->rchild = CreateBinTree(); } return T; }
user-0 提问: typedef的用法

回复:
user: user-0
content: 引用 10 楼 u013163178 的回复:create是一个指针，他指向一个函数void * function(void) 谢谢你哈，能不能帮忙解决这个问题啊 http://bbs.csdn.net/topics/390920981

user: user-0
content: 引用 7 楼 FightForProgrammer 的回复:typedef void * (*create)(void);  声明一个叫做create类型的指针，这个指针是一个函数指针，这个指针指向一个无参数、返回void*的函数。  详细内容可以参考函数指针、typedef 谢谢你哈，能不能帮忙解决这个问题啊 http://bbs.csdn.net/topics/390920981

user: user-0
content: 引用 8 楼 my_live_123 的回复:定义一个类型别名 这句代码定义一个函数指针类型void * (*)(void)的别名create 需要定义这样的函数指针的时候，直接 create fun; //fun的类型void * (*)(void) 谢谢你哈，能不能帮忙解决这个问题啊 http://bbs.csdn.net/topics/390920981

user: user-1
content: create是一个指针，他指向一个函数void * function(void)

user: user-2
content: void * (*create)(void); 就是定义一个函数指针void*是这个函数的返回类型，别的没有什么了。

user: user-3
content: 定义一个类型别名 这句代码定义一个函数指针类型void * (*)(void)的别名create 需要定义这样的函数指针的时候，直接 create fun; //fun的类型void * (*)(void)

user: user-4
content: typedef void * (*create)(void);  声明一个叫做create类型的指针，这个指针是一个函数指针，这个指针指向一个无参数、返回void*的函数。  详细内容可以参考函数指针、typedef

user: user-0
content: 引用 3 楼 falcomavin 的回复:这个typedef给这个函数指针定义了一个别名，你以后可以直接创建该函数指针，比如 create c；//c就是上面那种类型的函数指针 http://bbs.csdn.net/topics/390920981

user: user-0
content: 引用 2 楼 user-7 的回复:[quote=引用 楼主 wangqing008 的回复:] typedef void * (*create)(void);  [/img] 确实是个函数指针呀。 和这个很类似的。       #include <signal.h>       void (*signal(int sig, void (*func)(int)))(int);       or in FreeBSD's equivalent but easier to read typedef'd version:       typedef void (*sig_t) (int);       sig_t      signal(int sig, sig_t func); [/quote] 可以帮忙看看这个吗？漏写了 一个函数，最近看源码看到的，不懂 http://bbs.csdn.net/topics/390920981

user: user-5
content: 前边也是函数指针啊 http://zhidao.baidu.com/link?url=nkdC3naJiN-dWjTOr5eADJSE08JCrerLwJAB5q33KFftJD_vWBtheVyShI-2-zsvlC5jDKZ7UO0A8DF_qmrh_K

user: user-6
content: 这个typedef给这个函数指针定义了一个别名，你以后可以直接创建该函数指针，比如 create c；//c就是上面那种类型的函数指针

user: user-7
content: 引用 楼主 wangqing008 的回复:typedef void * (*create)(void);  [/img] 确实是个函数指针呀。 和这个很类似的。       #include <signal.h>       void (*signal(int sig, void (*func)(int)))(int);       or in FreeBSD's equivalent but easier to read typedef'd version:       typedef void (*sig_t) (int);       sig_t      signal(int sig, sig_t func);

user: user-0
content: http://bbs.csdn.net/topics/390920981，这个帖子
user-0 提问: 关于c语言用function算完美数会输出两个一样结果的问题

回复:
user: user-0
content: 已经明白怎么改了，谢谢各位帮助www

user: user-0
content: 引用 5 楼 r_Jimy 的回复:引用 4 楼 Nintenxu 的回复:[quote=引用 3 楼 r_Jimy 的回复:] while(x<=limit)问题不在这里吧...我改了之后出来一大堆东西..... 不好意思理解错了，专业点要改PerNum的算法，不专业的判断下重复值吧[/quote]唔...我想尝试改下PerNum算法，根据第一个人回复也大概知道问题在哪可是还是不太会改Orz

user: user-1
content: 引用 4 楼 Nintenxu 的回复:引用 3 楼 r_Jimy 的回复:while(x<=limit)问题不在这里吧...我改了之后出来一大堆东西..... 不好意思理解错了，专业点要改PerNum的算法，不专业的判断下重复值吧

user: user-2
content: 你把printf("%d\n",PerNum(x));改成printf("%d %d\n",x,PerNum(x));你就知道为什么了。 顺便目测下一个33550336会输出6次。

user: user-0
content: 引用 3 楼 r_Jimy 的回复:while(x<=limit)问题不在这里吧...我改了之后出来一大堆东西.....

user: user-1
content: while(x<=limit)

user: user-0
content: 引用 1 楼 user-2 的回复:你把printf("%d\n",PerNum(x));改成printf("%d %d\n",x,PerNum(x));你就知道为什么了。 顺便目测下一个33550336会输出6次。唔...大概明白怎么回事了，可还是不太清楚怎么改，在下面m=m*2后面加上x++也没用啊...
user-0 提问: C语言字符串与函数调用的问题，求大神解答！

回复:
user: user-1
content: *实参定义成*str，虽然编译通过，但是打不出来。用str[100]就可以了  *str 只定义了一个指针，没有定义空间。 str[100]则分配了100个char空间。  这是c的基本知识，你还是先把书看完再说吧。

user: user-2
content: 我草，你这。。。。。你知道,下面两语句的区别吗 char str[100]; char *str; 什么，不知道，那就去看看书吧，太基础了

user: user-3
content: 引用 1 楼 u013163178 的回复:我草，你这。。。。。你知道,下面两语句的区别吗 char str[100]; char *str; 什么，不知道，那就去看看书吧，太基础了+1

user: user-4
content: char *str;仅仅是定义了一个字符指针而已，而且没有指向有效的内存空间（这是关键）。char str[100]; 则是定义了一个长度为1000的字符数组，数组名就指向数组的首地址（一个有效的内存空间）
user-0 提问: 指针作为函数参数的调用疑问

回复:
user: user-1
content: 所以你传任何指针地址进去都是正确的 但是使用的时候，必须转化成你要的指针类型 不然无法解释那段内存中的数据 以及数据格式

user: user-1
content: 不算 void *表示任意类型的指针，不能解释说明指针类型以及内存大小 使用的时候必须转回来

user: user-2
content: 指针的长度都是一样的。在一些严格的编译器可能会提出类型不符，需要显式转换二个指针。但大部份编译器都会通过的。

user: user-3
content: 就是为了可以进行强制转化而写成void*,只要你保证传进去和接收的类型一致就可以在函数内部进行强制转化而没有问题。

user: user-4
content: 楼上正解，另说明下： const void *data类型的参数在函数内部只能传值，不能修改指向的内容，所以AvlNode指针结点传到该函数内，这个结点的内容不会改变

user: user-5
content: const void *data void*可以表示一切类型的指针。你只要在函数中转换回来就ok了
user-0 提问: 求指点const使用问题

回复:
user: user-1
content: 我用的vs2005，试验了下，会提示  error C2659: “=”: 作为左操作数

user: user-1
content: make_move=(board,x,y,player_c);   /* 错误代码位置，cannot convert `const   这段要把=去掉吧  然后我也试了编译了下，可以运行的啊

user: user-2
content: 楼上解释const有点不对 const所修饰的物体 表示该物体是不可变的 不可以修改的 并不是常量 ， 而且const带有类型检测功能，编译时 比如  const char comp_c='@'; 表示变量comp_c的值永远为'@'，不可以修改 去除掉const则改变值可以修改 虽然意思都是不变的 常量一般说是 1 2 3 “12zzx”等

user: user-3
content: 把const去掉就行。const是常量，不能更改。

user: user-0
content: 引用 3 楼 skyabc 的回复:make_move=(board,x,y,player_c);   /* 错误代码位置，cannot convert `const   这段要把=去掉吧  然后我也试了编译了下，可以运行的啊 这位朋友解说的正确，小小的错误纠结了我好久啊，错误提示强一点的编译器有没有推荐啊
user-0 提问: 一个小程序带来的思考

回复:
user: user-1
content: 为什么不参考bsearch函数的源代码呢？

user: user-2
content: 逻辑修改了一下 给了 0 1 3 6 7这几个测试用例，没问题了

user: user-2
content: #include "stdafx.h" #include <stdio.h> int binary_search(int a[],int left,int right,int number) { 	if (left>right) 	{ 		return -1; 	} 	else if (left == right) 	{ 		if (a[left]==number) 		{ 			return left; 		}  		else 		{ 			return -1; 		} 	} 	else 	{ 		int mid=left + (right -left)/2; 		if (a[mid] == number) 		{ 			return mid; 		} 		else if(a[mid]>number){ 			return binary_search(a,left,mid,number); 		} 		else{ 			return binary_search(a,mid+1,right,number); 		}	 	}  	return 0; } int main(int argc,char *argv[]) { 	int sortedarray[]={1,2,3,4,5,6}; 	int number,i; 	int len=sizeof(sortedarray)/sizeof(sortedarray[0]); 	printf("请输入你想查找的数字:\n"); 	scanf("%d",&number); 	i=binary_search(sortedarray,0,len-1,number); 	printf("%d,\n",i);  	getchar(); 	getchar(); }

user: user-3
content: 今天发现上面的代码有个bug,  else(array[mid] < key) 应为else if,不好意思。

user: user-3
content: 这个二分查找写得不严谨。 1、应该为while(left <= right)  ，整个程序把left = right的情形忘记了，事实上，题主的疑惑就是这个导致的，试想当left = right时，根据程序，可知直接到了return 0。 2、if(a[mid]>number){ return binary_search(a,left,mid,number); }，这里的右边界应该为mid + 1, mid的情形已经讨论过了，造成重复。  我徒手写了个标准写法(非递归、升序): //非递归，升序，返回索引 --by Yaoxin_ int binarysearch(int *array, int length, int key) { 	if(!array) 	{ 		return -1; 	} 	int left = 0; 	int right = length -1; 	int mid; 	 	while(left <= right) 	{ 		mid = left + (right - left)/2; 		if(array[mid] > key) 		{ 			left = mid + 1; 		} 		else(array[mid] < key) 		{ 			right = mid - 1; 		} 		else 		{ 			return mid; 		} 	} 	 	return -1; }

user: user-0
content: 已解决，谢谢你

user: user-4
content: 二分法是基本功，网上有很多样例代码，建议楼主找来学习一下。

user: user-4
content: if (left > right)  return; // 这里也有问题，建议改成 return -1; 试试输入0或者10看看什么结果

user: user-4
content: 改成while (left<=right)试试
user-0 提问: 操作系统中的独木桥问题，用c语言写代码

回复:
user: user-0
content: 引用 1 楼 Yaoxin_ 的回复:P（int sem） { 	sem +-= 1; } V(int sem) { 	sem -= 1; }  楼主不是已经贴出了伪码么？ 想着能不能用C写代码，不是伪代码

user: user-1
content: P（int sem） { 	sem +-= 1; } V(int sem) { 	sem -= 1; }  楼主不是已经贴出了伪码么？
user-0 提问: 如何调用VM——API

回复:
user: user-1
content: 说想用它们的产品，让他们技术支持工程师给解释下

user: user-2
content: 查看vm的官方文档

user: user-0
content: 就是运行程序然后虚拟机自动运行或者关闭

user: user-0
content: 用C语言来实现。。。打错了
user-0 提问: 菜鸟求教一个问题，本人学过c但没深入，现在在公司发展不理想，想学习代码编写

回复:
user: user-1
content: 修改相关注册表项。我猜。

user: user-2
content: 禁止识别U盘 把USB口通过注册表屏蔽可以做到

user: user-3
content: 驱动标识，我猜

user: user-4
content: 为啥不直接问他

user: user-0
content: 工控机用的xp操作系统，在usb驱动上加标志？不懂。我不是学计算机的，很多东西没接触过。呵呵

user: user-5
content: 看工控机用的什么操作系统，或者是不带操作系统，要禁止和启动U盘可在USB驱动上加个标志来控制
user-0 提问: C语言遇到一个奇怪的访存错误

回复:
user: user-1
content: 分配了160 * 8192字节的内存 却访问50*8192*4的位置，明显越界

user: user-2
content: 1楼解释是对的

user: user-0
content: 引用 1 楼 jerry_dqh 的回复:cb8s+50*8192 你打印这个地址就知道，实际偏移的字节数是 50*8192*sizeof(float),  有道理，谢谢

user: user-3
content: cb8s+50*8192 你打印这个地址就知道，实际偏移的字节数是 50*8192*sizeof(float),
user-0 提问: 怎么设置visual studio 2010 代码模板

回复:
user: user-0
content: 引用 2 楼 ForestDB 的回复:这个应该是VC中的定制project，搜搜MSDN吧。 感觉这样好麻烦,有没有简单的方法,网上有导出模板,而我的10版显示无法导出模板, 最后我使用了编辑功能里面的将文件作为文本插入.

user: user-1
content: 这个应该是VC中的定制project，搜搜MSDN吧。

user: user-2
content: 新建一个helloworld的控制台工程就行了。并不是什么模板
user-0 提问: C如何打开对应程序的对应文件

回复:
user: user-1
content: CSDN如何回复对应楼主的对应帖子？

user: user-2
content: ~~~ 好迷糊的 问题

user: user-1
content: 引用 4 楼 zhao4zhong1 的回复:CSDN如何回复对应楼主的对应帖子？ 这也能得分？！

user: user-0
content: 引用 1 楼 u012421456 的回复:什么对应文件啊 说错了，你知道C程序怎么调用vm_api 不

user: user-3
content: 什么对应文件啊
user-0 提问: 避免野指针问题，请大神赐教

回复:
user: user-1
content: 应该在free(p[i]); 之后 ， p[i]=0  以及free(p); 之后 p=0  但是出现这个断点应该不是因为这个原因啊 除非这个函数被你连续调用2次

user: user-0
content: 引用 1 楼 jerry_dqh 的回复:将*p = null注释掉并不表示没有问题，问题隐藏得更深了。  所以呢？为什么会出现断点报错呢？

user: user-2
content: 将*p = null注释掉并不表示没有问题，问题隐藏得更深了。
user-0 提问: 求助 局部变量的问题

回复:
user: user-1
content: 引用 4 楼 q328965539 的回复:[quote=引用 楼主 q328965539 的回复:] int* size() { 	int a[3]={1,2,3}; 	return a; } int main() { 	int* p=size(); 	cout<<*p<<endl; 	return 0; } 为什么还是能输出1，在size()函数中的内存部分，不是已经随着该函数的结束而销毁了吗？ 求助是不是编译器自动优化了？  确实是这样的~ ，请问这个函数调用的时候，栈顶指针以及一些寄存器的存取情况可以简绍下么 或者推荐下好文章[/quote] 推荐你读两本书： 《程序员的自我修养》和《老码识途》

user: user-0
content: 引用 楼主 q328965539 的回复:int* size() { 	int a[3]={1,2,3}; 	return a; } int main() { 	int* p=size(); 	cout<<*p<<endl; 	return 0; } 为什么还是能输出1，在size()函数中的内存部分，不是已经随着该函数的结束而销毁了吗？ 求助是不是编译器自动优化了？  确实是这样的~ ，请问这个函数调用的时候，栈顶指针以及一些寄存器的存取情况可以简绍下么 或者推荐下好文章

user: user-2
content: 引用 楼主 q328965539 的回复:int* size() { 	int a[3]={1,2,3}; 	return a; } int main() { 	int* p=size(); 	cout<<*p<<endl; 	return 0; } 为什么还是能输出1，在size()函数中的内存部分，不是已经随着该函数的结束而销毁了吗？ 求助是不是编译器自动优化了？ 虽然随着函数的结束而销毁了，但是内存中保存的值并没有被清空。但是不能保证一定是1。

user: user-1
content: 引用 1 楼 wangzuxi 的回复:[quote=引用 楼主 q328965539 的回复:] int* size() { 	int a[3]={1,2,3}; 	return a; } int main() { 	int* p=size(); 	cout<<*p<<endl; 	return 0; } 为什么还是能输出1，在size()函数中的内存部分，不是已经随着该函数的结束而销毁了吗？ 求助是不是编译器自动优化了？ a是在size函数的栈中，调用size函数返回后，只是改变栈顶指针，而不是真正的销毁a的内存，如果调用size()函数之后接着调用其他函数的话，其他函数就会覆盖size函数的栈。[/quote] 你可以试试正面这段代码：   int* size() {     int a[3]={1,2,3};     return a; }  void test() {     int b[3] = {11, 22, 33}; }  int main() {     int* p = size();     cout << *p <<endl;     test();     cout << *p <<endl;     return 0; }  第一行输出1，第二行输出11.

user: user-1
content: 引用 楼主 q328965539 的回复:int* size() { 	int a[3]={1,2,3}; 	return a; } int main() { 	int* p=size(); 	cout<<*p<<endl; 	return 0; } 为什么还是能输出1，在size()函数中的内存部分，不是已经随着该函数的结束而销毁了吗？ 求助是不是编译器自动优化了？ a是在size函数的栈中，调用size函数返回后，只是改变栈顶指针，而不是真正的销毁a的内存，如果调用size()函数之后接着调用其他函数的话，其他函数就会覆盖size函数的栈。
user-0 提问: 疑问，关于函数地址的赋值

回复:
user: user-0
content: 结贴了，谢谢各位！

user: user-1
content: 或者typedef int(*FUNC1)(int a); typedef int(*FUNC2)(int*, int*, int*);

user: user-2
content: 函数是指针类型的。  FUNC1 *p = NULL;
user-0 提问: 请大家帮帮忙，结构体数组成员做参数的函数调用问题！

回复:
user: user-0
content: 再请问大家，不用类，仅用结构体指针能否行？ 怎样做？

user: user-0
content: 呵呵，先谢谢！dev-c++，编译通过了，哈哈，厉害，五体投地！

user: user-1
content: 结构体变量在通常情况下使用和普通变量int float是一样的 除非结构体中含有类似指针类型，情况就有变 在C++中，结构体和class基本上是通用，他们的区别仅仅是默认访问修饰符不一样而已 所以可以参考类的使用

user: user-2
content: float max_s(struct Data_my * pm1, int m, int n, float Data_my::*which_mem /* 定义成员指针 */) {         .... 	pm1->*which_mem; // 取成员值         .... }  ... 	max_s(m1, 1, 1, &Data_my::a);  // 调用时传指针的方法 	max_s(m1, 1, 1, &Data_my::b); ...
user-0 提问: C语言，有没有引用类型？

回复:
user: user-1
content: c是C文件的扩展名 cc是C++文件的扩展名 C用gcc编译 C++用g++编译 C没有引用 C++有引用  另外数据结构中，都是伪代码，可是坑爹的作者都不指出来，或者作者有指出来，坑爹的LZ都不仔细看。

user: user-2
content: C语言没有引用，国内的教课书就是按照vc6.0来编的，所以在编程的时候，其实都是写的c++程序，大家都误以为有引用。比如说李春葆的数据结构里面就用到了引用，坑死人，我大一的时候看书上代码，看不懂，后来才发现被坑了，毁人不倦啊。

user: user-3
content: 引用C语言里面没有引用这个东西可以用指针c++才有这个呢 帅哥 这样？！  http://www.baike.com/wiki/《小孩好黑》

user: user-4
content: "习惯其它语言(特别是 Fortran 语言)的程序员可能会对 C 语言的函数参数传递方式感到 陌生。在 C 语言中,所有函数参数都是“通过值”传递的。也就是说,传递给被调用函数的 参数值存放在临时变量中,而不是存放在原来的变量中。这与其它某些语言是不同的,比如, Fortran 等语言是“通过引用调用” ,Pascal 则采用 var 参数的方式,在这些语言中,被调用的 函数必须访问原始参数,而不是访问参数的本地副本。 最主要的区别在于,在 C 语言中,被调用函数不能直接修改主调函数中变量的值,而只 能修改其私有的临时副本的值。 传值调用的利大于弊。在被调用函数中,参数可以看作是便于初始化的局部变量,因此 额外使用的变量更少。这样程序可以更紧凑简洁。" ——K&R  答案：C没有引用！C它爹说的，不是我说的

user: user-5
content: C语言里面没有引用这个东西 可以用指针 c++才有这个呢 帅哥

user: user-6
content: “引用”（reference）是c++的一种新的变量类型

user: user-7
content: 引用 1 楼 user-8 的回复:C里没有引用，C++才有。 +1 C用指针可实现C++引用的功能

user: user-8
content: C里没有引用，C++才有。
user-0 提问: 新手求助

回复:
user: user-0
content: 谢谢各位大神的帮助

user: user-1
content: 视频可以看郝斌翁恺的，软件，VS2010及以上版本，dev c++、cfree等都可以

user: user-2
content: 环境还是用VS2008吧 C预言的话 c plus那本经典书籍吧 学这个主要是敲代码 看代码 学得快 做项目

user: user-3
content: 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm

user: user-4
content: VS2008

user: user-5
content: 小一些的CodeBlocks就可以，不要使用vc6.0

user: user-6
content: 单纯学语言可以看《c primer》,VC++的话建议不要用vc6.0了太老了，很多东西和现有标准不一致，甚至在现在看来都是错的，可以用vs2005,2008等
user-0 提问: 如何输出一个自定义行列的矩阵？

回复:
user: user-0
content: 我感觉我好蠢啊。诸位的我连简单的都看不懂。下面还是别回复了。我得抽个时间好好看看！

user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //

user: user-2
content: 把a[m][n]定义放在mn信息采集后。现在C99标准已经支持这种特性喽！gcc支持 示例：  #include <stdio.h>  int main(int argc, char *argv[]) { 	int m, n; 	scanf("%d %d", &m, &n);  	int a[m][n];  	a[1][2] = 10; 	printf("%d\n", a[1][2]);  	return 0; }

user: user-3
content: 已经调试通过

user: user-3
content: #include "stdafx.h"  #include<stdio.h> #include <malloc.h>  #include<stdio.h> int main() { 	int m,n;  	printf("please input m and n:\n"); 	scanf("%d %d",&m,&n); 	int i, j; 	int *a = (int*)malloc(sizeof(int) * n*m);  	printf("please input a:\n"); 	for (i = 0; i < m; i++) 	{ 		for (j = 0; j < n; j++) 		{ 			scanf("%d", &a[i*m+j]); 		} 	} 	printf("the array is :\n"); 	for (i = 0; i < m; i++) 	{ 		for (j = 0; j < n; j++) 		{ 			printf("%5d", a[i*m+j]); 		} 		printf("\n"); 	} 	delete[] a; 	getchar();//读取缓冲区遗留的换行符0xA,不会暂停程序 	getchar();//暂停程序 }

user: user-0
content: 这里开始如何声明m.n啊。  跑程序的时候它说我    未定义标示符。  我的目的是求两个任列任行的两个矩阵相乘。  望好心人解答。自学很是艰难啊。
user-0 提问: C语言数组内存分配与赋值问题

回复:
user: user-1
content: 32位，用户可用3G空间，省着点用！

user: user-2
content: 如果用到 32 位的库就没法了，除非你找到那个库的 64 位版本。  不使用 64 位的情况下，要么就分段处理数据，不要一起全放内存里面; 要么使用 AWE（http://msdn.microsoft.com/zh-cn/library/windows/desktop/aa366527(v=vs.85).aspx） 来让程序使用超过 4G 的内存

user: user-3
content: 用文件读写模拟内存读写，参考_lseeki64函数。

user: user-4
content: 系统有限制的的 尤其是内存方面 32位的系统中一个进程操作的内存的上线是2G 64位的上线是4G

user: user-0
content: 刚试了下，改成x64，问题又出现了，因为程序调用了一个CLAPACK库，是32位的，所以不兼容，怎么解决呢

user: user-2
content: VC2005 都可以创建 64 位的程序了。解决方法之一就是把你的程序改成 64 位的

user: user-0
content: 貌似vs2010只有win32位吧，不太懂，那我现在需要怎么解决这一问题呢

user: user-2
content: 你的程序是 32 位的还是 64 位的？ 32 位的进程的内存地址范围只有 4G， 自己可用的还不到 2G， 和实际的物理内存多大无关。
user-0 提问: 【求助】关于#define的高级用法

回复:
user: user-1
content: 对号入座，有什么不懂的？## 拼接标识符

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E 好的，我试试，谢谢！

user: user-2
content: 看不懂define的内容就预编译一下看看，赵老师经常说的那啥？

user: user-3
content: 编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E
user-0 提问: 新手写了一个简单程序 不知道怎么一运行就出问题

回复:
user: user-0
content: 我是新手 如何给分啊。。。

user: user-1
content: 快点给他分啊，栈溢出

user: user-2
content: 神马问题啊。调试吧！

user: user-3
content: 引用 5 楼 u013174702 的回复:太厉害了 解决了。。这就是传说中的栈溢出(stackoverflow)，希望印象深刻。

user: user-4
content: 引用 3 楼 sundq12 的回复:a[1000][1000]申请太大的数组，导致栈溢出了，改小一点，或者修改栈的空间大小正解无误！

user: user-2
content: 数组太大。一般用动态数组，申请堆内存

user: user-0
content: 太厉害了 解决了。。

user: user-0
content: 我现在去试试去

user: user-3
content: a[1000][1000]申请太大的数组，导致栈溢出了，改小一点，或者修改栈的空间大小

user: user-0
content: 调试了  到 int a[1000][1000];这就中断了
user-0 提问: 结构体指针变量互换

回复:
user: user-1
content: 你在分配空间的时候，len还没有初始化，肯定会出错的。

user: user-2
content: int len; //len是个随机值，+-0都有可能，导致malloc不一定成功，因为你的len信息还没有采集，你就分配内存喽     struct student * pst = malloc(sizeof(struct student) * len); //《-bug     int i,j;     struct student t;               printf("请输入学生数：");     scanf("%d",&len);  补丁：  int len;     struct student * pst ；     int i,j;     struct student t;               printf("请输入学生数：");     scanf("%d",&len);     pst = malloc(sizeof(struct student) * len);     if(!pst)          exit(EXIT_FAILURE);
user-0 提问: 求助：简单程序。结尾出现大量乱码

回复:
user: user-1
content: Debug模式吧，“烫”是GBK编码的0xCCCC 而每一个0xCC都对应着int 3号中断，用来激活调试器的 也就是说，如果你错误的访问后面的数据时，会自动弹出来询问你是否需要Debug的对话框  参考： http://wenku.baidu.com/link?url=pAuYuX5St9TWCyV1vFbF_QpZIhIUTViCx9i0Fn-sDXRgleDQZxrFIDF9YqnyC_L73AmGGzgGFwEDF6N4O3W6memnufIcA4vzAIq-bPiQjsO  下次再看到【烫】，第一反应就是数组越界了……

user: user-2
content: 就是楼上说的这个memset(a,0,200)初始化

user: user-3
content: 对的，字符数组需要‘\0’结尾 定义完数组后，可以调用memset(a，0,200)初始化数组，将所有元素置为0。

user: user-4
content: 没有字符串结束标志 '\0', 你看下面的程序 #include <stdio.h> #include<string.h> int main(void) { 	// your code goes here 	char a[100]; 	a[0] = 'f'; 	a[1] = 'd'; 	a[2] = '\0';//注释掉这句试试 	printf("%s\n",a); 	return 0; }

user: user-5
content: 循环后数组a结尾没加'\0'.