Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 内核驱动 UNICODE_STRING 字符串截取

回复:
user: user-1
content: 可以直接修改 Length 的值，需要注意这个是字节数。

user: user-2
content: 直接对buffer操作就越过了结构的长度字段的更新，除非自己进行修改长度字段 还不如直接取得buffer中所要的字符，重新初始化一个UNICODE_STRING变量，释放原变量

user: user-0
content: 并且由于 unicode_string buffer 有可能并不以NULL结尾，所以单独对buffer进行操作，是不是会有问题
user-0 提问: libjson-c中的引用计数和对象所有权

回复:
user: user-1
content: 以我的理解，那个put的释放对象，只是将对象的引用计数变为了0，当引用计数变为了0后就会释放掉内存；而你重新用对象的时候，它又会将该对象的引用计数加1了。所以用完后，你还是得看情况，判断它是否得释放掉。

user: user-0
content: 以下是代码，请大神们看看，为什么最后new_field还可以使用？ #include <stdio.h> #include <stdlib.h> #include <json-c/json.h> #include <string.h>    //该函数用于接收一个json格式的字符串，转换成json_object格式 //参数为字符串、字符串长度、要返回的json_object对象 //成功返回0，失败返回-1 //注意josn如果获取成功将在函数内部开辟存储空间，不要忘记在函数外面释放空间  int string_to_json(char *string, unsigned long len, json_object **json) { 	json_tokener *tok = json_tokener_new();//创建一个json_tokener对象，以便进行转换,记得要释放 	enum json_tokener_error jerr; 	do 	{ 		*json = json_tokener_parse_ex(tok, string, len); 	}while((jerr = json_tokener_get_error(tok)) == json_tokener_continue); 	if(jerr != json_tokener_success  || tok->char_offset < (int)len) 	{ 		json_tokener_free(tok); 		return -1; 	} 	if(json_object_get_type(*json) == json_type_object) 	{ 		json_tokener_free(tok); 		return 0; 	} 	json_tokener_free(tok); 	return -1; }  int main() { 	char json[65535] = {0}; 	FILE * json_file; 	json_file = fopen("/home/han/桌面/tempro/json/json.txt","r"); 	if(json_file == NULL) 	{ 		printf("shibai \n"); 		return -1; 	} 	fread(json, 65535, 1, json_file); 	//printf("%s",json); 	json_object *new_json = NULL; 	unsigned long  len = strlen(json); 	json_object *new_field = NULL;  	if(string_to_json(json, len, &new_json) == 0) 	{	 		const char *str = json_object_get_string(new_json); 		printf("转换成功的json为：\n%s\n",str); 		new_field = json_object_new_string("周杰伦"); 		json_object_object_add(new_json, "最爱的歌手", new_field); 		printf("\n\n添加后的json为：\n%s\n",str); 	} 	if(json_object_get_type(new_json) != json_type_null) 	{ 		printf("释放空间\n"); 		json_object_put(new_json); 	} 	const char *after_put = json_object_get_string(new_field); 	printf("竟然还存在：%s\n",after_put); 	return 0; }

user: user-0
content: 引用 6 楼 u013910218 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] https://www.baidu.com/s?wd=libjson-c中的引用计数和对象所有权  并没有找到想要的[/quote] 大神，能不能解释一下，为什么我用json_object_add将A添加都B上，释放B之后，A依然可以继续使用呢？看文档里写的，json_object_add之后，释放B的同时A也就释放了，但是我发现A依然可以继续使用

user: user-2
content: 略改搜索用关键字，继续搜。

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:https://www.baidu.com/s?wd=libjson-c中的引用计数和对象所有权  并没有找到想要的

user: user-2
content: https://www.baidu.com/s?wd=libjson-c中的引用计数和对象所有权

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:百度搜相关关键字。就是因为百度不出满意的结果，才来scdn求大神的呀

user: user-2
content: 百度搜相关关键字。

user: user-0
content: 自己顶一下，求大神们指点

user: user-0
content: 没有人回答吗？自己顶一下
user-0 提问: 急急急！！卡了我一周了，还是得请教大神

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-2
content: 函数声明或全局变量引用，建议都放在函数外。

user: user-0
content: 到了if 这里我step into 就是进不去，但是看看方法栈，那里，其实是进入了方法的。可是就是定位不到执行的位置。

user: user-0

user: user-0
content: 引用 1 楼 user-3 的回复:可以看汇编定位跳转位置，或者执行到if那句点步入  要看你搜索出的yyparse函数是不是，可以在你找到的yyparse里下断点，看能不能断下  我有在if 开始步入，进不去，同时我也在全局搜索到那个函数里面第一句打了个断点，也是不行啊。

user: user-3
content: 可以看汇编定位跳转位置，或者执行到if那句点步入  要看你搜索出的yyparse函数是不是，可以在你找到的yyparse里下断点，看能不能断下
user-0 提问: 请教大家我使用fgets遇到段错误

回复:
user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。 感谢你多次回答我的问题。谢谢你。

user: user-1
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-2
content: 野指针很容易导致段错误；char *arg;这是一个野指针，野指针就是该指针指向的位置不确定（随机的），若指向不可写或不可读的区域都会导致段错误；因为fgets是将标准输入的内容，放到内存里的某个区域，这个区域是指针arg指向的区域，若arg指向的区域不可写，那么就会出段错误了。 char arg[5]；是栈上的数组，fgets输入就会将输入的内容放到栈上的数组里。

user: user-0
content: 这是我的运行结果。谢谢～

user: user-0
content: 引用 1 楼 user-3 的回复:char *arg; 这只是一个指针，你都没有初始化，都没分配空间怎么用？ 你要char *arg = new char[5];才行。  另外fgets不会把换行符换成NULL，不过并不会像你说的输出abcd%吧。。我试了并不是这样啊 谢谢。我刚才试着加了个 arg  = malloc(5),段错误没有了。 我的第二个问题 意思是既然fgets里面我给的参数是5，那么假如我输入abcd，然后回车enter，那么fgets读进去的是abcd加'\0'吧。我在linux环境运行的结果有个%在最后。

user: user-3
content: char *arg; 这只是一个指针，你都没有初始化，都没分配空间怎么用？ 你要char *arg = new char[5];才行。  另外fgets不会把换行符换成NULL，不过并不会像你说的输出abcd%吧。。我试了并不是这样啊
user-0 提问: 使用OPENSLL加解密码问题

回复:
user: user-1
content: MODULUS PUBLIC_EXPONENT PRIVATE_EXPONENT的值是多少啊？满足不满足RSA所要求的基本关系啊？

user: user-2
content: 仅供参考：void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }

user: user-2
content: 被加密的对象不是字符串，是字节数组。

user: user-3
user-0 提问: C语言，想用顺序栈做教师信息系统，遇到点问题（谢谢）

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h>  struct Tea//声明结构体数组 {     int number;     char name[10];  };  typedef struct//声明并定义结构体 {     struct Tea tea[5]; //定义结构体数组     int top;  }teacher;   teacher* init(teacher **s)//初始化 {     *s = (teacher*)malloc(sizeof(teacher));     (*s)->top = -1;     return *s; }  teacher* push (teacher *s, int x, char *y)//结构体指针 {     int i = 0;     s->top++;     s->tea[s->top].number=x;     while(y[i]!='\0') {         s->tea[s->top].name[i]= y[i];         i++;     }     s->tea[s->top].name[i]='\0';     //printf("%s",s->tea[s->top].name[1]);     //while(1);     return s; }   int main(void) {     int ch, X;     int j=0;     char Y[10];     teacher* h = NULL;//定义基本结构体指针     init(&h);//初始化结构体     char* p;//定义指向Y[10]的指针     p = Y;      printf("一:输入教师信息");     scanf("%d", &ch);      switch(ch) {         case 1:             printf("输入学号");             scanf("%d",&X);             printf("输入教师姓名");             getchar(); /* '\n' */             while((Y[j] = getchar()) != '\n' && j < 10-1)                 j++;             Y[j] = '\0';             h = push(h,X,p);             break;      }      return 0; } 崩溃的原因是main中变量h是野指针，init函数并没有将申请的空间返回至main函数里，所以需要传二重指针来实现获取申请的空间。 注意下其他问题，不一一表述了。 注意代码风格。
user-0 提问: 求教nrf24l01 如何把所发送的数据数组大小也发过去

