Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: sprintf出现段错误的问题

回复:
user: user-0
content: 引用 1 楼 jerry_dqh 的回复:编译应该不能通过吧。毕竟calloc返回的是void *  *args，因为这个指针没有指向任何的空间，这个值不确定，你的第二个程序也有问题。有问题不表示不能运行。 引用 2 楼 wyk565542030 的回复:char **args =calloc(4, sizeof(char));（内存空间分配，还要在一次分配） ==> char **args =(char**)calloc(4, sizeof(char*));; *args = calloc(4, sizeof(char));  这样应该没有问题， 谢谢楼上两位的回答~ 终于知道为啥了~

user: user-1
content: char **args =calloc(4, sizeof(char));（内存空间分配，还要在一次分配） ==> char **args =(char**)calloc(4, sizeof(char*));; *args = calloc(4, sizeof(char));  这样应该没有问题，

user: user-2
content: 编译应该不能通过吧。毕竟calloc返回的是void *  *args，因为这个指针没有指向任何的空间，这个值不确定，你的第二个程序也有问题。有问题不表示不能运行。
user-0 提问: 图的邻接表存储，出错了

回复:
user: user-0
content: 更新一下 void makeEdges(Graph g,int firstNode, int secondNode) {     printf("%d,%d,function:makeEdges\n",firstNode,secondNode); 	int i; 	EdgeNode* tmp; 	tmp = g.nodeList[firstNode].edgeList; 	for(i=0;i<g.nodeList[firstNode].totalEdge;i++) 	{ 	    printf("71,totalEdge:%d\n",g.nodeList[firstNode].totalEdge);  		printf("73\n"); 		printf("(*tmp).adjVex:%d",tmp->adjVex); 		if((*tmp).adjVex!= -1)//应该是这里出错了，上面的没有打印出来 		{ 			(*tmp).adjVex=secondNode; 			break; 		} 		tmp = g.nodeList[firstNode].edgeList->next; 	} 	printf("llllll"); }
user-0 提问: 如何写一个内存分配器

回复:
user: user-1
content: 我是菜鸟 学习了啊

user: user-2
content: 大家玩的太高深了，搞不懂！

user: user-3
content: 引用 10 楼 u010203099 的回复:学习了我是菜鸟 我也是菜鸟，可我学不懂

user: user-4
content: 最简单的原理：  先初始化你的内存池： p[0]=0;//0表示未分配，1 表示已分配 p[1]=4010;//可用内存长度  第一次调用mymalloc(10)，那么 p[0]=1//表示这是一个已分配的块 p[1]=10//表示分配的长度 p[12]=0;//未分配 p[13]=4012-10-2-2;//剩下的可用内存 retrun p+2;//这是用户得到的地址  第二次调用mymalloc(5)，那么 检查发现p[0]==1,所以跳过p[1]指示的长度 检查发现p[12]==0,那么这里可以进行分配了，方法和第一次调用一样。  myfree(ptr)调用的时候 将ptr-2位置置为0，就表示这个块没有分配了。  最后你可以选择在malloc或者free的时候合并相邻的未分配块。  当然以上只是一个最基本的原理，你需要自己处理对齐等问题，也可以添加更多的记录信息。

user: user-5
content: 数组+链表 。。

user: user-6
content: 还可以参考Linux源代码中malloc和free的实现。

user: user-7
content: 学习了我是菜鸟

user: user-8
content: 请参考dlmalloc 和dlfree的实现

user: user-0
content: 谢谢各位，我先看看

user: user-0
content: 引用 1 楼 thefirstz 的回复:这是要实现内存池？ 有点类似，不过是在嵌入式MCU上的，RAM最多8K

user: user-9
content: 这篇文章详述了如何设计一个内存分类器，并提供了源代码下载地址。 http://article.yeeyan.org/view/25646/6380?from_com

user: user-10
content: 见我博客了。。。

user: user-11
content: 这是要实现内存池？

user: user-12
content: 静态链表 会写吧！MCU 基本够用了

user: user-13
content: 引用 4 楼 cuiy0001 的回复:[quote=引用 1 楼 thefirstz 的回复:] 这是要实现内存池？ 有点类似，不过是在嵌入式MCU上的，RAM最多8K[/quote] 嵌入式上比较简单，用不着页分配，在嵌入式应用中大多数ram会被一个程序占用，可以简单的这样实现：  int alloced_size = 0; int total_size = 0x400 * 8; int mem_start_addr = 0x000d0000;  void* myram_alloc(int size) {     void* ptr = NULL;      if (total_size - alloced_size < size)     {         /*no memory remain*/         return NULL;     }     ptr = ioremap(mem_start_addr,size);      alloced_size += size;     return ptr; }  free的时候会麻烦一点，要将已分配的内存的size传入然后进行回收，上面这个版本缺陷太多，仅仅作为一种思路，希望有用

user: user-14
content: 推荐看看Nginx的内存管理！挺好的
user-0 提问: C语言 结构体指针字符 二进制文件写入和读取   

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

user: user-2
content: 我怎么感觉这个程序的逻辑有问题呢

user: user-3
content: s.name = (char*) malloc(sizeof(char)*20);

user: user-0
content: 引用 6 楼 xiaohuh421 的回复:fread(&s,sizeof(student),1,fp); 即使你对s.name申请了空间. 但实际s本身还是只占一个指针, 通常也就是4字节空间. 你在这里从文件读取了一个数给这个指针, 即s.name的值就被修改了, 即name这个指针地址被修改了, 你前面的分配等于是白做了. 也产生了内存泄漏.  sizeof只能对student本身计算大小, 也就是指针本身所占的大小,4字节.  要保存这个串, 在保存的时候应该这么做. fwrite(s.name,1,strlen(s.name),pFile);  读取的时候,先给s.name分配足够的空间,比如100,注意要为\0分配好空间. fread(s.name,1, 100,pFile).  也就是说我fread出来后s.name的值不一定是我当初存入的那个指针、指针值改变了，所以我printf的时候可能读的是非法内存。。。就会出现“程序出现错误”那种windows提示？  你说的fwrite(s.name....)和fread(s.name....)只是用于结构体中只有这一个name,我结构体中如果包含多项指针字符串呢？   是不是  fread和fwrite在 对结构体中指针字符的操作真的不好用、？？

user: user-4
content: fread(&s,sizeof(student),1,fp); 即使你对s.name申请了空间. 但实际s本身还是只占一个指针, 通常也就是4字节空间. 你在这里从文件读取了一个数给这个指针, 即s.name的值就被修改了, 即name这个指针地址被修改了, 你前面的分配等于是白做了. 也产生了内存泄漏.  sizeof只能对student本身计算大小, 也就是指针本身所占的大小,4字节.  要保存这个串, 在保存的时候应该这么做. fwrite(s.name,1,strlen(s.name),pFile);  读取的时候,先给s.name分配足够的空间,比如100,注意要为\0分配好空间. fread(s.name,1, 100,pFile).

user: user-5
content: 引用 4 楼 zxasqwedc 的回复:[quote=引用 3 楼 user-6 的回复:] 最简单的做法： typedef struct s{ char name[20]; }student; 嗯、我知道这么改可以、但是我还是想知道如果不改结构体的话如何实现呢、、、总不能实现不了吧？！[/quote] 写文件的时候，写入指针指向的字符串，读文件的时候，读出字符串放到结构体中 不是不能用fread，而是不能用fread读出带有指针/容器的结构体，别总想着sizeof多省事，那是用户的想法，程序员的工作就是用自己的麻烦换用户的简单

user: user-0
content: 引用 3 楼 user-6 的回复:最简单的做法： typedef struct s{ char name[20]; }student; 嗯、我知道这么改可以、但是我还是想知道如果不改结构体的话如何实现呢、、、总不能实现不了吧？！

user: user-4
content: 引用 7 楼 zxasqwedc 的回复:[quote=引用 6 楼 xiaohuh421 的回复:] fread(&s,sizeof(student),1,fp); 即使你对s.name申请了空间. 但实际s本身还是只占一个指针, 通常也就是4字节空间. 你在这里从文件读取了一个数给这个指针, 即s.name的值就被修改了, 即name这个指针地址被修改了, 你前面的分配等于是白做了. 也产生了内存泄漏.  sizeof只能对student本身计算大小, 也就是指针本身所占的大小,4字节.  要保存这个串, 在保存的时候应该这么做. fwrite(s.name,1,strlen(s.name),pFile);  读取的时候,先给s.name分配足够的空间,比如100,注意要为\0分配好空间. fread(s.name,1, 100,pFile).  也就是说我fread出来后s.name的值不一定是我当初存入的那个指针、指针值改变了，所以我printf的时候可能读的是非法内存。。。就会出现“程序出现错误”那种windows提示？  你说的fwrite(s.name....)和fread(s.name....)只是用于结构体中只有这一个name,我结构体中如果包含多项指针字符串呢？   是不是  fread和fwrite在 对结构体中指针字符的操作真的不好用、？？[/quote]  如果有多项指针, 那肯定要写多次了.  如果直接保存结构体, 只会保存结构体当前的东西, 指针就仅保存指针的值, 但是指针指向的内容却没有保存

user: user-6
content: 最简单的做法： typedef struct s{ char name[20]; }student;

user: user-0
content: 引用 1 楼 baichi4141 的回复:char*指针的值和char*指针指向的数据是两码事，一张纸上写了你房子的地址，不是说你把这张纸锁进保险箱里，你的房子就安全了 因为student结构体里放的是一个指针，所以sizeof(student)获得的是这张纸的大小，它上面写的地址可能早就不是你的房子了——毕竟，你只有70年产权而已 明白了、也就是说我fread取出来的不是我想要的完整结构体、、、那我想问问如果这样的话我岂不是不能fread了？  sizeof我没法得到结构体大小啊？？谢谢啦~

user: user-5
content: char*指针的值和char*指针指向的数据是两码事，一张纸上写了你房子的地址，不是说你把这张纸锁进保险箱里，你的房子就安全了 因为student结构体里放的是一个指针，所以sizeof(student)获得的是这张纸的大小，它上面写的地址可能早就不是你的房子了——毕竟，你只有70年产权而已
user-0 提问: 二级c语言一道题目，求大神呀

回复:
user: user-1
content: 引用 楼主 u013733018 的回复:以下选项中，值为1的表达式是（） A.1-'\0'    B.1-'0'    C.'1'-0    D.'\0'-'0' 是选 A， lz，其实这个你试一下就行了 # include <stdio.h>  int main(void) { 	char a = '0', b = '\0', c = '1'; 	printf("a = %d, b = %d, c = %d\n", a, b, c);  	return 0; } 最后结果是 '0','\0','1'的Ascll码的值分别是48，0，49 所以1-'\0'的值为1，答案为 A

user: user-2
content: 我用了排除法。。。'1'-'0'才等于1，所以b,c,d都不对，选a了，实在没记住'\0'ascii码是多少。。

user: user-3
content: 楼上的正解 看看C语言书后的ASCII表。记住常用的‘\0’的值为0 '0'值为48，‘A’的值为65等

user: user-4
content: 实在不会可以写个printf(“%d”,每个选项)试试哈

user: user-5
content: A.1-'\0'

user: user-6
content: 选A，'\0'的ASCII码是0。

user: user-7
content: A.1-'\0'
user-0 提问: 求一个正则表达式

回复:
user: user-1
content: 正则表达式不是万能的。 使用零宽断言可以实现，见 http://www.jb51.net/tools/zhengze.html 但是正则表达式不是解决你问题的根本思路，LZ题目的最终解决方案为： 分词->倒排索引->检索（使用布尔检索即可）

user: user-2
content: 如果是过滤'人民'两个字的话可以用 \b((?!人民)\w)+\b

user: user-3
content: 中华(?!人民)

user: user-4
content: 要用前看表达式“?<”还是什么的，自己认真google二十分钟学正则表达式 吧

user: user-0
content: 有人能指教下么?
user-0 提问: 余弦（新开贴）

回复:
user: user-1
content: 引用 8 楼 vipcxj 的回复:[quote=引用 5 楼 lpcads 的回复:] [quote=引用 2 楼 vipcxj 的回复:] acos是arccos，是cos的反函数，cos^(-1)是sec，是1/cos LZ需要的是arccos，即cos的反函数~ cos^(-1)(x) equa arccos(x); (cos(x))^(-1) equa sec(x);[/quote]  本人就是数学系的，cos如果有指数，都是放在cos后面的。想想也是，数学里面cos x可不会给x加括号，你把指数放在x上面，你认为这个算是cos(x)^2呢还是(cos x)的平方呢？数学中也确实有用指数-1表示逆算子或反函数的，但这个-1的指数一般加在一个表示函数或算子或映射的符号上，比如 令f(x) = cos x 那么f^-1就表示f的逆，但确实没有在cos后面加个-1表示反函数的。你可以说这是计算机领域的表示方法，但别说数学领域也是这么表示的.[/quote] 看清楚哦，我没有“把指数放在x上面”。 加括号是为了消歧义，(cos(x))^(-1) 不加括号写成 cos x ^ -1 ，那就真真得卓急了。 cos后面加个-1表示反函数，有些计算器上就是这样的，不然按钮上的字太多放不下。  不过要我写，那肯定是 arccos，除非 ^-1(上标) 成了ascii表上的字符。

user: user-1
content: 引用 9 楼 mousestuman 的回复:楼上的意思是说谭浩强的书上加的那个（-1）仅仅表示是逆运算，而不是数学中的将分子分母颠倒？ 当然。

user: user-0
content: 楼上的意思是说谭浩强的书上加的那个（-1）仅仅表示是逆运算，而不是数学中的将分子分母颠倒？

user: user-2
content: 引用 5 楼 lpcads 的回复:[quote=引用 2 楼 vipcxj 的回复:] acos是arccos，是cos的反函数，cos^(-1)是sec，是1/cos LZ需要的是arccos，即cos的反函数~ cos^(-1)(x) equa arccos(x); (cos(x))^(-1) equa sec(x);[/quote]  本人就是数学系的，cos如果有指数，都是放在cos后面的。想想也是，数学里面cos x可不会给x加括号，你把指数放在x上面，你认为这个算是cos(x)^2呢还是(cos x)的平方呢？数学中也确实有用指数-1表示逆算子或反函数的，但这个-1的指数一般加在一个表示函数或算子或映射的符号上，比如 令f(x) = cos x 那么f^-1就表示f的逆，但确实没有在cos后面加个-1表示反函数的。你可以说这是计算机领域的表示方法，但别说数学领域也是这么表示的.

user: user-3
content: 威武啊，原来是 谭浩强大人的书

user: user-3
content: gnuplot，开源的，都是这么画图的。

user: user-1
content: 引用 2 楼 vipcxj 的回复:acos是arccos，是cos的反函数，cos^(-1)是sec，是1/cos LZ需要的是arccos，即cos的反函数~ cos^(-1)(x) equa arccos(x); (cos(x))^(-1) equa sec(x);

user: user-4
content: 引用 楼主 mousestuman 的回复:昨天问了余弦的问题，感谢大家解答，不过我还是不太懂，所以开了新帖 要编个程序，输出余弦曲线y=cos(x)，由于printf只能按行输出，且不能返回已输出的上面的行，所以只能以纵坐标y为参数，将y的范围控制为1至-1，通过y计算出x，来输出。 由此必须将y=cos(x)换算为x=f(y).对于函数f，书上的原程序为x=acos(y),而谭浩强的书上写着： acos(y)=cos^(-1)(y) 那么这个等式是否成立呢？acos到底指什么呢？为什么x=acos(y)？ 还有cos^(-1)(y)是否等于1/cos(y)? acos是反余弦函数，这个(-1)次方的写法应该是学高数书上来的，cos的倒数应该是正割函数sec 反余弦函数 正割函数sec

user: user-5
content: 对谭大人那种喜欢自己发明概念的，懂的人自然看的懂他说的是啥意思，不懂的千万别咬文嚼字，那就完蛋了 x=acos(y)是程序代码，没什么可说的。acos这个函数名代表数学中的反三角函数arccos，如果你不认识这个词，那代表你没上过初中数学课 acos(y)=cos^(-1)(y)是把cos这个求余弦操作作为一个算子来表述的。所谓的算子就是如果你对一个数执行了某种操作，那么就可以称这个操作为一个算子，这个数和这个算子执行了一次乘法，所以当x乘以cos算子得到y，也就等于y除以cos算子得到x，因此表达为cos^(-1)。你觉得这种写法没意义？的确，看得懂的人只会觉得这玩意没意义，看不懂的人就会觉得这是天书。

user: user-2
content: acos是arccos，是cos的反函数，cos^(-1)是sec，是1/cos LZ需要的是arccos，即cos的反函数~

user: user-6
content: 谭大人的书不是出了名的错误多么？
user-0 提问: 求助，以下的代码有什么问题，是向GOOGLE POST一个数据包的简单程序

回复:
user: user-1
content: libcurl 请看我博客http://hi.baidu.com/new/guhuisec

user: user-0
content: 初学者求助啊~

user: user-0
content: 引用 7 楼 u010404494 的回复:这个太简单了，留给楼下回答吧大神求指导，感激不尽

user: user-2
content: 这个太简单了，留给楼下回答吧

user: user-0
content: 引用 5 楼 user-3 的回复:370后面的\r\n 去掉试试不行，依然是这样

user: user-3
content: 370后面的\r\n 去掉试试

user: user-0
content: 引用 3 楼 user-3 的回复:Content-Lengh 没有这个字段？？有啊，开始也以为是，反复看了很多次都有啊

user: user-3
content: Content-Lengh 没有这个字段？？

user: user-0
content: 没人吗，急啊

user: user-0
content: 自顶，求会的随意提点提点
user-0 提问: 菜鸟求解答简单递归

回复:
user: user-1
content: 变量和常量的区别！

user: user-2
content: 引用 楼主 CC06092448 的回复:菜鸟求结： 下面代码， 1. 既然getchar可以赋值给next，那为什么next不能被赋值‘abcd’呢？  2.比如输入abcd 当我调试的时候，输出第一个d的时候可以理解，但是输出d后，下一步是到else，然后就进入 palin(n-1);    putchar(next);  （为什么会进入else里面呢，而且是直接反复调用这2句？？？？？） 而且n的值又变了！！！！  这个递归是怎么调用的啊？求大神解答！  这个数学公式递归比较好理解，但是不是数学的递归好难理解啊。。。。有没有关于递归方面的资料啊？？？？    void palin(int n)   {    	char next;   	if(n<=1)    	{   		next=getchar();    	//	printf("\n\0:");    		putchar(next);    	}   	else    	{     		next=getchar();   		palin(n-1);    		putchar(next);    	}  }     int main(int argc, char* argv[]) { 	palin(4); 	printf("\n");      	return 0; }  理解递归的实质，工作中慎用递归或者不用

user: user-3
content: http://www.ffpan.com/u/%E6%88%91%E6%98%AF%E5%A4%A7%E5%AD%A6%E7%8B%97.html希望我的资料能对你有用哦

user: user-4
content: 引用 3 楼 CC06092448 的回复:[quote=引用 1 楼 Falleyes 的回复:] 你主函数调用这个函数的时候，n的参数是4，根据if语句判断，当然要进入else语块。 getchar（）只会取一个char，那么你输入“abcd”是4个char，第一次调用，把a给了next，然后调用palin（n-1）把b给next，知道n=1，即到d的时候，直接进入if语块执行。最终递归返回，把d，c，b，a依次输出。  getchar（）的含义是从输入流中得到一个char类型，那么你输入的abcd进入输入流，要一个一个地取  getchar()明白了！谢谢！  第二个问题，getchar（）只会取一个char，那么你输入“abcd”是4个char，第一次调用，把a给了next，然后调用palin（n-1）把b给next，知道n=1，即到d的时候，直接进入if语块执行 这个部分我理解的？  关键是下面的递归有点不明白！ 输出d以后跳出if为什么会进入else，这个时候n又没赋值，它的值为什么会变大？？？ 递归的时候就调用 palin(n-1);    putchar(next);   不理解啊？？？？望解释啊！！！！！ [/quote]递归会有一个返回的过程。因为你在程序中首先调用palin(n-1)，然后调用putchar(next)，这里的net指的是本层的next，当我们获得了一个a，把他入栈，然后让b入栈，直到d入栈（进入if语句），然后要putchar(next)，需要对入栈的四个char依次出栈，这时也就出现了n再次增大，返回你初次调用递归的值，结束函数。

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

user: user-0
content: 引用 2 楼 u013085807 的回复:1. 既然getchar可以赋值给next，那为什么next不能被赋值‘abcd’呢？ abcd 你又没有定义分配内存空间，怎么赋值； 2,递归是调用本身，还要看判断条件，你 n 定义int，输入的是char, 递归本来就是不断的循环调用，里面的参数肯定是得变化的。最后看临界状态。   问题一：我的 意思是char a= 'a'可以char a='abcd'但不可以， 但是char a; a=getcher()； 输入‘abcd’却可以？？？  问题二： 我是想问，当输入n到达临界后，输出的时候，为什么n的值又变大了

user: user-0
content: 引用 1 楼 Falleyes 的回复:你主函数调用这个函数的时候，n的参数是4，根据if语句判断，当然要进入else语块。 getchar（）只会取一个char，那么你输入“abcd”是4个char，第一次调用，把a给了next，然后调用palin（n-1）把b给next，知道n=1，即到d的时候，直接进入if语块执行。最终递归返回，把d，c，b，a依次输出。  getchar（）的含义是从输入流中得到一个char类型，那么你输入的abcd进入输入流，要一个一个地取  getchar()明白了！谢谢！  第二个问题，getchar（）只会取一个char，那么你输入“abcd”是4个char，第一次调用，把a给了next，然后调用palin（n-1）把b给next，知道n=1，即到d的时候，直接进入if语块执行 这个部分我理解的？  关键是下面的递归有点不明白！ 输出d以后跳出if为什么会进入else，这个时候n又没赋值，它的值为什么会变大？？？ 递归的时候就调用 palin(n-1);    putchar(next);   不理解啊？？？？望解释啊！！！！！

user: user-6
content: 1. 既然getchar可以赋值给next，那为什么next不能被赋值‘abcd’呢？ abcd 你又没有定义分配内存空间，怎么赋值； 2,递归是调用本身，还要看判断条件，你 n 定义int，输入的是char, 递归本来就是不断的循环调用，里面的参数肯定是得变化的。最后看临界状态。

user: user-4
content: 你主函数调用这个函数的时候，n的参数是4，根据if语句判断，当然要进入else语块。 getchar（）只会取一个char，那么你输入“abcd”是4个char，第一次调用，把a给了next，然后调用palin（n-1）把b给next，知道n=1，即到d的时候，直接进入if语块执行。最终递归返回，把d，c，b，a依次输出。  getchar（）的含义是从输入流中得到一个char类型，那么你输入的abcd进入输入流，要一个一个地取
user-0 提问: 关于borland 任哲ucos例程的简单问题

回复:
user: user-1
content: 静态连接还是动态连接不由是否使用.lib文件决定，而由 Options/Linker/Libraries对话框中的Static/Dynamic设置决定。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:bc++3.1 帮助里面对每个函数都有一小段能拷贝出来运行看效果的例子程序。非常适合初学C语言。相比较而言VC带的帮助MSDN就没有。http://download.csdn.net/source/2805028 换我这个版本再试试？ 我把文件CL.LIB替换成您给的完整版的（2K的替换成265k的），运行没问题了，我想用精简版的（任哲说的），这样的替换没问题吧？原来的2k的CL.LIB是不是可以扔了？  另外想问问怎么区分lib文件是静态还是动态？精简版里，lib文件在lib文件夹，dll在bin文件夹，所以看不出哪个lib文件是动静态.

user: user-1
content: bc++3.1 帮助里面对每个函数都有一小段能拷贝出来运行看效果的例子程序。非常适合初学C语言。相比较而言VC带的帮助MSDN就没有。http://download.csdn.net/source/2805028 换我这个版本再试试？
user-0 提问: vs2005下不能调出Memory窗口，求教

回复:
user: user-1
content: 解决了没有，我的2010也遇到相同的问题

user: user-0
content: 要是我电脑上没装VC呢？就是装了的话，我每次在vs下编程都要放到vc下去看内存是不是有点麻烦呢？我就想知道我说的那个问题应该怎么解决啊！还是谢谢你啊！

user: user-2
content: VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-3
content: 引用 2 楼 charce_you 的回复:要是我电脑上没装VC呢？就是装了的话，我每次在vs下编程都要放到vc下去看内存是不是有点麻烦呢？我就想知道我说的那个问题应该怎么解决啊！还是谢谢你啊！  VS就包括VC，这里应该是同义词吧。那你说的“我每次在vs下编程都要放到vc下去看内存”是什么意思？

user: user-2
content: VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。
user-0 提问: 老问题，指针寻址问题，我知道意思，但是不能用代码完整表示出来

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

user: user-2
content: 现在问题是我想用指针指向a的内存地址0x2000，打印出来的是i的地址0x1000,怎么表示  。。。指向a 就是int* pa = &a; 打印出来是i的地址1000？printf("%x", *p);

user: user-3
content: 打印地址用%p  引用 楼主 u013085807 的回复:#include<stdio.h>  void main() { 	int i = 10; //假设&i = 0x1000 	printf("%0x\n",&i);//0x1000 	int a = &i; //假设&a = 0x2000 	printf("%0x\n",a);//0x1000 	int p = &a; //假设&p = 0x3000 	printf("%0x\n",p);//0x2000         /*现在问题是我想用指针指向a的内存地址0x2000，打印出来的是i的地址0x1000,怎么表示*/ 	int *p;? 	printf("%0x\n",*p);?? 	 }

user: user-0
content: 引用 1 楼 derekrose 的回复:现在问题是我想用指针指向a的内存地址0x2000，打印出来的是i的地址0x1000,怎么表示  。。。指向a 就是int* pa = &a; 打印出来是i的地址1000？printf("%x", *p);没想到这里，昨天晚上脑子懵了。还是你们厉害！

user: user-0
content: 引用 2 楼 turingo 的回复:打印地址用%p  [quote=引用 楼主 u013085807 的回复:] #include<stdio.h>  void main() { 	int i = 10; //假设&i = 0x1000 	printf("%0x\n",&i);//0x1000 	int a = &i; //假设&a = 0x2000 	printf("%0x\n",a);//0x1000 	int p = &a; //假设&p = 0x3000 	printf("%0x\n",p);//0x2000         /*现在问题是我想用指针指向a的内存地址0x2000，打印出来的是i的地址0x1000,怎么表示*/ 	int *p;? 	printf("%0x\n",*p);?? 	 }[/quote]
user-0 提问: error C2664: 'wcscpy' : cannot convert parameter 1 from 'char [255]' to 'wchar_t

回复:
user: user-1
content: 引用 2 楼 u012162828 的回复:d:\my porject\twain\src\project\twain_passport\twain_passport\btnview.cpp(589) : error C2664: 'wcscpy' : cannot convert parameter 1 from 'char [255]' to 'wchar_t *' 1>        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 算了，简单点吧 _tcscpy(temp,szBuffer);改成 strcpy(temp,szBuffer); 下面的其它也改掉。

user: user-0
content: d:\my porject\twain\src\project\twain_passport\twain_passport\btnview.cpp(589) : error C2664: 'wcscpy' : cannot convert parameter 1 from 'char [255]' to 'wchar_t *' 1>        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

user: user-1
content: 编译时把_tcscpy会转化成strcpy还是wcscpy，看来你的工程属性是UNICODE了， wcscpy的参数必须是wchar_t，解决方法： 1.char改成TCHAR，这样都是T的形式存在，让编译器决定用char还是wchar 或 2._tcscpy改成strcpy  另外再建议下你，用strcpy_s吧，安全。
user-0 提问: 为何Array中未指定的element显示出来不是0呢？

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:未初始化的内存，里面的值是不确定的， 改在 int values[10] = {0};//默认全部清0原来如此，感谢！

user: user-1
content: 未初始化的内存，里面的值是不确定的， 改在 int values[10] = {0};//默认全部清0
user-0 提问: win7与vc6.0不兼容怎么办，复选框上面勾过了 

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

user: user-0
content: 各位大神有没有打包的适合c语言初学者敲的程序代码啊，求支援啊，这是我的邮箱liliyao330@163.com

user: user-2
content: VS2005吧，觉得这个比VC6.0方便很多。

user: user-3
content: 可以安装虚拟机。

user: user-0
content: 嗯嗯，灰常感谢大家啊，

user: user-4
content: 你都没建立工程，相关的文件也还没创建，都没东西可编译，那些按钮当然都是不可用状态。。。

user: user-5
content: 我刚才把我的Vc6.0卸载了，又重新安装了，下面是一系列图片——  你看，在最后一个图片中，即刚安装完后就运行，那是界面，你看红色矩形部分，就是编译链接执行的按钮啊，不知你那个是咋回事

user: user-5
content: 说实话，不清楚你那儿是怎么回事，我装的时候就直接在外边啊，就在上图的1处，其实即使直接看不到，在上面的“组建”里也有编译、链接和执行，实在不行，同时按下Ctrl和F7，就是编译，然后再同时按下Ctrl和F5，这是执行，我再看看，看能不能把这两个键放外面

user: user-5
content: 这个在上面的组建里，没有拿出来，稍等啊，我找找看怎么弄出来

user: user-0
content: 这是我装的vc6.0和vs2010，vc6.0工具栏里没有编译啊，这是为什么啊

user: user-0
content: 我也觉着我们的教材都跟不上时代，我先入入门，用vs2010在网上看视频学，破老师讲的一口方言我也听不懂，

user: user-6
content: 用VS2003或以后的版本。最大的问题是VC6很多地方都不符合C++标准，与任何其他编译器都有很大区别，你在VC6下习惯的用法以后在其他编程环境下也很可能不能用。 至于你们用VC6的教材，只能说是误人子弟，买本新一点的书吧

user: user-7
content: 引用 楼主 u013720580 的回复:win7与vc6.0不兼容怎么办，复选框上面勾过了 ，本人c语言初学者，要是vc6.0不能用该用什么软件代替vc6.0  vc6.0 早该丢到茅坑里的东西了 微软的工具或多或少的都要关联微软的自己的东西，如今都已经到windows8了你还在用给n年前的工具，敢不敢大胆的换成2010 2012？

user: user-5
content: 引用 23 楼 u013720580 的回复:[quote=引用 21 楼 u012421456 的回复:] [quote=引用 20 楼 u013720580 的回复:] 嗯嗯，那个我装上了，vs2010也下好了 装上就好，那个视频讲课用的是Vc6.0，平时学习还是用VS比较好[/quote]你说说看郝斌老师的视频学，用vs2010也可以吗[/quote] 我的意思是，看视频时你不敲代码吗？那时用vc6.0，毕竟那老师用的是这个，平时学习时用vs比较好，vs方便，好用，功能也较全面

user: user-0
content: 引用 24 楼 vipcxj 的回复:既然LZ是初学，不是被强制用vc6，那就换个其他的编译器嘛，高版本的vs就不错。至于你教程用的是vc6，导致有些代码新版本的vs编译不过，这是好事啊，正好让你知道这些旧教材坑爹在哪里，免得以后再杯具。举个例子 有些旧教材，喜欢 #include <iostream.h> 不过你用新编译器可能就编译不过，因为这个头文件木有了，你得用iostream代替嗯嗯，虽然现在不太懂，不过感谢指点，朝高手方向努力谢了

user: user-8
content: 既然LZ是初学，不是被强制用vc6，那就换个其他的编译器嘛，高版本的vs就不错。至于你教程用的是vc6，导致有些代码新版本的vs编译不过，这是好事啊，正好让你知道这些旧教材坑爹在哪里，免得以后再杯具。举个例子 有些旧教材，喜欢 #include <iostream.h> 不过你用新编译器可能就编译不过，因为这个头文件木有了，你得用iostream代替

user: user-0
content: 引用 21 楼 u012421456 的回复:[quote=引用 20 楼 u013720580 的回复:] 嗯嗯，那个我装上了，vs2010也下好了 装上就好，那个视频讲课用的是Vc6.0，平时学习还是用VS比较好[/quote]你说说看郝斌老师的视频学，用vs2010也可以吗

user: user-9
content: dev C++很好用可以试试

user: user-5
content: 引用 20 楼 u013720580 的回复:嗯嗯，那个我装上了，vs2010也下好了 装上就好，那个视频讲课用的是Vc6.0，平时学习还是用VS比较好

user: user-0
content: 嗯嗯，那个我装上了，vs2010也下好了
user-0 提问: 余弦

回复:
user: user-1
content: 引用 4 楼 mousestuman 的回复:书上的原话是这样的y=cos(x),则x=acos(y),而 acos(y)=cos(负一）(y)   负一在cos的右上角  上面的右值等于1/cos（y）吗？如果想等，那么我的问题就是对的 应该是y=cos(x),则x=arccos(y)，应该是楼主的书印刷错误

user: user-1
content: cos^(-1)y=(cosy)^(-1)=1/cosy; 因为类似x^(-1)=1/x

user: user-2
content: 引用 2 楼 mousestuman 的回复:我在书上看x=acos(y),而acos(y)=1/cos(y),所以应该是正确的呀你在哪本书看到的？贴出来看看。

user: user-3
content: acos(y)=1/cos(y)  是绝对不等的  举个例子  cos π/3  =  1/2  可推得   arccos 1/2  = π/3   那么  请问   π/3  =  2 么？

user: user-0
content: 书上的原话是这样的y=cos(x),则x=acos(y),而 acos(y)=cos(负一）(y)   负一在cos的右上角  上面的右值等于1/cos（y）吗？如果想等，那么我的问题就是对的

user: user-3
content: acos(y)=1/cos(y) 是谁告诉你的？ 如果是书上写的那书可以撕了  百度反三角函数吧......

user: user-0
content: 我在书上看x=acos(y),而acos(y)=1/cos(y),所以应该是正确的呀

user: user-3
content: 不正确...    x = arccos（y）  不谢~
user-0 提问: C语言如何调用库中的函数

回复:
user: user-1
content: 引用 7 楼 misakamm 的回复:gcc "-LE:\\Cworkspace\\test2\\ffmpeg\\lib" 这怎么看着怪怪的，为什么不是 gcc -L"E:\\Cworkspace\\test2\\ffmpeg\\lib"  同样的看法

user: user-0
content: 引用 22 楼 hxingz 的回复:请问，你有include头文件吗？ 当然有了

user: user-2
content: gcc -v可以看看当初编译工具的构建参数。或者，你试试编译参数里加入-m64要求64位输出，如果不支持会有对应的错误提示，只能编32位的...

user: user-0
content: 谁帮忙看一下

user: user-3
content: 请问，你有include头文件吗？

user: user-4
content: 把库文件的名字加到你链接时候用的库里面。

user: user-2
content: 引用 13 楼 Smoke_1988 的回复:开发包是在网上下载的最新开发包 给个地址看看你下的是啥版本...

user: user-0
content: 引用 12 楼 zhao4zhong1 的回复:将错误信息中出现的标识符放在google里面搜一下， 看其在哪个.h中，然后在本地硬盘上搜索该.h,如果没有，在网上搜索相关库或模块下载安装，然后将其所在目录填写到“附加包含路径”中，将其.h添加到包含到.c或。cpp中,重新编译; 看其在哪个.lib或库中，然后在本地硬盘上搜索该.lib或.a或.so,如果没有，在网上搜索相关库或模块下载安装，然后将其所在目录填写到“附加依赖库所在目录”中，将其名字添加到“附加依赖库”中，重新连接。 .h文件应该是没有问题的，因为编译器已经能够识别出函数，只是在编译时出现问题。 ffmpeg的库全在lib文件夹下，已经添加到eclipse中了。

user: user-0
content: 引用 11 楼 angel_su 的回复:感觉跟编译命令参数关系不大，都已经顺利编译只是链接出错，库名也确实加了。估计开发包版本搞错了... 开发包是在网上下载的最新开发包

user: user-5
content: 将错误信息中出现的标识符放在google里面搜一下， 看其在哪个.h中，然后在本地硬盘上搜索该.h,如果没有，在网上搜索相关库或模块下载安装，然后将其所在目录填写到“附加包含路径”中，将其.h添加到包含到.c或。cpp中,重新编译; 看其在哪个.lib或库中，然后在本地硬盘上搜索该.lib或.a或.so,如果没有，在网上搜索相关库或模块下载安装，然后将其所在目录填写到“附加依赖库所在目录”中，将其名字添加到“附加依赖库”中，重新连接。

user: user-2
content: 感觉跟编译命令参数关系不大，都已经顺利编译只是链接出错，库名也确实加了。估计开发包版本搞错了...

user: user-0
content: 引用 9 楼 misakamm 的回复:你自己配错了环境？  该怎么配呢？ 我没动过

user: user-0
content: 引用 19 楼 angel_su 的回复:你这包是64位的，估计你的mingw是32位的，应该下32位ffmpeg，不能乱套... 怎么看mingw的版本啊？

user: user-2
content: 你这包是64位的，估计你的mingw是32位的，应该下32位ffmpeg，不能乱套...

user: user-0
content: 引用 16 楼 bijiaoben 的回复:把库文件的名字加到你链接时候用的库里面。 链接了啊

user: user-0
content: 引用 15 楼 angel_su 的回复:给个地址看看你下的是啥版本... http://ffmpeg.zeranoe.com/builds/win64/dev/ffmpeg-20140221-git-76dd01e-win64-dev.7z

user: user-0
content: 引用 2 楼 nadleeh123 的回复:错误是你自己的好吧,../src/test2.c 未定义的引用 av_register_all 这个意思就是库文件没加载上呗？ 怎么加载库文件呢？

user: user-0
content: 引用 1 楼 turingo 的回复:参考http://ffmpeg.gusari.org/viewtopic.php?f=8&t=942  I saw this article. But I didn't use makefile. If I don't use it, what should I do? Do I have to use it?

user: user-6
content: 引用 楼主 Smoke_1988 的回复:我用的环境是windows eclipse mingw 我想调用ffmpeg中的函数 我下载了ffmpeg的sdk，将lib加载到-L，.a文件加载-l下但是没有找到函数 提示信息：  gcc "-IE:\\Cworkspace\\test2\\ffmpeg\\include" -O0 -g3 -Wall -c -fmessage-length=0 -o "src\\test2.o" "..\\src\\test2.c"  gcc "-LE:\\Cworkspace\\test2\\ffmpeg\\lib" -o test2.exe "src\\test2.o" -lavcodec -lavformat -lavutil -lavdevice -lavfilter -lswscale -lpostproc -lswresample  src\test2.o: In function `main': E:\Cworkspace\test2\Debug/../src/test2.c:19: undefined reference to `av_register_all' collect2.exe: error: ld returned 1 exit status  什么地方出现错误了？C语言应该如何载入库？  错误是你自己的好吧,../src/test2.c 未定义的引用 av_register_all

user: user-7
content: 引用 8 楼 Smoke_1988 的回复:[quote=引用 7 楼 misakamm 的回复:] gcc "-LE:\\Cworkspace\\test2\\ffmpeg\\lib" 这怎么看着怪怪的，为什么不是 gcc -L"E:\\Cworkspace\\test2\\ffmpeg\\lib"  我也不知道，我从eclipse里拷出来的[/quote] 你自己配错了环境？
user-0 提问: TCP/IP编程问题，求各位大牛指教？

回复:
user: user-1
content: 注意解析就好！其他没啥

user: user-0
content: 1、是在数据链路层截取TCP数据包，要对TCL数据进行重组才能得到HTTP报文。 2、原来发过来的HTTP请求要被RESET，修改报文的某些信息后，要基于当前HTTP报文重新发起HTTP请求 这两个问题libcurl能解决吗？

user: user-2
content: c +  liburl
user-0 提问: C语言操作字符串:在:号后和;号前添加"　请教各位

回复:
user: user-1
content: #include <iostream> #include <string>  using std::string;  string Str2Json(string &s) { 	int pos = 0;  	 // :后增加" 	 while((pos = s.find(':',pos)) != (-1)) 	 { 		 pos++; 		 s.insert(pos, 1, '"'); 	 }  	 // ;前增加" 	 pos = 0; 	 while((pos = s.find(';',pos)) != (-1)) 	 { 		 s.insert(pos, 1, '"'); 		 pos = pos + 2; 	 }  	 // 头尾增加{} 	 s = "{" + s + "}";  	 // 去除最后的; 	 if((pos = s.find_last_of(';')) != (-1)) 	 { 		 s.erase(pos, 1); 	 }  	 return s; }   int main()  { 	 using std::cout; 	 using std::endl;  	 string s = ";MFG:HP;MDL:Deskjet 1010 series;DES:CX015D;DevNode:/dev/usb/lp0;NULL:;";  	 cout << Str2Json(s) << endl;  	 return 0;  }

user: user-2
content: 引用 4 楼 zhao4zhong1 的回复:字符串操作的功力不是体现在 给出正确的输入能得到正确的输出 而是体现在 给出各种错误的输入也能得到合理的输出。 比如： ◆未按格式要求输入（无规定间隔符，规定间隔符全角、半角、编码错误……，子内容为空或非法或溢出有效范围） ◆空输入 ◆超长输入 ◆错误编码的字符串 ◆Ctrl+C或Ctrl+Break或Ctrl+Z等signal相关输入 ◆中途强行结束处理（进程意外退出，结束进程，关机，掉电……） ◆……  比如本题，内容里面有引号冒号分号大括号咋办？

user: user-2
content: 字符串操作的功力不是体现在 给出正确的输入能得到正确的输出 而是体现在 给出各种错误的输入也能得到合理的输出。 比如： ◆未按格式要求输入（无规定间隔符，规定间隔符全角、半角、编码错误……，子内容为空或非法或溢出有效范围） ◆空输入 ◆超长输入 ◆错误编码的字符串 ◆Ctrl+C或Ctrl+Break或Ctrl+Z等signal相关输入 ◆中途强行结束处理（进程意外退出，结束进程，关机，掉电……） ◆……

user: user-0
content: 给分结贴，感谢２楼。 也透漏一个最终方案：商定了一下用json有点小题大做了。就把原字符串交给java，然后直接按照;号截取字符串，再按照:号分号提取字段名字和内容。因为json有一个缺点是如果某一个字段不存在的话就会出错。所以对于不同的内容的字符串解析出来问题就会比较多一些。  引用 2 楼 KenZhang1031 的回复:#include <iostream> #include <string>  using std::string;  string Str2Json(string &s) { 	int pos = 0;  	 // :后增加" 	 while((pos = s.find(':',pos)) != (-1)) 	 { 		 pos++; 		 s.insert(pos, 1, '"'); 	 }  	 // ;前增加" 	 pos = 0; 	 while((pos = s.find(';',pos)) != (-1)) 	 { 		 s.insert(pos, 1, '"'); 		 pos = pos + 2; 	 }  	 // 头尾增加{} 	 s = "{" + s + "}";  	 // 去除最后的; 	 if((pos = s.find_last_of(';')) != (-1)) 	 { 		 s.erase(pos, 1); 	 }  	 return s; }   int main()  { 	 using std::cout; 	 using std::endl;  	 string s = ";MFG:HP;MDL:Deskjet 1010 series;DES:CX015D;DevNode:/dev/usb/lp0;NULL:;";  	 cout << Str2Json(s) << endl;  	 return 0;  }

user: user-0
content: String src = "MFG:HP;MDL:Deskjet 1010 series;DES:CX015D;DevNode:/dev/usb/lp0;NULL:"; 		 		//1.去掉最后一个";" 		String tmp1 = src.substring(0, src.length()-1); 		//2.":"后和";"号前添加""" 		String tmp2 = tmp1.replace(":", ":\""); 		String tmp3 = tmp2.replace(";", "\";"); 		//3.添加大括号 		String dest = "{" + tmp3 + "}"; 		 		Log.d("HAHA", dest);  抛给java层来做了，c做起来着实麻烦，我相信sun公司。:)
user-0 提问: 怎么将数组作为参数传入

回复:
user: user-0
content: 谢谢大家的耐心解答

user: user-0
content: 引用 1 楼 adlay 的回复: #include<stdio.h> int sum(int *p, int len){     int s=0;     int i;     for(i=0;i<len;i++){         s+=*(p+i);     }     return s; } void main() {     int array[]={1,2,3,4};     printf("%d\n",sum(array, sizeof(p)/sizeof(int)))); }    你好，不好意思 最近没上网 所以没及时回复 谢谢你

user: user-1
content: 核心上面说了,就是 数组作为表达式的时候是就是一个指针

user: user-2
content: 引用 1 楼 adlay 的回复: #include<stdio.h> int sum(int *p, int len){     int s=0;     int i;     for(i=0;i<len;i++){         s+=*(p+i);     }     return s; } void main() {     int array[]={1,2,3,4};     printf("%d\n",sum(array, sizeof(p)/sizeof(int)))); }  sizeof(array)/sizeof(int)

user: user-3
content: #include<stdio.h> int sum(int *p, int len) { 	int s = 0

user: user-4
content: 添加一个行参，作为数组的长度

user: user-5
content: 再加一个入参，把长度也传进去

user: user-6
content: 另一个方案：  int sum(int* beg, int* end);

user: user-7
content: 参考二楼写法，增加一个形参用来记录数组的大小

user: user-7
content: int len=sizeof(p)/sizeof(int); sizeof(p)有问题；

user: user-8
content: 怎么将整个互联网内容作为参数传入？！

user: user-9
content: 指针，数组做为形参时，都会变成一个指针，sizeof就是指针的大小，32位程序为4. 所以就只有一个元素了，数组长度你可以做为参数传递进去

user: user-10
content: 当数组作为函数的参数的形式传递的时候，它和指针是一样的！ 所以直接用sizeof的话，它的大小是固定的！

user: user-11
content: int sum(int *p) 这样定义，函数中处理的只是一个指针类型，因此int len=sizeof(p)/sizeof(int); 指针的长度为4，int的长度也为4，所以获取的长度是1，结果也就只处理array中的一个元素了

user: user-12
content: 需加一个数组长度参数信息进去，你那样求数组长度是不行的。

user: user-13
content: #include<stdio.h> int sum(int *p, int len){     int s=0;     int i;     for(i=0;i<len;i++){         s+=*(p+i);     }     return s; } void main() {     int array[]={1,2,3,4};     printf("%d\n",sum(array, sizeof(p)/sizeof(int)))); }
user-0 提问: 萌妹子 求大神

回复:
user: user-1
content: char * _log[3];  int i=0; char ch_line[3][500];  while (1) {     if (NULL==fgets(ch_line[i],500,file_log)) break;     printf("%s",ch_line[i]);     _log[i]=(char *)ch_line[i];     printf("%s\n",_log[i]);     i++;     printf("%d",i);     if (i>=3) break; } for (int j=0;j<i;j++) {     printf("%s,%d\n",_log[0],strlen(_log[0]));     printf("%s,%d\n",_log[1],strlen(_log[1]));     printf("%s,%d\n",_log[2],strlen(_log[2])); }

user: user-2
content: // strcpy(_log[i],ch_line);//这个不可以呢。。 因为_log[i] 没有分配内存地址的，所以直接这样拷贝数据的话，内存出错   _log[i]=ch_line;//请注意这行！！ 因为这里不是申请空间，只是把ch_line的内存地址赋值给_log[i]，所以每次都是相同地址了

user: user-0
content: 引用 2 楼 stephenhawke 的回复:// 调整现有代码 // _log[i]只是指针，先申请空间（最好判断是否成功）。 _log[i]=(char *)malloc(sizeof(char)*strlen(ch_line)+1); // _log[i]=ch_line;//请注意这行！！！！申请的空间地址会丢失，指向ch_line strcpy(_log[i],ch_line);//这才是字符串拷贝  strcpy(_log[i],ch_line);//这才是字符串拷贝   这个不报错 但是最后会停止运行！

user: user-0
content: 引用 1 楼 user-4 的回复:char ch_line[500];是全局的 所以都指向了它  使用动态申请的数组存get到的字符串 能详细说明一下么 ？？

user: user-3
content: // 调整现有代码 // _log[i]只是指针，先申请空间（最好判断是否成功）。 _log[i]=(char *)malloc(sizeof(char)*strlen(ch_line)+1); // _log[i]=ch_line;//请注意这行！！！！申请的空间地址会丢失，指向ch_line strcpy(_log[i],ch_line);//这才是字符串拷贝

user: user-4
content: char ch_line[500];是全局的 所以都指向了它  使用动态申请的数组存get到的字符串
user-0 提问: 菜鸟问题：如果想定义一个子程序，返回的值为字符串类型，应该如何定义呢？

回复:
user: user-1
content: 最好用参数传一个buffer进去 如：int program1（char * buffer）；

user: user-0
content: 惭愧，还没学到指针……

user: user-2
content: std::string program1( void ); string不是字符数组

user: user-0
content: 谢谢各位指点！

user: user-3
content: char *strfun(int v) {  static char rv[100];  sprintf(rv,"%d",v);  return (char *)rv; }
user-0 提问: 取两个整数的平均值

回复:
user: user-1
content: 对二进制数abcd和pqrs，有 abcd = a*2的3次方 + b*2的2次方 + c*2的1次方 + d*2的0次方 pqrs = p*2的3次方 + q*2的2次方 + r*2的1次方 + s*2的0次方 所以 abcd + pqrs = (a+p)*2的3次方 + (b+q)*2的2次方 + (c+r)*2的1次方 + (d+s)*2的0次方 对于某二进制数位相加，对应的和的位结果都是“(x+y)*2的n次方”，如果x!=y，即一个为0，另一个是1，那么可以通过“(x^y)*2的n次方”得到结果，与的部分为0；如果x==y，即都为0或1，那么结果可以通过“((x & y)<<1))*2的n次方”得到结果，异或部分为0。 因此： abcd + pqrs = ((abcd & pqrs) << 1) + (abcd ^ pqrs)，因此： 平均数 = (abcd + pqrs) >> 1 = (abcd & pqrs) + (abcd ^ pqrs) >> 1

user: user-0
content: 1.baichi4141点错了溢出这个关键点，而且还给出了很明确的实例，所以给了最多的25分； 2.Falleyes解释了表达式是如何得到平均值的，很浅显，给10分； 3.KenZhang1031，你的描述有点复杂啊，不过你这么热心，给5分^_^。  谢谢大家啦。

user: user-2
content: 引用 10 楼 wwwzys 的回复:这么麻烦，为什么不这样写   int begin = 0, end = 100, mid; mid = (begin>>1) + (end>>1);  这样多简单啊，你们说是不是啊？  的确不对啊，int 类型

user: user-3
content: 奇技淫巧！！

user: user-4
content: 引用 6 楼 C_226 的回复:防溢出这个我倒是没想到，谢谢baichi4141，不过为了防溢出而使用这样的晦涩的代码，是否合理？我第一眼看到的时候就没明白代码是做什么的。 这是取舍的问题 大多数情况下，代码的可读性的确比效率技巧等等更重要，但也有时候不得不由高级程序员来手动调整成最佳状态 例如大多数情况下，编译器的优化比程序员要简单高效，因此程序员不需要太关注运算效率，但有时最核心使用频率最高的那一部分代码，不仅不能依赖编译器的优化，甚至连c/c++都不能使用，必须内嵌汇编来提高效率    引用 10 楼 wwwzys 的回复:这么麻烦，为什么不这样写  int begin = 0, end = 100, mid; mid = (begin>>1) + (end>>1);  这样多简单啊，你们说是不是啊？ int begin = 1, end = 1, mid; mid = (begin>>1) + (end>>1); 别问别人，问自己

user: user-2
content: 这么麻烦，为什么不这样写   int begin = 0, end = 100, mid; mid = (begin>>1) + (end>>1);  这样多简单啊，你们说是不是啊？

user: user-5
content: 如2楼所说，如果两个数接近int 的最大值时，相加就溢出了 引用 2 楼 baichi4141 的回复:防止溢出用 如果0xFFFFFFFF和0xFFFFFFFF取平均值，( begin & end ) + ( ( begin ^ end ) >> 1 )可以得到正确的结果0xFFFFFFFF，而( begin + end ) / 2得到的就是0x7FFFFFFF

user: user-4
content: 防止溢出用 如果0xFFFFFFFF和0xFFFFFFFF取平均值，( begin & end ) + ( ( begin ^ end ) >> 1 )可以得到正确的结果0xFFFFFFFF，而( begin + end ) / 2得到的就是0x7FFFFFFF

user: user-6
content: 学习了，这个很有用啊，以前一直为两个数相加会溢出而不得不把类型定义成更大数据的类型。

user: user-7
content: 好像是有点复杂， 我能想到的一般是 (a+b)>>1 来算平均值

user: user-8
content: 这样来理解，求平均就是把两个数相加，然后除以2 数字相加有两个部分，一个是相加得到的本位，一个是相加得到的进位，我们可以计算的时候把他们分开。 首先，&得到的数字位，只有两个1才得到1，就是进位的1，而本该向前进一位的1待在了本位。实际上应该让得到的结果左移1（让进位的1进到合适的位置），然后再右移1（除以2），得到进位的平均数。 然后，^得到的数字位，实际得到的是本位得到的结果（不包括进位），让他右移1，得到本位的平均数。 两个平均数相加，得到整个数完整的平均数。  设本位为a，进位为b， 那么(a1+a2+b)/2=(a1+a2)/2+b/2。

user: user-0
content: 引用 2 楼 baichi4141 的回复:防止溢出用 如果0xFFFFFFFF和0xFFFFFFFF取平均值，( begin & end ) + ( ( begin ^ end ) >> 1 )可以得到正确的结果0xFFFFFFFF，而( begin + end ) / 2得到的就是0x7FFFFFFF  防溢出这个我倒是没想到，谢谢baichi4141，不过为了防溢出而使用这样的晦涩的代码，是否合理？我第一眼看到的时候就没明白代码是做什么的。

user: user-9
content: 溢出是知道的，但是那个平均值是怎嘛算的？

user: user-10
content: 引用 2 楼 baichi4141 的回复:防止溢出用 如果0xFFFFFFFF和0xFFFFFFFF取平均值，( begin & end ) + ( ( begin ^ end ) >> 1 )可以得到正确的结果0xFFFFFFFF，而( begin + end ) / 2得到的就是0x7FFFFFFF学习了！
user-0 提问: 主进程如何监控子进程状态？如果子进程非正常退出呢？

回复:
user: user-0
content: 类似如下SIGCHLD的响应函数的话，应该不会阻塞了吧。 void sig_chld(int signo) {        pid_t pid;        int stat;                 while((pid = waitpid(-1, &stat, WNOHANG)) > 0){                printf("child %d terminated\n", pid);        }         return; }

user: user-0
content: 或者直接捕捉“SIGCHLD”信号？

user: user-0
content: 谢谢楼上各位了。 测试了下。 决定采取响应SIGCHLD来确定。

user: user-1
content: void sig_chld(int signo) {        pid_t pid;        int stat;                 while((pid = waitpid(-1, &stat, WNOHANG)) > 0){                printf("child %d terminated\n", pid);        }         return; }  感觉这方法靠谱

user: user-2
content: 前排围观学习。 以前，在用SDK写程序的时候，我也遇到过这种情况，当时自己的做法是（仅供参考）： 主进程创建子进程后，在创建一个线程，并把子进程的句柄传递到这个线程里，然后就 WaitForSingleObject吧。（一旦子进程结束，它就变成已通知状态了） 接下来再判断子进程的退出代码。 …… http://blog.csdn.net/ubiter/article/details/10363601

user: user-3
content: 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……

user: user-3
content: 先让子进程每隔比如30秒打开某个日志文件，往最后添加一行信息，关闭； 再在主进程中每隔比如90秒检查这个日志文件的最后修改日期时间，如果和上次检查获得的日期时间相比没有变化，就说明被监视的子进程挂死或非正常退出了。

user: user-4
content: 引用 2 楼 u011339091 的回复:类似如下SIGCHLD的响应函数的话，应该不会阻塞了吧。 void sig_chld(int signo) {        pid_t pid;        int stat;                 while((pid = waitpid(-1, &stat, WNOHANG)) > 0){                printf("child %d terminated\n", pid);        }         return; }  linux 和fork相关函数都能通过一些手段得到子进程的状态，话说回来活要见人死要见尸。
user-0 提问: 求教 c语言相关问题  不求作业只是寻求方向    希望从事此工作的大神给个指示

回复:
user: user-1
content: 说的很好 正在愁这个事情

user: user-0
content: 多谢大家的解答  我还是先把我现在看的书弄明白了再想其他的吧!

user: user-2
content: 千万别看谭老的书，害了一代又一代人！

user: user-0
content: 你好  不知道实际项目是什么呢  能举个例子吗  我感觉书上写的那些是不是就是了  比如编写一个记忆测试游戏，还有就是怎么才能达到去公司工作的水平，如何自我检测呢

user: user-3
content: 我的观点是光对着书学习是不行的， 应该是学习了书本的基础之后，通过实际项目的锻炼才会有提高，同时学习别人的优秀代码。 这跟学习一门外语一样，多练是王道。。。

user: user-4
content: 不知道你有没有c基础，没有的话建议你买一本谭浩强的《c语言程序设计》，如果有一点c基础的话给你推荐两本书《windows 核心编程》和《unix环境高级编程》这两本书你选一本一个是windows方向的，一个是linux方向的，认真看完并动手敲完书上所有例子和习题的代码，你就可以出山找工作了。

user: user-0
content: 引用 9 楼 fengliang12345 的回复:如果想以找到c的工作为标准的话   至少需要学网络编程  多线程        我刚毕业  刚找到做c的工作   也祝你好运你面试的时候都用到什么知识啦，还有在公司工作都要用到什么啊  麻烦说一下吧！我对这一行一无所知啊

user: user-5
content: 如果想以找到c的工作为标准的话   至少需要学网络编程  多线程        我刚毕业  刚找到做c的工作   也祝你好运

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:引用 6 楼 li19900210 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] [quote=引用 4 楼 li19900210 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] 《Linux C编程一站式学习》学这个就够了吗？能不能达到就职水平啊 先学了再说。 有时去执行一个错误的决定总比优柔寡断或者没有决定要好得多。 [/quote]我现在纠结于是自学c语言然后找工作，还是去培训班呢，培训班好像稳妥点，但是四个月的时间似乎不能学到多少东西啊，还有就是如果自学的话找工作会不会有太多的学历限制啊，真的很纠结[/quote] 上培训班的主要作用不是学到技能，而是扩大人脉以增加找到工作的可能性。[/quote]  引用 7 楼 zhao4zhong1 的回复:引用 6 楼 li19900210 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] [quote=引用 4 楼 li19900210 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] 《Linux C编程一站式学习》学这个就够了吗？能不能达到就职水平啊 先学了再说。 有时去执行一个错误的决定总比优柔寡断或者没有决定要好得多。 [/quote]我现在纠结于是自学c语言然后找工作，还是去培训班呢，培训班好像稳妥点，但是四个月的时间似乎不能学到多少东西啊，还有就是如果自学的话找工作会不会有太多的学历限制啊，真的很纠结[/quote] 上培训班的主要作用不是学到技能，而是扩大人脉以增加找到工作的可能性。[/quote]哦 这样啊，那像我们这样没有基础的即使工作了但是什么都不会那也不行啊，还有就是什么培训机构靠谱点呢

user: user-6
content: 引用 6 楼 li19900210 的回复:引用 5 楼 zhao4zhong1 的回复:[quote=引用 4 楼 li19900210 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] 《Linux C编程一站式学习》学这个就够了吗？能不能达到就职水平啊 先学了再说。 有时去执行一个错误的决定总比优柔寡断或者没有决定要好得多。 [/quote]我现在纠结于是自学c语言然后找工作，还是去培训班呢，培训班好像稳妥点，但是四个月的时间似乎不能学到多少东西啊，还有就是如果自学的话找工作会不会有太多的学历限制啊，真的很纠结[/quote] 上培训班的主要作用不是学到技能，而是扩大人脉以增加找到工作的可能性。

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:引用 4 楼 li19900210 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] 《Linux C编程一站式学习》学这个就够了吗？能不能达到就职水平啊 先学了再说。 有时去执行一个错误的决定总比优柔寡断或者没有决定要好得多。 [/quote]我现在纠结于是自学c语言然后找工作，还是去培训班呢，培训班好像稳妥点，但是四个月的时间似乎不能学到多少东西啊，还有就是如果自学的话找工作会不会有太多的学历限制啊，真的很纠结

user: user-6
content: 引用 4 楼 li19900210 的回复:引用 3 楼 zhao4zhong1 的回复:《Linux C编程一站式学习》学这个就够了吗？能不能达到就职水平啊 先学了再说。 有时去执行一个错误的决定总比优柔寡断或者没有决定要好得多。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:《Linux C编程一站式学习》学这个就够了吗？能不能达到就职水平啊

user: user-6
content: 《Linux C编程一站式学习》
user-0 提问: 图书管理系统

回复:
user: user-1
content: 来接点分~

user: user-2
content: 引用 2 楼 user-9 的回复:多么亲切的系统啊 呵呵，每一个自学的程序员，都是从它开始的，我当初写的才1000行，当时就特高兴了，现在看起来就一个链表，啥都没有。

user: user-3
content: 目测是课程设计吧 0-0.

user: user-4
content: 百度里边有好多这样的程序，可以参考参考。

user: user-5
content: 楼主是想干什么？

user: user-6
content: 难道是传说的课程设计，话说我当时做的是超市管理系统..

user: user-7
content: 真的很熟悉呀，不过还是有点不相同。

user: user-8
content: 哪个培训机构的项目？？

user: user-9
content: 多么亲切的系统啊
user-0 提问: 飞机订票管理系统 用C语言  

回复:
user: user-1
content: http://sourceforge.net/p/oabs/discussion/224410/thread/c102020e/

user: user-2
content: LZ也太懒了吧，这都想要现成的，有了等的时间，自己都做完了！

user: user-0
content: 我是其他专业的 这个不会····

user: user-3
content: 这么简单 自己慢慢研究

user: user-4
content: 木有兴趣要你的分分，自己写不是挺好么，你都说简单了。。。~

user: user-5
content: 引用 5 楼 derekrose 的回复:http://sourceforge.net/p/oabs/discussion/224410/thread/c102020e/ 这个不错
user-0 提问: 学生学籍信息管理系统设计

回复:
user: user-1
content: 引用 2 楼 user-2 的回复:不要再写这种没用的东西了，一般这种东西都是要使用数据库的，哪个学校会使用几个文本文件来存储这些数据？你写这种东西，不如直接创建一个数据库，再开发一个带界面的程序客户端去使用它更有实用价值。 一年一度的课程设计时间到了，你懂得......

user: user-2
content: 不要再写这种没用的东西了，一般这种东西都是要使用数据库的，哪个学校会使用几个文本文件来存储这些数据？你写这种东西，不如直接创建一个数据库，再开发一个带界面的程序客户端去使用它更有实用价值。

user: user-1
content: http://download.csdn.net/detail/n_sev7/4324932 我大一写的，可以参考一下
user-0 提问: sprintf()格式化字符串的时候，多出一个"-"具体的原因是什么？

回复:
user: user-0
content: 引用 1 楼 jerry_dqh 的回复:heroId 这个值是-1吧 是的 -1，改了  耳环

user: user-1
content: To set a breakpoint when a variable heroId 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 heroId. Click OK to set the breakpoint.

user: user-2
content: heroId值可能被改了，改成-1，所以才会输出-1，你单步调试一下。

user: user-3
content: heroId可能是个返回值之类的，上一次使用被赋值为-1了。单步调试一下就知道了

user: user-4
content: 你这个32好紧哟, herold  稍大些, 就要越界了, 你就悲剧了.

user: user-5
content: herold  被改了吧

user: user-6
content: heroId的类型是int吗？断点跟踪一下heroId的值

user: user-7
content: herold 值为 -1

user: user-8
content: 看看heroId的值在哪里做了修改，导致不符合你的预期。

user: user-9
content: heroId 这个值是-1吧
user-0 提问: 字符串数组最后一个值去哪儿了

回复:
user: user-1
content: 引用 10 楼 007remember 的回复:n--之后，n=5 试了下，还是有问题，我再仔细看下  补充下：原程序的for循环中，有操作 index++，对for循环的判定条件 n - index作了改变，程序就不可能正常运行。

user: user-0
content: 不好意思，可能跟我用的一个工具（loadrunner）有关 我在c编译环境下面运行是正确的。 多谢大家！

user: user-0
content: n--之后，n=5 试了下，还是有问题，我再仔细看下

user: user-0
content: 嗯，谢谢tatata000！ 已经修改了

user: user-2
content: 如8楼所述，循环判断有问题。 举几个例子： n=6 index = 0时，n-index=6，即a<6；循环6次:a=0,1,2,3,4,5 index = 1时，n-index=5，即a<5;循环5次：a=0,1,2,3,4 index = 3时，n-index=3，即a<3；循环3次：a=0,1,2 index = 5时，n-index=1，即a<1；循环1次：a=0  不管哪一个例子，都会涉及到strcpy(str[5],str[6])的问题。 而str[5]就已经是最后一个字符串来，str[6]出数组边界了。

user: user-1
content: 应该还是循环次数的问题，在最后一个for循环那里,改成 if (index != 0) {        b = n - index;        for (a=0; a<b; a++)             {                    strcpy(str[index],str[index+1]);                    index++;             } } 再试试

user: user-0
content: 多声明了个j，请忽略

user: user-0
content: char str[6][15]={"aa","bb","cc","dd","ee","ff"}； int a,index,j; int n = 6;  	n--; //get a rand index in a string array 	index = rand()%n;  	if (index != n) {  		for (a=0;a<n-index;a++) {  			strcpy(string[index],string[index+1]);   			index++; 		} 	}

user: user-0
content: 多谢大家的回复！ 没有多循环呢，马上贴代码

user: user-2
content: 最好贴出你的代码。 以下代码纯属猜测： index = 3; i = 0; while(i<=2) { //估计循环判断的时候实际上循环了3次，这里应该把等号去掉。     strcpy(str[index+i],str[index+i+1]);     i++; }

user: user-3
content: 应该是多循环了一些index，造成覆盖现象。  引用 楼主 007remember 的回复:大家好，我有个小程序：实现随机从一个字符串数组里面取一个值，取完然后，从取值这个下标开始就把后面的值依次赋给前面的，相当于随机从数组里面删除了值，然后数组重新排列。 比如数组 str[6][15]={"aa","bb","cc","dd","ee","ff"}, 随机取了第4个值，str[3] ="dd", 然后 循环2次 strcpy（str[index],str[index+1]）, 重新排列的数组不是应该是 str[6][15]={"aa","bb","cc","ee","ff","ff"}吗？  但是实际的结果是最后数组只剩下5个元素（str[6][15]={"aa","bb","cc","ee","ff"}）了，请问原来那个str[5]去哪儿了？

user: user-4
content: 你最好能把你的程序贴出来， 引用 楼主 007remember 的回复:大家好，我有个小程序：实现随机从一个字符串数组里面取一个值，取完然后，从取值这个下标开始就把后面的值依次赋给前面的，相当于随机从数组里面删除了值，然后数组重新排列。 比如数组 str[6][15]={"aa","bb","cc","dd","ee","ff"}, 随机取了第4个值，str[3] ="dd", 然后 循环2次 strcpy（str[index],str[index+1]）, 重新排列的数组不是应该是 str[6][15]={"aa","bb","cc","ee","ff","ff"}吗？  但是实际的结果是最后数组只剩下5个元素（str[6][15]={"aa","bb","cc","ee","ff"}）了，请问原来那个str[5]去哪儿了？

user: user-4
content: 楼主，与"dd"相对应的数组下表应该是str[0][3],吧
user-0 提问: 一道面试题引发的疑问

回复:
user: user-1
content: 指针存储的是地址，地址是一个16进制的数。实际上，这相当于指针直接赋值地址，编译器自动把10进制的3转换为16进制的3，然后给指针。

user: user-2
content: 问题是这面试题其实只是错误的渣渣  结果不保证一定是你以为的这样

user: user-0
content: 引用 1 楼 user-3 的回复:改动一下就很清楚了 S s;  s.p = malloc(sizeof(int)); //此时s.p是一个很大的数 int *p=&s.i;  p[0]=4; //即s.i = 4 p[1]=3; //即s.p = 3，如果访问s.p，则崩溃  对不起.我不是很明白您的意思。 这样改动貌似只是说明了p[1]=3确实对s.p进行了赋值。。。 而我的问题是p+1是个int型指针，所以p[1]是个int型数据，而&p[1]这个地址存放的是个结构体s的int型指针，数据类型不对啊？？？他们怎么实现数据类型转换的？

user: user-3
content: 指针本身也是放着栈上的

user: user-3
content: 改动一下就很清楚了 S s;  s.p = malloc(sizeof(int)); //此时s.p是一个很大的数 int *p=&s.i;  p[0]=4; //即s.i = 4 p[1]=3; //即s.p = 3，如果访问s.p，则崩溃
user-0 提问: 菜鸟请教一下在for语句中赋值和在for之前赋值的区别

回复:
user: user-1
content: lz还是要多看看、多试试for循环啊，楼上的说的不错了，就不重复了

user: user-2
content: 运行结果当然不同啦，第二种情况下，每次进第二层和第三层循环b和c的值都会重新初始化的呀。

user: user-0
content: 引用 2 楼 derekrose 的回复:for (a=1;a<=3;a=a+1)         {             for(b=1;b<=3;b=b+1)             {                 for (c=1;c<=3;c=c+1)  等于 int a=1; for (;a<=3;a=a+1)         {             int b=1;             for(;b<=3;b=b+1)             {             int c=1;                 for (;c<=3;c=c+1) 非常感谢

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

user: user-0
content: 引用 3 楼 u012421456 的回复:[quote=引用 楼主 u013704298 的回复:]                             if (a!=1&&b!=1&&c!=3&&a!=b&&a!=c&&b!=c)                             if (a!=1&&c!=1&&c!=3&&a!=b&&a!=c&&b!=c) lz你这两行代码咋不一样啊！[/quote] 不好意思，一开始写错了，改了一下，忘了全部改了。

user: user-0
content: 引用 1 楼 user-6 的回复:运行结果不同是因为每次a循环，b都会重新赋值b = 1，每次循环 c都会重新复制 c = 1. 如果全部放在前面，a、b、c都只会被复制一次。 看来你还不了解循环。 恩，看来是我还没理解，非常感谢。

user: user-0
content: 引用 4 楼 starytx 的回复:主要区别是b和c写的位置引起的，第一种b和c都是在外边初始化一次，之后一直就是循环中的旧值，而第二种，每次最外层循环一次，b就被重置为1一次，同样，b循环进行一次，c就没重置一次。 有点明白了，非常感谢，顺便问一下，为什么我显示的用户名是类似UID的呢？我想显示我UID下面的那个名字，请教如何设置

user: user-4
content: 引用 4 楼 starytx 的回复:主要区别是b和c写的位置引起的，第一种b和c都是在外边初始化一次，之后一直就是循环中的旧值，而第二种，每次最外层循环一次，b就被重置为1一次，同样，b循环进行一次，c就没重置一次。被

user: user-4
content: 主要区别是b和c写的位置引起的，第一种b和c都是在外边初始化一次，之后一直就是循环中的旧值，而第二种，每次最外层循环一次，b就被重置为1一次，同样，b循环进行一次，c就没重置一次。

user: user-1
content: 引用 楼主 u013704298 的回复:if (a!=1&&b!=1&&c!=3&&a!=b&&a!=c&&b!=c)                             if (a!=1&&c!=1&&c!=3&&a!=b&&a!=c&&b!=c) lz你这两行代码咋不一样啊！

user: user-5
content: for (a=1;a<=3;a=a+1)         {             for(b=1;b<=3;b=b+1)             {                 for (c=1;c<=3;c=c+1)  等于 int a=1; for (;a<=3;a=a+1)         {             int b=1;             for(;b<=3;b=b+1)             {             int c=1;                 for (;c<=3;c=c+1)

user: user-6
content: 运行结果不同是因为每次a循环，b都会重新赋值b = 1，每次循环 c都会重新复制 c = 1. 如果全部放在前面，a、b、c都只会被复制一次。 看来你还不了解循环。
user-0 提问: 如何剔除s1字符串里与s2一致的字符？？

回复:
user: user-0
content: 知道为啥了 s1[k]=s1[++k];其实就等于 s1[k+1]=s1[k+1]; 应该写成 s1[k]=s1[k+1];

user: user-1
content: 仅供参考#include <stdio.h> #include <string.h> #include <locale.h> char s[256]; char *p; int r,n,i; int main() {     setlocale(LC_ALL,"chs");     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-2
content: #include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<errno.h> #include<string.h> #include<sys/types.h>   #define STR_SIZE 512   int main(int argc, char* argv[]) { 	       char str[STR_SIZE]     = {0};     char substr[STR_SIZE]  = {0};     char deststr[STR_SIZE] = {0};     char *phead = NULL;     char *ptail = NULL;               printf("input the first string!\n");     scanf("%s", str);          printf("input the second string!\n");     scanf("%s", substr);          if((phead = strstr(str, substr)) != NULL)     {         strncpy(deststr, str, phead-str);         strcpy(deststr+strlen(deststr), phead+strlen(substr));         printf("the string:%s, after delete the substr:%s, the left string:%s\n", str, substr, deststr);     }     else     {         printf("the second string is not a sub string int the first string!\n");     }          return 0; }
user-0 提问: windows程序设计的一些疑问

回复:
user: user-1
content: 亲，满意的话请给分哈~

user: user-0
content: 谢谢，我懂了。解释的非常好

user: user-1
content: HANDLE WINAPI LoadImage(   _In_opt_  HINSTANCE hinst,   _In_      LPCTSTR lpszName,   _In_      UINT uType,   _In_      int cxDesired,   _In_      int cyDesired,   _In_      UINT fuLoad );  MSDN上说： If the hinst parameter is NULL and the fuLoad parameter omits the LR_LOADFROMFILE value, the lpszName specifies the OEM image to load. The OEM image identifiers are defined in Winuser.h and have the following prefixes.  OEM就是预定义好的图像，在Winuser.h这个文件里面能找到，上面说有如下的前缀值： Prefix（前缀）  Meaning（含义） OBM_      OEM bitmaps OIC_      OEM icons OCR_      OEM cursors
user-0 提问: C 的EOF 问题

回复:
user: user-1
content: Enter,Ctrl+Z,Enter

user: user-2
content: 嗯，刚才确认了一下用vs 2010，ctrl+z一次就退出了，vc++ 6.0问题就是多。。

user: user-1
content: Linux下不是Ctrl+Z是Ctrl+D

user: user-2
content: 我认为这是编译器的事儿，我用的vc++ 6.0也是这种情况，第一次打ctrl+z 其实都没有进入键盘缓冲区，建议用高版本的，比如vs 2012可能就不会有这个问题(我没有2012实验不了，估计2楼没出现问题估计就是用的高版本的)，linux 下的crtl+z就直接退出程序了

user: user-3
content: if(scanf("%s",s)==EOF) 这句 scanf返回成功输入的变量个数,相当于用  输入几个参数和EOF作比较,而不是输入什么和EOF做比较

user: user-4
content: 应该把这句拆开， scanf("%s",s)

user: user-4
content: 楼主不小心把，函数返回值，当成输入的值了

user: user-0
content: 引用 3 楼 baichi4141 的回复:宏EOF代表没有接收到数据，一般定义为-1 如果你输入EOF，你输入的是三个字符数据，如果你输入-1，你输入的是一个整数数据，只有当你输入Ctrl+Z的时候，函数才会返回宏EOF或者说整数-1 楼主的问题在于没有分清函数返回值和函数输出 我就是输入的ctrl +z

user: user-0
content: 引用 楼主 u011488256 的回复:// 回音程序.cpp : Defines the entry point for the console application. //  #include "stdafx.h" #include "stdio.h"  int main(int argc, char* argv[]) { 	char s[10]; 	while (1) 	{ 		if(scanf("%s",s)==EOF) 			break; 		printf("%s\n",s); 	} 	return 0; }  这段小程序 运行后 为什么每次输入EOF后 点回车不能退出循环？ 必须要再一次输出EOF点回车才能退出循环啊？  如果换成if(scanf("%d",n)==EOF)  这样的话 输入一次EOF就可以退出循环 求解！ 我就是输入的 ctrl +z 啊 为什么我这里两次 我这里VC环境

user: user-5
content: 宏EOF代表没有接收到数据，一般定义为-1 如果你输入EOF，你输入的是三个字符数据，如果你输入-1，你输入的是一个整数数据，只有当你输入Ctrl+Z的时候，函数才会返回宏EOF或者说整数-1 楼主的问题在于没有分清函数返回值和函数输出

user: user-6
content: 帮你程序改短了一点，功能是一样的。 哦对了，EOF的输入方式是Ctrl+Z你知道吧。  #include "stdio.h"   int main( ) {     char s[ 10 ];     while( ~scanf( "%s", s ) )         printf("%s\n",s);     return 0; }

user: user-6
content: 我这边测试没有问题啊。  测试输入输出： L:\>test 123 123 ^Z  L:\>test ^Z
user-0 提问: Linux溢出利用代码这个句子是函数还是字符串？它有内存空间吗？

回复:
user: user-0
content: 引用 2 楼 ADF1230 的回复:这是将shellcode这个地址强制转化为void func()这样的函数的入口地址，这样shellcoe中的字符串就会被当做代码来执行。  thank you,对于原理还不太懂，但大概样子明白了

user: user-1
content: 这是将shellcode这个地址强制转化为void func()这样的函数的入口地址，这样shellcoe中的字符串就会被当做代码来执行。

user: user-1
content: 实际上是： typedef void(*PFN_TYPE)(); 	(*(PFN_TYPE)shellcode)();
user-0 提问: C语言操作excel表格问题

回复:
user: user-0
content: #include<stdio.h> void main() { 	char check[100]; 	char c;  	FILE *fp; 	fp=fopen("C:\\1.csv","r");  	while((c=fgetc(fp))!=EOF) 	{ 		fscanf(fp,"%s",check); 		printf("%s\n",check); 	} 	fclose(fp); }  这样反正是可以读出来了，但是还需要做很多其他工作！

user: user-1
content: 对的，cvs这个也行，但是有逗号分隔符。 我说的txt是在Excel里面Ctrl+A然后Ctrl+C然后粘贴到txt里面。 这样文件相对于cvs没有逗号，操作起来更加方便。分隔符是'\t'。  txt转成xlc只要复制粘贴就行的。

user: user-0
content: 引用 1 楼 xiayuanzhong 的回复:不能直接操作的，excel是封装的二进制文件。 想直接操作需要用VBA写脚本。 简介操作就是把Excel导出到txt里面操作。 那你感觉转换为csv文件的方法可以么？

user: user-0
content: 听说一种解决办法是把excel另存为csv格式，这是纯文本，然后用读文件的方式读入到数组。 各路大神认为应该怎么办啊？

user: user-1
content: 不能直接操作的，excel是封装的二进制文件。 想直接操作需要用VBA写脚本。 简介操作就是把Excel导出到txt里面操作。