Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 字符串匹配问题

回复:
user: user-0
content: 问题解决了，谢谢大家！          regex_t reg;         int cflags=REG_EXTENDED;         const char *pattern="^Session establishment rate";          regmatch_t pmatch[1];         const size_t nmatch=1;          ret=regcomp(®,pattern,cflags);          ret=regexec(®,readbuf,nmatch,pmatch,0);

user: user-1
content: strsep函数判断吧；用strsep以空格为基准然后分割字符串，然后是用strncmp判断吧~

user: user-2
content: \s*(\w+) Session

user: user-3
content: 提醒：正则表达式不是万能的；而有限状态自动机是万能的。 仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %32[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8
user-0 提问: 无法将字符数组保存到字符串数组中？？

回复:
user: user-1
content: static char data[100][100];//在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。  注意不要越界  注意字符串最后要加'\0'

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:char data[100][10]; 改为 char data[100][30]; data[1]为 cfg=system，其中“cfg=system”的长度为10个字节＋末尾还需要一个'\0'共11个字节，但前面定义是char data[100][10];，即data[1]中最多保存10个字节。企图将"cfg=system"保存在data[1]中越界了。 我设置data[100][26]后输出有乱码，这是什么原因？另外数组不能设的太大，我设成30就出错，26就可以。

user: user-1
content: char data[100][10]; 改为 char data[100][30]; data[1]为 cfg=system，其中“cfg=system”的长度为10个字节＋末尾还需要一个'\0'共11个字节，但前面定义是char data[100][10];，即data[1]中最多保存10个字节。企图将"cfg=system"保存在data[1]中越界了。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:char *data[100]={0}; 改为 char data[100][10];  data[i]=p; 改为 strncpy(data[i],p,9);data[i][9]=0; 1. 再将.c文件编译成可执行文件时提示：warning:passing argument 1 of 'strncpy' form incompatible pointer type.没什么错误，是不死可以忽略？还有一个问题是用sscanf函数引起的:  //data[0]为 method=get sscanf(data[0],"method=%s",f_method); printf("%s",f_method);  //输出正常  //data[1]为 cfg=system  ,这个就出错了 sscanf(data[1],"cfg=%s",f_cfg); printf("%s",f_cfg);  这是为什么？？赵老师麻烦你了。。。

user: user-1
content: char *data[100]={0}; 改为 char data[100][10];  data[i]=p; 改为 strncpy(data[i],p,9);data[i][9]=0;
user-0 提问: 一个helloworld的问题

回复:
user: user-0
content: 引用 9 楼 qq_20623897 的回复:[quote=引用 5 楼 tafengtianya 的回复:] 主函数里的多个{}表示变量作用域，在{}里，如果变量前面有类型如int,相当于新声明了一个变量，但其作用域仅限于该{}内，出了{}就不能作用了，最后一个printf输出的是你一开始就声明的变量score，楼主如果还不懂可以F10单步注意观察变量的值变化  对吗[/quote] 好的谢谢

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

user: user-2
content: 其实花括号就二次局部了，懂不

user: user-3
content: 最后一个printf是输出  score = a + 250;但如果int   score = a + 250;   那么最后一个print输出的值就是120 ，你要注意  下面这个score=10是在  int score = 50; 这个作用域的  {         int score = 50;                           //这个score的作用域是下面的大括号         {             score = 10;                                   // 由50变成10             printf("%d\n", score);                      //输出10，换行         }         a = 10;                                       //a的值由20变为10     }      建议楼主还是自己单步运行，F10是单步运行，F11是进入函数内部

user: user-0
content: 引用 5 楼 tafengtianya 的回复:主函数里的多个{}表示变量作用域，在{}里，如果变量前面有类型如int,相当于新声明了一个变量，但其作用域仅限于该{}内，出了{}就不能作用了，最后一个printf输出的是你一开始就声明的变量score，楼主如果还不懂可以F10单步注意观察变量的值变化  对吗

user: user-0
content: 引用 4 楼 qq_20623897 的回复:{}是什么意思？像是java的代码块吗？ 新学C语言 很多地方不懂 为什么最后一句printf 会输出260 而不是30或者130 {} 有特定的意义吗？ 能不能解答一下  对吗

user: user-0
content: 也就是说 最后一个printf是输出的  score = a + 250;   这一段代码  虽然他在变量作用域中 但是没有int 所以能在main方法中引用 如果int   score = a + 250;   那么最后一个print输出的值就是10 对吗

user: user-3
content: 主函数里的多个{}表示变量作用域，在{}里，如果变量前面有类型如int,相当于新声明了一个变量，但其作用域仅限于该{}内，出了{}就不能作用了，最后一个printf输出的是你一开始就声明的变量score，楼主如果还不懂可以F10单步注意观察变量的值变化

user: user-0
content: {}是什么意思？像是java的代码块吗？ 新学C语言 很多地方不懂 为什么最后一句printf 会输出260 而不是30或者130 {} 有特定的意义吗？ 能不能解答一下

user: user-4
content: good job

user: user-5
content: nice to read

user: user-3
content: #include <stdio.h>  int main() {     int a = 20;     int score = a + 100;     printf("%d\n", score);                        //输出120，换行          {         int score = 50;                           //这个score的作用域是下面的大括号         {             score = 10;                                   // 由50变成10             printf("%d\n", score);                      //输出10，换行         }         a = 10;                                       //a的值由20变为10     }          {         score = a + 250;                          //第一个声明的score变为260         int score = 30;                            //声明score，注意下面的printf输出就是这个score的值         printf("%d", score);                         //输出30，没有换行     }          printf("%d\n", score);                            // 输出260，也即最后一行显示的是30260     return 0; }
user-0 提问: 如何利用c语言，远程进行xml的读取

回复:
user: user-1
content: 引用 9 楼 goldenhawking 的回复:我在学校教书，有意思，拿你的问题今天问了学生，学生回答： 1、先设置一个windows共享文件夹 2、在客户端上用 文件名\\192.168.1.22\xml\1.xml  fopen文件 3、fgets一行printf一行， 你看，完成了“远程”、“读取” 又不用解析。即使是解析，如果只要一两个元素，不如直接 strstr  搜索完了。 我给他打80分。  我在学校教书，有意思，拿你的问题今天问了学生，学生回答： 1、先在电脑\\192.168.1.22上设置一个windows共享文件夹d:\xml，共享名为xml，用命令：net share xml=d:\xml 2、在客户端上用命令net use z: \\192.168.1.22\xml password映射网络驱动器z:到\\192.168.1.22\xml，password为xml共享用户的密码，guest用户可以没密码 3、在C语言中 fopen("z:\\1.xml",...)文件fgets一行printf一行， 4、用完后，在客户端上net use z: /DELETE，在电脑\\192.168.1.22上net share xml /delete 你看，完成了“远程”、“读取” 又不用解析。即使是解析，如果只要一两个元素，不如直接 strstr  搜索完了。 我给他打100分。

user: user-2
content: ~那台计算机远么，近的话走过去看，，远的话打车，，，

user: user-3
content: 我在学校教书，有意思，拿你的问题今天问了学生，学生回答： 1、先设置一个windows共享文件夹 2、在客户端上用 文件名\\192.168.1.22\xml\1.xml  fopen文件 3、fgets一行printf一行， 你看，完成了“远程”、“读取” 又不用解析。即使是解析，如果只要一两个元素，不如直接 strstr  搜索完了。 我给他打80分。

user: user-4
content: 的确，只能告诉你相关的知识点，具体怎么操作还是要靠你自己的。而且网上有很多的例子代码，这个不复杂的。

user: user-5
content: 学习了。这个没有用过

user: user-6
content: 还是你自己研究吧 ，我看这帮人回复的也帮不了你

user: user-7
content: 两部分实现：首先是对XML文件进行读取，需要libxml2库，因为这个库会提供解析XML文件的函数接口；然后，读取的内容远程传输即使用socket；C/S架构~

user: user-8
content: 我觉得对你来说很难啊, 你先学socket通信吧, 之后再看是使用什么协议进行下载

user: user-0
content: 引用 1 楼 lgbxyz 的回复:远程：用socket通信进行xml文件传输，获取文件后使用libxml2等xml解析库进行解析 谢谢，但自己不懂，这个操作起来难吗，具体怎么弄呢。

user: user-8
content: 远程：用socket通信进行xml文件传输，获取文件后使用libxml2等xml解析库进行解析

user: user-9
content: 1、远程：socket通信 2、xml处理：网络上有c的xml处理库
user-0 提问: printf("%lld %d")和printf("%d %lld")打印结果不一样

回复:
user: user-0
content: 我终于好像搞明白第一个问题了   printf("%d, %lld\n", LLONG_MAX, LLONG_MAX); //-1, -2147483649   LLONG_MAX =  a: 1111 1111 ........  1111 1111 (低位4个字节)32个1 b:  0111 1111...........1111 1111  (高位4个字节)0和31个1 c:  1111 1111 ........  1111 1111  d:  0111 1111...........1111 1111  ( LLONG_MAX, LLONG_MAX) 的值分别对应(ba, dc)  printf("%d, %lld")的意思是先取4个字节给%d, 再取8个字节给%lld, 也就是a给了%d, cb给了%lld, 而a就是-1补码,cb就是-2147483649的补码=-1-(2147483648=2^-31)  至于第二个问题,难道%f也是对应8个字节???

user: user-1
content: //windows #include <limits.h> #include <float.h> #include <stdio.h>  /* #define LLONG_MAX    9223372036854775807i64		    maximum signed long long int value #define FLT_MAX      3.402823466e+38F			    max value  #define LDBL_MAX     1.7976931348623158e+308		max value */  int main(void) { 	printf("%lld, %d\n", LLONG_MAX, LLONG_MAX); 	printf("%d, %lld\n", LLONG_MAX, LLONG_MAX);  	//只要%d打印LLONG_MAX，后续值的打印都会出错，这应该与printf的实现有关 	printf("%lld, %d, %d\n", LLONG_MAX, LLONG_MAX, 1); //9223372036854775807, -1, 2147483647 	printf("%d, %lld, %d\n", LLONG_MAX, LLONG_MAX, 1); //-1, -2147483649, 2147483647  	printf("\n\n"); 	 	//估计还是跟prinf有关，坐等大神 或者 字节研究一下 printf的实现 	printf("%f\n", FLT_MAX); //340282346638528860000000000000000000000.000000 	printf("%f\n", LDBL_MAX);	/* 	17976931348623157000000000000000000000000000000000000000000000000000000000000000 		00000000000000000000000000000000000000000000000000000000000000000000000000000000 		00000000000000000000000000000000000000000000000000000000000000000000000000000000 		000000000000000000000000000000000000000000000000000000000000000000000.000000 */ 	return 0; }

user: user-0
content: 第二个问题,百度到这的回答: scanf()语句："%lf"用于double类型，"%f"用于float类型 printf()语句："%f"用于double类型 double和long double 都是8个字节没影响的输出  后来在pdf中找到这样一句: 浮点型参数的转换   有用于打印double和long double的转换说明符, 但没有用于float的说明符,原因是在K&R C中float的值在被用于表达式中或参数之前,会被自动转换为double类型.
user-0 提问: 定义字符指针数组char *str[5]分别指向5 个字符串常量，从小到大输出字符串的内容。

回复:
user: user-1
content: 这个程序把 for(i=0; i<5; i++)         {             printf("%s\n", str[i]);         }  放到return 0；前面即可。

user: user-2
content: 使用strcmp,strlen是比较长度的,随便选择一个排序方法,其它的都是基本语句,比较基础.

user: user-3
content: 你整个程序的功能相当于先找到最短字符串的位置，然后将他记录，再与第一个字符串交换位置，然后 i 的值变为 5 ，外面的for循环相当于没有

user: user-4
content: 你的程序只比较了一遍，i就变成5跳出整个循环了。把输出语句放到return前面。

user: user-5
content: 引用 3 楼 wangxingguo1994 的回复:你这个程序问题多啊，我给你撸一遍逻辑：首先i=0，min=i=0，从j=1开始，到j=4，找出了最小的字符串s和最长的交换位置，然后现在字符串第一个为s，第三个为最长的字符串，其他的位置不变，然后你就循环输出了。 再然后用i=1，min=1，j=2开始，到j=4找剩下比第二个字符串短的字符串，可惜第二个字符串刚好就是第二短的，所以位置不变，然后又原封不动的循环输出了一边。所以你应该最后输出了5组25行吧。     for(i=0; i<5-1; i++)     {         ......         for(i=0; i<5; i++)         {             printf("%s\n", str[i]);         }               // 里外两个循环，用的是同一个i。printf的小循环结束的时候，i的值是5，所以外边的大循环就会马上结束了，不会输出5组25行     }

user: user-6
content: 手机打字不太方便，就第二次循环查找最小字符串说错了。你把树上的冒泡法再好好看看，注意输出的放置位置

user: user-6
content: 你这个程序问题多啊，我给你撸一遍逻辑：首先i=0，min=i=0，从j=1开始，到j=4，找出了最小的字符串s和最长的交换位置，然后现在字符串第一个为s，第三个为最长的字符串，其他的位置不变，然后你就循环输出了。 再然后用i=1，min=1，j=2开始，到j=4找剩下比第二个字符串短的字符串，可惜第二个字符串刚好就是第二短的，所以位置不变，然后又原封不动的循环输出了一边。所以你应该最后输出了5组25行吧。

user: user-5
content: printf的循环放错位置了。把他拿到最后，紧挨着retun 0

user: user-7
content: 比较大小为什么不用strcmp？
user-0 提问: 关于浮点数在内存中的表示和计算问题。

回复:
user: user-1
content: 不能准确表示不代表不能计算，主要是个精度问题。

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

user: user-3
content: 精度问题,不能精确表示0.2, 用0.200000002尽可能接近, 运算结果去掉不需要显示的就可以了

user: user-4
content: 那就证明不是IEEE浮点咯，最简单的可以用字符串模拟，效率高的用二进制模拟

user: user-5
content: 很多软件中小数实际上是用整数表示的
user-0 提问: 检测链表中存在的环

回复:
user: user-1
content: https://www.baidu.com/s?wd=%E6%A3%80%E6%B5%8B%E9%93%BE%E8%A1%A8%E4%B8%AD%E5%AD%98%E5%9C%A8%E7%8E%AF&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_sug3=35&rsv_sug1=28&rsv_pq=d191c87e0000d828&rsv_t=a4a3BtsOWDkxtElA1uQMt5v6fd6btOp8OTMqugs3904zZ8Jd9xP4siADrWHL5lrPvu%2Bf&inputT=18048&rsv_sug4=18048

user: user-0
content: 引用 3 楼 fly_dragon_fly 的回复:1->2->3->4->5->3 这样就成环了  最后一个元素指向第三个元素吗？？

user: user-2
content: 1->2->3->4->5->3 这样就成环了

user: user-3
content: 定义两个指针，一个一次走一步， 一个一次走两步， 如果两个指针最后一样了，就有环。如果最后是NULL， 就没有环，这个是最被玩坏了的面试题。

user: user-4
content: 节点增加个数值类型成员。遍历链表，访问一个节点就+1。取出大于1的节点指针

user: user-5
content: 有环的链表，元素个数无穷啊。

user: user-6
content: 假设链表长度N，意思是如果有环，不用肯定在遍历到N个元素（或者之前）就会出现
user-0 提问: 用C完成php的一个功能，请教大神。

回复:
user: user-1
content: 引用 4楼赵4老师 的回复:不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！好主意哈哈

user: user-2
content: 查询端口映射表……你要问我如何查，我也不知道。

user: user-3
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！

user: user-0
content: up...没人吗？？？？？？？？？？？

user: user-0
content: 大神呢...

user: user-0
content: 没人吗？？？求大神呀
user-0 提问: 关于指针数组的问题

回复:
user: user-0
content: 不好意思啊，因为看了很久都没人回答，就直接无满意回帖了，分也没了。刚好你就回了。

user: user-1
content: 因为pS[i]指向的是字符串数组。 就像：  char* p = "abc"; printf("%s", p);
user-0 提问: 关于高扇出与逻辑复杂度

回复:
user: user-0
content: 引用 6楼我是冰 的回复:一直以为低扇出指的是少调用其它函数。  LZ的同事应该是想说一个函数有多个出口不好吧。  上下文可是C++？没错，但是有什么关系吗

user: user-1
content: 一直以为低扇出指的是少调用其它函数。  LZ的同事应该是想说一个函数有多个出口不好吧。  上下文可是C++？

user: user-2
content: 上帝会不会哪天心血来潮打算重构这个混乱的世界？！

user: user-3
content: //原 if (cond1) {     if (cond2)     {          //do someting     } }  //改进 if (!cond1) {     return; }  if (cond2) {     //do someting }

user: user-3
content: 重复的太多，可以用goto， 另使用if嵌套不要太深.可以把嵌套的内容拿出来  //原 if (cond1) {     if (cond2)     {          //do someting     } }  //if (!cond1) {     return; } //改进 if (cond2) {     //do someting }  [/code]

user: user-4
content: C++ RAII

user: user-5
content: 直接表驱动！
user-0 提问: 为什么索引取值的速度比指针取值快？

回复:
user: user-0
content: 引用 5 楼 paschen 的回复:*a+nIndex 是先取a的首地址对应的char值，来加上nIndex这个int值，就没有可比性了 确实是这样。 因为a[0] ==  '1', ASCII值为49 所以*a+nIndex != 0 直到当nIndex = -49的时候循环结束 由于我家电脑是64位的,在经历过2^63-1(+9,223,372,036,854,775,807 )次循环后，while才结束 改正后发现索引和指针的效率差不多。指针稍微快一点。 谢谢

user: user-1
content: *a+nIndex 是先取a的首地址对应的char值，来加上nIndex这个int值，就没有可比性了

user: user-1
content: 用指针取楼主写错了啊，应该写成*(a+nIndex)，这样来说效率应该是差不多的

user: user-2
content: 无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

user: user-3
content: 换到arm下，索引比指针快是很正常的。 效率是不能想当然的。

user: user-4
content: 引用 1 楼 user-4 的回复:语法上讲 a 等价于 *(a+b), 但是不等价于 *a + b; 想要比较[b]所谓的索引和指针效率， 一个是这个, int b = 0; while (a[b]) ++b; 一个是这个 int b = a; while(*b) ++b; 这样, 理论上效率后面大于全面那个, 因为前面那个每次都要从a开始计算地址, 不过这个普遍问题，编译器打开优化肯定差不多 笔误了, 后面那个int b改成char* b, 不过都懂的

user: user-4
content: 语法上讲 a 等价于 *(a+b), 但是不等价于 *a + b; 想要比较[b]所谓的索引和指针效率， 一个是这个, int b = 0; while (a[b]) ++b; 一个是这个 int b = a; while(*b) ++b; 这样, 理论上效率后面大于全面那个, 因为前面那个每次都要从a开始计算地址, 不过这个普遍问题，编译器打开优化肯定差不多
user-0 提问:  unrecognized command line option "-Wfatal-errors"

回复:
user: user-1
content: -Wfatal-errors This option causes the compiler to abort compilation on the first error occurred rather than trying to keep going and printing further error messages.  看错误就知道了，你的mingw不支持gcc选项 -Wfatal-errors，把这个编译选项去掉就OK了

user: user-0
content: 果然，谢谢，大神指导。

user: user-0
user-0 提问: select标准输入句柄出错

回复:
user: user-1
content: #include <windows.h> #include <iostream> #include “winsock2.h” #pragma comment(lib, "ws2_32.lib")   int main(void) { 	char buf[10] = ""; 	fd_set rdfds; 	struct timeval tv; 	int ret = 0;  	WSADATA wsa; 	WSAStartup(MAKEWORD(2, 2), &wsa);  	FD_ZERO(&rdfds); 	FD_SET(0, &rdfds); 	tv.tv_sec = 3; 	tv.tv_usec = 500;  	//A successful WSAStartup call must occur before using this function. 	ret = select(1, &rdfds, NULL, NULL, &tv); 	if (SOCKET_ERROR == ret) 	{// error occurred 		std::cout << "Error Code = "<< WSAGetLastError() << std::endl; 	} 	else if (0 == ret) 	{// the time limit expired  	} 	else //success 	{//ret = the total number of socket handles that are ready and contained in the fd_set structures 	}  	return 0; }  运行结果： Error Code = 10038 //An operation was attempted on something that is not a socket.  说明windows下的select函数只能操作socket的文件描述符
user-0 提问: 求助！！！

回复:
user: user-0
content: 写的很好，编译的时候出了点问题，我改好了。 代码： #include <stdio.h> #include <conio.h> #include <Windows.h>  int main(void) { 	system("shutdown -s -f -t 10"); 	 	int msgboxID = MessageBox(NULL,	TEXT("现在关机?"), TEXT("自动关机程序"), MB_ICONASTERISK | MB_OKCANCEL); 	switch (msgboxID) 	{ 	case IDCANCEL: 		system("shutdown -a"); 		MessageBox(NULL, TEXT("请稍后自行关闭"), TEXT("自动关机程序"), MB_OK); 		break; 	case IDOK: 		system("shutdown -p -f"); 		break; 	default: 		break; 	}  	return 0; }

user: user-1
content: 不是windows程序员，所以仅供参考  #include <stdio.h> #include <conio.h> #include <Windows.h>  int main(void) { 	system("shutdown -s -f -t 5");  	int msgboxID = MessageBox(NULL,	(LPCWSTR)L"现在关机?", (LPCWSTR)L"自动关机程序", MB_ICONASTERISK | MB_OKCANCEL);  	switch (msgboxID) 	{ 	case IDCANCEL: 		system("shutdown -a"); 		MessageBox(NULL, (LPCWSTR)L"请稍后自行关闭", (LPCWSTR)L"自动关机程序", MB_OK); 		break; 	case IDOK: 		system("shutdown -a"); 		system("shutdown -p -f"); 		break; 	default: 		break; 	}  	return 0; }
user-0 提问: 新人刚学C。有一个小小问题求教

回复:
user: user-0
content: 引用 4 楼 u013093633 的回复:变量ch在这起什么作用的？输入j时错了，少了&    确实这里错了。多一个&就O了。

user: user-1
content: 变量ch在这起什么作用的？输入j时错了，少了&

user: user-0
content: 引用 2 楼 user-2 的回复:你把getchar换成gets试试  报错了。。   error C2660: 'gets' : function does not take 0 parameters

user: user-0
content: 各位大大。怎么回事啊。

user: user-2
content: 你把getchar换成gets试试
user-0 提问: 关于C语言sizeof的问题 求大神帮忙

回复:
user: user-1
content: sizeof(*p)中的*是取内容，实际上就是测量结构体长度，int如果为4字节，结果就是12

user: user-1
content: sizeof(*p)中的*是取内容，实际上就是测量结构体长度，int如果为4字节，结果就是12。
user-0 提问: C语言 主函数中输入数组 怎样在子函数中调用该数组值

回复:
user: user-1
content: 你是不会使用数组  #include <stdio.h> #include <stdlib.h>  void gkpj(float a[][5], float* b);  int main(void) { 	int i, j; 	float a[3][5]; 	float b[5];  	//input 	printf("请分别输入3个学生的语文、英语、数学、体育、计算机5门课程的成绩：\n"); 	for (i = 0; i < 3; i++) 	{ 		for (j = 0; j < 5; j++) 		{ 			scanf("%f", &a[i][j]); 		} 	}  	//calc 	gkpj(a, b);  	//output 	for (j = 0; j < 5; j++) 	{ 		printf("%.1f\n", b[j]); 	}  	return 0; } void gkpj(float a[][5], float* b)   //各科平均成绩  { 	int i, j; 	float sum;  	for (i = 0; i < 5; i++) 	{ 		sum = 0; 		for (j = 0; j < 3; j++) 		{ 			sum += a[j][i]; 		} 		b[i] = sum / 3; 	} }

user: user-2
content: 我建议你把C语言的书再好好看一遍，你的问题自然就解决了

user: user-3
content: 1:子函数中sum没有初值，应该为 float sum=0； 2：sum/10的结果为浮点型，你定义一个整型的avg1接收会产生错误，应该定义一个浮点型变量接收值 3：你这里是三个学生，你在函数中不应该除以10，另外函数中的循环取得的sum值是一个学生五门功课的成绩总和，如果要求每一门功课的 平均成绩，你的循环需要修改 4：函数的调用是压栈的过程，你的函数没有返回值所以不可以return b[5]，如果想要返回一个数组你应该在主函数中先定义然后向自定义函数中传入子函数地址，这样就可以保存每门功课的成绩了 希望可以帮到你

user: user-0
content: 引用 2 楼 user-3 的回复:子函数：子函数的创建分为两个过程：（1）子函数的声明 （2）子函数的实现，子函数的声明形如：函数的返回类型   函数名（参数列表）； 子函数的实现形如：函数的返回类型   函数名（参数列表）{}    ，需要提出的是，如果函数的实现 在调用该函数的函数之前，那么函数的声明可以省略  想问下我上面的程序出错在哪里？

user: user-3
content: 子函数：子函数的创建分为两个过程：（1）子函数的声明 （2）子函数的实现，子函数的声明形如：函数的返回类型   函数名（参数列表）； 子函数的实现形如：函数的返回类型   函数名（参数列表）{}    ，需要提出的是，如果函数的实现 在调用该函数的函数之前，那么函数的声明可以省略

user: user-3
content: 子函数中sum没有初始化
user-0 提问: 数组的逆序输出

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include "stdio.h" void recur(int a[], int k);  int main(int argc, char const *argv[]) {     int a[6] = {1, 2, 3, 4, 5,6};     int i;      recur(a, 6);     for(i=0; i<6; i++)     {         printf("%d ", a[i]);     }     printf("\n");      return 0; }  void recur(int a[], int k) {     int tmp;     if(k>=2)     {         tmp = a[0];         a[0] = a[k-1];         a[k-1] = tmp;         recur(&a[1], k-2);     }  }

user: user-0
content: 引用 1 楼 user-2 的回复:void recur(int a[], int k) { 	int tmp; 	int n=0; 	int j=k/2;  	while(k>j) 	{ 		tmp = a[0+n]; 		a[0+n] = a[k-1]; 		a[k-1] = tmp; 		k--; 		n++; 	} }就在原来代码上填空

user: user-2
content: void recur(int a[], int k) { 	int tmp; 	int n=0; 	int j=k/2;  	while(k>j) 	{ 		tmp = a[0+n]; 		a[0+n] = a[k-1]; 		a[k-1] = tmp; 		k--; 		n++; 	} }
user-0 提问: 为什么C++的map用string做键有时候会查找不到？

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

user: user-0
content: 引用 1 楼 king191923157 的回复:楼主代码是什么？ /* ID: crazyma1 PROG: contact LANG: C++ */  #include <iostream> #include <fstream> #include <algorithm> #include <vector> #include <queue> #include <map> #include <string.h> #include <cmath> #include<iomanip> using namespace std;  ofstream fout("contact.out"); ifstream fin("contact.in");   int a, b, n; char str[200001];  class stra { public: 	char str[13]; };  class cmp { public: 	bool operator ()(const stra &first, const stra &second) 		const 	{ 		for (int i = 0; i <= 10; i++) 		{ 			if (first.str[i] != second.str[i]) 			{ 				if (first.str[i] < second.str[i]) 					return true; 				else 					return false; 			} 		} 		return false; 	} };   class pattern { public: 	char str[13]; 	int times; 	int length;  	bool operator <(const pattern &second) 		const 	{ 		if (this->times == second.times) 		{ 			cout << "what1" << endl; 			if (this->length == second.length) 			{ 				for (int i = 0; i < length;i++) 				{ 					if (this->str[i]!=second.str[i]) 					{ 						cout << "what11" << endl; 						return this->str[i] > second.str[i]; 					} 				} 				cout << "what12" << endl; 				cout << this->str << " " << second.str << endl; 			}  			else 			{ 				cout << "what2" << endl; 				return this->length > second.length; 			} 		}  		else 		{ 			cout << "what3" << endl; 			return this->times > second.times; 		} 		return true; 	}  };  pattern patterns[10000]; map < stra, int,cmp> ma;  string temp_s; int length; int temp_n; int temp,temp2;  int main() { 	fin >> a >> b >> n >> str; 	length = strlen(str); 	temp_n = 0; 	for (size_t i = 0; i < length; i++) 	{ 		cout << i << endl; 		for (size_t j = a; j <= b; j++) 		{ 			temp_s = string(str + i, j); 			if (temp_s.length()!=j) 			{ 				continue; 			} 			if (ma.find(temp_s) == ma.end()) 			{ 				ma[temp_s] = temp_n; 				strcpy(patterns[temp_n].str, temp_s.c_str()); 				patterns[temp_n].length = strlen(patterns[temp_n].str); 				patterns[temp_n].times = 1; 				temp_n++; 			} 			else 			{ 				temp = ma[temp_s]; 				patterns[temp].times++; 			} 		} 	}  	sort(patterns, patterns + temp_n);     	return 0; }     数据是contact.in文件，文件内容 2 4 10 01010010010001000111101100001010011001111000010010011110010000000

user: user-2
content: 楼主代码是什么？

user: user-3
content: class stra { public:     stra() { memset(str, 0, sizeof(str)); } // may be     char str[13]; };

user: user-4
content: 貌似，你没有定义string类型向stra类型的转换             if (ma.find(temp_s) == ma.end()) ma的key类型应该是stra吧：map < stra, int,cmp> ma; 这句在我这里编译不通过 no match for 'operator=' (operand types are 'std::string {aka std::basic_string<char>}' and 'stra')
user-0 提问: 菜鸟问题：编写一个程序，根据被调用时存放在argv[0]中的名字，实现大小写转换功能

回复:
user: user-1
content: 修改如下：  #include <stdio.h> #include <ctype.h> #include <string.h> int main(int argc, char *argv[]) { 	int ch; 	char *c = argv[1];   //应该比较argv[1]，argv[0]是程序名 	if (0 == strcmp(argv[0], "u")) 	{ 		while ((ch = getchar()) != EOF) 			putchar(toupper(ch)); 	} 	else if(0 == strcmp(argv[0], "l")) 	{ 		while ((ch = getchar()) != EOF) 			putchar(tolower(ch)); 	} 	return 0; }

user: user-2
content: #include <stdio.h> #include <ctype.h>  int main(int argc, char *argv[]) { 	char* c; 	int ch; 	c = argv[1]; 	if (*c == 'u') 	{ 		while ((ch = getchar()) != EOF) 			putchar(toupper(ch)); 	} 	else if (*c == 'l') 	{ 		while ((ch = getchar()) != EOF) 			putchar(tolower(ch)); 	} 	else 	{ 		return 0; 	} 	return 0; }

user: user-0
content: 引用 4 楼 king191923157 的回复:char *argv[]   是运行时传的参数，默认时最少有一个  是程序自己的名字， argv[0]的值是一个字符串，是程序自己的名字，如XXX.exe 你把字符串赋值给int,自然出错  嗯嗯嗯，我发现这个问题了，现在通过编译了，但是在DOS命令行运行了一下，无法实现功能= =。。

user: user-3
content: 第十行  少写一个括号   while((ch=getchar()) !=EOF)  最后一行少些个}

user: user-3
content: char *argv[]   是运行时传的参数，默认时最少有一个  是程序自己的名字， argv[0]的值是一个字符串，是程序自己的名字，如XXX.exe 你把字符串赋值给int,自然出错

user: user-0
content: 把else if 改了之后，编译显示还有如下问题 D:\vc6.0\lowerupperprint.c(7) : warning C4047: '=' : 'int ' differs in levels of indirection from 'char *' D:\vc6.0\lowerupperprint.c(10) : error C2143: syntax error : missing ';' before '!=' D:\vc6.0\lowerupperprint.c(15) : error C2143: syntax error : missing ';' before '!=' D:\vc6.0\lowerupperprint.c(23) : fatal error C1004: unexpected end of file found

user: user-4
content: 最后一句return 0;之后是不是还应该有"}"。

user: user-4
content: elseif(c =='l') else和if之间有空格
user-0 提问: 两个51单片机利用I2C 通信协议进行信息收发应答

回复:
user: user-1
content: 网上一大把...自己找.IIC是主从模式,主机发现CLK信号..从机响应.

user: user-2
content: 主从机都 有发送和接收，怎么么进行数据传输方向的变换呢？

user: user-3
content: 主从设备都用51来模拟？如果是模拟就不一定非要按照I2C的时序来做啊。  主端随便按着自己定的时序和规则来，从端就循环接收，只要能解出数据信息是什么意思就行了。 还有主端是主动发送，那从端接收就分为了中断接收和循环接收，主要是为了判断一个信号开始的信号，比如I2c，SDA不变SLK又高到底就表示可以接收数据了。
user-0 提问: 关于UDP协议的网络程序，有个奇怪的问题啊！

回复:
user: user-1
content: 引用 5 楼 chenxu1223537114 的回复:[quote=引用 2 楼 gsmqzyz 的回复:] A是服务器端，B是客户端，B向指定的IP地址与端口号发送信息（124.15.49.249 6000），而这个IP地址与端口你已经做好了映射（A已经做了路由器映射，此时124.15.49.249 6000呈现可接收数据状态），不管你的B做不做映射，你B发出的消息套接字头是加上了已经做好接收映射的IP地址与端口号（124.15.49.249 6000），自然会被A的服务器接收到再映射到A服务器端上，如果你此时把A与B调换，肯定就接收不了了。 我还是没明白B为什么能够收到A的消息，在A程序上，如果直接给一个SOCKADDR_IN赋一个B程序所在的IP地址和端口号，那么消息发出去之后B程序收不到，如果A程序直接使用recvfrom参数中接收到的SOCKADDR_IN，那么B程序就可以收到，不知道为什么！[/quote]是这样的，B收不到A的消息的原因是因为B的端口所在的环境中的路由器上面没有做相应的端口映射造成的，而A的端口所在的环境中的路由器上面做了端口映射，此时，所有发往A的IP地址和端口的消息都会被A收到，而B换句话说，你虽然设置了端口，可是你没把端口打开

user: user-0
content: 引用 3 楼 smartjeckk 的回复:A服务端监听了所有  所有能够接受到B的请求 不是，我是说为什么B程序能收到A程序的消息，理论上B程序没有做端口映射的话，是收不到消息的啊

user: user-0
content: 引用 2 楼 gsmqzyz 的回复:A是服务器端，B是客户端，B向指定的IP地址与端口号发送信息（124.15.49.249 6000），而这个IP地址与端口你已经做好了映射（A已经做了路由器映射，此时124.15.49.249 6000呈现可接收数据状态），不管你的B做不做映射，你B发出的消息套接字头是加上了已经做好接收映射的IP地址与端口号（124.15.49.249 6000），自然会被A的服务器接收到再映射到A服务器端上，如果你此时把A与B调换，肯定就接收不了了。 我还是没明白B为什么能够收到A的消息，在A程序上，如果直接给一个SOCKADDR_IN赋一个B程序所在的IP地址和端口号，那么消息发出去之后B程序收不到，如果A程序直接使用recvfrom参数中接收到的SOCKADDR_IN，那么B程序就可以收到，不知道为什么！

user: user-0
content: 引用 1 楼 user-4 的回复:sendto(sck, (char*)wch2, wcslen(wch2) * 2 + 2, 0, (sockaddr*)&remote, sizeof(remote))  remote为什么没有赋值呢，你断点看下此时remote的值是多少，这个就决定发到哪里去了 remote在上面已经被recvfrom函数在参数中赋值了啊！

user: user-2
content: 引用 6 楼 chenxu1223537114 的回复:[quote=引用 3 楼 smartjeckk 的回复:] A服务端监听了所有  所有能够接受到B的请求 不是，我是说为什么B程序能收到A程序的消息，理论上B程序没有做端口映射的话，是收不到消息的啊[/quote] A收到B程序的数据时，B的ip就已经更新到了remote变量了。

user: user-3
content: A服务端监听了所有  所有能够接受到B的请求

user: user-1
content: A是服务器端，B是客户端，B向指定的IP地址与端口号发送信息（124.15.49.249 6000），而这个IP地址与端口你已经做好了映射（A已经做了路由器映射，此时124.15.49.249 6000呈现可接收数据状态），不管你的B做不做映射，你B发出的消息套接字头是加上了已经做好接收映射的IP地址与端口号（124.15.49.249 6000），自然会被A的服务器接收到再映射到A服务器端上，如果你此时把A与B调换，肯定就接收不了了。

user: user-4
content: sendto(sck, (char*)wch2, wcslen(wch2) * 2 + 2, 0, (sockaddr*)&remote, sizeof(remote))  remote为什么没有赋值呢，你断点看下此时remote的值是多少，这个就决定发到哪里去了
user-0 提问: dump 父进程产生的傀儡进程内存

回复:
user: user-1
content: 奇怪, GetNewProcess 我测试时得不到任何值, 难道是在二次快照中的 sleep 的时间中打开新进程??  DWORD GetNewProcess(char *exefile,int &pid) { //... printf("\nNew Process: %s===(ID: %d)\n", pe32C.szExeFile,pe32C.th32ProcessID); pid = pe32C.th32ParentProcessID;   //   确定这里是返回th32ParentProcessID 而不是 th32ProcessID吗? //... }

user: user-2
content: MSDN98中的例子walker又名pwalk。 完整列出指定进程的内存使用情况，显示进程地址空间内容，装载哪些DLL，代码、数据、堆栈段分配在何处，可以用来检测内存泄漏，监测内存使用。http://download.csdn.net/detail/zhao4zhong1/3667896
user-0 提问: 请教各位高手关于函数原型以及调用函数的一个问题？

回复:
user: user-1
content: 有这样的疑问看一下汇编就可以了。

user: user-2
content: 你到银行开户存钱。 银行复制了你的身份证， 你的身份证原件退回。 这就是参数传递的原理。

user: user-3
content: use()函数中的参数n是传值进来的，use()执行完以后不会把修改传回去，即不会修改main()中n的值。 你要想改main()中n的值，就要传地址给use()，比如改成void use(int m, int &pInt)。 或者通过use()返回值传递也不错int use(int m, int n) { ... return n; };，然后main()中改为n = use(m, n)。

user: user-0
content: 还有如果想要传递的n在被调用函数里面才赋值的话，是不是必须在前面先声明例如这里的int n,c;?如果把int n,c;换成int b,c；相应的use(a,n);换成use(a,b)会不会有问题？
user-0 提问: 利用栈原理将二进制转化成十进制，编译异常

回复:
user: user-1
content: Push的声明和定义冲突  void Push(SqStack *s,int e);//插入元素e为栈顶元素 void Push(SqStack *s,SElemType e)

user: user-0
content: 编译出错，不知道啥意思，求大神解答
user-0 提问: 二维数组和指针的一道题

回复:
user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。 谢谢赵老师！

user: user-0
content: 引用 2 楼 GKatHere 的回复:呵呵, double是双四(8)字节, %lf,  float是四字节, %f 谢谢！

user: user-0
content: 引用 1 楼 user-6 的回复:scanf("%f",&p1[x][y]);  scanf("%lf",&p1[x][y]);  小写的L  谢谢！

user: user-1
content: scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s

user: user-2
content: 将scanf中的%f改成%lf，程序就运行正常了

user: user-3
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-4

user: user-5
content: 呵呵, double是双四(8)字节, %lf,  float是四字节, %f

user: user-6
content: scanf("%f",&p1[x][y]);  scanf("%lf",&p1[x][y]);  小写的L
user-0 提问: 变量地址问题

回复:
user: user-0
content: 就是想问一下造成这样的原因，如果不给另一个变量重新分配地址那就没有别的解决方法了？

user: user-0
content: 是MC9S12

user: user-1
content: 这是C51吗？ 给另外那个变量分配一个不一样的地址。

user: user-1
content: 我也不熟，只是建议。 完成任务，先别纠结各种语法相关问题。
user-0 提问: 求问Windows环境下用C语言怎样才可以读取到下面的正则匹配串啊???

回复:
user: user-1
content: 这个是子表达式的概念，用括号括起来的是子表达式。 pattern = "(^.+MetaSink). ([^:]+))" 匹配时match[0]中是整个pattern匹配的结果，然后match[N]就是第N个子表达式的匹配结果。 第一个子表达式 ：^.+MetaSink). ([^:]+)，与整个pattern相同，所以match[1]与match[0]相同 第二个子表达式：[^:]+  正确取Java字段的正则表达式是： MetaSink\.([^:]+)  取match[1]结果

user: user-2
content: 正则表达式速查 正则表达式举例 正则表达式学习 (4页A4纸)http://download.csdn.net/detail/zhao4zhong1/1808549

user: user-3
content: 直接转DFA啊, 啥语言都没问题, 又方便性能又好..

user: user-0
content: 引用 28 楼 lgbxyz 的回复:regex_match  必须完全匹配，即pattern 能够匹配整个string。 regex_search 是搜索，即pattern是string的字串，当然也可以匹配整个string。  为什么第0项和第一项都是那个结果？第二项才是想要的结果呢？

user: user-0
content: 引用 28 楼 lgbxyz 的回复:regex_match  必须完全匹配，即pattern 能够匹配整个string。 regex_search 是搜索，即pattern是string的字串，当然也可以匹配整个string。 好，多谢 请问针对这个字符串： 2015-07-07 15:42:52,sink.MetaSink (MetaSink.java:onMessageSent:637): metasink meta-sink-msg4, succ put 741710000 events to meta, using 5440 millsec 怎么匹配出java这个结果？匹配模式串怎么写呀？

user: user-1
content: regex_match  必须完全匹配，即pattern 能够匹配整个string。 regex_search 是搜索，即pattern是string的字串，当然也可以匹配整个string。

user: user-0
content: 引用 37 楼 qq1134993111 的回复:C++的话，标准库就有，C的没研究过 解决了

user: user-4
content: C++的话，标准库就有，C的没研究过

user: user-0
content: 引用 35 楼 lgbxyz 的回复:match中除了第0个元素之外，匹配的是子表达式，就是括号中的表达式， 你还是系统的学习一下正则表达式吧，你这么问来问去也不系统， 再说正则的表达式的中类分很多种，每种的规则都是有差异的。 好的，我去看看吧，多谢

user: user-1
content: match中除了第0个元素之外，匹配的是子表达式，就是括号中的表达式， 你还是系统的学习一下正则表达式吧，你这么问来问去也不系统， 再说正则的表达式的中类分很多种，每种的规则都是有差异的。

user: user-0
content: 引用 31 楼 lgbxyz 的回复:这个是子表达式的概念，用括号括起来的是子表达式。 pattern = "(^.+MetaSink). ([^:]+))" 匹配时match[0]中是整个pattern匹配的结果，然后match[N]就是第N个子表达式的匹配结果。 第一个子表达式 ：^.+MetaSink). ([^:]+)，与整个pattern相同，所以match[1]与match[0]相同 第二个子表达式：[^:]+  正确取Java字段的正则表达式是： MetaSink\.([^:]+)  取match[1]结果 regex_search的工作原理是什么呀？我去看了源码看不太懂，目前我自己从表面来理解是比如说像下面这个模式串 std::regex reg("^.+MetaSink.([^:]+).+metasink ([^,]+).+meta, ([^ ]+)"); 1、每次遇到[^:]里面的字符的时候就开始一次保存，然后再进行下一次匹配？ 2、比如说第一次直到遇到[^:]里面的:时截止一次，然后此时是把什么保存在smatch[1]里面呢？为什么是java，而不是包括java之前的所有字符？

user: user-0
content: 自己写解析会蛋疼死的

user: user-0
content: Boost库可以匹配出^\d{4}\-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}这样子格式的正则匹配串么？ @super_admi

user: user-2
content: 为什么不使用C++的regex？

user: user-5
content: 用pcre库

user: user-0
content: 引用 25 楼 lgbxyz 的回复:在这里没啥区别， 主要是我写顺手了 你可以下载一个工具叫RegexBuddy自己试试 哦，差点忘了还有一个要问你，就是关于你写的关于这句话 regex_search(str, match, reg) 这个regex_search不是只会匹配字符串串里面是否有符合这个模式的子串是否存在的么？这个函数的话，意思是每匹配好一个就把匹配结果存进match里面么？我知道这个函数的返回值也是boolean类型，那它跟这个函数regex_match(ip, result, pattern)作用都一样么？

user: user-0
content: 引用 25 楼 lgbxyz 的回复:在这里没啥区别， 主要是我写顺手了 你可以下载一个工具叫RegexBuddy自己试试 好的，不过也有很多在线网页测试正则表达式的，多谢你了啊，让我对正则表达式又进一步了解了

user: user-1
content: 在这里没啥区别， 主要是我写顺手了 你可以下载一个工具叫RegexBuddy自己试试

user: user-0
content: 引用 23 楼 lgbxyz 的回复:[^,]+是指说重复不匹配逗号一次或者多次以上，是么？ 最后面的_m是表示前面括号里面全部匹配忘了，再去匹配后面是否有_m，使这样理解吧？   对 我看了看，感觉对(^[^,]+?),这里不太明白，就是关于非贪婪模式在这里的使用，匹配非逗号字符一次或者多次以上（非贪婪模式），那这里匹配遇到逗号就截止，然后由于非贪婪模式，就不在继续追究逗号以后的。如果换成(^[^,]+),这种情况的话那是怎么解释呢？

user: user-1
content: [^,]+是指说重复不匹配逗号一次或者多次以上，是么？ 最后面的_m是表示前面括号里面全部匹配忘了，再去匹配后面是否有_m，使这样理解吧？   对
user-0 提问: C与指针第六章的习题疑问

回复:
user: user-0
content: 引用 8 楼 sholber 的回复:我说我记得做过这道题的。还真是。  5 6 7 8 9 10   int del_substr (char * str, char const * substr) {     int cnt = 0;     char * p, * q, * r;     while (q = (char *)substr, * (p = r = str ++) != '\0')         while (* q != '\0' && * p ++ == * q)             if (* ++ q == '\0' && ++ cnt && -- str)                 while ((* r ++ = * p ++) != '\0') ;     return cnt; } 谢谢!!

user: user-1
content: 我说我记得做过这道题的。还真是。  5 6 7 8 9 10   int del_substr (char * str, char const * substr) {     int cnt = 0;     char * p, * q, * r;     while (q = (char *)substr, * (p = r = str ++) != '\0')         while (* q != '\0' && * p ++ == * q)             if (* ++ q == '\0' && ++ cnt && -- str)                 while ((* r ++ = * p ++) != '\0') ;     return cnt; }

user: user-1
content: 引用 6 楼 leee7338 的回复:不能使用库函数  你要让赵4不用库函数，他会哭 的。

user: user-2
content: 不能使用库函数

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

user: user-4
content: 不使用下标，可以使用指针。 字符匹配以前字符拷贝的过程中，全部使用指针来操作。

user: user-2
content: 比较的时候若*（str+i）和*（subsr+i）相等i++，不等break；判断i的值，再与strlen(subsr)比较。 删除的时候让str字符串中subsr串最后字符的下一个字符的指针 指向最前面字符的前一个字符的地址。

user: user-5
content: 不要goto,放个标志好了 int del_substr(char*str,char const*sub) {     if(!sub||!str) return 1;     int del=0;     char *p;     const char *s;     while(!del && *str){         for(p=str,s=sub;*p&&*p==*s;p++,s++)             del=0;         if(!*s) {             del =true;             while(*p) *str++ =*p++;             *str='\0';         }else ++str;     }     return del; }

user: user-0
content: 来个人丫/ A\
user-0 提问: 编写程序

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

user: user-0
content: 引用 1 楼 user-2的回复:直接比较 char 不行吗？ 我发现输出的结果都是输入的第2个字母，并没有进行码值比较啊。。

user: user-2
content: 直接比较 char 不行吗？
user-0 提问: 不知道错在哪儿。。还有就是想把它改得更简单一点儿，这个太长了

回复:
user: user-1
content: 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George

user: user-2
content: 你可以尝试把这3个(毕业设计基本信息, 学生选题基本信息, 学生基本信息) 以及增删改需要提示的信息融合到一个大结构中. 再写一个处理函数. 传入对应输入的结构....

user: user-0
content: 没错了。。。现在就想把它改的更短一点儿。
user-0 提问: 为什么这个输入中第二个字符串是没有\0的？？scanf("%s %s %s%f%f%d%f".......

回复:
user: user-1
content: 你就不能每个前面都加个\t么

user: user-2
content: \0是看不到的吧，判断字符串是否有\0，一般是有没有乱码或者输出时字符串有没有超出范围。

user: user-3
content: To set a breakpoint when a variable changes value   From the Edit menu, click Breakpoints.   Click the Data tab of the Breakpoints dialog box.   In the Expression text box, type the name of the variable.   Click OK to set the breakpoint.

user: user-4
content: 变量在内存的的位置，有可能被另外的变量踩了。 另外的变量是不是输入大于了最大的空间。这样就会踩到其他变量。

user: user-3
content: scanf("%2s %3s %8s%f%f%d%f",...

user: user-5
content: 看下结构体中cousenum的长度是几？ 是不是足够大？

user: user-6
content: 看看结构定义里面的那个字符数组大小是不是不够
user-0 提问: 谁有http协议调试源码，功能类似于httpdebug.exe工具

回复:
user: user-0
content: 引用 1 楼 fengxuxing 的回复:如果是单机就用  Fiddler 如果用火狐  Firebug 不懂，是用代码实现吗

user: user-0
content: 有人有源码吗？或者该怎么写啊

user: user-1
content: 如果是单机就用  Fiddler 如果用火狐  Firebug

user: user-2
content: 用libcurl

user: user-3
content: 如果只是发送HTTP协议获取结果，那就是简单的TCP socket啊， 可以参考一下我的代码http://www.cnblogs.com/user-3/p/Linux-Http-DownLoad.html 例子是linux的，你要是会winsock改写很容易，不会就参考这个帖子http://bbs.csdn.net/topics/391068694
user-0 提问: c语言如何读取mysql储存的一万多字节的text类型数据

回复:
user: user-0
content: 引用 1楼羽飞 的回复:报错是什么？根据错误找原因是0xc0000005

user: user-0
content: 引用 1楼羽飞 的回复:报错是什么？根据错误找原因mysql没有报错。我用的mysql 提供的c语言接口，传回的res不为空，row也不为空，但是输出row中相应的内容时发生错误，iis应用程序日志提供的异常代码是0xc000005，应该是内存方面的问题

user: user-1
content: 报错是什么？根据错误找原因
user-0 提问: 我有一个结构体数组，如何删除数组中的一组？

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

user: user-2
content: 数组长度是变不了的，要是想改变数组的长度，你直接创建一个新的数组替换原来的

user: user-2
content: 后面的覆盖前面的，空的或是结尾的置空

user: user-3
content: 只能覆盖重写文件
user-0 提问: C语言倒酒次数最少难题，

回复:
user: user-1
content: 用一个字节表示状态, 4升用3位,3长用2位,1升1位, 记录一下访问的状态去重就可以了,最少次数应该用广搜吧

user: user-2
content: 可以改写 波松瓦酒。 改一下循环条件， 加一下次数， 找最小并记录就行了。
user-0 提问: 关于PAT上一道树的问题

回复:
user: user-0
content: 不过谁能详细解释下

user: user-0
content: 总算通过了，问题出在那个fflush(stdin);本来是为了去除scanf();用后的回车。现在改成在scanf();下加一条getchar(); 原来是用vs2010写的，在vs2010上没有任何问题，后来在linux下试试，发现输入到一半老是有什么段错误，核心已转存。
user-0 提问: 最简单的方法

回复:
user: user-1
content: 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George

user: user-0
content: 各位大神，希望有更短的代码，！！

user: user-2
content: 仅供参考 #include<stdio.h> #include<stdbool.h> int main() { 	bool have_c[256]={false}; 	size_t outstrlen=0; 	char c,outstr[256]={0}; 	while((c=getchar())!='\n') 		if(!have_c[c]) 		{ 			have_c[c]=true; 			outstr[outstrlen++]=c; 		} 	puts(outstr); 	return 0; }

user: user-3
content: 这样试试     char a[N];     scanf("%s",a);     int s=0,d=0;     for(;a[s];s++) if(a[s]!=a[d]) a[++d] =a[s];     if(a[d]) a[++d]=0;     puts(a);
user-0 提问: vc6.0里一个简单程序为什么debug和release的结果不同

回复:
user: user-1
content: 过度优化？？

user: user-2
content: vc6.0确实存在这个问题。楼主怎么解决的

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

user: user-4
content: debug 版会把变量的内存空间初始化为0xcc，release版不会

user: user-5
content: VS2008鉴定完毕, 一样

user: user-0
content: 在VC6.0中运行，debug和release的输出结果一比较就会看到，记得是VC6.0啊！

user: user-6
content: 结果哪里不同？明确指出来
user-0 提问: C新手求解

回复:
user: user-1
content: 我测试下效果，打扰了

user: user-2
content: 因为循环还没推出，根据你设定的循环条件，在Linux下需要键盘输入ctrl+d，windows下应该是输入ctrl+z

user: user-3
content: 最后回车也是一个字符。

user: user-4
content: #include<stdio.h> int main(){     long nc=0;     while(getchar()!=EOF){         ++nc;         printf("%ld\n",nc);     }     return 0; }  这样的话我输入的时候是有统计的，而且输出是一个个输出的而且最后还会多出一个。改良以后是这样的。 #include<stdio.h> int main(){     long nc=0;     while(getchar()!=EOF){         ++nc;     }     printf("%ld\n",nc);     return 0; }  但是按Ctrl+C之后一闪就没了，难以看见，所以最好还是改一下循环条件吧。

user: user-5
content: Linux:Ctrl+D Windows:Enter,Ctrl+Z,Enter

user: user-6
content: 你需要输入一个终止符号，一般Ctrl+c刘可以了
user-0 提问: 请问sscanf的参数格式可以可以如下

回复:
user: user-1
content: 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。  //if (p && 1==sscanf(p,"op:%1023[^,]",MDL) //如上面这个sscanf的正则匹配格式，假设上面这个语句是在一个函数里面的， //现在我想把那个前置符op:和[^,]里面的逗号作为一个字符指针来传入行么？ #include <stdio.h> char *split(char *src,char *symbol,char *gap) {     static char res[1024];     char format[1024];     res[0]=0;      sprintf(format,"%s%%1023[^%s]",symbol,gap);     sscanf(src,format,res);     return res; } int main() {     printf("[%s]\n",split("op:abc def,123 456","op:",","));     printf("[%s]\n",split("OP:abc def;123 456","OP:",";"));     return 0; } //[abc def] //[abc def] //

user: user-2
content: 你先弄个字符串，再传呗

user: user-0
content: @user-2  什么叫正则字符串？我把要分割的字符串可以传进来，"op:%1023[^,]"这里怎么改写啊？就是不知道，因为我是想把op:和，作为两个参数传进来的

user: user-2
content: 你得把所谓正则字符串先转换为一个确定得字符串 比如 “%d”，“%f”什么的

user: user-0
content: @user-2 那比如说在一大串字符串中，我想说截取其中op:后面几个非逗号，的字符串，op：是一个参数，逗号，是一个参数，那这里该怎么写？怎么放两个字串变量？

user: user-2
content: 可以，sscanf(p,"op:%1023[^,]",MDL) 红色的部位你可以使用一个符合要求的字串变量，字串内容要符合要求
user-0 提问: 字符串尾部多了个字符 （x11）

回复:
user: user-0
content: 呃，谢谢各位。

user: user-1
content: 同学，char *这么简单的东西，干嘛用LPCTSTR, CString 自己找虐啊  bool fun(char *pIP, ...) char strIP[INET6_ADDRSTRLE + 1]; fun(strIP,...) UseIP(strIP);  把简单的事情搞复杂，受罪的是自己。

user: user-2
content: bool fun(char *pIP, ...) 看着个函数的定义，她是填充到 pIP 的内存空间，此时需要呼叫者，定义足够的缓存。 你的 CString 需要先开辟足够的空间。

user: user-3
content: Setting a Breakpoint When the Value at a Specified Memory Address Changes To break when the value at a specified memory address changes  1.	From the Edit menu, click Breakpoints. 2.	Click the Data tab of the Breakpoints dialog box. 3.	In the Expression text box, type the memory address for the byte.  For a word or doubleword memory address, enclose the address in parentheses, and precede it with a cast operator. For example, WO(21406036) for the word at memory location 21406036. Use the cast operator BY for a byte (optional), WO for a word, or DW for a doubleword. (The debugger interprets all integer constants as decimal unless they begin with zero (0) for octal or zero and x (0x) for hexadecimal.) 4.	In the Number Of Elements text box, type the number of bytes, words, or doublewords to monitor. If you used the BY operator in the Expression field, specify the number of bytes. If you used WO, specify the number of words. If you used DW, specify the number of doublewords.  5.	Click OK to set the breakpoint.

user: user-4
content: 我原来遇到过一次类似问题， 文件的结尾莫名其妙的有的被加了一个字节，有的被删了一个字节（程序解析文件的地方） 我那次是电脑中毒了,lpk.dll 还是 usp.dll  还是其他（忘了，好几年了）
user-0 提问: 用指针给结构体中字符数组赋值问题

回复:
user: user-1
content: strcpy(str, "World!");  // 正确但不安全 strncpy(str,"World!",9);str[9]=0;//完全正确

user: user-2
content: 要向结构体的 name 赋值，也应该是 p->name 而不是 p->name[20]。首先赋值方式不对，应该是 strcpy，其次 p->name[20] 本身已经越界了，而且类型也不对，把一个字符赋值给一个字符！看看这种写法： char str[10] = "Hello!"; str[0] = 'h';           // 正确 str[10] = 'H';          // 越界但语法正确 str[10] = "World!";     // 越界且语法不正确，类型不匹配 strcpy(str, "World!");  // 正确对于结构体成员，写法是一样的，只是前面多了一个 "p." 或 "p->" 而已。如果你连这段代码都会犯错误，只能说明基础不扎实。

user: user-3
content: 引用 1 楼 lgbxyz 的回复:数组不能这么赋值得用memcpy汗 字符串有专用的 strcpy 或 strncpy 用什么memcpy  自造麻烦?

user: user-2
content: // 字符指针和字符数组的初始化： char *ps      = "Hello!"; char str[256] = "Hello!"; // 运行时刻重新赋值： // 对于指针而言，只是改变了指针指向 ps = "World!"; // 对于数组而言，改写内存区域的内容 strcpy(str, "World!"); // 结构体同理： // 结构体字符指针和字符数组成员的初始化： typedef struct { const char *p; } STRUCT_A; typedef struct { char str[256]; } STRUCT_B; // 指针和数组初始化方式相同： STRUCT_A st_a = { "Hello!" }; STRUCT_B st_b = { "Hello!" }; // 运行时刻重新赋值(同上)： st_a.p = "World!"; strcpy(st_b.str, "World!");

user: user-4
content: 字符数组可不支持这种直接字符串赋值的，你应该通过内存copy等方式来实现，或者通过字符串指针给数组直接赋值

user: user-5
content: 引用 2 楼 gcx100 的回复:[quote=引用 1 楼 lgbxyz 的回复:]  数组不能这么赋值得用memcpy 如果是定义的时候可以直接赋值是吧，比如 char str[20] = "ggggggg"[/quote] 你得分清 初始化和赋值

user: user-6
content: 定义的时候是可以的，但是中间的赋值需要memcpy, 如果你想直接赋值就用MFC中的CString吧。

user: user-0
content: 引用 1 楼 lgbxyz 的回复:数组不能这么赋值得用memcpy 如果是定义的时候可以直接赋值是吧，比如 char str[20] = "ggggggg"

user: user-5
content: 数组不能这么赋值得用memcpy
user-0 提问: malloc后free不对吗？为什么调试时说遇到断点

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

user: user-2
content: int *p = (int *)malloc(sizeof(int)); 你是要打算至分配一个int长度(4个字节)的内存吗？

user: user-3
content: void Mergesort(int a[], int n) {     int *p = (int *)malloc(sizeof(int));//分配空间不够，n * sizeof(int)       mergesort(a, 0, n, p);       free(p);  // 调试显示这里触发一个断点,其原因可能是堆被损坏，搞不明白什么原因，malloc后free不对吗？     p = NULL; }
user-0 提问: 用C实现去掉字符串中的相同字母

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #include <string.h> char s1[]="delete"; char s2[]="select"; unsigned char n[256]={0}; char r[257]; int i,L,o=0; void main() {     L=strlen(s1); for (i=0;i<L;i++) if (!n[(unsigned int)s1[i]]) n[(unsigned int)s1[i]]=++o;     L=strlen(s2); for (i=0;i<L;i++) if (!n[(unsigned int)s2[i]]) n[(unsigned int)s2[i]]=++o;     L=0;     for (o=1;o<=256;o++) {         for (i=0;i<256;i++) {             if (o==n[i]) {                 r[L++]=i;                 break;             }         }         if (i>=256) break;     }     r[L]=0;     printf("[%s]\n",r); } //[deltsc]

user: user-2
content: 引用 6 楼 weixin_29041015 的回复:你这只是判断是否与前一个字符相同。逻辑有问题你弄错了  你这个解决的是 删除连续相同字符 题目 不连续的相同字符也要删掉的撒

user: user-3
content: 你这只是判断是否与前一个字符相同。逻辑有问题

user: user-4
content: 上面的解答说的很清楚了。判断字符是否出现过有问题。

user: user-5
content: void printString(char str[], int count) {     char *Output = (char*)malloc(sizeof(char) * (count + 1)); 	int OutputCount = 1; 	Output[0] = str[0];     for (int i = 1; i < count; i++) 	{ 		bool Exist = false; 		for(int j = 0; j < OutputCount; j++) 		{ 			if(str[i] == Output[j] && str[i] != ' ') 			{ 				Exist = true; 				break; 			} 		} 		if(Exist == false) 			Output[OutputCount++] = str[i];     } 	Output[OutputCount] = '\0';     printf("delete the same character result:");     for (int i = 0; i < OutputCount; i++)         printf("%c", Output[i]); }  void main(int argc, char* argv[]) { 	printString("gggggoogoooood", 14); 	printf("\n"); 	system("PAUSE"); }

user: user-6
content: 你的程序作用是删除连续的字符，因为判断重复部分只与上一个字符比较，改成用已得出的所有字符进行比对即可

user: user-5
content: 你只有判别temp上一个字符 只要字符是交错的话那肯定都是错答案 你可以把出现过的记录下来做后续比对

user: user-0
content: 我这个程序实现的后输出为gogod
user-0 提问: 结构体赋值调试问题

回复:
user: user-1
content: 不要依赖调试器输出复杂数据结构！ 而要将复杂数据结构的整个内容在处理它的每一步使用一小段代码按自己很容易理解的格式输出，非常有助于调试！或者可以说是“基础设施”： 十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495
user-0 提问: c语言错误

回复:
user: user-1
content: 建议楼主以后先将所有英文提示信息放在百度翻译里面翻译为中文后自己还是看不懂再在此发帖提问。

user: user-2
content: 文件最后一行 空行

user: user-3
content: 文件末尾加回车，我编单片机程序时有这个警告，你也是编单片机程序吗

user: user-4
content: 文件最后加个回车
user-0 提问: 纵横字谜的答案

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

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

user: user-2
content: 纯粹宽字符是wchar_t类型， wchar_t wStr[] = L"中文";  我自己也学习了。

user: user-2
content: MessageBox  的定义： #ifdef UNICODE #define MessageBox  MessageBoxW #else #define MessageBox  MessageBoxA #endif // !UNICODE  UNICODE是否定义： Project—Properties—Configuration Properties—General—Character Set 被设置为：Use Unicode Character Set ANSI是否定义： Project—Properties—Configuration Properties—General—Character Set 设置为：Not Set 或者 Use Multi-byte Character Set  MessageBox  函数和参数字符串匹配应该就可以，或者都是UNICODE，或者都是ANSI。代码未验证。 TCHAR d[] = _T("中文")比较好，会自动适配UNICODE或者ANSI。我也是初学者一起学习。

user: user-3
content: 如果你的.c源文件采用ansi格式编码，好像中文是可以 直接显示的。编码到char d[]中的码流是按你的源文件本身的编码格式编译进去的，其实就是看编译器的实现，没有必要纠结，  可以直接将d开始的内存打印一下，看一下编码内容就知道了。

user: user-4
content: MessageBoxA(NULL, d, d, MB_OKCANCEL);
user-0 提问:  cgdb调试的时，发现源文件乱码了，没法解决。

回复:
user: user-1
content: 不要依赖调试器输出复杂数据结构！ 而要将复杂数据结构的整个内容在处理它的每一步使用一小段代码按自己很容易理解的格式输出，非常有助于调试！或者可以说是“基础设施”： 十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-0
content: up 起来，等高手解答