回复:
user: user-0
content: 我感觉行不通了，2401在接收的时候是用这个函数SPI1_ReadWriteByte(reg);    读取RD_RX_PLOAD 这个寄存器中的数据，读取的数据大小必须先事先规定好，就是说 接收的时候2401只能就收结构体中的数组数据而无法接收数组大小
user-0 提问: 【求助】关于缓冲区清除的问题

回复:
user: user-1
content: 建议是用字符串，因为你要反复的读取；这样你用缓存的方式接收要输入的内容，这样就会不用fflush。

user: user-2
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0];

user: user-3
content: ~~1楼正解

user: user-0
content: 引用 1 楼 user-4 的回复:fflush只能用于stdout 你可以用while循环getchar读光，直到EOF 这个我也有想过过。打比方说，如果我在循环结尾处里多加一句printf("...\n");，在不暂停每”。。。”持续输出的情况下清除键盘输入的多余的数据该怎么办呢？用WHILE能避免程序暂停吗？

user: user-4
content: fflush只能用于stdout 你可以用while循环getchar读光，直到EOF
user-0 提问: 急！急！急！关于bin文件中0x00的打包发送处理问题

回复:
user: user-1
content: 那你把长度发送过去呗

user: user-0
content: 对于8位的数组我已用sizeof成功发送接收0x00,但对于不满8位的，我无法使tmp_buf[8]={0x11,0x22,0x00,0x33,0x00,0x00} 的数组长度为6，有什么好的办法能做到这个么

user: user-2
content: 你要提前算好数组长度啊。。难道你还想用strlen之类的得到长度？  另外数据你给漏了几个字节肯定也是不行的啊，这些0x00很有可能是某些int类型的高位字节，你给去掉了那还不seg fault？

user: user-0
content: 刚才试了试用成员为数组和数组长度的结构体指针去传参数，对于24l01 他是读寄存器的值放到rx_buf中，而读取的数组长度我用结构指针的成员len去接受 是接收不到数值的 就是说len 数组长度发不过去 而发送端24l01显示的是send ok啊
user-0 提问: Eclipse C/++ 调试分析

回复:
user: user-0
content: 但是他会直接把调试信息直接存到字符串啊，影响我的调试，明白？ 并不是调试输出麻烦，而是这个数据直接进入到了缓冲区，直接给字符串进行了赋值，我是没又办法调试的啊

user: user-1
content: 你是没有输入，那是debug调试信息的输出，

user: user-0
content: 赵老师，我也试了一下，不是这个原因，我换了一个eclipse的版本就可以了，感谢你们。 可能是这个版本的问题。

user: user-2
content: puts("请输入信息："); rewind(stdin);     scanf("%s", str);
user-0 提问: ……分配了一个不兼容的指针类型？

回复:
user: user-1
content: 看一下你的数据结构定义

user: user-0
content: 引用 4 楼 user-2 的回复:[quote=引用 3 楼 Lamuna 的回复:] [quote=引用 2 楼 user-2 的回复:] 你看下你的ITEM结构体中，next成员的类型是不是ITEM*类型  typedef struct Item{   int id;   char name[255];   struct Item *next; }ITEM;   应该就是ITEM吧？[/quote]  那你给的这部分代码应该没问题  你试下：item = (ITEM*)item->next;[/quote]  啊！非常感谢，我找到问题了。  我之前是struct item，后来改成了Struct Item，但是next的部分还是写成了struct item *next，所以错了。 非常感谢指导！

user: user-2
content: 引用 3 楼 Lamuna 的回复:[quote=引用 2 楼 user-2 的回复:] 你看下你的ITEM结构体中，next成员的类型是不是ITEM*类型  typedef struct Item{   int id;   char name[255];   struct Item *next; }ITEM;   应该就是ITEM吧？[/quote]  那你给的这部分代码应该没问题  你试下：item = (ITEM*)item->next;

user: user-0
content: 引用 2 楼 user-2 的回复:你看下你的ITEM结构体中，next成员的类型是不是ITEM*类型  typedef struct Item{   int id;   char name[255];   struct Item *next; }ITEM;   应该就是ITEM吧？

user: user-2
content: 你看下你的ITEM结构体中，next成员的类型是不是ITEM*类型
user-0 提问: code blocks使用过程中字体突变！求大神解决

回复:
user: user-1
content: 编程时直接改成英文模式，不用中文输入法。注释建议也写英文的。

user: user-1
content: 注意看一下你输入法，是不是碰到的这个键正好是输入法的热键呢。 注意编程是用英文，半角模式

user: user-2
content: 应该是输入法从半角变成了全角，切换一下输入法就行了。

user: user-0
content: 我的天，为什么没办法标红了？，就是那句（zhe shi zen me le ?）

user: user-0
content: while(s[i] == 'e'||s[i] == 'E'){         if(s[++i] == '-'){             for(p = 1;p <= s[++i];++p){                 p = p * 0.1;                 return sum * p;             }         }         else{             for(p = 1;p <= s[i];++p){                 p = p * 10;                 return sum　    （ｚｈｅ　ｓｈｉ　ｚｅｎ　ｍｅ　ｌｅ？）             }         }     } }
user-0 提问: fscanf_s读取出错

回复:
user: user-0
content: 引用 2 楼 jianwen0529 的回复:你ReadElement之前是不是使用getchar了？  确实在一个函数不小心读取了一个字符

user: user-1
content: 你ReadElement之前是不是使用getchar了？

user: user-2
content: 应该是因为回车符存在流缓存区种，使用如下代码在每次输入后执行流清空 char ch; while((scanf("%c",&ch)!=EOF)&&(ch!='\n'));
user-0 提问: 求大佬看看

回复:
user: user-1
content: vs里面，每一个.cpp文件或者说源文件都要包含stdafx.h文件，可以理解为硬性规定，iostream.h?这是C版本的iosream头文件了，如果是在vs里面写，直接#include<iostream> 欢迎指正。

user: user-0
content: 还是没用，是不是没有头文件

user: user-2
content: #include<iostream>这样用
user-0 提问: 请大神帮助解决函数的有关问题，谢谢！

回复:
user: user-0
content: 引用 5 楼 qq_36100960 的回复:接楼上的话，如果s是“abcabc”，t是"abc"，那么t在s中出现的最后一次，是最后三个字母，此时t中的字符'a'，对应到s中，索引值（数组下标）是3 谢谢，理解了

user: user-1
content: 引用 4 楼 caine12345 的回复:[quote=引用 3 楼 paschen 的回复:] [quote=引用 2 楼 caine12345 的回复:] [quote=引用 1 楼 paschen 的回复:] 引用练习4-1 编写函数strrindex(s,t)，它返回字符串t在s中最右边出现的位置。如果s中不包含t，则返回-1  首先这个问题我就感觉很别扭，他想表达的意思我不理解，比如说我输入(abcdefg,bcdefg abc,efg)这串字符，  题目的意思就是：  如果字符串要s是"abcabc'，字符串t是“abc”，那么最右边出现的位置就是3，如果s中不包含t，就返回-1  弱弱问一句，为啥是3？3代表的是什么意思呢？[/quote]  索引号，最左边是0[/quote]  不好意思，我还是有点不明白您说的索引号是什么意思，最左边是0 是什么意思？[/quote]  a  b  c  a  b  c 0  1  2  3  4  5

user: user-2
content: 接楼上的话，如果s是“abcabc”，t是"abc"，那么t在s中出现的最后一次，是最后三个字母，此时t中的字符'a'，对应到s中，索引值（数组下标）是3

user: user-0
content: 引用 3 楼 paschen 的回复:[quote=引用 2 楼 caine12345 的回复:] [quote=引用 1 楼 paschen 的回复:] 引用练习4-1 编写函数strrindex(s,t)，它返回字符串t在s中最右边出现的位置。如果s中不包含t，则返回-1  首先这个问题我就感觉很别扭，他想表达的意思我不理解，比如说我输入(abcdefg,bcdefg abc,efg)这串字符，  题目的意思就是：  如果字符串要s是"abcabc'，字符串t是“abc”，那么最右边出现的位置就是3，如果s中不包含t，就返回-1  弱弱问一句，为啥是3？3代表的是什么意思呢？[/quote]  索引号，最左边是0[/quote]  不好意思，我还是有点不明白您说的索引号是什么意思，最左边是0 是什么意思？

