Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 如何读取一个文本文件中的数据？

回复:
user: user-0
content: 对大家的回答都不如意

user: user-1
content: http://bbs.csdn.net/topics/360055953

user: user-2
content: 引用 9 楼 buyong 的回复:[quote=引用 8 楼 bcxss123 的回复:] 为何C要实现一个简单问题都很难，而用其它的某些语言却很容易。  尺有所短，寸有所长。 C可以做一些其他语言做不了的，同时这种文本处理确实不如脚本语言。[/quote]  难者不会,会者不难 文本处理没有比C更简单的了 元芳,你怎么看

user: user-3
content: 引用 14 楼 bcxss123 的回复:楼上这个把exit(0)改成return 0;可运行但只能读取文本不能比较两行相同的数据啊。 额，对不住了，没看清题意，只看到了前半部分。菜鸟飞过，大牛勿怪。

user: user-0
content: 如果随机的产生两个数字集合或者含有其它字符,如何实现它门之间的交，并，补等运算，用C++要求速度尽可能的快。

user: user-0
content: 楼上这个把exit(0)改成return 0;可运行但只能读取文本不能比较两行相同的数据啊。

user: user-3
content: 读取d盘根目录下1.txt文件。 文件内容：  代码如下： #include<stdio.h> int main() { 	FILE *fp;//定义文件指针     char a;//定义读取字符变量 	if((fp=fopen("d:\\1.txt","r"))==NULL)//判断文件是否为空，是空提示错误，		 	{ 		printf("can not open this file\n"); 		exit(0); 	} 	else//否则只读方式打开要读的1.txt文件 	{		 		while(!feof(fp))/*如果文件内容没有读完，那么执行下列代码。*/ 		{ 			fscanf(fp,"%c",&a);/*一个字符一个字符读文件中的字符*/ 			printf("%c",a);//每读一个字符就打印出来一个字符。 		} 		fclose(fp);/*关闭并保存文件。*/ 	} 	printf("\n"); 	return 0; }

user: user-4
content: 引用 11 楼 xy505188 的回复:fscanf("%d\t",&....)即可 应该是 fscanf(fp,"%d\t",&a)

user: user-5
content: fscanf("%d\t",&....)即可

user: user-0
content: 如果随机的产生两个数字集合如何实现它位之间的交，并，补等运算，用C++要求速度尽可能的快。5楼大哥请考虑如何？

user: user-6
content: 引用 8 楼 bcxss123 的回复:为何C要实现一个简单问题都很难，而用其它的某些语言却很容易。  尺有所短，寸有所长。 C可以做一些其他语言做不了的，同时这种文本处理确实不如脚本语言。

user: user-1
content: fgets加 #include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-0
content: 为何C要实现一个简单问题都很难，而用其它的某些语言却很容易。

user: user-0
content: 刚学不久C，不懂大哥的程序，希能详术，并读两个文本试一试

user: user-7
content: fp=fopen(文件名,"r"); while(ch=getc(fp)!=EOF) putchar(ch); fclose(fp);

user: user-0
content: 能否详点写出来？

user: user-6
content: getline strtok std::set set_difference

user: user-4
content: fscanf(文件指针，读取格式，变量)

user: user-8
content: int sscanf( const char *buffer, const char *format, ... );
user-0 提问: c 函数返回问题

回复:
user: user-1
content: 返回局部变量的地址，很危险

user: user-2
content: 引用但是有人说第一种返回局部变量有问题  不要返回局部变量的地址或引用， 一般的局部变量通过拷贝返回时没有问题的。 你的第一个例子确实返回了局部变量的地址，所以是不可取的。

user: user-3

user: user-3
content: 引用 4 楼 u010915464 的回复:除了局部变量的地址不可以返回，其他的貌似都可以返回 int i; char ch[50]="dasdasd"; char *ch1="dasdasda"; return i;//Y return &i;//N return ch;//N返回的是ch的地址所以不行 return ch1;//Y 因为ch1指针变量里面存的是一个地址而不是返回的是ch1的地址&ch1  所以你的第一个代码里面返回buf会有警告，函数结束时buf就从栈中消失了，最终肯定得不到buf的值，第二个static是静态变量，存放在全局区，结果不会错

user: user-3
content: 除了局部变量的地址不可以返回，其他的貌似都可以返回 int i; char ch[50]="dasdasd"; char *ch1="dasdasda"; return i;//Y return &i;//N return ch;//N返回的是ch的地址所以不行 return ch1;//Y 因为ch1指针变量里面存的是一个地址而不是返回的是ch1的地址&ch1

user: user-4
content: static char buf[13]; 你这样是不能返回的

user: user-5
content: 有错误的程序不是每次运行一定会出错，尤其是简单的例子里。就好比你闯红灯不一定会被车撞倒，尤其是在车不多的路口。你不能因此就觉得闯红灯是没错的。

user: user-0
content: 我猜想可能是局部变量我退出的时候直接printf了 所以就直接打出来了，如果过段时间去取就会有问题。
user-0 提问: 编程语言为了兼容造成的损失

回复:
user: user-1
content: 的确可以认为是设计垃圾，没有预见到可能的需求变化，也没有能够有效淘汰旧特性的机制，导致不得不对现实做出妥协。 根本原因可以说是设计者的无能和使用者的无能。大部分人都习惯于worse is better的惯用技俩了，做不好甩掉历史包袱是很正常的事。加上以用户数决定发展方向的不良风气在哪都有…… 因为旧的特性有很多人用，这些人觉得用得好好的，连同旧代码就变成历史包袱了。所以加入了替代的新特性也淘汰不了旧的，结果就是更乱。这样还不如不加入新特性。 例子有很多。C尤其多。比如声明符语法。这也影响到试图在源码上兼容的语言。BS考虑过trailing syntax，但是最终直到C++11在另一个上下文中才加入。相对来说新的语言就没这个顾虑了，像C#一开始就扔掉了数组声明符的中缀写法。 但是即便能加入新特性也不见得就是好的。比如说C#的匿名方法之类本来也算是新特性，但加入了lambda之后基本就没什么意义了。如果一开始就能预见到，根本不需要在这里增加语言的复杂性和历史包袱候选。
user-0 提问: gcc对（c=getchar（））！=EOF这个表达式的处理并不正确？

回复:
user: user-1
content: 因为在楼主的环境里EOF是-1，char的范围是-128到127，当然可以表示EOF了，但是如果EOF是不在这个范围的数，那么就有问题了。

user: user-2
content: 我看了一下那本书，它说的也合理。 首先，EOF只是保证为负，但并不保证一定是-1。在这种情况下，即使char等价于signed char，也未必可以表示EOF； 其次，如果char等价于unsigned char，那么，EOF必定是不能表示的。 最后，在C中，字符编码和执行字符集有关，不能一口咬定它就是ASCII。认为c可能无法表示getchar的返回值，是合理的。 其它情况取决于编译器。老的编译器不太规范，现在的情况毕竟好一些。

user: user-0
content: 引用 7 楼 sholber 的回复:[quote=引用 5 楼 incident_a 的回复:] 这个问题来自《C陷阱与缺陷》,又是那本号称14年未改动的书，但在这个问题上，作者只列出了3种可能，我在看你的回答之前，估计gcc的行为属于第三种，也就是: 这正是书上写的“程序在表达式中并不是比较c与EOF，而是比较getchar函数的返回值与EOF”这种情况。 但在看完回答之后，我认为gcc的行为属于你说的这种，也就是第4种。 那本书说了哪三种？（这本书我从来没看过，不过准备看一下） 无论如何，确切的说法是比较赋值表达式的值和EOF[/quote] 1.某些合法的输入字符在被截断后使得c的取值与EOF相同 2.c根本不可能取到EOF这个值 3.某些编译器在表达式中并不是比较c与EOF，而是比较getchar函数的返回值与EOF

user: user-0
content: 这个问题来自《C陷阱与缺陷》,又是那本号称14年未改动的书，但在这个问题上，作者只列出了3种可能，我在看你的回答之前，估计gcc的行为属于第三种，也就是: 这正是书上写的“程序在表达式中并不是比较c与EOF，而是比较getchar函数的返回值与EOF”这种情况。 但在看完回答之后，我认为gcc的行为属于你说的这种，也就是第4种。

user: user-0
content: 你的意思就是gcc将char c；默认为是signed char c；对吧？ 看了半天终于看明白了

user: user-2
content: 我觉得这个帖子值300分（是帖子本身有意义，而不是说我的回答值300分）。

user: user-2
content: 这正是书上写的“程序在表达式中并不是比较c与EOF，而是比较getchar函数的返回值与EOF”这种情况。                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 这段话充满了似是而非的东西。 char c; while((c=getchar())!=EOF)  putchar(c); 首先，赋值表达式c=getchar()的类型和c的类型（经左值转换后）是一样的，也就是char类型。getchar函数的返回类型是int，将被截短为char类型的值。这个等性表达式可以看成是char类型的值和int类型的值进行比较。 麻烦就在于char可能等价于signed char，也可能等价于unsigned char。如果属于前者，那么，当前程序可以正常工作，因为!=运算符的右操作数EOF是一个int类型的负值，!=运算符的左操作数（赋值表达式）要先从char提升为int，然后再判断相等性。注意，是用赋值表达式的值和EOF判断，而不是用c或者getchar的值和EOF判断。 但是，如果char等价于unsigned char，那么，当getchar返回EOF时，因EOF为负值，所以，将被转换为一个非负值赋给c，这也是赋值表达式的值。因为!=运算符右操作数（EOF）的类型是int，故赋值表达式的值转换为int，因为转换到int是可表示的，故同样是一个非负值。在这种情况下，表达式(c=getchar())!=EOF是永远成立的（失去了程序原本的意义）。

user: user-3
content: getchar并非真正的函数而是getc(stdin)定义，ctrl+d产生SIGHUP信号，getchar()接受到相应的信号

user: user-2
content: 引用 5 楼 incident_a 的回复:这个问题来自《C陷阱与缺陷》,又是那本号称14年未改动的书，但在这个问题上，作者只列出了3种可能，我在看你的回答之前，估计gcc的行为属于第三种，也就是: 这正是书上写的“程序在表达式中并不是比较c与EOF，而是比较getchar函数的返回值与EOF”这种情况。 但在看完回答之后，我认为gcc的行为属于你说的这种，也就是第4种。 那本书说了哪三种？（这本书我从来没看过，不过准备看一下） 无论如何，确切的说法是比较赋值表达式的值和EOF

