Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 怎么减少代码时间超限问题

回复:
user: user-0
content: 引用 11 楼 hijack00 的回复:[quote=引用 10 楼 zuoside__lord 的回复:] [quote=引用 9 楼 hijack00 的回复:] [quote=引用 8 楼 zuoside__lord 的回复:] [quote=引用 5 楼 hijack00 的回复:] log运算相较于乘除法更慢，由于多个log相加等价先相乘再取一次log，在n不是很大的时候，可以先计算连乘积，再取一次log就是最终结果。 请问怎么写，，，，不好意思我不太会，，，，[/quote]  #include <stdio.h> #include <math.h> int main(int argc, const char * argv[]) {     int i,n;     double sum, mul;     while(scanf("%d",&n)!=EOF)     {         mul = 1.0;         for(i=2; i<=n; i++)         {             mul *= i;         }         sum = log10(mul);         printf("%f\n", sum);     }     return 0; } [/quote] 你的代码错了，输入5应该输出3，但是输出的是2[/quote]  我的代码只是给你提供一个思路，让你照着改的。 你原来的代码里面有个ceil函数，我把它去掉了。你加上这个就是3而不是2了[/quote] 好滴，谢谢

user: user-1
content: 引用 10 楼 zuoside__lord 的回复:[quote=引用 9 楼 hijack00 的回复:] [quote=引用 8 楼 zuoside__lord 的回复:] [quote=引用 5 楼 hijack00 的回复:] log运算相较于乘除法更慢，由于多个log相加等价先相乘再取一次log，在n不是很大的时候，可以先计算连乘积，再取一次log就是最终结果。 请问怎么写，，，，不好意思我不太会，，，，[/quote]  #include <stdio.h> #include <math.h> int main(int argc, const char * argv[]) {     int i,n;     double sum, mul;     while(scanf("%d",&n)!=EOF)     {         mul = 1.0;         for(i=2; i<=n; i++)         {             mul *= i;         }         sum = log10(mul);         printf("%f\n", sum);     }     return 0; } [/quote] 你的代码错了，输入5应该输出3，但是输出的是2[/quote]  我的代码只是给你提供一个思路，让你照着改的。 你原来的代码里面有个ceil函数，我把它去掉了。你加上这个就是3而不是2了

user: user-0
content: 引用 9 楼 hijack00 的回复:[quote=引用 8 楼 zuoside__lord 的回复:] [quote=引用 5 楼 hijack00 的回复:] log运算相较于乘除法更慢，由于多个log相加等价先相乘再取一次log，在n不是很大的时候，可以先计算连乘积，再取一次log就是最终结果。 请问怎么写，，，，不好意思我不太会，，，，[/quote]  #include <stdio.h> #include <math.h> int main(int argc, const char * argv[]) {     int i,n;     double sum, mul;     while(scanf("%d",&n)!=EOF)     {         mul = 1.0;         for(i=2; i<=n; i++)         {             mul *= i;         }         sum = log10(mul);         printf("%f\n", sum);     }     return 0; } [/quote] 你的代码错了，输入5应该输出3，但是输出的是2

user: user-1
content: 引用 8 楼 zuoside__lord 的回复:[quote=引用 5 楼 hijack00 的回复:] log运算相较于乘除法更慢，由于多个log相加等价先相乘再取一次log，在n不是很大的时候，可以先计算连乘积，再取一次log就是最终结果。 请问怎么写，，，，不好意思我不太会，，，，[/quote]  #include <stdio.h> #include <math.h> int main(int argc, const char * argv[]) {     int i,n;     double sum, mul;     while(scanf("%d",&n)!=EOF)     {         mul = 1.0;         for(i=2; i<=n; i++)         {             mul *= i;         }         sum = log10(mul);         printf("%f\n", sum);     }     return 0; }

user: user-0
content: 引用 5 楼 hijack00 的回复:log运算相较于乘除法更慢，由于多个log相加等价先相乘再取一次log，在n不是很大的时候，可以先计算连乘积，再取一次log就是最终结果。 请问怎么写，，，，不好意思我不太会，，，，

user: user-0
content: 引用 2 楼 FancyMouse 的回复:至少用stirling公式啊，一个个log算多慢。数据不强stirling直接能过的 不会，，，，这个是百度上找了好久，

user: user-1
content: log运算相较于乘除法更慢，由于多个log相加等价先相乘再取一次log，在n不是很大的时候，可以先计算连乘积，再取一次log就是最终结果。

user: user-0
content: 引用 3 楼 jianwen0529 的回复:输入数据改为读文本？  看起来你程序慢，是因为控制台输入和打印这块 请问怎么修改，别人让我存起来再一次性输出，我不太会

user: user-2
content: 输入数据改为读文本？  看起来你程序慢，是因为控制台输入和打印这块

user: user-0
content: 有大神可以教我改下么，我不太会修改，

user: user-3
content: 至少用stirling公式啊，一个个log算多慢。数据不强stirling直接能过的

user: user-4
content: 一般超时都是算法问题吧。
user-0 提问: 二进制位取反的问题

回复:
user: user-1
content: destination指针琐有分配内存就使用了

user: user-0
content: 用了destination=(char*)malloc(sizeof(char)*strlen(argv[1]));分配内存，还是不能运行。

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

user: user-0
content: #include <stdio.h> #include <string.h> #include <stdlib.h> char *destination; void reverse(const char * source); int main(int argc,char * argv[]) {     char * p; 	p=(char*)malloc(sizeof(char)*strlen(argv[1])); 	destination=p; 	reverse(argv[1]); 	printf("%s",p); 	free(p); 	return 0; } void reverse(const char * source) { 	strcpy(destination,source); 	while(*destination!='\0') 	{ 		if(*destination=='0') *destination='1'; 		else  		    *destination='0'; 		destination++; 	} 	return; }

user: user-3
content: if (argc > 1)         {             destination = new char[strlen(argv[1]) + 1];             reverse(argv[1]);             printf("%s", destination);             delete destination;         }

user: user-4
content: 参考2楼
user-0 提问: 求大神帮忙分析下这个递归 通俗易懂最好有图

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

user: user-2
content: 单步跟踪程序运行，观察程序运行流程，比别人给你讲要容易懂

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

回复:
user: user-1
content: 引用 12 楼 imhuay 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] FOR(i, 0, n) 以前没见过  这是一个宏啦  #define FOR(i,f_start,f_end) for(int i=(f_start);i<(f_end);++i)[/quote] 宏是语法糖。  语法糖越甜，编译调试查错越苦！ 把有限的生命浪费在品尝/品鉴无穷多种的语法糖中，我认为不值当。

user: user-0
content: 引用 3 楼 qq_36409192 的回复:只要你输入的格式没问题，并且代码也都是英文的，就可以这样进行输入  我贴一下代码，麻烦帮我看下哪里出问题了 n=3 (1,1)  (5,3)  (8,1)   void rd() { 	scanf("n=%d", &n); 	FOR(i, 0, n) 		scanf("(%d,%d)", &vs[i].first, &vs[i].second); }

user: user-2
content: 引用 8 楼 zhao4zhong1 的回复:FOR(i, 0, n) 以前没见过  伪代码看不懂么，赵老四

user: user-3
content: 只要你输入的格式没问题，并且代码也都是英文的，就可以这样进行输入

user: user-1
content: FOR(i, 0, n) 以前没见过

user: user-0
content: 引用 1 楼 user-4 的回复:不会啊检查你括号、逗号是否都是英文的  我试过好几遍了，也复制试过了，还是读不出啊

user: user-4
content: 不会啊检查你括号、逗号是否都是英文的

user: user-3
content: 引用 6 楼 imhuay的回复:[quote=引用 5 楼 qq_36409192 的回复:] [quote=引用 4 楼 imhuay 的回复:] [quote=引用 3 楼 qq_36409192 的回复:] 只要你输入的格式没问题，并且代码也都是英文的，就可以这样进行输入  我贴一下代码，麻烦帮我看下哪里出问题了 n=3 (1,1)  (5,3)  (8,1)   void rd() { 	scanf("n=%d", &n); 	FOR(i, 0, n) 		scanf("(%d,%d)", &vs[i].first, &vs[i].second); } [/quote] [/quote]  这样一行读确实没问题，但是但是像我给出的数据，要循环读的时候就读不进了[/quote] 循环的话，该怎么输入就怎么输入啊！你输入一次回车一次(前提是你代码没出错)