user: user-1
content: 引用 2 楼 caine12345 的回复:[quote=引用 1 楼 paschen 的回复:] 引用练习4-1 编写函数strrindex(s,t)，它返回字符串t在s中最右边出现的位置。如果s中不包含t，则返回-1  首先这个问题我就感觉很别扭，他想表达的意思我不理解，比如说我输入(abcdefg,bcdefg abc,efg)这串字符，  题目的意思就是：  如果字符串要s是"abcabc'，字符串t是“abc”，那么最右边出现的位置就是3，如果s中不包含t，就返回-1  弱弱问一句，为啥是3？3代表的是什么意思呢？[/quote]  索引号，最左边是0

user: user-0
content: 引用 1 楼 paschen 的回复:引用练习4-1 编写函数strrindex(s,t)，它返回字符串t在s中最右边出现的位置。如果s中不包含t，则返回-1  首先这个问题我就感觉很别扭，他想表达的意思我不理解，比如说我输入(abcdefg,bcdefg abc,efg)这串字符，  题目的意思就是：  如果字符串要s是"abcabc'，字符串t是“abc”，那么最右边出现的位置就是3，如果s中不包含t，就返回-1  弱弱问一句，为啥是3？3代表的是什么意思呢？

user: user-1
content: 引用练习4-1 编写函数strrindex(s,t)，它返回字符串t在s中最右边出现的位置。如果s中不包含t，则返回-1  首先这个问题我就感觉很别扭，他想表达的意思我不理解，比如说我输入(abcdefg,bcdefg abc,efg)这串字符，  题目的意思就是：  如果字符串要s是"abcabc'，字符串t是“abc”，那么最右边出现的位置就是3，如果s中不包含t，就返回-1
user-0 提问: 创建二叉树的代码编译错误，求大神帮看看

回复:
user: user-0
content: 不好意思刚没在线。我这把树的结构发一下 struct BinTreeNode; typedef struct BinTreeNode *PBinTreeNode; typedef char Datatype; struct BinTreeNode { 	Datatype info; 	PBinTreeNode llink; 	PBinTreeNode rlink; }; typedef struct BinTreeNode *BinTree; typedef BinTree *PBinTree;

user: user-1
content: 双击错误提示，定位到具体位置。这里看不出有什么问题  1：检查是否有左右操作数类型不能匹配的情况 2：BinTreeNode在这个文件中是否是完全类型（能看到定义的）

user: user-2
content: *pbt类型和createBinTreeNode的返回值类型不一样吧； 感觉这个地方怪怪的。 我认为你应该是pbt类型里的一个元素是PBinTreeNode类型的。  主要还是要看你的数据结构定义。

user: user-3
content: 这些类型怎么定义的啊
user-0 提问: 十进制0.81转成IEEE规格的问题

回复:
user: user-1
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-0
content: 谢谢各位答复

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:浮点数格式 http://bbs.csdn.net/topics/390676437额，马上还看不懂，才学到给变量赋值，先存着，再往后看看估计就懂了。

user: user-0
content: 引用 1 楼 user-2 的回复:应该是浮点舍入模式的问题吧 0.81第23位后面是111...，所以就进了一位 应该就是了，刚又试了几个数，23位后面有1就进一位，0就不进位。

user: user-2
content: 应该是浮点舍入模式的问题吧 0.81第23位后面是111...，所以就进了一位
user-0 提问: VS2013编程，查找内存方面的错误

回复:
user: user-1
content: 有一些办法是能检测内存泄露的  http://blog.csdn.net/windows_nt/article/details/8652191

user: user-2
content: 如果是要检查申请的内存有没释放可参看： http://blog.csdn.net/windows_nt/article/details/8652191  除了分配的内存会泄露，你使用的各种资源（GDI、位图、画刷）等没释放也会泄露

user: user-3
content: 检查是否资源泄漏的办法之一： 在任务管理器 进程 查看 选择列 里面选择：内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍，越多越好，比如1000000次甚至无限循环，记录以上各数值，再隔至少一小时，越长越好，比如一个月，再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加，则铁定有对应资源的资源泄漏！  搜“GDI泄露检测”
user-0 提问: C语言定义函数形参是结构体指针，引用函数时参数用的是（&+结构体变量）

回复:
user: user-1
content: 声明时，A *a表示a是指向A类型的指针，A &a表示a是A类型的引用； 调用时，*a表示取a指向的内容，&a表示取a的地址。

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:形参的星号是指指针，就是结构体类型的指针，函数形参是一个结构体指针，实参也需要一个该结构体类型的指针，也就是要实参是一个地址传给形参；故在函数调用是使用的是&符号，就是区地址，将结构体变量的地址传过去。这样在函数里对于形参的修改就是对实参结构体变量的修改。  其实我发帖提问的是，因为还看到有其它的函数 也是这样声明： void func(MyTypeDef* adc)        //MyTypeDef  是结构体类型 {  }  但是引用时却是 func(Initabc);   //MyTypeDef   Initabc;   此处实参中无取地址符&  这是如何理解的？

user: user-2
content: Init需要的参数类型是指向这种结构体的指针类型，所以用*  调用时的&是取地址

user: user-3
content: 形参的星号是指指针，就是结构体类型的指针，函数形参是一个结构体指针，实参也需要一个该结构体类型的指针，也就是要实参是一个地址传给形参；故在函数调用是使用的是&符号，就是区地址，将结构体变量的地址传过去。这样在函数里对于形参的修改就是对实参结构体变量的修改。
user-0 提问: 统计一个整数中某数字的出现次数

回复:
user: user-1
content: #include <stdio.h>  int Count_Didit(const int N,const int D);  int main() { 	int N,D; 	scanf("%d %d",&N,&D); 	printf("%d\n",Count_Digit(N,D)); 	return 0; }  int Count_Digit(int N, int D) { 	int a=0,b; 	N = N<0 ? -N:N; 	while(N > 0) 	{ 		b = N%10; 		if(b == D) 		{ 			a++; 		} 		N = N/10; 	} 	return a; }  你main函数为什么要整一大堆东西

user: user-0
content: 哦哦，会了#include<stdio.h>  void main(){  int countdigit(long number,int digit); int i,repeat; int count; long in; printf("Input repeat:\n"); scanf("%d",&repeat); for(i=1;i<=repeat;i++){ printf("Input a number:\n"); scanf("%ld",&in); count=countdigit(in,2); printf("count=%d\n",count); } } int countdigit(long number,int digit) { int num,count=0; number=number<0?-number:number; while(number)     {     num=number%10;     if(num==digit)count++;     number/=10;     }     return count; }

user: user-0
content: #include<stdio.h>  void main(){  int countdigit(long number,int digit); int i,repeat; int count; long in; printf("Input repeat:\n"); scanf("%d",&repeat); for(i=1;i<=repeat;i++){ printf("Input a number:\n"); scanf("%ld",&in); count=countdigit(in,2); printf("count=%d\n",count); } } int countdigit(long number,int digit) { int num,count=0; number=number<0?-number:number; while(number)     {     num=number%10;     if(num==digit)count++;     number/=10;     }     return count; }

user: user-0
content: 刚开始用，不太会，怎么表示啊

user: user-2
content: 一个小小的建议,下次具体的代码能不能像二楼那样子表现出来?

user: user-3
content: 什么情况？？？？

user: user-0
content: 谢谢

user: user-4
content: 注意代码风格，函数声明建议放在函数外。代码可以写的更条理一些，需要空格或者换行的还是要换行，这样有利于代码的阅读。

user: user-4
content: #include <stdio.h>  int countdigit(long number,int digit);  int main(void) {     int i,repeat;     int count;     long in;      printf("Input repeat:\n");     scanf("%d", &repeat);     for (i = 1; i <= repeat; i++) {         printf("Input a number:\n");         scanf("%ld", &in);         count = countdigit(in,2);         printf("count=%d\n",count);     }     return 0; } int countdigit(long number,int digit) {     int num,count=0;      number = number < 0 ? -number : number;      while (number) {         num = number % 10;    /*should number, not num,*/         if(num == digit)             count++;         number/=10;     }     return count; }  原因很简单，就是这句改成这样： num = number % 10;
user-0 提问: 新手困惑，求解（在下在此先谢过了）