user: user-2
content: 引用 4 楼 incident_a 的回复:你的意思就是gcc将char c；默认为是signed char c；对吧？ 看了半天终于看明白了  有可能。这应该通过观察头文件<limits.h>来判断。
user-0 提问: 如何控制每次读盘的大小，以减少IO的次数

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:设置流的buf大小： http://www.cplusplus.com/reference/cstdio/setvbuf/ 谢谢大神 非常有用！！！

user: user-1
content: /* setvbuf example */ #include <stdio.h>  int main () {   FILE *pFile;    pFile=fopen ("myfile.txt","r);    setvbuf ( pFile , NULL , _IOFBF , 1024 * 512 );    // File operations here    fclose (pFile);    return 0; }

user: user-1
content: 设置流的buf大小： http://www.cplusplus.com/reference/cstdio/setvbuf/
user-0 提问: C、非前缀编码？

回复:
user: user-0
content: System.out.println("非常感谢楼上。");  printf("\n");  cout<<"好久没来了。"<<endl;

user: user-1
content: 如果数据按照，代码短的在前，长的在后存放。 只需要测试是否经过，叶子节点既可以判断是否前缀码了。 如果不是这种顺序存放的。  不排序的话，需要判断较长的已经插入的节点，是否新插入节点的前缀。  做法是 二叉树节点，只有一个数据域，表示该节点是否叶子节点。   1）已经插入的代码节点，最后一个节点标记为叶子节点。 2）每次插入新的代码，传递一个状态;        初始化为true,一旦插入新的节点，设置状态为false； 3）插入数据时候，如果数据为0,插入左子树节点       数据为1的时候，插入右子树节点。 4）插入的时候，只有对左子树，右子树不为NULL的时候，才创建新的节点。       否则只是路过，当插入完成，最后一个节点标记为叶子节点。       这还需要传递一个状态数据，表示某此插入一个代码， 有没有创建新的节点，如果创建了，则不是已经插入的代码的前缀。  如果到插入结束都没有创建新的节点； 该代码则一定不是，此前所有插入二叉树中的代码的个前缀。

user: user-1
content: 如果数据是按照位数多少排序的； 那么只需要判断插入的路径，是否有叶子节点，即可。  如果，不是按照位数多少排序的； 那么还需要判断是否插入新的节点了。  只要插入一个新节点，则这个数据和之前所有数据； 都不重复，也不是谁的前缀，  否则，如果该数据插入时，没有插入新的节点； 该数据就是是已经插入的某个节点的前缀。  例如上图中有一个编码插入结束； 他的最后一个节点，在标志为 false 的节点， 那么该编码，是一个前缀。

user: user-1
content: 引用 5 楼 u012540439 的回复:题目倒是解出来了，不过我觉得用字符串匹配做出来真的时间复杂度比较高，二叉树算法可不可以再详细点？楼上  引用 4 楼 user-1 的回复:如果不排序，插入某数据，没有分配新节点，则该该节点是已经插入其节点的前缀。 二叉树就是0 插入左子树。1插入右子树 如果是按照位顺序存放的数据，那么一次插入经过了某个叶子节点，则从跟节点到改节点的一个编码，是正在处理的这个编码的前缀        如果不按顺序，插入每个数据，只要不是和前面的数据全同，       则必然插入新节点，没插入新节点的数据必然是某个编码的前缀。  二者结合。可以判断出，有没有前缀，有则为前缀码. 根节点不存数据 任何数据的编码，都是直接按照 0，1 插入节点的左右子树，插入最后一个数据， 标记一下节点为编码结束节点（编码的叶节点）。  1）插入过程中，如果没有插入新建节点，则该编码是其他编码的前缀。 2）插入过程中，如果经过一个编码的叶节点，那么那个编码是正在插入的编码的前缀   树的结构图如下：                            f                           root                         /          \                     0 f             1 f                   /       \           /      \     000-> 0 t        1f        0 f    1 f                        /   \         /           \                      0f      1t  0t  1t <---   111                     /         ^  ^ 0100->  0t       011   100   t =rrue,f =fase   数据域只需要 一个bool ，表示 是否叶子节点即可。 插入过程是 每个数据取出一位编码。从根开始，0 插入节点的左子树 ，1插入节点的右子树 直到最后一位编码，此时这个节点结束域标志设置为 true;

user: user-0
content: 题目倒是解出来了，不过我觉得用字符串匹配做出来真的时间复杂度比较高，二叉树算法可不可以再详细点？楼上  引用 4 楼 user-1 的回复:如果不排序，插入某数据，没有分配新节点，则该该节点是已经插入其节点的前缀。

user: user-1
content: 如果不排序，插入某数据，没有分配新节点，则该该节点是已经插入其节点的前缀。

user: user-1
content: 二叉树算法应该可以的，可能需要优化，每个节点只需要记录是否某个编码在此节点结束就行了 如果有一个新插入的节点，插入过程经过，其他编码结束的节点，则此编码是前缀码，否则是非前缀码。 如果编码不是按照长度顺序存放的，那就按照长度排序后插入。  不过这里提到的前缀，是本质意义上的前缀编码，而不是应用中的。 应用的前缀码，是严格定义中的非前缀编码。  即通常把哈夫曼编码称为前缀码，但是实质上严格意义上说，它是非前缀码。

user: user-1
content: 想到两种方法，可能都不是太好。  1)对不同长度的串，截取前k位进行匹配，k是短串的长度 2）按照位构造二叉树，根节点为 长度为0 的空节点，节点的层数，和数据位数对应，数据按照位分层插入        节点的有两个数据域，       1个是值域，为0或者1，一个是终止节点标志域。         如果插入数据在该节点结束，设置为1，否则一律为0        每个节点的左子，值为0，右子为1         如果，一个节点，是其他节点（终止节点）的子树，则是前缀编码，如果不存在这种节点，则为非前缀编码        插入过程，如果经过终止节点则为前缀码。

user: user-0
content: /* Description  有很多方法可以实现使用2进制序列对字符进行编码，比如典型的Huffman编码， 如果在对字符的2进制编码中不存在某一个字符的编码是另一个字符编码 的前缀，那么就称这种编码方式为非前缀编码，Huffman编码就是一种非前缀编码。 比如 A：00 B：10 C：0100 D：0101 则这种编码为非前缀编码； A:01 B:10 C:010 D:0000，则这种编码为前缀编码。 请写一个程序，判断编码是前缀编码还是非前缀编码。   输入：  第一行是一个整数K，表示有多少个测试用例，以后每行一个测试用例。 每个测试用例为若干个字符串，字符串之间有空格隔开（最大长度不超过1000）。   输出：  每行输出一个测试用例的结果。如果是非前缀编码输出Yes，否则输出No。  Sample Input  2 01 10 0010 0000 01 10 010 0000  Sample Output  Yes No  */
user-0 提问: 使用epoll时需要将socket设为非阻塞吗？

回复:
user: user-1
content: 水平触发，只要可读或可写，事件会一直触发 边缘触发，只有从不可读变为可读、从不可写变成可写，事件才会触发  基于此，水平触发，socket不需要设置为non-block，因为只要触发，就可以读或写。 而对于水平触发，事件一旦触发，需要用户一直读，直到缓冲区数据全部读完为止才可以，如果设置为block，在没有数据可读时，就block了，需要用eagain错误来告知用户，数据读完了，不用再读了。

user: user-2
content: 我理解，et的epoll需要循环，多次对fd进行读取，读取到无数据后，应该获取到一个错误，表示本次数据读取完成。 如果用非阻塞模式，则不会得到一个错误，而是将读取动作阻塞，这样造成epoll程序阻塞住。

user: user-3
content: 引用 3 楼 wallwind 的回复:边缘触发是要设置成非阻塞，成因为边缘触发本身不是一次性读完数据的。 能否再具体点，为什么不是一次性读完数据的 就需要nonblock?

user: user-0
content: 引用 3 楼 wallwind 的回复:边缘触发是要设置成非阻塞，成因为边缘触发本身不是一次性读完数据的。 那是不是比水平触发写程序需要注意更多的东西，也就是要不断地读取直到缓冲空，而水平触发就不需要这么做？

user: user-4
content: 引用 3 楼 wallwind 的回复:边缘触发是要设置成非阻塞，成因为边缘触发本身不是一次性读完数据的。  这个问题问的很不错，我最近也在疑惑问题，楼上的大牛是否可以讲的再详细一点 @wallwind

user: user-5
content: 边缘触发是要设置成非阻塞，成因为边缘触发本身不是一次性读完数据的。

user: user-6
content: epoll有两种工作模式 其中ET要设置非阻塞

user: user-7
content: The epoll interface, when used with the EPOLLET flag ( Edge Triggered ) should use non-blocking file descriptors to avoid having a blocking read or write starve the task that is handling multiple file descriptors  具体你看看这个
user-0 提问: fread首个参数void *buffer强制转换类型是为了什么？

回复:
user: user-1
content: 引用 5 楼 incident_a 的回复:............................... 你第一个问题的回答，我认为这个传送的事情不是由程序员来管的吧？fread第一个参数只要指定某个能容纳读取内容的内存的地址（指针）不就完事了么？  fread是一个函数吧，是另外一个程序员写好的吧？ 该程序员写的是后总不能你乱塞东西都能接受吧？ 不信你写一个啥类型都能接受的函数我看看？ 既然如此，该程序员要提供这个东西给大家都能用 是不是要规定个统一的类型啊？  更何况，fread是二进制I/O函数，我理解的二进制I/O，就是按01010101这样的“位”逐个传输的，而你所说的char这个单位应该是文本I/O时最小的数据单位吧？  说叫你别扯蛋你还就扯了 鸡蛋是细胞够成的，最小还能分解，可以说是由原子组成的 你买鸡蛋的时候是一个细胞一个细胞买啊？？？ 还是一个原子一个原子买啊？？？？ 鸡蛋就是一个一个买的，以个为单位，知道不？  你定义一个变量表达一个二进制位给我看看？  还有，另外几人说的（char *）不转也可以，这我当然知道，但我想知道作者为什么要故意转成char *， 假设你的肚量极大，你有本事来任何大小的东西，都能一口吞下，我就给你解释这个问题  作者的原话是： &rec在传入fread和fwrite函数时被小心翼翼地转换为字符指针类型。 我不明白的是，为什么转换为char *就是“小心翼翼”了呢？  翻译的水平你也信，你把“两个黄鹂鸣翠柳”准确的翻译成英文，我就回答你这个问题