user: user-0
content: 引用 5 楼 qq_36409192 的回复:[quote=引用 4 楼 imhuay 的回复:] [quote=引用 3 楼 qq_36409192 的回复:] 只要你输入的格式没问题，并且代码也都是英文的，就可以这样进行输入  我贴一下代码，麻烦帮我看下哪里出问题了 n=3 (1,1)  (5,3)  (8,1)   void rd() { 	scanf("n=%d", &n); 	FOR(i, 0, n) 		scanf("(%d,%d)", &vs[i].first, &vs[i].second); } [/quote] [/quote]  这样一行读确实没问题，但是但是像我给出的数据，要循环读的时候就读不进了

user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:FOR(i, 0, n) 以前没见过  这是一个宏啦  #define FOR(i,f_start,f_end) for(int i=(f_start);i<(f_end);++i)

user: user-1
content: 伪代码终究不是代码。

user: user-3
content: 引用 9 楼 zhu339111520 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] FOR(i, 0, n) 以前没见过  伪代码看不懂么，赵老四[/quote] 赵老四比较专业

user: user-3
content: 引用 4 楼 imhuay 的回复:[quote=引用 3 楼 qq_36409192 的回复:] 只要你输入的格式没问题，并且代码也都是英文的，就可以这样进行输入  我贴一下代码，麻烦帮我看下哪里出问题了 n=3 (1,1)  (5,3)  (8,1)   void rd() { 	scanf("n=%d", &n); 	FOR(i, 0, n) 		scanf("(%d,%d)", &vs[i].first, &vs[i].second); } [/quote]
user-0 提问: 农夫过河问题 求教！

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

user: user-2
content: return(0!=location&0x08);  改成：  return(0!=(location&0x08));   同理后面的几处
user-0 提问: invalid use of array with unspecified bounds

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

user: user-2
content: 两维数组参数传递只能省去第一维数，因为如果全省去的话将无法确认其中是如何分配的

user: user-3
content: void print(int (*p)[],int i,int j)  改成：  void print(int (*p)[3],int i,int j)

user: user-4
content: void print(int (*p)[3],int i,int j)
user-0 提问: C语言模块化设计之菱形依赖问题

回复:
user: user-0
content: 引用 5 楼 JiLuoXingRen 的回复:钻石依赖在C++中使用虚基类来避免D重复的问题。因为B，C各自依赖D，产生D的两个副本，到A时D就会出现两份，会产生冲突，这是虚基类语法出现的原因。当B、C、D都不能修改时，就只能拓展语言来弥补了。  你是用C语言写的，你的”依赖“是怎么做的？A创建并保持B、C的指针；B、C各自创建并保持D的指针？ C语言中一般会是模块，每个模块有init函数，模块间有调用关系，初始化有顺序要求的

user: user-1
content: 钻石依赖在C++中使用虚基类来避免D重复的问题。因为B，C各自依赖D，产生D的两个副本，到A时D就会出现两份，会产生冲突，这是虚基类语法出现的原因。当B、C、D都不能修改时，就只能拓展语言来弥补了。  你是用C语言写的，你的”依赖“是怎么做的？A创建并保持B、C的指针；B、C各自创建并保持D的指针？

user: user-0
content: 引用 3 楼 maguiwa 的回复:D的初始化也可以放在A里。初始化后传给BC这是个好办法，谢了！

user: user-2
content: D的初始化也可以放在A里。初始化后传给BC

user: user-0
content: 谢了，C语言单例，有点难

user: user-3
content: 像这种需要init的模块最好看成单例对象 如果只是数据对象，最好还是不要这样设计，否则还得考虑线程安全问题
user-0 提问: 编译组建没问题 运行有问题

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  int main(void) {     FILE *fp = NULL;     int i,j;     float a[5][4] = {{0.0}}, ave = 0.0, b;      if((fp = fopen("E:\\自己编写代码\\第三次作业\\10_3_26\\grades.bin","w+")) == NULL)     {         printf("File failed!\n");         exit(0);     }     for(i = 0; i < 3; i++)     {         for(j = 0; j < 2; j++)         {             scanf("%f", &a[i][j]);             fprintf(fp, "%f\n", a[i][j]);    /*一个数据占一行,以利于后面正确读写,或者每次写一个数据后加一个空格或\t,这样写到文件里的数据都能够很好的分割*/         }     }     rewind(fp);     for(i = 0; i < 5; i++)     {         for(j = 0; j < 4; j++)         {             fscanf(fp,"%f\n",&b);    /*上面怎么写入的,这儿就以相同格式读出.*/             ave+=b;         }         ave/=4.0;         printf("第%d行的平均值：%.2f\n",i+1,ave);     }     fclose(fp);     return 0; }  有一个错误,就是判断文件打开判断,另外,你的程序写入文件的数据和读出的数据不一致.我使用回车符(也可以使用空格或\t)将输入的数据分割开,这样保证读出的也写入的一致.

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

user: user-3
content: if((fp = fopen("E:\\自己编写代码\\第三次作业\\10_3_26\\grades.bin","w+")) = NULL)  改成：  if((fp = fopen("E:\\自己编写代码\\第三次作业\\10_3_26\\grades.bin","w+")) == NULL)
user-0 提问: 请帮忙分析一下

回复:
user: user-1
content: for(i=0,j=0;i<6,j<6;i++,j++)  要写成：  for(i=0,j=0;i<6&&j<6;i++,j++)

user: user-2
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-2
content: 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-0
content: 还是不行啊，能解释一下为什么是int吗

user: user-2
content: int ch;
user-0 提问: 这是一道填空题，请问空缺怎么填？