回复:
user: user-1
content: 兄弟刚入门的吧？先去听听老师怎么讲的！

user: user-2
content: 小六六，别急，先回去听课。听完课了就懂了

user: user-3
content: 引用 1 楼 cfjtaishan 的回复:这些问题基本上都是很基础的C语言语法： 1. 大括号在for后面还是另起一行这是属于代码风格的问题，即coding style.不同的公司可能有不同的代码风格，这个跟写代码的爱好也有一定关系；跟程序逻辑没关系； 2. //后面的内容是注释，//是表示后面的内容不属于代码逻辑的一部分，仅用于说明下面的一句或前面一句的逻辑或功能； 3. 是可以的，至于为什么用，你可以通过两种形式加以对比，%2d是表示占用2个字符的位置，为了是使输出对齐。 4. 这个是约定，因为main函数是int类型的，你平时学习的可能定义main函数的类型都是void，所以不需要一个return 0; 看来已经有人解决了。

user: user-4
content: 这些问题基本上都是很基础的C语言语法： 1. 大括号在for后面还是另起一行这是属于代码风格的问题，即coding style.不同的公司可能有不同的代码风格，这个跟写代码的爱好也有一定关系；跟程序逻辑没关系； 2. //后面的内容是注释，//是表示后面的内容不属于代码逻辑的一部分，仅用于说明下面的一句或前面一句的逻辑或功能； 3. 是可以的，至于为什么用，你可以通过两种形式加以对比，%2d是表示占用2个字符的位置，为了是使输出对齐。 4. 这个是约定，因为main函数是int类型的，你平时学习的可能定义main函数的类型都是void，所以不需要一个return 0;
user-0 提问: Fibonacci数列

回复:
user: user-1
content: 肯定是用动态规划呀，递归太耗时了。

user: user-2
content: x%100000%10007不等于x%10007。  比如x=100001，x%100000%10007=1，而x%10007=（懒得算了，反正不是1）

user: user-3
content: 引用 楼主 lifeevents 的回复:问题描述 Fibonacci数列的递推公式为：Fn=Fn-1+Fn-2，其中F1=F2=1。  当n比较大时，Fn也非常大，现在我们想知道，Fn除以10007的余数是多少。  输入格式 输入包含一个整数n。 输出格式 输出一行，包含一个整数，表示Fn除以10007的余数。 说明：在本题中，答案是要求Fn除以10007的余数，因此我们只要能算出这个余数即可，而不需要先计算出Fn的准确值，再将计算的结果除以10007取余数，直接计算余数往往比先算出原数再取余简单。  样例输入 10 样例输出 55 样例输入 22 样例输出 7704 数据规模与约定 1 <= n <= 1,000,000。    #include <stdio.h> int f(int n); int main() { 	int c,a; 	scanf("%d",&a); 	 	c=f(a)%100000%10007; 	printf("%d",c); 	return 0; } int f(int n) { 	if(n==1 || n==2) return 1; 	else return (f(n-1)%100000+f(n-2)%100000); }  老是错误啊。。 什么错误，样例测试没有问题；但是输入较大的值会比较慢，建议使用循环代替递归，递归会非常消耗栈空间，导致由于反复申请函数栈导致运行慢。

user: user-4
content: 这不是简单的代数题吗。。。。 假设n>2 f(n-2)=10007*a+x f(n-1)=10007*b+y f(n)=f(n-2)+f(n-1)=10007*(a+b)+(x+y) 可知f(n)除以10007的余数就是(x+y)%10007，而x、y正好分别是f(n-2)和f(n-1)除以10007的余数，所以代码就出来了。。。#include<iostream> using namespace std; int main() { 	int n; 	while (true) 	{ 		cin>>n; 		if (n<1||n>1000000) break;  		int fn; 		for (int i=3,f1=1,f2=1;i<=n;i++) 		{ 			fn=(f1+f2)%10007; 			f1=f2; 			f2=fn; 		} 		cout<<fn<<endl; 	}  	return 0; }

user: user-5
content: #include <stdio.h>   int func(int n) { 	if(n>2) 		return func(n-1)+func(n-2); 	else return 1; }  int main () { 	int n,ans; 	scanf("%d",&n); 	if(n<=0&&n>1000000) 		return 0; 	ans=func(n)%10007; 	printf("%d\n",ans); 	return 0; }
user-0 提问: C语言，如何将数据转成字符串啊？

回复:
user: user-1
content: sprintf

user: user-2
content: #include <stdio.h> #include <string.h>   int main(void) {     char buf[200];     char tmp[1024] = { 0 };     int i;      for (i = 0; i < 200; i++) {           buf[i] = i;     }      for (i = 0; i < 200; i++)         sprintf(tmp+strlen(tmp), "%d", buf[i]);     puts(tmp);     return 0; }
user-0 提问: c语言I/O操作，io和buf长度有关？

回复:
user: user-1
content: 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

user: user-0
content: 兄弟们别沉啊，帮下我，好奇的潘多拉

user: user-1
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-0
content: user-2：什么意思哦！字符串本来就有\0哦

user: user-2
content: char buf[] ="123\0";

user: user-0
content: 赵4老师：意思是txt文本不支持我这种编码格式吗？，刚我用notepad++打开确实是可以显示12了
user-0 提问: Visual C++ 6.0安装失败

回复:
user: user-1
content: win8及以上版本都装不上6.0的,建议装visual studio 2016

user: user-2
content: 悲夫！计算机发展太快，计算机老师老书却阴魂不散

user: user-3
content: 要分清c++语法  和编译器的区别，        语法是相同的，vc6.0只是一个编译器版本， 一些早该烧掉的书，只有学校还在用它们来误人子弟。  更高版本的编译器意味着更多的功能，更好的语法支持和优化，想学c++，建议直接上手c++11的语法，或者直接上手c++14语法，   学语法看  primer最新版，   学写代码看  代码大全

user: user-0
content: 引用 12楼source03 的回复:微软的操作系统都升级好几代了，还是有很多人在用着这些十多年前的版本。 主要是目前很多书籍还是介绍VC6.0。对啊，书基本都是讲VC6.0，考试也是用VC6.0！

user: user-0
content: 引用 1楼weixin_36764539 的回复:电脑是32位还是64位呢？win10系统64位

user: user-4
content: 电脑是32位还是64位呢？

user: user-0
content: 这个应该不是win10跟6.0不兼容的情况吧，不知道还要安装什么东西才行

user: user-5
content: win10不支持了，换成VS吧，貌似现在趋向64位，VC6不支持

user: user-6
content: 这个软件应该是比较老了，几年之前就有，并且当时是在XP下安装的。Win10估计不支持了吧。 建议安装其他的，去网上搜一下C++编译器

user: user-3
content: win10装不了，换个绿色版的吧，msdv.exe换成英文的

user: user-7
content: 用vs2010和vs2013把

user: user-8
content: 微软的操作系统都升级好几代了，还是有很多人在用着这些十多年前的版本。 主要是目前很多书籍还是介绍VC6.0。

user: user-9
content: 直接上VS吧，现在都免费，很好用的。

user: user-10
content: 引用 2 楼 qq_34417707的回复:引用 1楼weixin_36764539 的回复:电脑是32位还是64位呢？win10系统64位 Windows10别装VC6了。 你可以尝试VS  2008或者2010

user: user-11
content: 请问大神这个是支持win10的包么

user: user-12
content: Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt
user-0 提问: 关于openmp的race condition

回复:
user: user-1
content: 引用 2 楼 katorirea2017 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 百度搜相关关键字。 可以说的更明白一点吗？我百度主要解决方法就是靠critical，但是要保护的变量太多了，都用crtical的吧跟单线程不是一样了吗？[/quote] 《Windows核心编程》 仅保护读时可能被其它线程写的局部数据。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:百度搜相关关键字。 可以说的更明白一点吗？我百度主要解决方法就是靠critical，但是要保护的变量太多了，都用crtical的吧跟单线程不是一样了吗？