user: user-0
content: 引用 3 楼 gz_qmc 的回复:第一个问题: 时空机传送人的时候,怎么说也要把人先分解掉吧,整体传不了 你来个人能传,来根木头怎么办? 所以我统一传送原子,啥玩意都不再有区别了是不是? char是最小的数据单位     (位是一种概念,别跟我扯那种没用的) 第二个问题: 大哥,百度一下fseek你会死吗? 如果百度讲的没有这论坛的解释清楚,请用豆腐砸死我吧! 第二个问题答得很好，但是你第一个问题的回答，我认为这个传送的事情不是由程序员来管的吧？fread第一个参数只要指定某个能容纳读取内容的内存的地址（指针）不就完事了么？ 更何况，fread是二进制I/O函数，我理解的二进制I/O，就是按01010101这样的“位”逐个传输的，而你所说的char这个单位应该是文本I/O时最小的数据单位吧？  还有，另外几人说的（char *）不转也可以，这我当然知道，但我想知道作者为什么要故意转成char *，作者的原话是： &rec在传入fread和fwrite函数时被小心翼翼地转换为字符指针类型。 我不明白的是，为什么转换为char *就是“小心翼翼”了呢？

user: user-0
content: 引用 1 楼 tujiaw 的回复:（char*）不转也可以的，看fread函数需要的第一个参数是什么类型的； fseek(fp,-(long)sizeof(rec),1);／／是由于读文件的时候fp指向文件结尾了，所以在fwrite之前必须将fp指向文件头 你两句话都有错吧

user: user-1
content: 第一个问题: 时空机传送人的时候,怎么说也要把人先分解掉吧,整体传不了 你来个人能传,来根木头怎么办? 所以我统一传送原子,啥玩意都不再有区别了是不是? char是最小的数据单位     (位是一种概念,别跟我扯那种没用的) 第二个问题: 大哥,百度一下fseek你会死吗? 如果百度讲的没有这论坛的解释清楚,请用豆腐砸死我吧!

user: user-2
content: 引用while(fread((char *)&rec,sizeof(rec),1,fp)==1)    //干嘛要（char *）？ 可以不转换。   引用fseek(fp,-(long)sizeof(rec),1);   //这里的1又是什么意思？没有这个说法吧？ 这个代码是个坏例子，应该使用SEEK_SET,SEEK_CUR, SEEK_END等表示相对位置。   http://www.cplusplus.com/reference/cstdio/fseek/

user: user-3
content: （char*）不转也可以的，看fread函数需要的第一个参数是什么类型的； fseek(fp,-(long)sizeof(rec),1);／／是由于读文件的时候fp指向文件结尾了，所以在fwrite之前必须将fp指向文件头
user-0 提问: 现在已经没有打字机了，windows为什么不把\r\n换成\n?

回复:
user: user-1
content: 引用因为\n只有两个字符 '\n'是一个字符呀

user: user-2
content: 你干嘛不说mac只用\r？

user: user-1
content: 还是很多遗留系统和归档文件的， 还是有必要要考虑后向兼容。

user: user-0
content: \r\n和\n的使用并不涉及到专利问题吧？windows当然应该做出让步，因为\n只有两个字符，比较方便，windows干嘛非得搞个特例出来，显示自己技术牛逼还是咋的？为了这两个字符，这么多编程语言为了兼容这两套标准，弄得又烦又臃肿，不知微软咋想的

user: user-3
content: 谁统一谁？是个问题。
user-0 提问: 关于指针初始化赋初值的小问题

回复:
user: user-1
content: 函数之外只能有声明，不能有其他语句。  int * p = &n;就只是声明，这里的=表示初始化； p = &n;就是个赋值语句了，这里的=表示赋值。

user: user-2
content: 编译器问题吧，你试试这样写： int n=1; int* p=&n

user: user-3
content: 哎,又一个孔乙几诞生了

user: user-0
content: 在网上找了段关于函数之外不能赋值的讲解，大家可以参考下……  main函数之前是用来声明和定义全局变量和函数的，并由编译器进行预处理，给那些全局变量和定义的函数分配内存和地址,不能设计可执行代码。   编译器在编译阶段对main函数之前的全局变量进行内存分配，对定义的函数生成可执行的代码，并保留该函数的地址以供main函数调用，而赋值语句操作是一句可执行代码，又没有类似函数指针的东西供main函数调用，所以只能放在main函数内部进行顺序执行。 　　  在多文件组织中，只有在包含main函数的源文件里面的main函数内部才能对变量进行赋值语句的操作，而其它不包含main的源文件这不能进行变量的赋值操作，只能进行变量的声明。  但并不是说在main函数之前就不能对变量进行初始化赋值：可以在定义变量的时候对变量进行初始化赋值。如下： 　　int a=10; 　　student s1={10};  虽说可以在初始化时赋值,但是如果是个自定义类,在main()外面还是不能赋值.  只有基本类型在初始化时可以赋值.

user: user-0
content: 引用 1 楼 gz_qmc 的回复:p=&n;单独写就是赋值语句了 不能写在函数之外 确实在函数之外，但为什么就不能呢？

user: user-0
content: no errror, where you put your code?[/quote]   在vc6.0上面……

user: user-4
content: 引用 9 楼 Eliyah_ 的回复:[quote=引用 8 楼 mujiok2003 的回复:] [quote=引用 1 楼 gz_qmc 的回复:] p=&n;单独写就是赋值语句了 不能写在函数之外 多半是这个问题。 [/quote] 就算是赋值也没问题才对啊，我实验了一下，结果是这样的，附图： [/quote] 看看10L

user: user-3
content: 楼上,你能把回答内容看清楚 再来发言好吗?  你这样瞎搅和,真的很烦呢!  知道啥叫写在函数之外吗?  你的main不是函数吗?

user: user-5
content: 引用 8 楼 mujiok2003 的回复:[quote=引用 1 楼 gz_qmc 的回复:] p=&n;单独写就是赋值语句了 不能写在函数之外 多半是这个问题。 [/quote] 就算是赋值也没问题才对啊，我实验了一下，结果是这样的，附图：

user: user-4
content: 引用 1 楼 gz_qmc 的回复:p=&n;单独写就是赋值语句了 不能写在函数之外 多半是这个问题。

user: user-6
content: “变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。

user: user-7
content: 引用 楼主 u012983643 的回复:int n=1; int* p; p=&n; 系统·会报错：'p' : missing storage-class or type specifiers                           'p' : 'int' differs in levels of indirection from 'int *'                            cannot convert from 'int *' to 'int'  但采用初始化就没问题： int n=1； int *p=&n； 这是为什么  no errror, where you put your code?

user: user-8
content: translation-unit:         external-declaration         translation-unit      external-declaration  external-declaration:         function-definition         declaration

user: user-9
content: 引用 1 楼 gz_qmc 的回复:p=&n;单独写就是赋值语句了 不能写在函数之外++

user: user-10
content: 我也感觉没问题啊

user: user-3
content: p=&n;单独写就是赋值语句了 不能写在函数之外

user: user-11
content: 感觉应该是代码不规范产生的问题。
user-0 提问: 求教__malloc_ptr_t是什么类型

回复:
user: user-1
content: 应该是指malloc函数的地址指针。这里是想将malloc hook一下，替换为自己的分配内存函数，一般为了监控内存分配，或者自己管理内存时使用。__malloc_ptr_t 这个就是一个malloc函数指针类型，搜索一下是否有定义，没有就加上。

user: user-1
content: 引用 2 楼 shixiazuike 的回复:[quote=引用 1 楼 jerry_dqh 的回复:] 应该是指malloc函数的地址指针。这里是想将malloc hook一下，替换为自己的分配内存函数，一般为了监控内存分配，或者自己管理内存时使用。__malloc_ptr_t 这个就是一个malloc函数指针类型，搜索一下是否有定义，没有就加上。 您是说__malloc_ptr_t 是程序自己定义的？是一个指向malloc函数的指针，只要定义使它指向malloc函数就可以了？我原以为是linux内核定义的，因为在程序中没有搜到这个定义，但是在Ubuntu 12.04下编译并没有提示这个错误。[/quote]  linux版本不一样，有可能去掉了这个定义，在新版本有可能移除了这个定义，如果想兼容原来的可以自己定义一下 typedef void * __malloc_ptr_t; 其实就是一个指针。

user: user-0
content: 引用 1 楼 jerry_dqh 的回复:应该是指malloc函数的地址指针。这里是想将malloc hook一下，替换为自己的分配内存函数，一般为了监控内存分配，或者自己管理内存时使用。__malloc_ptr_t 这个就是一个malloc函数指针类型，搜索一下是否有定义，没有就加上。 您是说__malloc_ptr_t 是程序自己定义的？是一个指向malloc函数的指针，只要定义使它指向malloc函数就可以了？我原以为是linux内核定义的，因为在程序中没有搜到这个定义，但是在Ubuntu 12.04下编译并没有提示这个错误。
user-0 提问: C语言索引排序不明白，求大神给段索引排序的代码