回复:
user: user-1
content: void reverse( int * p_b , int * p_e ) { 	if ( p_b < p_e ) // p_b所指元素在p_e所指元素之前 	{ 		swap(*p_b, *p_e);//交换p_b与p_e所指向数据的值 		reverse(++p_b, --p_e) ;//对p_b所指元素之后，p_e所指元素之前的元素做同样处理 	} }

user: user-2
content: 引用 2 楼 zhao4zhong1 的回复:[quote=引用 1 楼 sdghchj 的回复:] *p_b ^= *p_e;  *p_e = *p_b ^ *p_e;  *p_b ^= *p_e; -- p_b, -- p_e 感觉咋那么象一串表情呢？(^_^)[/quote] 赵老师知道的。呃，第二行我打错了。 ++ p_b, -- p_e

user: user-3
content: 引用 1 楼 sdghchj 的回复:*p_b ^= *p_e;  *p_e = *p_b ^ *p_e;  *p_b ^= *p_e; -- p_b, -- p_e 感觉咋那么象一串表情呢？(^_^)

user: user-2
content: *p_b ^= *p_e;  *p_e = *p_b ^ *p_e;  *p_b ^= *p_e; -- p_b, -- p_e
user-0 提问: 第一次尝试编写一个小程序，结果出问题了，求指导。

回复:
user: user-1
content: 建议：必要时把各个小部分分割成函数

user: user-1
content: printf("已经%d天啦，厉害！", sum); 这句有可能显示了没有初始过的sum

user: user-1
content: if (yr = 0)//28天  改成：  if (yr == 0)//28天  同理改：else if (yr = 1)//29天  后面还有好几个地方都这种，我就不列了

user: user-2
content: #include <stdio.h>   int months_list[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  int is_leapyear(int year); int count_days(int year, int month, int days);  int main(int argc, const char *argv[]) {     int born_year, born_month, born_day;     int now_year, now_month, now_day;     int sum_days = 0, i;      printf("请注意：1.我相信您在公元元年后出生\n");     printf("2.我相信您不来自公元后10000年\n");     printf("3.请用‘/’隔开年月日\n");     printf("4.如果你在17世纪前出生，实际天数可能与历史不相符\n\n\n");      printf("Please enter the date you born：");     scanf("%d/%d/%d", &born_year,&born_month,&born_day);     printf("What's the date today:");     scanf("%d/%d/%d", &now_year, &now_month, &now_day);      if (now_year < born_year)         printf("Input error!");      /* Deal with the year. */     for (i = born_year; i < now_year; i++) {         if (is_leapyear(i)) {             sum_days += 366;         } else {             sum_days += 365;         }     }     //printf("born days = %d\n", count_days(born_year, born_month, born_day));     //printf("now days = %d\n", count_days(now_year, now_month, now_day));     sum_days += count_days(now_year, now_month, now_day);     sum_days -= count_days(born_year, born_month, born_day);      printf("已经%d天啦，厉害！\n", sum_days);     return 0; }  int count_days(int year, int month, int days) {     int total_days = 0, i;      for (i = 0; i < month-1; i++)         total_days += months_list[i];     if (is_leapyear(year) && month > 2)         total_days += 1;     total_days += days;      return total_days; }   int is_leapyear(int year) {     if ((year % 4 == 0 && year % 100 != 0)             || (year % 400 == 0))         return 1;     else         return 0; }  作为一个参考吧

user: user-2
content: 判断yr的地方都出现错误.

user: user-3
content: 你yr的比较有好多地方都少了一个等号 比如48行，if (yr = 0)应该是if (yr == 0) 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

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

回复:
user: user-1
content: 引用 2 楼 qq423399099 的回复:因为你输入字母的话，scanf读取失败，输入缓冲区里的字母并不会被读走，然后下一次循环的时候scanf又会尝试读取输入缓冲区里的数据，又失败。。。。 你fflush(stdin);清空输入缓冲区一下才行。  #include<stdio.h> int main(void) { 	float a; 	while (!scanf("%f", &a)) 	{ 		printf("\nIt is'n a number!"); 		printf("\nPlease enter a number ,such as 2.5,-1.78E8,or 3:"); 		fflush(stdin); 	} 	return 0; }  fflush(stdin)是未定义行为，参考

user: user-2
content: 仅供参考：#include <stdio.h> #include <string.h> char s[80]; double d; char c; int main() {     while (1) {         printf("Input a double:");fflush(stdout);         rewind(stdin);         fgets(s,80,stdin);         if (strlen(s)>20) {             printf("Input too long(>20)!\n");             continue;         }         if (2==sscanf(s,"%lf%c",&d,&c)) {             if ('\n'==c) {                 printf("%lg is a double.\n",d);                 break;             }         }         if ('\n'==s[strlen(s)-1]) s[strlen(s)-1]=0;         printf("\"%s\" is NOT a double!\n",s);     }     return 0; }

user: user-1
content: 引用 1 楼 ipqtjmqj 的回复:改成波浪号~ 更正，应该是用gets吃掉无效的字符串   #include<stdio.h> int main (void) {     float a; 	 char tmp[1024]; 	 while (!scanf("%f", &a))      {             printf("\nIt is'n a number!");          printf("\nPlease enter a number ,such as 2.5,-1.78E8,or 3:"); 			gets(tmp);     } 	       return 0; }

user: user-3
content: 因为你输入字母的话，scanf读取失败，输入缓冲区里的字母并不会被读走，然后下一次循环的时候scanf又会尝试读取输入缓冲区里的数据，又失败。。。。 你fflush(stdin);清空输入缓冲区一下才行。  #include<stdio.h> int main(void) { 	float a; 	while (!scanf("%f", &a)) 	{ 		printf("\nIt is'n a number!"); 		printf("\nPlease enter a number ,such as 2.5,-1.78E8,or 3:"); 		fflush(stdin); 	} 	return 0; }

user: user-1
content: 改成波浪号~
user-0 提问: printf("01 %d\n", "01"); 将一个字符串整型输出 输出内容的意义是啥,想不出来,查了半天资料也没见介绍 好奇~~~

回复:
user: user-1
content: 用十进制显示的这个字符串的地址

user: user-2
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-3
content: %d输出的是十进制的字符串的首地址 %p 是以16进制的形式输出内存地址 （楼主也顺便%p输出一下地址就明白了）

user: user-4
content: 对于32位程序，地址为32位4字节，输出的是"12"这个字符串的地址。 对于64位程序，地址为64位8字节，输出的是"12"这个字符串的地址的低32位

user: user-5
content: 输出的是地址
user-0 提问: 怎么给数据排序按大小分等级，并跟据输入等级数，输出相应等级的数值，，

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

user: user-0
content: 其实我想问的是几组从键盘输入的数组，排序，然后各组从高到底依次排序，在输入的各个数组后输入数字a，跟据这个数字输出第a大的数，我写不出来，数组溢出，程序停止运行，，了，能帮帮忙再写一下吗？

user: user-0
content: 谢谢你啦*^_^*

user: user-2
content: 随便写了个，你可以参考一下： #include <stdio.h> #include <string.h> #include <stdlib.h>   char *grade(int n,char a[]) { 	if(n > 80) 		strcpy(a,"you"); 	else if(n > 70) 		strcpy(a,"liang"); 	else if(n > 60) 		strcpy(a,"zhong"); 	else strcpy(a,"cha"); 	return a; }  int main () { 	char **a; 	int *b; 	int i,n; 	scanf("%d",&n); 	b=(int *)malloc(n*sizeof(int)); 	a=(char **)malloc(n*sizeof(char *)); 	for(i=0;i<n;i++) 		a[i]=(char *)malloc(10*sizeof(char)); 	 	for(i=0;i<n;i++) 	{ 		scanf("%d",&b[i]); 		a[i]=grade(b[i],a[i]); 	} 	for(i=0;i<n;i++) 	{ 		printf("第%d个成绩的等级：",i);  		printf("%s\n",a[i]); 	} 	return 0; }
user-0 提问: 问问题~我想对搜索  很多个结构体数组中的   其中的一个元素，显示元素所在结构体的索引号，求问怎么实现。

回复:
user: user-1

user: user-2
content: 参考：  struct Name {     const int Base_Class1;     const int  Sub_Class1;     const int  Interface1;     const char  *Meaning1; } mean[17]={     {0x00,0x00,0x00,"All currently implemented devices"},     {0x00,0x01,0x00,"VGA-compatible device"},     {0x01,0x01,0x80,"IDE controller"},     {0x01,0x80,0x00,"Other mass storage controller"},     {0x02,0x00,0x00,"Ethernet controller"},     {0x02,0x80,0x00,"Other network controller"},     {0x03,0x00,0x00,"VGA-compatible controller"},     {0x03,0x80,0x00,"Other display controller"},     {0x06,0x00,0x00,"Host bridge"},     {0x06,0x01,0x00,"ISA bridge"},     {0x06,0x04,0x00,"PCI-to-PCI bridge"},     {0x06,0x04,0x01,"Subtractive Decode PCI-to-PCI bridge"},     {0x06,0x07,0x00,"CardBus bridge"},     {0x0c,0x00,0x10,"IEEE 1394 OpenHCI"},     {0x0c,0x03,0x00,"USB Universal Host Controller"},     {0x0c,0x03,0x20,"Intel USB2 Enhanced Host Controller"},     {0x0c,0x05,0x00,"SMBus"}, }; int i; for (i=0;i<17;i++)     if (Base_Class == mean[i].Base_Class1      &&  Sub_Class == mean[i]. Sub_Class1      &&  Interface == mean[i]. Interface1) break; if (i<17) puts(mean[i].Meaning1); else printf("%s\t","Unknow Device");

user: user-3
content: 循环遍历结构体数组，循环中检查当前索引的结构体是否满足你的条件，如果满足则找到，可以将当前索引显示出来

user: user-4
content: 循环遍历，与你要找元素进行匹配，如果值是对的，输出结构体对应的索引号。
user-0 提问: 学生成绩管理系统

回复:
user: user-1
content: 帮你调试了下发现，你应该是count函数有问题 你打开文件失败了，fp = fopen("stud", "rb");这句，应该是stud.txt什么的吧？ PS：注意细节，你save函数里fp = fopen("achievement,txt", "wb");的achievement,txt应该是achievement.txt 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: void zhscore(int n)  /*计算每个学生的综合成绩*/ { 	int i,j,s,zxf,sum; 	for(i=0;i<n;i++) 	{ 		sum=0; 		for(j=0;j<4;j++) 			s=stu[i].score[j]*stu[i].CourseCredit[j]; 		zxf+=stu[i].CourseCredit[j]; 		sum+=s; 		stu[i].zhscore=sum/zxf; 	} }  你的这个函数，第一次执行zxf+=stu[i].CourseCredit[j]; 这句时，zxf还没有初始化就使用了

user: user-0
content: 初始化了咋还是这状况啊
user-0 提问: 变步长梯形积分算法求函数定积分C语言

回复:
user: user-0
content: 好的，谢谢，我先回去看看，谢谢指导！！

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

user: user-2
content: double jifen(double upper, double lower, double esp) {     int nloop = 1;     double area1 = 0, area2 = 0, step = upper - lower;     if (step<=0)     {         printf("Error,the upper must greater than lower\n");         return 0.0;     }      do     {         area1 = area2;         //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!         area2 = 0.0;         //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!         double x1 = lower, x2 = lower + step;         double y1 = hanshu(x1), y2 = hanshu(x2);         for (int i = 0; i < nloop; i++)         {             area2 += ((y1 + y2)*step / 2.0);             y1 = y2;             x2 += step;             y2 = hanshu(x2);         }         nloop *= 2, step /= 2;     }     while (fabs(area2 - area1) >= esp);     return area2; }

user: user-3
content: 1、在DEBUG下进行程序调试  2、你需要设置断点，然后程序断下之后才可以看到调试窗口
user-0 提问: C语言基础问题

回复:
user: user-1
content: scanf中, 第二个参数起, 都要求是指针类型,  所以对于基本数据类型的变量, 都需要加&符号, 才能得到其指针.  但数组是个特例,  对于 int arr[10]来说  arr本身,传入其它函数时, 就会退化为指针,   加一个&也是取这个arr变量的地址. 这个一个编译器的操作, 你不用知道为什么, 只要知道原理, 就是要得到地址就行了.

user: user-2
content: 字符串的输入可加可不加，scanf（“%p”,&n）; 你要获得的是地址

user: user-3
content: 数组名就代表着数组首元素的地址，在scanf中，要修改数组元素，要先取地址，所以直接用数组名即可；同理int也需要取地址，但int类型的变量名不是地址，所以需要用取地址符号“&”取得int变量的地址，再做修改。

user: user-4
content: 引用 5 楼 qq_37120945 的回复:char arr[10] = "hello"; scanf("%p", arr); scanf("%p", &arr); arr表示数组的首地址 &arr表示arr[0]的首地址 地址是同一个地址 但是第一个输入的arr 必须是个地址作为数组的首地址 第二个意思是给arr[0]赋值 第一次回复 我是这么理解的 不对的话还望交流反了 这里的arr 表示的是 指向arr[0]的指针 &arr 表示的是指向 arr的指针

user: user-0
content: 好久没看回复, 感谢各位

user: user-5

user: user-6
content: char arr[10] = "hello"; scanf("%p", arr); scanf("%p", &arr); arr表示数组的首地址 &arr表示arr[0]的首地址 地址是同一个地址 但是第一个输入的arr 必须是个地址作为数组的首地址 第二个意思是给arr[0]赋值 第一次回复 我是这么理解的 不对的话还望交流

user: user-7
content: arr和&arr代表的数值是一样的，但含义是不同的 参考：http://blog.csdn.net/draw5230/article/details/6699431

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

user: user-9
content: 引用char arr[10] = "hello"; scanf("%p", arr); scanf("%p", &arr); 而这里加或不加取地址符都可以?  因为数组名arr作为参数的时候会退化成指针，是数组首元素的地址 所以正确的写法应该是：scanf("%p", arr); scanf("%p", &arr);之所以可以，是因为数组的地址刚好与指向数组首元素的地址是相同的 但这两种指针的类型是不同的

user: user-9
content: 引用int i; scanf("%p", &i); 为这么这里必须加取地址符?  因为scanf需要的是要修改的地址
user-0 提问: 不知道错在哪

回复:
user: user-1
content: %d溢出,可以看一下int类型的取值范围,long,unsigned int等这些基础类型的取值范围

user: user-1
content: printf中的%d都换成%ld,或者将s,n都换成unsigned int类型,并且%u输出

user: user-2
content: main函数声明称  int main(int argc, char *argv[])  然后最后添加一个 return 0;  楼主好好整理一下代码格式， 大括号 单独占一行， 同一个逻辑块缩进要相同。   代码风格好点儿也会减少很多错误。

user: user-3
content: 所有的%d改成%ld（最后一个估计也还是溢出了）

user: user-4
content: main函数没有返回一个值，后面加上return 0;就可以了
user-0 提问: 一个C程序双链表通讯录，有些错误，改不出来，求大神指点迷津

回复:
user: user-0
content: 引用 1 楼 user-2的回复: 		while(p!=NULL) 		{    			if(!strcmp(p->name,n)) //比较输入名字与通讯录名字 			{                       //输入名字匹配 				flag=1; 				p->prior->next=p->next; 				p->next->prior=p->prior; 				free(p); 				printf("已被被删除\n"); 			} 			p=p->next; 			seat++; 		}   你代码的这一部分，如果你释放了p指向的空间后，紧接着又去访问p=p->next;导致出错 原来如此，知道了，谢谢指点

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

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

user: user-2
content: while(p!=NULL) 		{    			if(!strcmp(p->name,n)) //比较输入名字与通讯录名字 			{                       //输入名字匹配 				flag=1; 				p->prior->next=p->next; 				p->next->prior=p->prior; 				free(p); 				printf("已被被删除\n"); 			} 			p=p->next; 			seat++; 		}   你代码的这一部分，如果你释放了p指向的空间后，紧接着又去访问p=p->next;导致出错
user-0 提问: 在printf里做运算的问题

回复:
user: user-1
content: 如果对C语言运算符优先级和结合性不熟悉，完全可以通过括号来改变优先级，或者将*p++这样的语句拆分为两句。

user: user-2
content: 1.前++和后++的区别 2.运算符优先级

user: user-3
content: 代码应该写的简洁，而不是让人看不懂

user: user-4
content: 关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

user: user-5
content: 引用 1 楼 sarras32 的回复:相对的++p就是先++，为什么呢  这就是这前置++和后置++的不同之处，标准就这么规定的，没为什么

user: user-5
content: *p++是先输出*p，然后p再+1  *++p才是p先+1，再输出p

user: user-6
content: 如果是指针，根据指针的运算规则进行加减，也是一样的。

user: user-6
content: 自增自减问题最主要的就是看++和--的位置，如果是在你变量的前面，则表示你在执行这个语句之前进行自增自减，如果是在变量的后面，则表示在这个语句执行以后，再进行自增自减。  int p=1; printf("%d\n",++p);  //这里的值会是2，因为在输出前就进行了自增 printf("%d",p++);   //这里输出的值也是2，但是p的值在输出以后却自增为3了

user: user-0
content: 相对的++p就是先++，为什么呢
user-0 提问: 求大佬帮忙解决完善程序，本人新手，不知道怎么实现。

回复:
user: user-0
content: 引用 4 楼 qq_36409192 的回复:掉了个头文件：stdio.h 我知道了，谢谢大佬

user: user-1
content: 掉了个头文件：stdio.h

user: user-1
content: #include <string.h> #include <math.h> int main () { 	char a[32]; 	int len,sum=0,i=0; 	gets(a); 	len=strlen(a); 	 	for(int i=0;i<len;i++)   		if(a[i]-'0'!=0&&a[i]-'0'!=1) 			return 0;	 	 	i=0; 	for(int j=len-1;j>=0;j--,i++) 		sum+=(a[j]-'0')*pow(2,i); 	 	printf("%d",sum); 	return 0; }

user: user-0
content: 引用 1 楼 user-2 的回复: 	int t = 10; 	int n = 0; 	while (t) 	{ 		t >>= 1; 		++n; 	}   t为你的数 循环之后n为你要的位数 可是数值的每一位数我是直接赋值给数组的，不是int，我的目的就是可以输入任意位数的二进制数，转换为十进制数，求解决

user: user-2
content: int t = 10; 	int n = 0; 	while (t) 	{ 		t >>= 1; 		++n; 	}   t为你的数 循环之后n为你要的位数
user-0 提问: C语言指针，求教。

回复:
user: user-0
content: 引用 3 楼 qq_36409192的回复:#include <stdio.h> #include <string.h> #define N 100 char *substr(char a[],int m) { 	int n,i,j=0; 	n=strlen(a); 	for(i=m-1;i<n;i++) 	{ 		a[j]=a[i]; 		j++; 	} 	a[j]='\0'; 	return a; } int main () { 	char a[N],*b; 	int m; 	printf("请输入字符串："); 	scanf("%s",a); 	printf("请输入你的m：");  	scanf("%d",&m);  	b=substr(a,m); 	printf("%s",b); 	return 0; } 已经明白了，题意说复制为另一个字符串我理解错了，就在自定义函数里加了另一个没必要的新字符串，多谢！

user: user-1
content: #include <stdio.h> #include <string.h> #define N 100 char *substr(char a[],int m) { 	int n,i,j=0; 	n=strlen(a); 	for(i=m-1;i<n;i++) 	{ 		a[j]=a[i]; 		j++; 	} 	a[j]='\0'; 	return a; } int main () { 	char a[N],*b; 	int m; 	printf("请输入字符串："); 	scanf("%s",a); 	printf("请输入你的m：");  	scanf("%d",&m);  	b=substr(a,m); 	printf("%s",b); 	return 0; }

user: user-0
content: 引用 1 楼 user-2 的回复:不要返回局部变量的地址，你的char s[N];是一个局部变量，函数结束就销毁了 知道了，多谢，大概是题意不清晰，没理解。

user: user-2
content: 不要返回局部变量的地址，你的char s[N];是一个局部变量，函数结束就销毁了
user-0 提问: 如何输出字符串的I位呢

回复:
user: user-1
content: 引用 4 楼 sarras32的回复:[quote=引用 3 楼 qq_36409192 的回复:]  我改成二进制试了下。。打印没问题啊。。  改成二进制就可以了，10进制不行，为啥呢[/quote] 十进制也可以啊！一样的。。

user: user-0
content: 引用 3 楼 qq_36409192 的回复: 我改成二进制试了下。。打印没问题啊。。  改成二进制就可以了，10进制不行，为啥呢

user: user-1
content: 我改成二进制试了下。。打印没问题啊。。

user: user-0
content: 引用 1 楼 user-2 的回复:sum1[0],改为sum1[j]  改了打不出来，我写0主要是看0能不能打出，改成j也不行

user: user-2
content: sum1[0],改为sum1[j]
user-0 提问: c内嵌汇编不能使用fs寄存器

回复:
user: user-1

user: user-2
content: 引用 2 楼 biyaun 的回复:__asm{ 		push offset _except_handler 		push fs : [0] 		mov fs : [0], esp          }  代码在这  push    _except_handler

user: user-2
content: release与debug下都可以用，到是64位程序就不能这样

user: user-0
content: __asm{ 		push offset _except_handler 		push fs : [0] 		mov fs : [0], esp          }  代码在这

user: user-0
content: SEH异常需要用到fs寄存器，debug可以用，release不能用 有人知道吗
user-0 提问: 对于c语言数组的理解问题

回复:
user: user-1
content: 二维数组实际是一维数组的一维数组，所以二维数组时，a[0]表示的是内层的那个一维数组

user: user-2
content: 仅供参考：//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-3
content: 自己写个小程序练练就知道了，不巧我正好有一个，就给你玩玩吧。   #include <iostream>   int main() {     int **x ;   //创建一个指向指针x[row]的指针x     const int row = 5 ;     const int col = 10 ;          x = new int *[row] ;   //创建一个行指针，没错，在内存中连续分配的数组就是个指针     for(int j = 0 ; j < row ; j++)     {         x[j] = new int [col] ; //在第row行指针x[j]里再次创建col个int型变量     }     for(int i = 0 ; i < row ; i++)     {         for(int j = 0 ; j < col ; j++)         {             x[i][j] = i * j ;    //x是指针，x[i]也是指针，x[i][j]终于不是了，如果你创建三维数组，那么x,x[i],x[i][j]都是指针，x[i][j][k]才不是哦。             std::cout << "x[" << i << "][" << j << "]="<< x[i][j] << std::endl;         }     }     //std::cout << "address of x : " << x << std::endl ;      //std::cout << "value of x : " << *x << std::endl ;      for(int i = 0 ; i < row ; i++)     {         //std::cout << "address of x[" << i << "] = "<< x[i] << std::endl ;          std::cout << "value of x[" << i << "] = "<< *x[i] << std::endl ;          delete [] x[i] ;   //使用完了后记得要delete啊，不然就是内存泄漏。先delete 后创建的     }     delete [] x ;  //再delete先创建的。               }

user: user-2
content: http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组

user: user-4
content: 楼主多去了解下指针就明白了
user-0 提问: free问题求解

回复:
user: user-1
content: 没出错不代表你是对的，可能你程序之后将这片内存分配给其他变量，你就修改了不属于你的内存

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

user: user-0
content: 或者说，i在堆上，p在栈上，但是打印出来地址都是一样的。0x1004002d0 不太明白。

user: user-3
content: 引用 5 楼 u010637941 的回复:谢谢各位的回复，那请教一下，free(i)，这个时候p可以正常的，p,i不是指向同一个地址吗？操作系统这一块暂时还没有了解学习呢。 实际上malloc、free的过程与操作系统无关，这是C环境的逻辑，你的程序一开始，便会向操作系统申请一大块堆空间，之后对于小内存的malloc、free都是这一大块堆空间的操作。 你调用free释放，仅仅是对于C环境内存管理而言。实际上对于操作系统来说这块内存已经是你的了，你当然可以使用！ free仅仅只是C环境将此内存标记为可用，以便下次你再malloc，这块内存可以再次被用到。

user: user-0
content: 谢谢各位的回复，那请教一下，free(i)，这个时候p可以正常的，p,i不是指向同一个地址吗？操作系统这一块暂时还没有了解学习呢。

user: user-4
content: 当free一块内存后，free(即运行库)会将这块内存标记为未使用，并不会清零或者说不能继续访问。 你继续使用free后的内存是个未定义行为，一旦这块内存被别的变量使用就会出错
user-0 提问: 为什么转义字符里面需要存在十六进制和八进制

回复:
user: user-1
content: 发表下个人见解: 第一. 一般说的字符是指英文ASCII码字符 ASCII字符的本质是整数 例如:字符'A'在内存中存在的形式其对应的ASCII码的二进制的补码 第二 在大多数编程语言中,整数的表示方式有三种 1.十进制 2.八进制 3.十六进制

user: user-2
content: 举两个例子吧

user: user-3
content: 引用 1 楼 qq_35061930 的回复:思考了一下，我觉得其存在还是有必要的，因为在输出字符串中如果要添加响铃或者别的功能的话就需要用到转义字符 例如  printf（“HELLO\007”）时 括号内就一定要用转义字符 此时如果写数字的话就只能显示数字了  不知道我说的对不对

user: user-0
content: 思考了一下，我觉得其存在还是有必要的，因为在输出字符串中如果要添加响铃或者别的功能的话就需要用到转义字符 例如  printf（“HELLO\007”）时 括号内就一定要用转义字符 此时如果写数字的话就只能显示数字了  不知道我说的对不对
user-0 提问: C语言调用网页录入功能

回复:
user: user-1

user: user-2
content: 使用WebBrowser控件，可以操作网页中的元素、控件，调用网页的JS方法。 可以使用MFC集成WebBrowser。  QT中，有与WebBrowser类似的QWebEngineView控件。

user: user-3
content: 网页录入信息的本质是，你再填写了信息之后，浏览器根据你的输入，将数据通过HTTP的POST方式发送到服务器。你若是不想手动录入，便按照既定的格式，自己用程序构造HTTP的POST请求，然后将其发送到服务器即可。 这里我肯定只能给出思路，具体的实现如果楼主还不清楚的话，建议楼主自己去学习一下web的工作方式、HTTP相关知识。 清楚了HTTP之后，c的网络相关直接用socket。若嫌麻烦便找个HTTP客户端库吧，建议使用curl。

user: user-0
content: 引用 1楼yes-hyh 的回复:分析页面的输入字段，然后c++程序自己构造POST包，POST到服务器就可以了撒！能具体说一下吗

user: user-3
content: 分析页面的输入字段，然后c++程序自己构造POST包，POST到服务器就可以了撒！

user: user-4
content: 引用 3 楼 heyuhang112 的回复:网页录入信息的本质是，你再填写了信息之后，浏览器根据你的输入，将数据通过HTTP的POST方式发送到服务器。你若是不想手动录入，便按照既定的格式，自己用程序构造HTTP的POST请求，然后将其发送到服务器即可。 这里我肯定只能给出思路，具体的实现如果楼主还不清楚的话，建议楼主自己去学习一下web的工作方式、HTTP相关知识。 清楚了HTTP之后，c的网络相关直接用socket。若嫌麻烦便找个HTTP客户端库吧，建议使用curl。  楼上说得对。 但是，不够全面，你先下载个Wireshark学会分析包再说吧。最后要使用管道执行Curl命令。 事先要有心理准备，以前对网络解析包等没了解，那没个一周摸索学习是玩不来的。 我弄过。
user-0 提问: 统计数字出现的次数

回复:
user: user-1
content: while((c=getchar())!=EOF);  去掉后面的分号

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

user: user-3
content: #include<stdio.h>  #define  DIGIT_NUM  10  int main(int argc, const char *argv[]) {     int c, i = 0;     int quantity[DIGIT_NUM];      for(; i < DIGIT_NUM; i++)         quantity[i] = 0;      while((c = getchar()) != EOF)         if('0' <= c && c <= '9')             ++quantity[c-'0'];      for(i = 0; i < DIGIT_NUM; i++)         printf(" %d", quantity[i]);      putchar('\n');      return 0; }  建议你注意下代码风格

user: user-3
content: #include<stdio.h>  int main() {     int c, i=0;     int quantity[10];      for(; i < 10; i++)         quantity[i] = 0;      while((c=getchar())!=EOF)         if('0'<=c&&c<='9')             ++quantity[c-'0'];     for(i = 0; i < 10; i++)         printf(" %d", quantity[i]);     putchar(10);      return 0; }  多一个分号;对比一下找到多了哪个分号

user: user-4
content: 1、while后面有封号，int c为整形只能保存一个整数，所以无论输入多少次，只判断一次 2、getchar读取换行符赋给int c，所以if语句判断的一直是换行符，不符合条件，所以输出都是0
user-0 提问: 菜鸟求问，struct类型的初始化和传参

回复:
user: user-1
content: 用结构体数组

user: user-2
content: 引用 2 楼 erxiaoqing5536 的回复:传参的话是怎样？AAA* aaa[ ] ??  aaa[0].a = 1; aaa[0].b = 'a';  //..........

user: user-3
content: struct AAA { int a; char b; double c; };  void Foo(AAA* pAAAs, int count) { 。。。 }  void main() {    AAA *aaa = new AAA[10];   Foo(aaa, 10);    AAA aaa2[20];   Foo(aaa2, 20); }

user: user-0
content: 传参的话是怎样？AAA* aaa[ ] ??

user: user-2
content: 多个就：AAA *aaa = new AAA[10];
user-0 提问: 求助关于计算数字和

回复:
user: user-0
content: 引用 3 楼 qq423399099 的回复:试试itoa?  #include <stdio.h> #include <stdbool.h> #include <string.h> #include <stdlib.h> int main(void) { 	int i, sum = 0; 	char k[100]; 	char str[100] = ""; 	scanf("%s", k); 	for (i = 0; i<strlen(k); i++){ 		sum += (int)k[i] - '0'; 	} 	printf("%d", sum);  //计算数字和  	char sum2[32] = { 0 }; 	_itoa(sum, sum2, 10); 	printf("%s", sum2);    		return 0; }   itoa确实可以，但是为什么不能强制转换呢。。奇怪

user: user-0
content: 引用 4 楼 paschen 的回复:最后那里改成：   		char sum2 = sum + '0'; 		printf("%c",sum2);   这样打印是空的啊

user: user-1
content: 最后那里改成：   		char sum2 = sum + '0'; 		printf("%c",sum2);

user: user-2
content: 试试itoa?  #include <stdio.h> #include <stdbool.h> #include <string.h> #include <stdlib.h> int main(void) { 	int i, sum = 0; 	char k[100]; 	char str[100] = ""; 	scanf("%s", k); 	for (i = 0; i<strlen(k); i++){ 		sum += (int)k[i] - '0'; 	} 	printf("%d", sum);  //计算数字和  	char sum2[32] = { 0 }; 	_itoa(sum, sum2, 10); 	printf("%s", sum2);    		return 0; }

user: user-3
content: #include <stdio.h> #include <stdbool.h> #include <string.h>  #define MAX_STRING_LEN  64  int my_itoa(int num, char *str);  int main(void) {     int i, sum = 0;     char str[MAX_STRING_LEN];     char sum_str[MAX_STRING_LEN] = "";      printf("Please input a string of numbers: ");     scanf("%s", str);      for(i = 0; i < strlen(str); i++)         sum += str[i] - '0';      printf("sum num = %d\n", sum);  //计算数字和      my_itoa(sum, sum_str);     printf("sum string = %s\n", sum_str);      return 0; }   int my_itoa(int num, char *str) {     int i, j;      for (i = 0; num; i++) {         str[i] = num % 10 + '0';         num = num / 10;     }     str[i] = 0;      for (j = 0; j < i/2; j++) {         int tmp = str[j];         str[j] = str[i-j-1];         str[i-j-1] = tmp;     }      return 0; }     做一个求和的反操作

user: user-0
content: 有人吗。。。求回答
user-0 提问: 为什么函数的地址不会变？

回复:
user: user-1
content: 引用 6 楼 zkr33928 的回复:[quote=引用 4 楼 paschen 的回复:] [quote=引用 2 楼 zkr33928 的回复:] [quote=引用 1 楼 akirya 的回复:] 这个本来就是是不确定事情。 试了很多遍，都只改变前四位，虽然地址不确定，但是这个改变的规律应该确定吧？[/quote]  因为函数与函数之间也会进行对齐[/quote] 不明白，这个对齐是什么意思[/quote]  网上搜索“内存对齐”

user: user-1
content: 引用 5 楼 zkr33928 的回复:[quote=引用 3 楼 ipqtjmqj 的回复:] 空行编译时就忽略掉了，操作系统不变，编译器不变，编译配置不变，结果就不变 后4位地址没变，你还是一个函数，编译配置相同，当然地址不变了。  你输出的地址是操作系统分配的虚拟地址，并不是物理地址。 一个程序的地址空间分为几个段，text段放函数，data段放全局变量,bss段是未初始化的全局变量  不仅是空行！定义100个变量他也不会变。[/quote]  变量是定义在栈上，而不是代码区，不会影响到函数的地址

user: user-2
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构

user: user-3
content: 一年管理成富翁，三年市场路路通，十年技术一场空。 ======================================== 孟子曰：劳心者治人，劳力者治于人。

user: user-4
content: 因为爱情  管他为啥呢，windows封装这么多层，一层套一层的，为的就是让我们摆脱这种乱七八糟没意义的探索，用得着的都会在编译器窗口里显示出来。  如果实在是闲的难受想研究下，通读下《数字逻辑》->《计算机组成原理》->《操作系统》->《编译原理》,  读完之后顺便怀疑下人生，然后大彻大悟发现自己不适合干程序员，从此转行卖烧饼，年入百万，赢取白富美，走向人生巅峰。  正印了那句老话：一年管理成富翁，三年市场路路通，十年技术一场空。

user: user-0
content: 引用 4 楼 paschen 的回复:[quote=引用 2 楼 zkr33928 的回复:] [quote=引用 1 楼 akirya 的回复:] 这个本来就是是不确定事情。 试了很多遍，都只改变前四位，虽然地址不确定，但是这个改变的规律应该确定吧？[/quote]  因为函数与函数之间也会进行对齐[/quote] 不明白，这个对齐是什么意思

user: user-0
content: 引用 3 楼 ipqtjmqj 的回复:空行编译时就忽略掉了，操作系统不变，编译器不变，编译配置不变，结果就不变 后4位地址没变，你还是一个函数，编译配置相同，当然地址不变了。  你输出的地址是操作系统分配的虚拟地址，并不是物理地址。 一个程序的地址空间分为几个段，text段放函数，data段放全局变量,bss段是未初始化的全局变量  不仅是空行！定义100个变量他也不会变。

user: user-1
content: 引用 2 楼 zkr33928 的回复:[quote=引用 1 楼 akirya 的回复:] 这个本来就是是不确定事情。 试了很多遍，都只改变前四位，虽然地址不确定，但是这个改变的规律应该确定吧？[/quote]  因为函数与函数之间也会进行对齐

user: user-5
content: 空行编译时就忽略掉了，操作系统不变，编译器不变，编译配置不变，结果就不变 后4位地址没变，你还是一个函数，编译配置相同，当然地址不变了。  你输出的地址是操作系统分配的虚拟地址，并不是物理地址。 一个程序的地址空间分为几个段，text段放函数，data段放全局变量,bss段是未初始化的全局变量

user: user-0
content: 引用 1 楼 akirya 的回复:这个本来就是是不确定事情。 试了很多遍，都只改变前四位，虽然地址不确定，但是这个改变的规律应该确定吧？

user: user-6
content: 这个本来就是是不确定事情。
user-0 提问: 小白，求解！

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

user: user-2
content: #include<stdio.h>  #define MAX_LEN     8 int main (void) {     double n[MAX_LEN];     double h[MAX_LEN];     int i;      printf("Enter eight number(double):");     for( i = 0; i < MAX_LEN; i++)         scanf("%lf", &n[i]);      h[0] = n[0];     for(i = 0; i < MAX_LEN-1; i++)         h[i+1] = h[i] + n[i+1];      for(i = 0; i < MAX_LEN; i++)         printf("%5.2lf %5.2lf\n", n[i], h[i]);     return 0; }

user: user-3
content: 因为你的代码：h[0]=n[0];  你自己让h[0]的值等于n[0]  后面的循环 h[q+1]=h[q]+n[q+1]; 是从h[1] ~ h[8]的赋值，而且越界了
user-0 提问: 命令行 文件压缩程序问题

回复:
user: user-1
content: 引用 12 楼 bigwatercar 的回复:老赵的回答很正确。

user: user-2
content: 老赵的回答很正确。

user: user-1
content: 现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！

user: user-0
content: 谢谢你啊 代码我看的懂啊，只是书上就只是简单的写道“ 命令如下：reducto eddy”    我不知道在哪里去输入这个命令。。。谢谢你了 我按你的方法去试一下

user: user-3
content: 引用 2 楼 njxs1357 的回复:书上的代码啊  应该没错吧。。看了几遍 那也是抄的，而且你没懂。  Windows命令行使用方法：在你的工程目录中，找到你编译的可执行(exe)程序所在目录, 然后按住shift鼠标右击，选择“在此处打开命令行”， 然后敲你的程序名字(按tab可自动补全), 再敲空格，再是参数，如有更多参数则都是空格分隔。 然后回车参数传入程序，程序启动

user: user-0
content: 还是不懂呀，有没有人能帮帮我

user: user-1
content: VC6：  工程、设置、Debug、U程序变量：填写命令行参数。 VS20XX：  项目、属性、配置属性、调试、命令参数：填写命令行参数。

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

user: user-0
content: 书上的代码啊  应该没错吧。。看了几遍

user: user-3
content: 你代码网上抄来的吧。 从命令行与从stdin你搞混了

user: user-4
content: 没看出是文件压缩程序，就是简单的读写。 如果是要实现压缩文件功能，可以直接调用Windows 自带 WinRAR ！

user: user-1
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……

user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！呀呀 老师我不是码农啊   我只是一个初学者，学基础呀
user-0 提问: 求把下面的代码转换成用指针完成

回复:
user: user-1
content: A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价

user: user-2
content: #include<stdio.h>  #define     MAX_NUM  10 #define USE_POINTER static void print_num(int *num, int len); void get_max_min_num(int *num, int len);  int main() {     int num[MAX_NUM]={2,1,5,4,8,7,9,7,2,6};  #ifndef USE_POINTER     int i,max=0,min=0,m,n;      m=num[9];     n=num[0];     for(i=0;i<MAX_NUM;i++)     {         if(num[i]>num[max])         {             max=i;             num[9]=num[max];             continue;         }         else if(num[i]<num[min])         {             min=i;             num[0]=num[min];             continue;         }     }     num[max]=m;     num[min]=n;     for(i=0;i<MAX_NUM;i++)         printf("%d ",num[i]);     putchar('\n'); #else     get_max_min_num(num, MAX_NUM);     print_num(num, MAX_NUM); #endif     return 0; }  static void print_num(int *num, int len) {     int i;      for(i = 0; i < len; i++)         printf("%d ", num[i]);      putchar('\n'); }  void get_max_min_num(int *num, int len) {     int m, n, i;     int max = 0, min = 0;      m = num[len-1];     n = num[0];     for(i = 0; i < len; i++)     {         if(num[i] > num[max])         {             max = i;             num[len-1] = num[max];             continue;         }         else if(num[i] < num[min])         {             min = i;             num[0] = num[min];             continue;         }     }     num[max] = m;     num[min] = n; }  在得到最大和最小值的处理中,代码有点"硬",我做了修改,就是把9改成了len-1

user: user-3
content: 用一个指针指向数组？

user: user-4
content: 楼主可以看看这个 http://blog.csdn.net/peiyao456/article/details/51291785?locationNum=3&fps=1

user: user-5
content: arr[i] 等价于 *(arr+i)
user-0 提问: 求助：帮忙看看老师所要求的这道重要节点组的挖掘该怎么做

回复:
user: user-1
content: 百度搜相关关键字。

user: user-0
content: 卧槽，这都被你发现了

user: user-2
content: 哥们，电子科大英才陈端兵老师的吧~hhhhhhhh同病相怜啊哈哈哈哈哈哈哈哈哈哈哈哈哈
user-0 提问: C语言point跟Bool问题

回复:
user: user-1
content: uint32_t battery;    //无符号? Bool read_battery(int *data); //有符号 ret = read_battery(&info.battery);   // 有无符号匹配么？？  另外，常用C++。 在c中，ret是保留关键字么？

user: user-2
content: 需要传递一个参数,不然编译器回报错或者警告吧,尤其是在这个函数里使用到这个参数,那么就不会得到想要的结果.还是传一个实参进去吧

user: user-0
content: 是整数: Bool read_battery(int *data){...}  另外请教, int main() {     int BattValue;     BattValue = read_adc();     } read_adc后面似乎要带一个参数吧? 才能够将Bool read_battery(int *data){...}内的资料带回main

user: user-0
content: struct system_info {   uint8_t   mcu[12];   uint32_t battery;   uint8_t   firmware_version[12]; }  int main() {    struct system_info info;    bool                        ret;   //error      ret = read_battery(&info.battery);   //error      if (ret == false)         return error message; }  Bool read_battery(int *data){      ADC_Handle    adc;      ADC_Params  params;     bool	              ret;      ADC_Params_init(¶ms);     adc = ADC_open(Board_ADC0, ¶ms);       if ( adc == NULL )       return FALSE;         ret = read_adc(adc,0,data,sizeof(uint32_t));       ADC_close(adc);      return ret; }

user: user-0
content: 我就是不知道要传递啥数据型态才PO上去求救  int main(){    int	      BattValue;    int       battery;    BattValue = read_battery(&battery);  }  Bool read_battery(int *data){ 	ADC_Handle  adc; 	ADC_Params  params; 	bool		ret;  	ADC_Params_init(¶ms); 	adc = ADC_open(Board_ADC0, ¶ms);    	if ( adc == NULL ) 			return FALSE; 	ret = read_adc(adc,0,data,sizeof(uint32_t)); 	ADC_close(adc); 	return ret; }  这样也出错

user: user-3
content: int read_adc(*data)  没有指定参数类型

user: user-0
content: 1.我也知道没调用参数 2.写错了,应该是:    int read_battery(int *data){...} 3. Bool read_adc(void *handle, uint8_t address, void *data, size_t size) { 	uint16_t value;  	if (ADC_convert((ADC_Handle)handle, &value)  == ADC_STATUS_SUCCESS) { 		*(uint32_t *)data = ADC_convertRawToMicroVolts((ADC_Handle)handle, value); 		return TRUE; 	} else { 		return FALSE; 	} }

user: user-4
content: 在main函数中调用read_abc时没有写参数，下面出现四个参数同一楼一样看不懂

user: user-5
content: 看不懂你这个read_adc函数 1.main函数里调用是不传参数的，BattValue = read_adc();  2.函数实现的时候是有一个参数的，类型也没有写而且，int read_adc(*data) 3.这次调用，又是4个参数的？？？battery = read_adc(adc, 0, µVolts, sizeof(int));
user-0 提问: C题求解

回复:
user: user-1
content: 引用 9 楼 qq_24138885 的回复:[quote=引用 8 楼 qq_24138885 的回复:]  #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h>  void del_char(char a[], char); int main() { 	char s[20] = {0}; 	char ch = 'a'; 	scanf("%s", s); 	getchar(); 	scanf("%c", &ch);  	printf("原始字符串为：%s \n", s); 	printf("要截取的字符串为：%c \n", ch); 	printf("截取后字符串为："); 	del_char(s, ch); 	return 0; } void del_char(char s[], char ch) { 	unsigned int i, n; 	n = strlen(s); 	char tmp[30] = {0};  	for (i = 0; i < n; i++) 	{ 		if (s[i] != '\0')  		{ 			if (ch != s[i]) 			{ 				strncpy(&tmp[i],&s[i],1); 				printf("%c", tmp[i]); 			} 		} 	} 	printf("\n"); }  第8行改为 char ch = {0}；[/quote] 是第九行

user: user-1
content: 引用 8 楼 qq_24138885 的回复: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h>  void del_char(char a[], char); int main() { 	char s[20] = {0}; 	char ch = 'a'; 	scanf("%s", s); 	getchar(); 	scanf("%c", &ch);  	printf("原始字符串为：%s \n", s); 	printf("要截取的字符串为：%c \n", ch); 	printf("截取后字符串为："); 	del_char(s, ch); 	return 0; } void del_char(char s[], char ch) { 	unsigned int i, n; 	n = strlen(s); 	char tmp[30] = {0};  	for (i = 0; i < n; i++) 	{ 		if (s[i] != '\0')  		{ 			if (ch != s[i]) 			{ 				strncpy(&tmp[i],&s[i],1); 				printf("%c", tmp[i]); 			} 		} 	} 	printf("\n"); }  第8行改为 char ch = {0}；

user: user-1
content: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h>  void del_char(char a[], char); int main() { 	char s[20] = {0}; 	char ch = 'a'; 	scanf("%s", s); 	getchar(); 	scanf("%c", &ch);  	printf("原始字符串为：%s \n", s); 	printf("要截取的字符串为：%c \n", ch); 	printf("截取后字符串为："); 	del_char(s, ch); 	return 0; } void del_char(char s[], char ch) { 	unsigned int i, n; 	n = strlen(s); 	char tmp[30] = {0};  	for (i = 0; i < n; i++) 	{ 		if (s[i] != '\0')  		{ 			if (ch != s[i]) 			{ 				strncpy(&tmp[i],&s[i],1); 				printf("%c", tmp[i]); 			} 		} 	} 	printf("\n"); }

user: user-2
content: 学生党  挺多的   我们老师要求我们  进csdn  期末检查论坛积分

user: user-3
content: strlen()返回的字符串长度和字符数组的下标是不一样的。

user: user-4
content: 1.你的for (j = i; j<n; j++)s[j] = s[j + 1];这个会越界，如果j等于n-1的时候，s[j+1]会越界 2.出于效率考虑，你其实不需要每次都从i前移到n（前移到'\0'的位置就行了）

user: user-5
content: 改成j<n-1就对了

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

user: user-7
content: void del_char(char a[],char) 声明后少了分号   s[20] 设置大一点，否则字符串长度只有20字符

user: user-8
content: 当j=n-1的时候，那么请问你的j+1又是多少呢？？
user-0 提问: 在C语言中

回复:
user: user-1
content: 根据2楼所述，没有rw

user: user-2
content: 打开文件的方式，rw表示读写方式打开

user: user-3
content: ANSI C规定文件打开用函数fopen，关闭为fclose。  1、调用方式通常为:  FILE *fp; fp=fopen(文件名, 打开方式);   2、参数说明: 文件名: 形如"myfile.dat"、"F:\data\myfile.dat"等等; 打开方式: 　　"r"(只读) 为输入打开一个文本文件 　　"w"(只写) 为输出打开一个文本文件 　　"a"(追加) 向文件文件尾添加数据 　　"rb"(只读) 为输入打开一个二进制文件 　　"wb"(只写) 为输出打开一个二进制文件 　　"r+"(读写) 为读写打开一个文本文件 　　"w+"(读写) 为读写建立一个新的文本文件 　　"a+"(读写) 为读写打开一个文本文件 　　"rb+"(读写) 为读写打开一个二进制文件 　　"wb+"(读写) 为读写建立一个新的二进制文件 　　"ab+"(读写) 为读写打开一个二进制文件   3、注意: 　　(1)用"r"方式打开的文件，不能向其输入数据，并且该文件已存在，否则出错； 　　(2)用"w"方式打开的文件，只能向该文件输入数据，如果所打开的文件不存在，则在打开时新建一个以指定的名字命名的文件；如果指定文件存在,则在打开时将该文件删去，然后新建一个新的文件； 　　(3)如果函数fopen打开文件出错，则fopen返回一个空指针值NULL； 　　(4)在程序开始运行时，系统自动打开3个标准文件:标准输入(stdin)，标准输出(stdout)，标准出错输 出(stderr)。如果要使用输入输出终端，则不需要打开，可以直接使用，如fputc(stdout,'a');向屏幕输出字符a。

user: user-4
content: 文件打开模式  参看：http://en.cppreference.com/w/c/io/fopen 中 mode 参数
user-0 提问: 关于C语言文件处理的问题，小白求指点。。急！

回复:
user: user-0
content: 引用 6 楼 paschen 的回复:[quote=引用 5 楼 qingfeng__ 的回复:] [quote=引用 1 楼 paschen 的回复:] 你要在42+3= 输入45之前，要将后面的内容向后移动两个字符大小，然后再插入，否则会覆盖了之前的内容  也可按行读取，然后依次计算，把所有计算结果重新找成一个字符串，然后一次性写入那请问如何向后移动字符再插入呢？是重新把所有数据读取出来然后重新写一遍吗？[/quote]  比较好的办法就用我上面说的第二种，直接重新构造整个字符串，然后再一次性写入空文件  或者可以考虑使用文件内存映射，这样可以直接用指针的方式读写文件中的内容[/quote]谢谢大神，文件内存映射我没学过，我试试你的第一种方法吧。

user: user-1
content: 引用 5 楼 qingfeng__ 的回复:[quote=引用 1 楼 paschen 的回复:] 你要在42+3= 输入45之前，要将后面的内容向后移动两个字符大小，然后再插入，否则会覆盖了之前的内容  也可按行读取，然后依次计算，把所有计算结果重新找成一个字符串，然后一次性写入那请问如何向后移动字符再插入呢？是重新把所有数据读取出来然后重新写一遍吗？[/quote]  比较好的办法就用我上面说的第二种，直接重新构造整个字符串，然后再一次性写入空文件  或者可以考虑使用文件内存映射，这样可以直接用指针的方式读写文件中的内容

user: user-0
content: 引用 1 楼 paschen 的回复:你要在42+3= 输入45之前，要将后面的内容向后移动两个字符大小，然后再插入，否则会覆盖了之前的内容  也可按行读取，然后依次计算，把所有计算结果重新找成一个字符串，然后一次性写入那请问如何向后移动字符再插入呢？是重新把所有数据读取出来然后重新写一遍吗？

user: user-0
content: 那请问如何向后移动字符再插入呢？是重新把所有数据读取出来然后重新写一遍吗？  （不好意思，我不知道怎么直接回复楼层，想问问二楼的兄弟的）

user: user-2
content: 因为文件系统中每个字节的组织不是链表，而是数组那样的连续存储，所以如果在中间插入的话，需要后面的字符全部依次往后挪一个位置，成本太高了，所以不提供插入的方法。

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

user: user-1
content: 你要在42+3= 输入45之前，要将后面的内容向后移动两个字符大小，然后再插入，否则会覆盖了之前的内容  也可按行读取，然后依次计算，把所有计算结果重新找成一个字符串，然后一次性写入
user-0 提问: 字符拼接的问题

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

user: user-2
content: VS下，没出现你所说的问题 你把  char reminders[MAX_REMIND][MSG_LEN+3]; 等初始化下看看

user: user-3
content: 建议在必要的地方设置断点，然后单步跟踪程序运行，观察程序每一步执行结果与你期望的结果是否一致，很容易找到原因
user-0 提问: 嵌入式linux 反汇编 objdump求教

回复:
user: user-1
content: 26d040:	0a000030 	beq	26d108 <static_ext_paint+0x178> 26d040 指令所在的地址 0a000030 指令的内容 beq	26d108  指令对应的汇编 ： 跳转到26d108处运行 <static_ext_paint+0x178> 对26d108  的解析，即26d108  是static_ext_paint函数便宜0X178的地方  26d044:	e51b0024 	ldr	r0, [fp, #-36]	; 0x24 不知道后面的0X24是啥 前面的指令应该是讲fp-36地址处取一个字（4字节）存到r0寄存器中
user-0 提问: 求助，大神看下我这哪里错了.

回复:
user: user-1
content: 呃，我吐糟的是一些书籍。 c++贴吧的：http://tieba.baidu.com/p/4900195154 另外，有一本铁道出版社出版的 c++STL.....开发指南。。。一个博士后写的。那代码风格也是。。。。

user: user-2
content: 骚年,拿去看看,规范一下格式. http://download.csdn.net/download/u011137631/9706539

user: user-3
content: 代码风格怎么样就不吐槽了，你扔个图片上来，就算有人闲的没事想拿你的代码去运行一下都不方便 就不能使用论坛代码功能吗？

user: user-4
content: 引用 2 楼 weixin_36921802 的回复:引用 1楼paschen 的回复:自己单步调试吧，代码写成这种风格没救了我第一次写这种东西.确实写的烂.老哥帮我看下qsort能这样用吗 引用 5 楼 GKatHere 的回复:引用 1 楼 paschen 的回复:自己单步调试吧，代码写成这种风格没救了 呵呵，2013年以前出版的国内教材，有这样的风格的。  我说的不是你代码烂不烂的问题，是你写代码的习惯........

user: user-1
content: 引用 1 楼 paschen 的回复:自己单步调试吧，代码写成这种风格没救了 呵呵，2013年以前出版的国内教材，有这样的风格的。

user: user-5
content: hash函数中，判断小于不能使用那样使用的，要分开。'a' <= *s;  *s <= 'z';  使用'a' <=  *s <= 'z'的话，前一个<= 符号返回bool值了，后面的判断没用用了。 'a' <= *s返回true或者false

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

user: user-0
content: 引用 1楼paschen 的回复:自己单步调试吧，代码写成这种风格没救了我第一次写这种东西.确实写的烂.老哥帮我看下qsort能这样用吗

user: user-4
content: 自己单步调试吧，代码写成这种风格没救了
user-0 提问: openssl  AES-CBC 加密解密问题 IV 如何保存下来。

回复:
user: user-1
content: 必须保存iv，否则解不出来了。

user: user-2
content: 保存在大脑中以免被黑。

user: user-0
content: 是不是 可以设置固定的 iv呢？
user-0 提问: printf（） 接受中间带有空格的字符串时，字符串从空格处被折断

回复:
user: user-1
content: 用gets和puts试试？

user: user-2
content: 这样改就可以一直到回来：  	char s1[10]; 	char s2[10]; 	printf(" \n请输入s1： "); 	scanf("%[^\n]", s1); 	getchar(); 	printf(" \n请输入s2： "); 	scanf("%[^\n]", s2);  	printf("\n%s%s%s", "---", s1, "---"); 	printf("\n%s%s%s", "---", s2, "---"); 	printf("\n");  	system("pause");

user: user-3
content: printf(" \n请输入s1： ");         scanf("%9[^\n]",s1);

user: user-3
content: printf(" \n请输入s1： ");         scanf("%9[^\n]",&s1);