user: user-1
content: 百度搜相关关键字。
user-0 提问: 关于c语言和c++中的const问题

回复:
user: user-1
content: c++编译的时候默认把const修饰的变量转换为常量了

user: user-2
content: 引用 2 楼 huamao1023 的回复:[quote=引用 1 楼 user-8的回复:]有点意思，我在Ubuntu上测了一下，首先  int *p = &a; 这句要做个强制转换，否则c编译出警告，c++编译报错。改成 int *p = (int*) &a;  用 gcc -S和g++ -S 选项生成汇编看，发现c编译器在处理a时按照普通变量处理，而c++编译器处理a时做了值替换，也就是:  printf("a=%d\n", a );这句话，c++编译器里面处理成 printf("a=%d\n", 10); 如果c编译器把变量a当成普通变量处理，那为什么如果在中间添加a=30；给a重新赋值，编译器又会报错?又把a当成常量了??[/quote] a就是普通变量，const是修饰a里的值，就是const是限制a里的值不能通过a去修改。所以，将30赋值给a，编译器会报错，因为a里的值不能通过a在次改变。但是*p是指针，const不能限制指针p，所以通过p可以去修改a里的值。

user: user-3
content: 这个跟编译器有关，在      程序员的自我修养--编译、链接与库   那本书讲过

user: user-4
content: C里面的是假的，C++里面的是真的。

user: user-5
content: 编译器帮你处理了，用到a的地方，通通改为10，与宏定义类似。 const只是编译期常量关键字。

user: user-6
content: 不要纠结各种常量了，这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢！

user: user-7
content: 修改常量，未定义行为

user: user-0
content: 引用 1 楼 user-8的回复:有点意思，我在Ubuntu上测了一下，首先  int *p = &a; 这句要做个强制转换，否则c编译出警告，c++编译报错。改成 int *p = (int*) &a;  用 gcc -S和g++ -S 选项生成汇编看，发现c编译器在处理a时按照普通变量处理，而c++编译器处理a时做了值替换，也就是:  printf("a=%d\n", a );这句话，c++编译器里面处理成 printf("a=%d\n", 10); 如果c编译器把变量a当成普通变量处理，那为什么如果在中间添加a=30；给a重新赋值，编译器又会报错?又把a当成常量了??

user: user-8
content: 有点意思，我在Ubuntu上测了一下，首先  int *p = &a; 这句要做个强制转换，否则c编译出警告，c++编译报错。改成 int *p = (int*) &a;  用 gcc -S和g++ -S 选项生成汇编看，发现c编译器在处理a时按照普通变量处理，而c++编译器处理a时做了值替换，也就是:  printf("a=%d\n", a );这句话，c++编译器里面处理成 printf("a=%d\n", 10);
user-0 提问: C语言malloc之后指针指向内存空间问题

回复:
user: user-1
content: 直接在VC上新建个工程，单步调试查看，就知道结果了。

user: user-2
content: 引用 2 楼 cfjtaishan 的回复:pstu++是偏移8个字节，如何来知道偏移了多少个字节呢？通过sizeof(student)，可以查看数据结构是占多少个字节。pstu是student类型的变量，pstu++的偏移长度就是sizeof(student).  这个稍微看一眼就知道sizeof(student) 是多少了

user: user-3
content: pstu++是偏移8个字节，如何来知道偏移了多少个字节呢？通过sizeof(student)，可以查看数据结构是占多少个字节。pstu是student类型的变量，pstu++的偏移长度就是sizeof(student).

user: user-2
content: 第一 这和字节对齐有关系，默认的4字节对齐的情况下，结构体中的成员按4的倍数占用存储空间，结构体大小按4字节补齐，因为结构体本身就只有4字节的2个成员，因此一个结构体完整大小是8字节（不填充任何字节，紧密存储）

user: user-4
content: 已知：  typedef struct  {   int  score;   int  age; }student;  这里假设int是4个Byte的 student * pstu = malloc(sizeof(student)*100);  求P

user: user-5
content: sizeof *pstu 结果是8 pstu+1 就是 + 8 这个是指针算术的内容 和pstu存储的数据没有关系  哪怕你的pstu 里面存储的是 0  pstu+1 一样是 +8

user: user-6
content: 引用student * pstu = malloc(sizeof(student)*100);  这时候P++，内存偏移的地址是否还是8？  P是什么？？  T类型的指针+1移动的距离是sizeof(T)  pstu + 1 就移动了一个结构体的大小

user: user-7
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！
user-0 提问: 输入10个学生5门课的成绩

回复:
user: user-1
content: scanf读入有问题

user: user-2
content: scanf 错了，另外，函数直接传二维数组，有些牵强啊

user: user-3
content: 请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢？

user: user-4
content: 函数声明建议放在函数外，同时注意coding style.

user: user-4
content: #include<stdio.h>  void std_average(float (*array)[5], float *pstu_ave); void sub_average(float (*array)[5], float *psub_ave);  int main() {      float a[10][5], student_ave[10], subject_ave[5];     int i,j;      printf("Input scores:\n");     for(i = 0; i < 10; i++) {         printf("student %d:\n", i + 1);         for(j = 0; j < 5; j++)             scanf("%f", &a[i][j]);         printf("\n");     }       printf("student average score is:\n");     std_average(a, student_ave);     for(i = 0; i < 10; i++) {         printf("5.2%f", student_ave[i]);         if(i == 5)             printf("\n");     }      printf("subject average score is:\n");     sub_average(a, subject_ave);     for(i = 0; i < 5; i++)         printf("5.2%f",subject_ave[i]);       return 0; }   void std_average(float array[10][5], float *pstu_ave) {     int i, j;      for(i = 0; i < 10; i++) {         for(j = 0; j < 5; j++)             pstu_ave[i] = array[i][j];         pstu_ave[i] = pstu_ave[i] / 5;     } }  void sub_average(float array[10][5], float *psub_ave) {     int i,j;      for(i = 0; i < 5; i++)     {         for(j = 0; j < 10; j++)             psub_ave[i] = array[j][i];         psub_ave[i] = psub_ave[i] / 5;     } } 两个问题： 1. scanf输入时，需要加&;  2. 求学生平均成绩和科目平均成绩直接平均成绩的数组传进处理函数，这样节省函数栈空间，同时还能提高程序效率。
user-0 提问: ACM谜题问题

回复:
user: user-0
content: 引用 1楼自信男孩 的回复:应该是输入的时候不能输入空格，但是空格有ASCII对应的值，这个值是32； 建议输入空格的地方输入一个特殊字符（比如-1）然后再数组进行重新赋值，遇到特殊字符（-1）赋值32即可。十分感谢！

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:应该是输入的时候不能输入空格，但是空格有ASCII对应的值，这个值是32； 建议输入空格的地方输入一个特殊字符（比如-1）然后再数组进行重新赋值，遇到特殊字符（-1）赋值32即可。 程序可以运行了，十分感谢，问下，除了这种赋值的方式外，有直接输入空格的操作方法吗？

user: user-1
content: 应该是输入的时候不能输入空格，但是空格有ASCII对应的值，这个值是32； 建议输入空格的地方输入一个特殊字符（比如-1）然后再数组进行重新赋值，遇到特殊字符（-1）赋值32即可。
user-0 提问: 提问如何解此题:将一组任意长度的数组从大到小排列输出

回复:
user: user-0
content: 引用 3楼自信男孩 的回复:直接写一个不定长度的冒泡排序算法即可，数据长度可以通过参数传递进去。比如： void bubble_sort(int *arr, int len) {     int i,j;     int tmp;      for(i = 0; i < len - 1; i++)         for(j = 0; j < len - 1 - i; j++)             if (arr[j] > arr[j + 1]) {                 tmp = arr[j];                 arr[j] = arr[j + 1];                 arr[j + 1] = tmp;             } } 数组长度len是需要传递到bubble_sort函数里。想明白了谢大神⁄(⁄ ⁄ ⁄ω⁄ ⁄ ⁄)⁄

user: user-1
content: 数组长度可以这样表示sizeof(arr)/sizeof(arr[0])