回复:
user: user-1
content: #include <iostream>  void BubbleSort1(int arr[], int n); void BubbleSort2(int arr[], int n); void BubbleSort3(int arr[], int n);  int main() {     int arr[] = { 5, 23, 4, 1, 1, 3 };     BubbleSort3(arr, 6);     for (auto i : arr) {         std::cout << i << " " << std::ends;     }     return 0; }  void Swap(int &a, int &b) {     int tmp = a;     a = b;     b = tmp; }  void BubbleSort1(int arr[], int n) {     for (int i = 0; i < n; i++) {         for (int j = 1; j < n - i; j++) {             if (arr[j - 1] > arr[j]) {                 Swap(arr[j - 1], arr[j]);             }         }     } }  void BubbleSort2(int arr[], int n) {     bool flag = true;     int k = n;     while (flag == true) {         flag = false;         for (int i = 0; i < n; i++) {             if (arr[i - 1] > arr[i]) {                 Swap(arr[i - 1], arr[i]);                 flag = true;             }         }         k--;     } }  void BubbleSort3(int arr[], int n) {     int j, k;     int flag = n;      while (flag > 0) {         k = flag;         flag = 0;         for (j = 1; j < k; j++) {             if (arr[j - 1] > arr[j]) {                 Swap(arr[j - 1], arr[j]);                 flag = j;             }         }     } }  三种冒泡实现，比较简单。更多的排序方法可以找本数据结构的书看看。

user: user-0
content: 就是一个一维数组，要求用索引排序
user-0 提问: 关于GCC编译问题

回复:
user: user-1
content: 引用 9 楼 xiyuyan 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。          偶就碰不到这问题，用习语言，管你全角，半角，管你多个分号，少个分号，全智能处理，不够智能就改造编译器，工具是为人服务的，干嘛要做工具的奴隶 ？ 没事去唱下国际歌，工具的奴隶们            [/quote] 最怕工具为人自动纠错，自动灾难恢复，自动心脏移植，……

user: user-2
content: 引用 8 楼 zhao4zhong1 的回复:偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。          偶就碰不到这问题，用习语言，管你全角，半角，管你多个分号，少个分号，全智能处理，不够智能就改造编译器，工具是为人服务的，干嘛要做工具的奴隶 ？ 没事去唱下国际歌，工具的奴隶们

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

user: user-0
content: 引用 1 楼 user-6 的回复:明显标号、注释有问题。  单行注释还是用//吧， 检测问题可以先大段删然后慢慢加看到底哪里出错了  我看了.应该是没有注释嵌套啊..

user: user-0
content: 引用 3 楼 kjfddfjk 的回复:其实就是你不注意,哪里少了个括号或者分号等  从主程序看,貌似没有吧.这么说来.可能是我引用的某个模块出的问题么?..哎,这不是玩死人咯

user: user-0
content: 引用 4 楼 buyong 的回复:用了中文标点？   用了中文标点的话.我去了加不加那个空语句,都会报错啊

user: user-3
content: 用了中文标点？

user: user-4
content: 其实就是你不注意,哪里少了个括号或者分号等

user: user-5
content: 春风吹得人心醉，代码太长难判对。

user: user-6
content: 明显标号、注释有问题。  单行注释还是用//吧， 检测问题可以先大段删然后慢慢加看到底哪里出错了
user-0 提问: 小白写代码判断输入的是否是素数

回复:
user: user-1
content: 对于素数的判定只需满足N % [2 , sqrt(N)]都不为0，则N为素数# include <stdio.h> # include <math.h> # define Bool int  Bool isPrime(int n);  int main() { 	int num; 	for (num = 2; num < 1000; num++) 	{	 		if (isPrime(num)) 			printf("%4d ", num); 	} 	printf("\n"); 	return 0; }  Bool isPrime(int n) { 	int i;     int num = sqrt((float)n) 	for (i = 2; i <= num; i++) 	{ 		if (n % i == 0) 			return 0; 	} 	return 1; }这是我求1000以内的素数程序

user: user-2
content: 一楼说的对，问题太多，楼主好好看看书吧！ 关于求素数，楼主可以看看这个——http://blog.csdn.net/u012421456/article/details/19074525

user: user-3
content: 想避免基本的语法问题，用个好的集成开发环境，比如vs，codeblock等等，都会自动为你写完的代码做基本的语法判断，如果有错误，会提示你，一般是错误代码下有红色的波浪线。 还有，注意代码缩进。缩进的代码可读性高

user: user-3
content: #include <stdio.h> int main() { 	int long n, i, k[n - 2];   //n是未定义的变量，用来声明数组大小是错误的 								//如果要动态的确定数组大小，就应该使用malloc 								//在堆上动态分配内存 	scanf("%ld", &n); 	for (i = 2; i<n; i++) 	{ 		k[i - 2] = n%i; 	} 	if 		(                      //if语句的（）内得到的应该是一个布尔值， 								//然而你使用了一个for语块，没有返回值 	for (i = 2; i<n; i++) 	{ 		k[i - 2] != 0; 	} 	) 	{ 		printf("素数"); 	}  	return 0; } 以上标记为基本语法问题，判断素数的方法简单些就是i从2开始尝试，直到sqrt（n），让n%i判断是否为0，如果为0则为合数，如果一直到sqrt（n）都没有出现n%i==0的情况，那么这个数就是素数。

user: user-0
content: 2楼思想很好，只是有点小问题，我修改后可以了：  #include <stdio.h> int isPrime(int num); int main(void) {     int n, ret;     scanf("%d", &n);     ret = isPrime(n);     if(ret == 1)  	{         printf("Yes\n");     }     else  	{         printf("No\n");     } }   int isPrime(int num)  {     int i;     for (i = 2; i < num; i++)  	{         if(num % i == 0) 		{             return 0;         }     }     return 1; }

user: user-4
content: 既然LZ要求的是“判断输入的是不是素数”，那就综合一下2楼和4楼好了。 还可以参考： http://baike.baidu.com/link?url=5-ZiTeBftvAUYX1P3MEgHOweSNqFoTKGYchwGB0_EA_p3pbBD9pWIsVZV3PW-3q0nVFXvvQG8fxk3iF6nsZCBq  另外你确实要好好看书了。

user: user-5
content: int isPrime(int num); int main(void) {     int num, ret;     scanf("%d", &num);     ret = isPrime(num);     if(1 == num) {         printf("Yes\n");     }     else {         printf("No\n");     } } int isPrime(int num) {     int i;     for (i = 2; i < num; i++) {         if(num % 2 == 0) {             return 0;         }     }     return 1; }

user: user-3
content: 你的代码到处都是问题，还是好好看看书吧，基本语法都有问题
user-0 提问: 写了个剪刀石头布的游戏，有一个问题不知道怎么解决

回复:
user: user-0
content: 问题解决了，谢谢了！！拜你为师可好