user: user-2
content: 直接写一个不定长度的冒泡排序算法即可，数据长度可以通过参数传递进去。比如： void bubble_sort(int *arr, int len) {     int i,j;     int tmp;      for(i = 0; i < len - 1; i++)         for(j = 0; j < len - 1 - i; j++)             if (arr[j] > arr[j + 1]) {                 tmp = arr[j];                 arr[j] = arr[j + 1];                 arr[j + 1] = tmp;             } } 数组长度len是需要传递到bubble_sort函数里。

user: user-3
content: 排序做为最基本的算法题，网上一搜一大把。 所谓任意长度，对于C语言，事先都是要先知道的，传参就行了。

user: user-4
content: 在c中，数组在定义的时候就必须要知道长度了，因为在编译阶段就要分配存储单元，你这种可以采用宏定义来做，每次只需要改最初的宏定义的数值就可以了。
user-0 提问: static的用法还不太懂，大家帮忙看看

回复:
user: user-1
content: 你可以简单认为static int n   n就是一个全局变量 （这样认为肯定错误） void aaa() { ....static int n = 0; ....n++; } 你可以认为是 int n = 0; void aaa() { ....n++;  } 并且n只能在aaa()里面才能使用。

user: user-0
content: 引用 8 楼 m0_37481440 的回复:我想 应该是函数执行时它的参数只是值的 拷贝,get(int n=0)那个函数里第一次的n 和第二次的n是两个n了,然后第二次的n为2返回给第一次2,但第一次的n还是1返回给外层1.  然后static 修饰的局部变量是导致这个变量就存在于程序运行的整个阶段了不会被第二次static 修饰赋值,并且维持它上一次改变的值,它不会被拷贝,也不像普通的局部变量会在用完后即空间被释放. static修饰过后会被放在静态区(程序运行存在),普通的局部变量放在的是栈区(用完就释放空间). 可能你需要熟悉一下 哪些数据 存在于 哪些地方.比如堆和栈还有静态区等等. 太感谢了！完美解决问题

user: user-2
content: 请忽略我上面的答案。

user: user-2
content: static 标注的语句，只执行一次，后面n变量在整个程序中永久存在，只是它的作用域在get函数内，而不在整个程序中，说明白一些只是个永久的局部变量，不管get函数调用多少次，都只执行一次，也就是说哪怕函数结束了，n的值也不会丢失。

user: user-0
content: 引用 2 楼 qq_36009365 的回复:进去调用get(1)，之后n变成2，返回2给get(1)，然后返回1给main，所以最后主函数中显示的是1。上面的打错字。。 谢谢，我知道n是如何变化的，我想知道的是n为什么会那样变化。有static关键字的，只返回最后一个结果，没static关键字的就相当于 int get(int n=0) {     n++; //    if(n<2) get(n);     return n; }

user: user-0
content: 引用 2 楼 qq_36009365 的回复:进去调用get(1)，之后n变成2，返回2给get(1)，然后返回1给main，所以最后主函数中显示的是1。上面的打错字。。  谢谢，我知道n是如何变化的，我想知道的是n为什么会那样变化。有static关键字的，只返回最后一个结果，没static关键字的就相当于int get(int n=0) {     n++; //    if(n<2) get(n);     return n; }

user: user-3
content: 你可以在if后面加一句输出。跟踪一下n的值是如何变化的。

user: user-4
content: 老司机说一句，static一般只在涉及到线程的类里，或者做单例模式的时候用，其它时候static就是个摆设

user: user-5
content: 进去调用get(1)，之后n变成2，返回2给get(1)，然后返回1给main，所以最后主函数中显示的是1。上面的打错字。。

user: user-5
content: 进去调用get(1)，之后n变成2，返回2给get(1)，然后返回1给main，所以最后主函数中显示的是2

user: user-6
content: 我想 应该是函数执行时它的参数只是值的 拷贝,get(int n=0)那个函数里第一次的n 和第二次的n是两个n了,然后第二次的n为2返回给第一次2,但第一次的n还是1返回给外层1.  然后static 修饰的局部变量是导致这个变量就存在于程序运行的整个阶段了不会被第二次static 修饰赋值,并且维持它上一次改变的值,它不会被拷贝,也不像普通的局部变量会在用完后即空间被释放. static修饰过后会被放在静态区(程序运行存在),普通的局部变量放在的是栈区(用完就释放空间). 可能你需要熟悉一下 哪些数据 存在于 哪些地方.比如堆和栈还有静态区等等.
user-0 提问: 运行代码总是停止工作，求指导

回复:
user: user-0
content: 引用 3 楼 cfjtaishan 的回复:建议你添加输出信息，然后根据输出信息一步一步的调试； 或者将你的demo文件（要读取的文件）发出来（不要图片形式），我帮你调试一下；已解决谢谢！

user: user-1
content: 建议你添加输出信息，然后根据输出信息一步一步的调试； 或者将你的demo文件（要读取的文件）发出来（不要图片形式），我帮你调试一下；

user: user-0
content: 这是output里面到达特定字符串的位置，下面一行一行的数据就是要收集的

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

回复:
user: user-1
content: int sum=0,i; for(i=0;i<100;i++) { sum+=a[i]-b[i]; }

user: user-2
content: 题目错了还是就是第二个是b1-a1，这样就控制下正负号就行了

user: user-3
content: 多看看书吧，基本啊

user: user-4
content: 楼上少个引号

user: user-5
content: int sum=0; for(i=0;i<=99;i++) {            sum+=a[i]-b[i]   }

user: user-6
content: 对应输入，然后循环相减（a[i] -= b[i] )，最后用循环把a数组的值相加就可以了。
user-0 提问: 一个关于指针和数组的问题

回复:
user: user-1
content: cfjtaishan的说法正确。但都没有说出问题关键：a是数组名，是常量，不能取地址。就像&123，是错的。常量也不接受赋值。就像不能1=2。

user: user-2
content: 类型不匹配，p和a是相同类型的，一个是数组名（数组的首地址）可以看作是指针常量（不能做左值），若a是一维数组，就是一重指针常量。

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

user: user-4
content: 第二种说法完全不对。第一种说法需要稍微改一下： &a为a的地址，a是一个数组，要如此做的话p需为指向数组的指针。  顺便楼上说数组就是指针的，请自行试验以下代码：  int a[42]; int **p = &a;

user: user-5
content: p是一个指针变量，应该给它赋一个地址值，一维数组名本身就是代表数组的首地址，所以p=a;    即可

user: user-6
content: 数组退化后就是指针。p=&a表示p要指向a的地址，而a本来就是一个指针，所以需要一个二级指针才能指向a的地址。
user-0 提问: 内存的移位操作

回复:
user: user-1
content: 建议将固定数以二进制数表示放到一个二进制数组里，然后对该这个数组进行移位，最后将数组转换成移位后的数值。

user: user-2
content: SHL		逻辑左移. 	SAL		算术左移.(=SHL) 	SHR		逻辑右移. 	SAR		算术右移.(=SHR) 	ROL		循环左移. 	ROR		循环右移. 	RCL		通过进位的循环左移. 	RCR		通过进位的循环右移. 			  以上八种移位指令,其移位次数可达255次. 			  移位一次时, 可直接用操作码. 如 SHL AX,1. 			  移位>1次时, 则由寄存器CL给出移位次数. 			  如 MOV CL,04	SHL	AX,CL
user-0 提问: C语言读入TXT文件并输入结构体中，忽略空格

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

user: user-2
content: #include <iostream> #include <string> #include <fstream> using namespace std;  int main(int argc, char* args[]) {     string file="123.txt";     std::fstream input(file);     if (!input.is_open())     { 	  std::cout << "Error opening file"; exit(1);     }     while (!input.eof())     { 	  char buffer[256] = { 0 }; 	  input.getline(buffer, 64); 	  std::cout << buffer << std::endl;     }      input.close();      system("pause");     return 0; }

user: user-3
content: 在循环中 用fgets一行一行地读,然后用strtok分解空格得到各个字符串再放到结构体对应成员中.  我没做过,我想的.
user-0 提问: 俩字符数组名比较大小的含义

回复:
user: user-1
content: 比较数组首元素的地址值，如果你需要比较ASCII，使用strcmp函数比较，或者把数组换为string类型

user: user-2
content: 你用的是 char 数组，那么 s1、s2 会退化为指针，比较的结果就是恒定的，即比较其地址（指针）。 如果你用的是 string、CString 之类的，则比较运算符会被重载，这样是逐字符比较 ascii 码，同 strcmp。

user: user-3
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-4
content: 引用 楼主 qq_38179971 的回复:#include<iostream> using namespace std; int main() { 	char s1[20],s2[20],s3[20]; 	cin>>s1>>s2; 	if(s1<s2)cout<<s1; 	else cout<<s2;  	 	return 0;   }   输入:gejianping【回车】jiang 输出:jiang  输入:ge【回车】jiang 输出:jiang   由上得出if(s1<s2)既不是比较首字母ascii码的大小也不是比较字符串的大小，那是比较什么呢？ 比较的是地址值，因为s1和s2分别表示两个数组的首地址。在内存中表示两个地址值。
user-0 提问: 坛子里的大神可以解释下原因吗？

回复:
user: user-1
content: #include<stdio.h>  int change(double x) { 	return (int)(x+0.5); }  int main() { 	double a = 26.5; 	double b = 10.0; 	printf("%lf\n", a / b); 	printf("%d\n", (int)((a / b - (int)(a / b)) * 100)); 	printf("%d\n", (int)((2.65-2 )* 100)); 	printf("%d\n",change((a / b - (int)(a / b)) * 100));	     return 0; }

user: user-2
content: 浮点数转整型存在精度丢失问题，所以要么根据自己的需求自己实现一个转换函数，要么就全部用浮点数  #include<stdio.h>  int main() {     double a = 26.5;     double b = 10.0;     printf("%.30f\n",(2.65-2)*100);     return 0; }

user: user-3
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-4
content: 很多十进制可以精确表示的小数都不能在二进制下精确表示  2.65 在内存中存储的二进制对应的十进制实际是：2.6499999999999999  转换int 是直接截断，所以结果是64  如果需要65，需要四舍五入，而不是直接转换成int
user-0 提问: 求大神帮忙

回复:
user: user-1
content: #include <stdio.h> #include <string.h>  void ps(char b[][20],int n);  int main(void) {     char p[10][20] = {         "Aafhghk", "Bbgjfjghkkh",         "Ccdfggkgdfhff", "Dfdhj",         "Egdfhd","Fsrb",         "Jdfghhk","Hfggkghhfrthfj",         "Gdfghkhfdgh","Wfdhfhjhg"     };     int i;      for(i=0;i<10;i++)         printf("%s\n", *(p+i));   /* *(p+i) is equal p[i] */     printf("\n");      ps(p, 10);     for(i=0;i<10;i++)         printf("%s\n", *(p+i));    /* *(p+i) is equal p[i] */      return 0; } void ps(char b[][20], int n) {     char s[20];     int r,i;      while(n!=0)     {         n--;         for(i=0;i<n-1;i++)         {             r = strcmp(b[i], b[i+1]);             if(r>=1)             {                 strcpy(s, b[i]);                 strcpy(b[i], b[i+1]);                 strcpy(b[i+1], s);             }         }     } }  加头文件string.h，输出时有问题，*(p+i)或者p[i]； 排序没问题

user: user-0
content: 我好像头文件写错了。

user: user-2
content: 单步跟踪程序运行，观察变量变化情况，分析原因
user-0 提问: 对结构体数组取地址问题

回复:
user: user-0
content: 引用 7 楼 user-3 的回复:你这里只是一个结构体对象，而不是结构体  [quote=引用 6 楼 znevq 的回复:] [quote=引用 3 楼 user-3 的回复:] 你这里的arrowA只是一个结构体对象，而不是结构体数组  printf("%x\n", arrowA); 相当于只是将arrowA这个对象当十六进制整数来输出，仅取了第一个成员的成员的值  printf("%x\n", &arrowA); 则是输出这个对象的地址  老师您好，这样应该是结构体数组了吧，但结果还是一样的呀： str_A arrowA[2] = {     {&a,     &b,     &c,     &d},     {&a,     &b,     &c,     &d} }str_A;[/quote]  这不是结构体数组，只是初始结构体对象中的成员变量而已[/quote]   老师，您好，请问下面这个定义不是一个结构体数组吗？ 我一直以为是有两个相同类型的结构体成员的结构体数组啊？  str_A arrowA[2] = {      {&a,      &b,      &c,      &d},      {&a,      &b,      &c,      &d}  }

user: user-1
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-0
content: str_A arrowA[2] = {      {&a,      &b,      &c,      &d},      {&a,      &b,      &c,      &d}  }   这样应该是结构体数组了吧？ 结果一样呀？

user: user-2
content: 结构体变量地址和结构体地址的问题；  printf("%x\n", arrowA);输出的是结构体变量arrowA的值，不过这儿应该是指定结构体中的某个成员，结构体变量本身无法输出。  printf("%x\n", &arrowA); 输出的是全局变量arrayA的地址。

user: user-3
content: 你这里只是一个结构体对象，而不是结构体  引用 6 楼 znevq 的回复:[quote=引用 3 楼 user-3 的回复:] 你这里的arrowA只是一个结构体对象，而不是结构体数组  printf("%x\n", arrowA); 相当于只是将arrowA这个对象当十六进制整数来输出，仅取了第一个成员的成员的值  printf("%x\n", &arrowA); 则是输出这个对象的地址  老师您好，这样应该是结构体数组了吧，但结果还是一样的呀： str_A arrowA[2] = {     {&a,     &b,     &c,     &d},     {&a,     &b,     &c,     &d} }str_A;[/quote]  这不是结构体数组，只是初始结构体对象中的成员变量而已

user: user-0
content: 引用 3 楼 user-3 的回复:你这里的arrowA只是一个结构体对象，而不是结构体数组  printf("%x\n", arrowA); 相当于只是将arrowA这个对象当十六进制整数来输出，仅取了第一个成员的成员的值  printf("%x\n", &arrowA); 则是输出这个对象的地址  老师您好，这样应该是结构体数组了吧，但结果还是一样的呀： str_A arrowA[2] = {     {&a,     &b,     &c,     &d},     {&a,     &b,     &c,     &d} }str_A;

user: user-0
content: 求大神解疑呀

user: user-0
content: str_A arrowA[2] = {     {&a,     &b,     &c,     &d},     {&a,     &b,     &c,     &d}, }str_A;  也是一样的结果呀？ 这个是结构体数组了吧！？

user: user-3
content: 你这里的arrowA只是一个结构体对象，而不是结构体数组  printf("%x\n", arrowA); 相当于只是将arrowA这个对象当十六进制整数来输出，仅取了第一个成员的成员的值  printf("%x\n", &arrowA); 则是输出这个对象的地址

user: user-1
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-0
content: 我的理解是：     printf("%x\n", arrowA); //输出arrowA的第一个元素的值     printf("%x\n", &arrowA); //输出arrowA的数组地址(第一个元素的地址)  但是不知道原因，为什么会这样？
user-0 提问: 泣血跪求！！！！#include的问题

回复:
user: user-1
content: #include<complex>  复数使用的是 C++，所以包含的头文件是没有 .h 后缀的。

user: user-0

user: user-2

user: user-2

user: user-0
content: 忘了说了，我用的编译器是visual studio 2013

user: user-0
content: 引用 1 楼 user-3 的回复:编译选项加上 -std=c99 试试  在哪儿加啊，小弟C玩的不是很6

user: user-3
content: 编译选项加上 -std=c99 试试
user-0 提问: 指向字符数组的指针指针问题

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-2
content: char   Binary_Command[]="1234578963214587\0"; 字符串最后的'\0'不需要加，因为字符串结束标记是自动加的，它会占用数组的一个字节。 在Linux下不会出现这个问题。理论上输入字符串，只有遇到'\0'才会结束，否则不会自动截断字符串的。应该是其他原因；

user: user-3
content: 代码全部贴出来

user: user-3
content: 引用 7 楼 Janxionwang 的回复:指针定义改成这样：char *p = new char[20]();别乱改

user: user-4
content: 指针定义改成这样：char *p = new char[20]();

user: user-5
content: 应该不会出现你说的问题，试下输出Binary_Command的结果是什么，再看下生成的汇编代码

user: user-6
content: 这个不会有问题吧，能具体讲一下你的问题吗？

user: user-0
content: 我在CCS3.0和VC6.0上编写都没有问题，在CCS5.0上就出现这个问题

user: user-7
content: 确实特殊并且神奇。把P初始化null一下看看。不会编译器作怪吧
user-0 提问: 求出-10到30之内能被7或11整除，但不能同时被7或11整除的所有整数

回复:
user: user-1
content: if( ( i % 7 == 0 || i % 11 == 0 ) && ( !(  i % 7 == 0 && i % 11 == 0 ) ) )

user: user-2
content: 写if((i%7==&&i%11!=0)||(i%7!=0&&i%11==0))

user: user-3
content: 引用 2 楼 qq_31989333 的回复:[quote=引用 楼主 qq_38172134 的回复:] #include<stdio.h> main() { int i; for(i=-10;i<=30;i++) { if(i%7==0||i%11==0) (不知道填什么!=0) { printf("%d,",i); }  }  } -10到30之间也不存在这样的数字呀,你可以扩大一下范围,在纸上算出来这些数字,再用C语言编程算出来[/quote  ]说错了,-10到30之间存在这样的数字,但是你可以扩大范围变成-78到78.你就可以发现-77,77没有被打印出来

user: user-3
content: 引用 楼主 qq_38172134 的回复:#include<stdio.h> main() { int i; for(i=-10;i<=30;i++) { if(i%7==0||i%11==0) (不知道填什么!=0) { printf("%d,",i); }  }  } -10到30之间也不存在这样的数字呀,你可以扩大一下范围,在纸上算出来这些数字,再用C语言编程算出来

user: user-3
content: if ( (i % 7 == 0 || i % 11 == 0)&&(i%77!=0 ) )  (  (能够被7整除或者能够被11整除)并且(不能同时被7和11整除)  ) 找7和11的最小公倍数也就是77
user-0 提问: 关于pthread_create线程创建的断错误

回复:
user: user-0
content: 引用 8 楼 sum_TW 的回复:http://blog.csdn.net/sum_tw/article/details/68952050 参考一下  谢谢

user: user-0
content: 引用 6 楼 cfjtaishan 的回复:#include<stdio.h> #include<stdlib.h> #include<string.h> #include<pthread.h> #include<unistd.h>  void *fn() {     pthread_detach(pthread_self());     return NULL; }  int main(void) {     pthread_t tid;     int i;      for (i = 0; ; i++) {         int err = pthread_create(&tid, NULL, fn, NULL);         if (err!=0) {             printf("%s\n", strerror(err));             break;         }         printf("i = %d\n", i);     }     return 0; } 你是在那个平台上运行改程序，我在Linux下运行了，没有出现错误，一直在运行（通过查看i的值）。这是一个无限创建线程，并且线程会自动释放的程序。  看来是ubuntu的问题，我换centos试了下，确实可以一直创建线程，谢谢啦，但分数怎么给你呢？

user: user-1
content: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<pthread.h> #include<unistd.h>  void *fn() {     pthread_detach(pthread_self());     return NULL; }  int main(void) {     pthread_t tid;     int i;      for (i = 0; ; i++) {         int err = pthread_create(&tid, NULL, fn, NULL);         if (err!=0) {             printf("%s\n", strerror(err));             break;         }         printf("i = %d\n", i);     }     return 0; } 你是在那个平台上运行改程序，我在Linux下运行了，没有出现错误，一直在运行（通过查看i的值）。这是一个无限创建线程，并且线程会自动释放的程序。

user: user-0
content: 难道没人知道吗？

user: user-2
content: http://blog.csdn.net/sum_tw/article/details/68952050 参考一下

user: user-3
content: 引用 6楼自信男孩 的回复:#include<stdio.h> #include<stdlib.h> #include<string.h> #include<pthread.h> #include<unistd.h>  void *fn() {     pthread_detach(pthread_self());     return NULL; }  int main(void) {     pthread_t tid;     int i;      for (i = 0; ; i++) {         int err = pthread_create(&tid, NULL, fn, NULL);         if (err!=0) {             printf("%s\n", strerror(err));             break;         }         printf("i = %d\n", i);     }     return 0; } 你是在那个平台上运行改程序，我在Linux下运行了，没有出现错误，一直在运行（通过查看i的值）。这是一个无限创建线程，并且线程会自动释放的程序。谢谢解答。系统是Ubuntu 16.04lts，难道是系统的问题？

user: user-3
content: 引用 3楼欧阳春晖 的回复:我的理解是线程不能分离自身，要由父线程进行分离自身分离也是可以，而且在主线程中分离效果也是一样的

user: user-4
content: 我的理解是线程不能分离自身，要由父线程进行分离

user: user-3
content: 引用 1楼赵4老师 的回复:进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令这个试了，显示pthread create 有错，但不知道错在哪儿。

user: user-5
content: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令
user-0 提问: 关于数组求最大最小值的问题

回复:
user: user-1
content: 引用 2 楼 qq_38126053的回复:引用 1 楼 qq_36409192 的回复:你写在里面，那么你你每次的比较都是和p[0]在比较，所以根本就不是在求最值，而是在求大于第一个数的最后一个数。（注意if、for的使用都要加花括号，不加括号这个习惯是很不好的，你这个代码因为没花括号，逻辑都出问题了）哦，大概明白了，放在循环里面经过一次循环后，又把最大最小值初始化为第一个元素的值了。 其实如果只是想求一个数组的最大值和最小值的话，没必要这么麻烦，可以直接用冒泡排序，排序完了第一数就是最小值，最后一个数就是最大值(如果你没学过，可以去网上搜一下冒泡排序法)

user: user-0
content: 引用 3 楼 user-2 的回复:if 后面用大括号， 否则只有一条语句属于if  #include<stdio.h> void daxiao(int *p, int g, int *da, int *xiao) {    	for (int i = 1; i < g; i++) 	{ 		int _da = p[0]; 		if (p[i]>_da) 		{ 			_da = p[i]; 			*da = _da; 		} 	} 	for (int k = 1; k < g; k++) 	{ 		int _xiao = p[0]; 		if (p[k] < _xiao) 		{ 			_xiao = p[k]; 			*xiao = _xiao; 		}  	} } int main() { 	int array[5] = { 69, 25, 6, 99, 0}; 	int a, b; 	daxiao(array, 5, &a, &b); 	printf("最大值是：%d\n", a); 	printf("最小值是：%d\n", b); 	return 0; }在这里if后面的两句不用大括号括起来运行结果都一样吧？

user: user-2
content: if 后面用大括号， 否则只有一条语句属于if  #include<stdio.h> void daxiao(int *p, int g, int *da, int *xiao) {    	for (int i = 1; i < g; i++) 	{ 		int _da = p[0]; 		if (p[i]>_da) 		{ 			_da = p[i]; 			*da = _da; 		} 	} 	for (int k = 1; k < g; k++) 	{ 		int _xiao = p[0]; 		if (p[k] < _xiao) 		{ 			_xiao = p[k]; 			*xiao = _xiao; 		}  	} } int main() { 	int array[5] = { 69, 25, 6, 99, 0}; 	int a, b; 	daxiao(array, 5, &a, &b); 	printf("最大值是：%d\n", a); 	printf("最小值是：%d\n", b); 	return 0; }

user: user-0
content: 引用 1 楼 qq_36409192 的回复:你写在里面，那么你你每次的比较都是和p[0]在比较，所以根本就不是在求最值，而是在求大于第一个数的最后一个数。（注意if、for的使用都要加花括号，不加括号这个习惯是很不好的，你这个代码因为没花括号，逻辑都出问题了）哦，大概明白了，放在循环里面经过一次循环后，又把最大最小值初始化为第一个元素的值了。

user: user-1
content: 你写在里面，那么你你每次的比较都是和p[0]在比较，所以根本就不是在求最值，而是在求大于第一个数的最后一个数。（注意if、for的使用都要加花括号，不加括号这个习惯是很不好的，你这个代码因为没花括号，逻辑都出问题了）