user: user-1
content: void wanjia() {   fflush(stdin);   你原来的代码 ｝
user-0 提问: 看完龙书或虎书什么的能有什么用？

回复:
user: user-1
content: 不清楚，没看过

user: user-2
content: 我不知道  看完了还是娶不到老婆 真悲催

user: user-3
content: 可以用来装B

user: user-4
content: 引用 楼主 incident_a 的回复:顶多就自己写个编译器吗？那是不是说不写就不用看？或者说不想了解原理也不用看？  是的，而且你这个观点基本可以推广到更一般，任何将原理的书，都是不想了解原理也不用看
user-0 提问: 求详细解答

回复:
user: user-0
content: 引用 4 楼 sholber 的回复:600分以上才可以。小弟只有100分了。

user: user-1
content: 600分以上才可以。

user: user-0
content: 分太少？怎么回事？

user: user-0
content: .求详细解答这些题目，感激不尽。。

user: user-0
user-0 提问: 谁有谭浩强C语言学习，急求

回复:
user: user-1
content: 谭浩强的视频？？？ 楼主可以看看郝斌的视频，基础性较强

user: user-2
content: www.tudou.com/home/93506222

user: user-3

user: user-4

user: user-5

user: user-6
content: 学这个还是看书比较好。

user: user-7
content: 如果你是真的要学C语言而不是为了屁用都没有的计算机二级 完全不建议看谭浩强的

user: user-8
content: 考试才看 谭浩强的c

user: user-9
content: 唉。。。浩强啊，只能说别的专业考级用那个还行，专业的还是别看那个书的好

user: user-10
content: 那玩意儿不是给零基础的人看的，而且书上还有好多错误 看C primer 这个靠谱

user: user-11
content: http://bbs.csdn.net/topics/370153775

user: user-12
content: 怒喷 谭浩强, 没有他中国的IT水平会高一个级别

user: user-13
content: 推荐 c primer

user: user-14
content: 谭C 一生黑  渣书 误人子弟 别看了

user: user-15
content: 坐等楼主和谭浩强被喷。
user-0 提问: 中断问题

回复:
user: user-0
content: 引用 1 楼 u012061345 的回复:这应该算临界区吧，上锁。 上了锁以后难道会阻断中断的产生吗？

user: user-1
content: Synchronization Functions The following functions are used in synchronization.        CancelWaitableTimer   CreateEvent   CreateMutex   CreateSemaphore   CreateWaitableTimer   DeleteCriticalSection   EnterCriticalSection   GetOverlappedResult   InitializeCriticalSection   InitializeCriticalSectionAndSpinCount   InterlockedCompareExchange   InterlockedDecrement   InterlockedExchange   InterlockedExchangeAdd   InterlockedIncrement   LeaveCriticalSection   MsgWaitForMultipleObjects   MsgWaitForMultipleObjectsEx   OpenEvent   OpenMutex   OpenSemaphore   OpenWaitableTimer   PulseEvent   QueueUserAPC   ReleaseMutex   ReleaseSemaphore   ResetEvent   SetCriticalSectionSpinCount   SetEvent   SetWaitableTimer   SignalObjectAndWait   TimerAPCProc   TryEnterCriticalSection   WaitForMultipleObjects   WaitForMultipleObjectsEx   WaitForSingleObject   WaitForSingleObjectEx        《Windows核心编程》 《深入解析Windows操作系统-Windows Internals》

user: user-2
content: 这个地方需要写保护吧，上锁，程序跑完这里再解锁

user: user-3
content: 引用 4 楼 richyhuang 的回复:对中断的这种数据操作的最好还是先关中断 ++

user: user-4
content: 对中断的这种数据操作的最好还是先关中断

user: user-5
content: 加锁，用完之后解锁，之后才能被别的进程调用

user: user-6
content: 用锁，处理完这个过程再去执行下面的操作

user: user-7
content: 这应该算临界区吧，上锁。

user: user-1
content: 《Windows核心编程》
user-0 提问: C语言，数组用什么函数，计算数组长度？

回复:
user: user-1
content: int a[10]={12,54,6,23,7,5,9,89,10,34}; 1 可以用strlen函数：头文件在＃include<string.h>  // int b=str(a); 2 可以用sizeof,例如：sizeof(a)//求出的是数组a总的字节长度。

user: user-2
content: 用 sizeof（array）获得整个数组占用大小 sizeof（array）/sizeof(ArrayType)获得数组长度

user: user-1
content: 函数的话是strlen,头文件在<string.h>,如果是计算字节个数用sizeof(array)/sizeof(array[0])

user: user-3
content: 个数乘以每个的大小

user: user-4
content: http://cs.glimix.com/?controller=posts&action=show&id=17

user: user-5
content: int  arr[xxx];  可以sizeof. int *p = new int[xx]  你个人用变量记

user: user-6
content: sizeof获取长度

user: user-7
content: 咱也学习一下，请百度搜索相关关键字

user: user-8
content: c语言中，定义数组后可以用sizeof命令获得数组的长度（可容纳元素个数） 如： { int data[4]; int length; length=sizeof(data)/sizeof(data[0]);  //数组占内存总空间，除以单个元素占内存空间大小 printf("length of data[4]=%d", length ); //输出length of data[4]=4 } 但，通过传递数组名参数到子函数中，以获得数组长度是不可行的。如： int getLength(int[] a){     int length;     length=sizeof(a)/sizeof(a[0]); //这样是错误的，得到的结果永远是1     return length; } 因为，a是函数参数，到了本函数中，a只是一个指针（地址，系统在本函数运行时，是不知道a所表示的地址有多大的数据存储空间，这里只是告诉函数：一个数据存储空间首地址），所以，sizoef(a)的结果是指针变量a占内存的大小，一般在32位机上是4个字节。a[0]是int类型，sizeof(a[0])也是4个字节，所以，结果永远是1。 因此，获得数组长度，只能在数组定义所在的代码区中，采用以上方法，才可以达到效果。

user: user-9
content: 对静态的数组，sizeof(a)/sizeof(a[0]) countof是vc的宏定义。  动态申请的，没有。默认用户自己知道。

user: user-10
content: #define ARRAYSIZE(a) (sizeof(a) / sizeof(*(a)))

user: user-11
content: //计算占用内存大小 sizeof(array)   //计算数组元素个数 sizeof(array) / sizeof(array[0]) sizeof(arry) / sizeof (datatype) //直接使用数据类型作为参数

user: user-12
content: 请组织好你的语言

user: user-13
content: 引用 29 楼 cauc_guidian 的回复:可以自己写个for循环的函数，计算数组遇到\0时i的值，i就是数组的长度 不是字符串才以\0结尾么 我觉得可以定一个标志为数组结束标志。到标志返回位置比较好把

user: user-13
content: 引用 10 楼 yiyefangzhou24 的回复:char str[1024]； 1024不就是长度？ emmm那如果是str[ ],长度是多少呢？

user: user-14
content: 引用 8 楼 zhao4zhong1 的回复:最稳妥的办法是程序自己负责用变量记住或函数参数传递数组大小。+1,sizeof在函数调用的时候不适合,strlen只能用于char

user: user-15
content: C语言，数组用什么函数，计算数组长度？  ????? 在CSDN，没见到一个遣词造句像样的学生。现在的大学生语言文字学得不好啊。 “C语言用什么函数计算数组的长度”，这样说不好吗？

user: user-16
content: 四楼正解,先用sizeof(array)求出整个数组张勇的内存空间,再用sizeof(array[0])求出单个元素所占内存空间,两者相除即长度

user: user-17
content: 如果是字节数组，你们这些方法全部无效，字节数组中间就可能出现\0，一般使用字符串数组，就是strlen计算，字节数组的话，局部的都是记住长度，全局的用宏定义记住长度

user: user-18
content: 受教。四楼。
user-0 提问: 求教字符指针作为函数参数的问题

回复:
user: user-1
content: 你到底在多少个论坛发啊，在阿莫上也看到你发。去阿莫论坛看看吧。

user: user-2
content: 0xC0000005一般都是内存访问越界

user: user-3
content: #include<stdio.h> #include<malloc.h> #include<stdlib.h> void catstr(char *dest,char *src);  int main() { char *dest, *src;//="help you?"; char *ch1,*ch2;//记录分配内存地址 ch1 = src =(char *)malloc(256); sprintf(src,"%s","help you?"); if((ch2 = dest=(char *)malloc(80))==NULL) { printf("no memory\n"); exit(1); } sprintf(dest,"%s","Can I "); //dest="Can I "; catstr(dest,src); puts(dest); free(ch1); free(ch2); return 0; }  void catstr(char *dest,char *src) { int i=0; while(*dest)	dest++; for(i=0;i<9;i++) { *dest = *src; src++; dest++; } *dest = '\0'; } //Can I help you?

user: user-0
content: 引用 6 楼 stack009 的回复: #include<stdio.h> #include<malloc.h> #include<stdlib.h> void catstr(char *dest,const char *src);  int main() { char dest[30]="can i"; char src[20]=" help you? "; char *str; catstr(dest,src); puts(dest); system("pause"); return 0; }  void catstr(char *dest,const char *src) { while(*dest)   dest++;	 while(*dest++=*src++)    ;  *dest='\0';   } 你贴出来的代码问题是在是太多，大概就是三楼说的那些问题，我就在你的上面修修改改了一些，你看对你是否有一些帮助有用，多谢啊！

user: user-0
content: 引用 3 楼 user-6 的回复:这段代码的问题太多了。 src初始值为help you?,但是后面又重新为指针申请了内存，256字节，没有初始化。 dest申请了内存，80个字节，没有初始化， dest重新指向了字符串can I， 导致原有80字节内存泄露 接下来在cat函数内部，对常量指针dest做运算，在while循环当中，dest已经指向了常量指针的内存结束位置 所以接下来在for循环中产生访问非法内存错误 你说的这本书我没看过。如果你列出的代码是书上源码的话，那么建议你不要再看这本书了。 这本书代码漏洞百出。。。我果然得换书了，手里有c和指针这本经典书，郭天祥写的这本指针太差了

user: user-0
content: 看了3楼评论我把内存那块改了，好歹可以用了……谢大神

user: user-4
content: #include<stdio.h> #include<malloc.h> #include<stdlib.h> void catstr(char *dest,const char *src);  int main() { char dest[30]="can i"; char src[20]=" help you? "; char *str; catstr(dest,src); puts(dest); system("pause"); return 0; }  void catstr(char *dest,const char *src) { while(*dest)   dest++;	 while(*dest++=*src++)    ;  *dest='\0';   } 你贴出来的代码问题是在是太多，大概就是三楼说的那些问题，我就在你的上面修修改改了一些，你看对你是否有一些帮助

user: user-5
content: 我猜楼主经常借东西忘还或还错人或以为东西本来就是自己的不是借别人的。

user: user-6
content: 后续的指针没有释放等等，这些代码风格习惯方面的问题也很严重。 编程中，算法和思路很重要，但是良好的编程风格和习惯更重要。

user: user-6
content: 这段代码的问题太多了。 src初始值为help you?,但是后面又重新为指针申请了内存，256字节，没有初始化。 dest申请了内存，80个字节，没有初始化， dest重新指向了字符串can I， 导致原有80字节内存泄露 接下来在cat函数内部，对常量指针dest做运算，在while循环当中，dest已经指向了常量指针的内存结束位置 所以接下来在for循环中产生访问非法内存错误 你说的这本书我没看过。如果你列出的代码是书上源码的话，那么建议你不要再看这本书了。
user-0 提问: 无符号运算不会溢出，那会怎样？

回复:
user: user-1
content: UINT_MAX不是给你这样检测的 可以这样 if(a > UINT_MAX - b)。。。  因为UINT_MAX 最大，所以a<= UINT_MAX && b<= UINT_MAX  其实，对于两个无符号数， a,b 之和 c =a+b； 如果无溢出，必有 a<=c && b<=c ； 如果不满足a<=c && b<=c，一定是溢出了。

user: user-0
content: 嗯我弄错了，但是《c陷阱与缺陷》上说: 如果需要检查a+b是否会“溢出”,可以这样做： if(a+b>UINT_MAX）       complain（）； 依据上面这种方法，我这样写： #include <stdio.h> #include <limits.h> int main() {     unsigned a=4294967295,b=1,c;     c=a+b;     printf("%u\n",UINT_MAX);     if(a+b>UINT_MAX)     printf("%u\n",c);//这里不能被执行到！ } 是这本书写错了吗？否则如何检查无符号运算已经溢出？

user: user-2
content: a、b、c的类型都是unsigned int，计算过程中无需类型提升，而且unsigned int的最大值为#  define UINT_MAX	4294967295U，计算结果也不会溢出。

user: user-3
content: 不会怎么样,全靠自己掌握

user: user-4
content: UINT_MAX是4294967295 = INT_MAX*2+1
user-0 提问: 关于一个建立二叉树算法里的问题

回复:
user: user-1
content: 从原文档中没有看到数组a的定义，但根据赋值操作a[i] = q来判断，a应该为结构体指针数组，定义类似Lnode *a[]

user: user-2
content: 不好意思！个人认为那个向量a[]本身存储的就是地址，它只不过是吧地址重新拿出来罢了！！！ 个人见解！若错勿怒！

user: user-3
content: 强制类型转换？不过，这个整数代表的是一个结构体的地址吗？  int address; struct Node* p; //... p = (struct Node*)address;
user-0 提问: cAPI怎么了

回复:
user: user-1
content: 引用 7 楼 u012564309 的回复:引用 5 楼 zhao4zhong1 的回复:[quote=引用 4 楼 li582158579 的回复:] graphics.h是在TC下的图像库头文件，在VC下是没有的，如果在VC下想用graphics，推荐楼主使用EasyX。库文件中函数的使用方法会有函数说明文档。http://www.easyx.cn  大哥 你用C做GUI 需要什么[/quote] Win32 API

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:引用 4 楼 li582158579 的回复:graphics.h是在TC下的图像库头文件，在VC下是没有的，如果在VC下想用graphics，推荐楼主使用EasyX。库文件中函数的使用方法会有函数说明文档。http://www.easyx.cn  大哥 你用C做GUI 需要什么

user: user-0
content: 引用 4 楼 li582158579 的回复:graphics.h是在TC下的图像库头文件，在VC下是没有的，如果在VC下想用graphics，推荐楼主使用EasyX。库文件中函数的使用方法会有函数说明文档。]  什么是 vc ? 是IDE还是语言？

user: user-2
content: graphics.h是在TC下的图像库头文件，在VC下是没有的，如果在VC下想用graphics，推荐楼主使用EasyX。库文件中函数的使用方法会有函数说明文档。

user: user-0
content: 就好比 我用c做 暗黑破坏神 应该会需要一些GUI头文件等等 这些头文件 自己编写的话 感觉 C里没有一个类型表示 此引用直接与显示器的一个位置链接 那么这些头文件去哪里找到 和了解  或者是什么情况

user: user-0
content: 引用 1 楼 user-3 的回复:C语言标准库是国际标准，各个C编译器都应该支持。编译器厂商为了竞争，还会加入一些自己特有的功能。这个graphics.h 就是TC这个编译器所有的。估计楼主用的不是TC，所以找不到这个头文件。 你会用graphics.h吗 ？ 怎么会的 看源代码吗

user: user-3
content: C语言标准库是国际标准，各个C编译器都应该支持。编译器厂商为了竞争，还会加入一些自己特有的功能。这个graphics.h 就是TC这个编译器所有的。估计楼主用的不是TC，所以找不到这个头文件。

user: user-1
content: 引用 4 楼 li582158579 的回复:graphics.h是在TC下的图像库头文件，在VC下是没有的，如果在VC下想用graphics，推荐楼主使用EasyX。库文件中函数的使用方法会有函数说明文档。http://www.easyx.cn
user-0 提问: 运行后得到的，显示出来怎么少了两个数字，而且变成了问号，这是怎么回事？

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  void main (void) { 	char ch[]="fdsafg8589fs59f376s456f5s621"; 	int *str=new int[sizeof(int)]; 	int i, j=0, k=0;  	 	int jj=0; 	for (i=0; (size_t)i<strlen(ch); i++) 	{ 		jj=int(ch[i]);		 		if ((jj>=48) && (jj<=57)) 		{			 			str[j]=jj; 			j++; 		} 	}  	int n=0; 	int min=0; 	int temp=0;     int l1=0;     int m=0;     for (l1=0;l1<j;l1++)     { 		min=l1; 		for(m=min+1;m<j;m++) 		{ 			if(str[min]>=str[m]) 				min=m;			 		} 		temp=str[l1]; 		str[l1]=str[min]; 		str[min]=temp; 		m=0; 	}	     for(k=0; k<j; k++) 	{ 		 		printf("%c\n",str[k]); 	} }  你在排序的时候没处理好吧，稍微改了一下

user: user-2
content: 数组访问越界 一切行为都是可能发生的 重新为str数组分配足够的空间

user: user-3
content: Too long to parse.

user: user-4
content: 指针空间分配不足吧

user: user-5
content: int *str=new int[sizeof(int)]; 改成int *str=new int[strlen(ch)];

user: user-6
content: 你这代码的风格，真是看的头痛啊
user-0 提问: 建立二颗二叉树，写算法判断这二颗二叉树是否完全一样,程序编译通过,建立玩第一颗建立第二棵二叉树无法退出输入函数

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h> #include<string.h> #define maxlen 25  typedef struct BT {   char data;   struct BT *lchild,*rchild; }Bnode,*BTree;  typedef struct queue{   BTree a[maxlen];   int front,rear; }Linkqueue;  Linkqueue que;  //按层次建立二叉树，建立循环队列  void in_queue(BTree t) {    if(que.front==(que.rear+1)%maxlen)      printf("dui man\n");   else    {      que.rear=(que.rear+1)%maxlen;     que.a[que.rear]=t;   } }  BTree out_queue()  //出队列 {    if(que.rear==que.front)   {     printf("dui kong");        return 0;   }   else   {     que.front=(que.front+1)%maxlen;     return(que.a[que.front]);   } }  BTree creat_tree()      //构造二叉树 {   char ch,ch1,ch2; BTree t,p,q;   ch=getchar();   if(ch!='*')     {     p=(BTree)malloc(sizeof(Bnode));     if(!p)  exit(0);     p->data=ch;      in_queue(p);    }   else return NULL;   while(que.front!=que.rear)     {     t=out_queue();     ch1=getchar();     if(ch1!='*')         {       q=(BTree)malloc(sizeof(Bnode));       if(!q)  exit(0);       q->data=ch1;       t->lchild=q;       in_queue(q);     }     else  t->lchild=NULL;     ch2=getchar();     if(ch2!='*')     {       q=(BTree)malloc(sizeof(Bnode));       if(!q)  exit(0);       q->data=ch2;  t->rchild=q;       in_queue(q);     }     else  t->rchild=NULL;   }   return (p); }  char* preorder(BTree t, char *element) //改 char* preorder(BTree t)    //先序遍历 {   //删 不能用自动变量保存输出 char element[maxlen];   //删 不能用自动变量保存下标 int i=0;   if(t)   {       *element++=t->data;//改 element[i++]=t->data;     element=preorder(t->lchild, element);//改 preorder(t->lchild);     element=preorder(t->rchild, element);//改 preorder(t->rchild);   }   *element=0;//加 使字符串结尾为0   return element;//return element; }  char* midorder(BTree t, char *element) //改 char* midorder(BTree t)  //中序遍历 {   //删 char element[maxlen];   //删 int i=0;   if(t)    {       element=midorder(t->lchild,element);//改 preorder(t->lchild);     *element++=t->data;//改 element[i++]=t->data;     element=midorder(t->rchild,element);//改 preorder(t->rchild);   }   *element=0;//加 使字符串结尾为0   return element; }  int main() {   int conclusion1=0,conclusion2=0;   BTree t1,t2;   char pre1[maxlen],mid1[maxlen],pre2[maxlen],mid2[maxlen];//改 char  *pre1,*mid1,*pre2,*mid2;   //分别存储二叉树的先序与中序序列，从而确定两个二叉树是否相等    que.rear=0;   que.front=0;   printf("please input tree one data\n");   t1=creat_tree();  //创建第一个二叉树   getchar();//加 消化回车 没有这行导致“构造第二颗二叉树的时候就是退出不了”   que.rear=que.front=0;   printf("please input tree two data\n");   t2=creat_tree();  // 创建第二颗二叉树   getchar();//加 消化回车   preorder(t1,pre1);//改 pre1=preorder(t1);   midorder(t1,mid1);//改 mid1=midorder(t1);   preorder(t2,pre2);//改 pre2=preorder(t2);    midorder(t2,mid2);//改 mid2=midorder(t2);   conclusion1=strcmp(pre1,pre2);  //比较两棵树的先序序列是否相等   conclusion2=strcmp(mid1,mid2);  //比较两棵树的中序序列是否相等   if(conclusion1==0 && conclusion2==0)     printf(" the two trees equal\n");   else     printf(" the two trees not equal\n");   return 0; }
user-0 提问: clock()返回值为什么是零？

回复:
user: user-1
content: 引用 9 楼 sd530842780 的回复:或者换一个单核500mhz的cpu，你那张囧脸啊能换换么 人家只是笑得比较灿烂点而已。

user: user-2
content: 或者换一个单核500mhz的cpu，你那张囧脸啊能换换么

user: user-2
content: 你中间sleep(100)，再看看结果

user: user-3
content: 引用 5 楼 zhang5476499 的回复:引用 3 楼 FancyMouse 的回复:[quote=引用 2 楼 zhang5476499 的回复:] [quote=引用 1 楼 FancyMouse 的回复:] clock计算的是cpu时间，io挂起等待的时间不算在里面的。但是我的第一个代码没有输入输出，就只有两个for循环之后，就直接输出出程序的时间， 但是它输出0. 你那两个for能用掉多少时间？clock的精度普遍是毫秒级，你那两个for估计几个微秒就算完了。[/quote]但是第二个程序的输出： 1 2    Time= 0.002000 1    Time= 0.002000 1 2 3    Time= 0.002000 1 2 3 4    Time= 0.002000 1 3    Time= 0.002000 1    Time= 0.002000 1 4    Time= 0.002000 1 5 6 7    Time= 0.002000 每个Time的时间为什么相等？[/quote] 你去看clock的文档。你问的问题里面早就有说明。我不想把文档里每一句话重复一遍。

user: user-0
content: 引用 3 楼 FancyMouse 的回复:引用 2 楼 zhang5476499 的回复:[quote=引用 1 楼 FancyMouse 的回复:] clock计算的是cpu时间，io挂起等待的时间不算在里面的。但是我的第一个代码没有输入输出，就只有两个for循环之后，就直接输出出程序的时间， 但是它输出0. 你那两个for能用掉多少时间？clock的精度普遍是毫秒级，你那两个for估计几个微秒就算完了。[/quote]但是第二个程序的输出： 1 2    Time= 0.002000 1    Time= 0.002000 1 2 3    Time= 0.002000 1 2 3 4    Time= 0.002000 1 3    Time= 0.002000 1    Time= 0.002000 1 4    Time= 0.002000 1 5 6 7    Time= 0.002000 每个Time的时间为什么相等？

user: user-4
content: 引用 2 楼 zhang5476499 的回复:引用 1 楼 FancyMouse 的回复:clock计算的是cpu时间，io挂起等待的时间不算在里面的。但是我的第一个代码没有输入输出，就只有两个for循环之后，就直接输出出程序的时间， 但是它输出0. 换几个计算进去再试试就知道了

user: user-3
content: 引用 2 楼 zhang5476499 的回复:引用 1 楼 FancyMouse 的回复:clock计算的是cpu时间，io挂起等待的时间不算在里面的。但是我的第一个代码没有输入输出，就只有两个for循环之后，就直接输出出程序的时间， 但是它输出0. 你那两个for能用掉多少时间？clock的精度普遍是毫秒级，你那两个for估计几个微秒就算完了。

user: user-0
content: 引用 1 楼 FancyMouse 的回复:clock计算的是cpu时间，io挂起等待的时间不算在里面的。但是我的第一个代码没有输入输出，就只有两个for循环之后，就直接输出出程序的时间， 但是它输出0.

user: user-3
content: clock计算的是cpu时间，io挂起等待的时间不算在里面的。
user-0 提问: C语言创建文件的奇怪现象

回复:
user: user-1
content: 永远不要试图去修改常量内存区域。 先申请一个指针，然后分配内存，接着把cao拷贝到指针中，把指针传递给你的addc方法试试。

user: user-2
content: char* w = "cao"; 一般编译后， w指向的地址在 .rdata段， 默认情况下，该段为只读区域。   对于你这个程序，崩溃 或者异常是正常现象。

user: user-3
content: char* w = "cao"; 指向的常量，你在试图修改它的内容，出错不足为奇
user-0 提问: 获取mfc的EDIT控件上的数据并存储

回复:
user: user-1
content: [quote=引用 楼主 a13728843352 的回复:] 代码如下。  	FILE *p; 	p=fopen("test.bin","w+");  	CString strGetStr; 	GetDlgItem(IDC_EDIT_TEST)->GetWindowText(strGetStr); 	_cprintf("the  buf length is %d \n",strGetStr.GetLength()); 	fseek(p,0,SEEK_SET);//定位文件指针到文件开始位置 	fwrite(strGetStr,strGetStr.GetLength(),1,p); 	_cprintf("the buf get is %s \n",strGetStr);   后面的输出打印完全正确，但是写入文件失败，怎么回事？ fwrite((char*)&strGetStr,strGetStr.GetLength(),1,p);

user: user-2
content: 换成char数组，将CString变量的内容strcpy到数组中，再写入这个字符数组试试
user-0 提问: 大一学生求五子棋c语言程序！！！！双人对战就可以

回复:
user: user-1
content: 大一就做这种题目，什么学校啊？ 一般来说，大一写程序能入门就不错了

user: user-2
content: 引用 楼主 hjw92695 的回复:求c语言五子棋程序，，有网格棋盘的，，完全不会啊。。。 这个是哪个脑残老师处的题目

user: user-0
content: 我加一下你吧，，大神。。。。求指导

user: user-3
content: 本人毕业时用纯C做了一个五子棋,可以在DOS和WINDOWS上运行的两栖程序,515311445

user: user-0
content: 网上搜的大多看不懂，，我们上学期就编了一些普通的小程序，，这学期就要求五子棋，，压力大啊

user: user-4
content: 这个应该网上一搜一大把吧。
user-0 提问: 新人第一次发帖，求问下在windows操作系统中，无安装任何c编译器情况下，如何使用记事本编写c程序

回复:
user: user-1
content: linux下缺省安装有c编译器，因为linux作为开源来说，有时候需要编译内核什么的。 windows可不是开源的，没有什么免费的东西给你用。 c代码的编写可以用任何文本编辑器。但是这只是程序代码，它是需要编译为可执行代码来运行的。  这就和语言一样，你不能因为美国人不需要学习英语就懂英语而要求中国人也天生就懂英语。 这里英语就相当于C程序，美国人就是linux，中国人就是windows。

user: user-2
content: 一般linux的发行版都带gcc编译器，但是也有个别没有的，比如fedora的xfce很干净，就需要手动安装gcc！gcc只是GNU的一个工具！ 此外，lz需要注意vim是个文本编辑器。它不是编译器，一个字之差！vim用来编写代码，编译工作还是交给了gcc。但是它是神之编辑器，强大的震撼。用绝了，任何IDE都弱暴了！此外linux的终端也是位window的cmd的dos命令无法比拟的！建议你还是在linux下玩吧。

user: user-3
content: 在线编译器，好用得很涅：http://codepad.org/

user: user-3
content: 上网，在线编译呗。

user: user-0
content: 引用装个编译器难么？ Dev C++ TC BC ++3.1 Win-TC gcc for win32 Watcom C Intel C compiler VS6 VS200x VS201x ……  主要是想问下不装编译器的情况下，能否使用windows系统自带的东西编译

user: user-4
content: linux自带编译器，Windows不带，所以你写了不能编译啊

user: user-5
content: 有能力的话，可以手动编译.....

user: user-6
content: 装个编译器难么？ Dev C++ TC BC ++3.1 Win-TC gcc for win32 Watcom C Intel C compiler VS6 VS200x VS201x ……

user: user-7
content: 用批处理实现个C编译器慢慢撸么。

user: user-8
content: 没编译器你怎么编译程序？

user: user-9
content: 没有编译器怎么编译啊。linux自带gcc的，windows又不自带cl。
user-0 提问: C语言提取网页链接，本人小白，求大神指点

回复:
user: user-0
content: 引用zhao4zhong1引用yiyefangzhou24感谢两位的耐心回答，顺利毕业了，也找了开发的工作； 本该把源码贴上来，实在不忍睹，不要误导了别的新人

user: user-1
content: 赵老四果然很搞人

user: user-2
content: 建议楼主学习使用抓包工具比如wireshark 建议楼主学习使用正则表达式＋《编译原理》中词法分析＋有限状态自动机 建议楼主学习使用hash_map

user: user-0
content: 最终还是没能做../路径的合成 只做了 /、XX.htm类路径的合成 不知道怎么样。。PS：毕业设计结束给分

user: user-3
content: QueryInfo

user: user-0
content: 没人说话，是都被我弄得凌乱了嘛？

user: user-0
content: 在《HTTP协议(RFC2616)中文版》中看到的 HEAD 方法和GET 方法一致，除了服务器不能在响应里返回消息主体。HEAD请求响应里 HTTP头域里的元信息（译注：元信息就是头域信息）应该和GET请求响应里的元信息一致。 此方法被用来获取请求实体的元信息而不需要传输实体主体（entity-body）。此方法经常被用 来测试超文本链接的有效性，可访问性，和最近的改变。. HEAD请求的响应是可缓存的，因为响应里的信息可能被缓存用于更新以前那个资源对应缓存 的实体.。如果出现一个新的域值指明缓存的实体和当前源服务器上的实体有所不同（可能因为 Content-Length，Content-MD5，ETag或Last-Modified值的改变），那么缓存（cache）必 须认为缓存项是过时的（stale）。 小白就是要测试连接的有效性，提取信息的办法各位大牛有什么好办法

user: user-0
content: 引用 8 楼 yiyefangzhou24 的回复:http://192.168.20.1:8080/index.jsp 8080就是端口 3Q~~这个懂了  小白还有问：发送HEAD请求后服务器返回的消息类似这样  HTTP/1.1 200 OK Content-Length: 102792 Content-Type: text/html Content-Location: http://lnrsks.com/index.html Last-Modified: Tue, 29 Apr 2014 03:55:10 GMT Accept-Ranges: bytes ETag: W/"9afb78d15e63cf1:f79" Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET Date: Tue, 29 Apr 2014 06:54:00 GMT Connection: close  有什么好办法提取状态码、Content-Length、Content-Type、Last-Modified这些属性呢，小白目前只想到字符串匹配（strstr函数），感觉太丑了，不像规范的样子，是不是有更好的办法？

user: user-3
content: http://192.168.20.1:8080/index.jsp 8080就是端口

user: user-0
content: 引用 6 楼 yiyefangzhou24 的回复:[quote=引用 4 楼 junjie2606 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] 使用curl库。 curl好像不是VS2010的类库？  还有个新问题，C语言socket怎么获取服务器端口，或者说能获取到使用哪个端口吗？[/quote]web服务不是80端口？[/quote]  默认是80，这个服务器也可以配置其他的端口，下午老师问题怎么没处理端口，不太明白，也有网站端口用的不是80吧，可是忘记在哪见过8080、8081、9000这样的端口

user: user-3
content: 引用 4 楼 junjie2606 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 使用curl库。 curl好像不是VS2010的类库？  还有个新问题，C语言socket怎么获取服务器端口，或者说能获取到使用哪个端口吗？[/quote]web服务不是80端口？

user: user-0
content: 引用 3 楼 yiyefangzhou24 的回复:分析出链接和原始页面路径合并成绝对URL，并存储在可快速查询的数据结构中 这句话着实没弄懂，不过要求你用socket库写的话，也就是对download下来的数据进行字符串处理，不会太难吧  合并路径是的，但是到相对路径的时候不知道怎么确定位置，比如我测试的地址是：www.lnrsks.com时候会获取到相对路径“/HtmlNews/ksdt/ksxw/index.html”我连接到一起就可以得到绝对路径了，但是我用www.lnrsks.com/HtmlNews/ksdt/ksxw/index.html测试的时候也会有“/HtmlNews/ksdt/ksxw/index.html“”这样的相对路径，我记得以前学静态网页的时候可以写成“../../”这样的相对路径我就不知道怎么再去拼新的绝对路径了；  可快速查询的数据结构就是获取到绝对路径以后要减小数据冗余，储存的时候会查找以前的数据，就是为了快速查找到数据设计的存储结构，还没考虑，暂时忽略了。。。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:使用curl库。 curl好像不是VS2010的类库？  还有个新问题，C语言socket怎么获取服务器端口，或者说能获取到使用哪个端口吗？

user: user-3
content: 分析出链接和原始页面路径合并成绝对URL，并存储在可快速查询的数据结构中 这句话着实没弄懂，不过要求你用socket库写的话，也就是对download下来的数据进行字符串处理，不会太难吧

user: user-4
content: 张老师所言极是

user: user-2
content: 使用curl库。
user-0 提问: 未初始化的数据段的内容并不放在磁盘上的程序文件中

回复:
user: user-1
content: 《Windows PE权威指南》

user: user-2
content: 简单比喻一下，你有一个账本，记录你今年买了多少米； 如果这些米没什么区别，你难道还需要记录每个米粒的信息；  只怕，你连几袋子米，你都不乐意去记录、 只要记录，每次买了几斤米就行了。

user: user-2
content: 未初始化的数据段，只需要知道每个数据的位置和大小就可以了； 位置，多半写入代码的指令中去了； 每个数据大小，如果需要的话，也已经写入代码中了； 所以大小，只需要整个未初始化的数据段的大小即可； 文件里存储这些数据，岂非多余，而且增加文件的空间占用量。
user-0 提问: L298控制两个直流电机正转反转程序

回复:
user: user-1
content: 虽然不怎么懂. 应该是给一个信号吧, 应该有一个驱动API接口,  给某个地方输入高电平或者低电平, 即可得到不同的方向.

user: user-2
content: 经典的电机驱动控制 IC - L298，百度一下资料漫天。

user: user-3
content: 提醒：小心空回误差。
user-0 提问: 结构体中变量定义求助

回复:
user: user-1
content: 引用 11 楼 sholber 的回复:[quote=引用 10 楼 mujiok2003 的回复:] 柔性数组：http://ideone.com/Q7d66b 引用 8 楼 a345485527 的回复:是“变长数组”还是“变量长度数组”，我建议称之为“变量长度数组”。当然，这个似乎不是那么重要。哈哈，用的不多，见笑[/quote]  “柔性数组”的说法更不常见。通常，变量长度数组是指： void f (int n) {     int ia [n];     /* …… */ } 这样的数组； 在结构体中，像这样的用法： struct s { int i; char c[]; }; 通常称struct s的成员c为弹性数组，很多人也称之为柔性数组。 纯概念上的不同而已，无所谓啦。[/quote] 是从flexible array member翻译来的。

user: user-2
content: 引用 10 楼 mujiok2003 的回复:柔性数组：http://ideone.com/Q7d66b 引用 8 楼 a345485527 的回复:是“变长数组”还是“变量长度数组”，我建议称之为“变量长度数组”。当然，这个似乎不是那么重要。哈哈，用的不多，见笑[/quote]  “柔性数组”的说法更不常见。通常，变量长度数组是指： void f (int n) {     int ia [n];     /* …… */ } 这样的数组； 在结构体中，像这样的用法： struct s { int i; char c[]; }; 通常称struct s的成员c为弹性数组，很多人也称之为柔性数组。 纯概念上的不同而已，无所谓啦。

user: user-1
content: 柔性数组：http://ideone.com/Q7d66b

user: user-0
content: 引用 4 楼 a345485527 的回复: struct staff    {  	int age; char name[];// 如果还不行的话 写成这样 ，char name[0]，视编译器而定  };  恩 多谢

user: user-3
content: 引用 6 楼 sholber 的回复:[quote=引用 3 楼 a345485527 的回复:] 想用变长数组？要把他放在结构体的最后 是“变长数组”还是“变量长度数组”，我建议称之为“变量长度数组”。当然，这个似乎不是那么重要。[/quote]哈哈，用的不多，见笑

user: user-4
content: #include "stdio.h" #include "string.h"  struct staff    {     char name[20];     int age;     };  void main() {  struct staff staff1;  staff1.age=20;  strncpy(staff1.name,"jiangchao",19);staff1.name[19]=0;  printf("name:%s\nage:%d\n",staff1.name,staff1.age);   }

user: user-2
content: 引用 3 楼 a345485527 的回复:想用变长数组？要把他放在结构体的最后 是“变长数组”还是“变量长度数组”，我建议称之为“变量长度数组”。当然，这个似乎不是那么重要。

user: user-2
content: 引用 1 楼 user-5 的回复:结构体中不能	char name[];这样定义，你如果想表示char数组的话，可以以使用char *name； 别乱说，看一下3楼和4楼的解释。

user: user-3
content: struct staff    {  	int age; char name[];// 如果还不行的话 写成这样 ，char name[0]，视编译器而定  };

user: user-3
content: 想用变长数组？要把他放在结构体的最后

user: user-0
content: 引用 1 楼 user-5 的回复:结构体中不能	char name[];这样定义，你如果想表示char数组的话，可以以使用char *name； 额 char name[]编译是没有错的，int age那一行出错了

user: user-5
content: 结构体中不能	char name[];这样定义，你如果想表示char数组的话，可以以使用char *name；
user-0 提问: 用C语言实现一个功能，急！！

回复:
user: user-1
content: #include <stdio.h> #include <limits.h>  int change_bits(char *pBuf, int length, int Begin, int BitCnt) {     int i = 0;     unsigned int byte_off = 0;     unsigned int bit_off = 0;     char * p = NULL;     unsigned char mask = 0;      if (pBuf == NULL)     {         return -1;     }      byte_off = BitCnt / CHAR_BIT; /* 需要取反的字节数 */     bit_off = BitCnt % CHAR_BIT;  /* 最后1字节需要取反的比特数 */     mask = 0xff << (CHAR_BIT - bit_off); /* 取反比特掩码 */      if (length < (Begin + byte_off + (bit_off != 0)))     {         return -1;     }      p = pBuf + Begin;     for (i = 0; i < byte_off; i++)     {         p[i] = ~p[i];     }      p = p + i;     p[i] = (~p[i] & mask) |     /* 取反n bits部分 */         (p[i] & ~mask);         /* 原始8-n bits部分 */      return 0; }  int main(void) {     int i = 0;     unsigned char buf[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0xed, 0xff, 0x33, 0x33};      printf("buf before changing:\n");     for (i = 0; i < sizeof(buf); i++)     {         printf("0x%02x, ", buf[i]);     }     printf("\n");      change_bits(buf, 9, 4, 6);      printf("buf after changing:\n");     for (i = 0; i < sizeof(buf); i++)     {         printf("0x%02x, ", buf[i]);     }     printf("\n");      return 0; }

user: user-2
content: 我认为函数原型改成：  //[first, last) is expected to be a valid range void fun(char* first, char* last) {     while(first < last)      {            *first = ~*first;            ++first;      } }  更好，更专注于功能身。

user: user-3
content: int ChangeBuf(char *pBuf, int iLength, int iBegin, int iBitCnt) { 	int i; 	if(iLength<(iBegin+iBitCnt)) 	{ 		//编写超出事件的处理代码 		return -1;//-1表示有超出的情况 	} 	for(i=0; i<iBitCnt; i++) 	{ 		pBuf[iBegin+i]=~pBuf[iBegin+i]; 	} 	return 0;//0表示正常 }
user-0 提问: mini2440串口1的问题

回复:
user: user-1
content: 连接pc的串口是uart0 做了RS232电平转换 这个mini2440的手册上有的，所以说pc连的是串口0 你测试字符串发到串口1又没有和pc连通

user: user-0
content: 没有人遇到这样的问题吗？

user: user-0
content: 自己顶一下，希望各位能伸出援助之手

user: user-0
content: 其实我就是简单的测试一下串口1，PC机用串口调试工具连，波特率 数据位 校验位什么的，都和板子设置的一样，但终端上就是什么都不显示。我用轮询的方式发送数据，不是中断。 我的main函数简单：  #include "2440addr.h" #include "uart.h" int main() {    uartini(); //串口初始化    while(1)   {      uart1SendByte('1');   } return 0; }  /******************************************************* 【函数功能】	从串口1发送字符 ********************************************************/ void uart1SendByte(char data2) { 	if(data2=='\n')         {             while(!(rUTRSTAT1 & 0x2));            // Delay(1);                 //because the slow response of hyper_terminal              rUTXH1 = '\r';         }           while(!(rUTRSTAT1 & 0x2));   //Wait until THR is empty.       //  Delay(1);         rUTXH1 = data2; }

user: user-2
content: 信息量太少。 你说板子问题，那就是主机有问题。

user: user-0
content: 我就是根据手册编的啊，寄存器的设置肯定木有问题

user: user-3
content: 看手册，开发板的手册和demo.
user-0 提问: 决定学习路线了。。。

回复:
user: user-1
content: http://bbs.csdn.net/topics/390374955

user: user-2
content: 楼主加油吧！不过，VC6.0的确。。。建议再装一个比较新的编译器

user: user-3
content: 加油。。。。

user: user-4
content: Windows.环境下32位汇编语言程序设计(第2版)罗云彬  这个比这个<<windows程序设计>>好  windows程序设计这书里面很多东西没讲清楚甚至没有  如果不是搞游戏开发的话个人不建议学windows编程，想搞应用软件开发的话建议学了C 学JAVA 吧，绝B不是乱说

user: user-5
content: windows api，啥年代了，小心被坑爹。。。我们都是被vc6.0+API+MFC坑爹过来的，那时候总觉得C，C++就是MFC。。就是windows API，被坑的不行了。。 建议 linux， gcc，记事本+c，c++

user: user-6
content: 现在还有人用“vc 6 英文版”，好屌丝的开发工具。

user: user-7
content: 摸着石头过河

user: user-8
content: 引用 楼主 liweibopa0598 的回复:我的原帖http://bbs.csdn.net/topics/390770090  先从windows api编程开始，一边复习c语言一边学习windows编程，学习教材，windows程序设计。参考教材c专家编程，大话数据结构。学习环境，win7 32位 加vc 6 英文版。为了兼容性可能考虑换xp系统。  目标1，用时6个月把c语言和windows基本原理还有基础数据结构大概搞清楚。  目标2。。。1实现再考虑!  给自己加油吧! linux呢？

user: user-9
content: 引用 楼主 liweibopa0598 的回复:我的原帖http://bbs.csdn.net/topics/390770090  先从windows api编程开始，一边复习c语言一边学习windows编程，学习教材，windows程序设计。参考教材c专家编程，大话数据结构。学习环境，win7 32位 加vc 6 英文版。为了兼容性可能考虑换xp系统。  目标1，用时6个月把c语言和windows基本原理还有基础数据结构大概搞清楚。  目标2。。。1实现再考虑!  给自己加油吧!  为毛一堆人学C喜欢顺带去搞windows编程？ 图形有c++的dx，app有睡下铺，根本没C啥子事。

user: user-10
content: 建议将vc6.0换成vs2010

user: user-11
content: 感觉可行。 不过，既然是复习C语言，那得用CLANG，或者GCC，用VC你就惨了。
user-0 提问: 关于UDP 发送图片..

回复:
user: user-1
content: 你的图片是jpg还是bmp，好像lin下的bmp在win下显示有问题。你用libjpeg压缩一下传过来应该就可以了。

user: user-2
content: UDP发送数据不在乎是否丢包，当你的图片中少一个数据包都有可能导致图片打不开，最好使用tcp  另外看楼主的说法好像不是丢包问题，而是打开格式问题，建议试试一楼的方法

user: user-3
content: 估计没处理。

user: user-4
content: UDP会丢包的，不知楼主是如何处理丢包问题的呢？

user: user-5
content: 你可以用ftp之类的传过去试试看能否打开