Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 可变函数使用问题

回复:
user: user-0
content: 引用 2 楼 ychongx 的回复:[quote=引用 1 楼 user-1 的回复:] %f需要一个double，但是*argptr并不是double              t = va_arg(argptr, double);             printf("argptr = %p, *argptr = %10.9f\n", argptr, t);  这样试试？ 想直观的看0.5, 0.25, 0.125, 0.06254在栈中的分布， va_start(argptr, num)执行后argptr指针指向0.5， va_arg(argptr, double)执行的话，先在&0.5地址处按8字节(double)取0.5给t,然后argptr+1即&0.5地址 0xbfa0ef64+0x8，这样解释对不              printf("argptr = %p, *argptr = %10.9f\n", argptr, (double *)argptr);//这里将argptr强制转换为  double指针             t = va_arg(argptr, double); 运行结果还是如此：  root@book-desktop:/work/video_example# cc doublesum.c  doublesum.c: In function ‘sum_series’: doublesum.c:12: warning: format ‘%10.9f’ expects type ‘double’, but argument 3 has type ‘double *’ root@book-desktop:/work/video_example# ./a.out  argptr = 0xbfef7ac4, *argptr = 0.000000000 argptr = 0xbfef7acc, *argptr = 0.000000000 argptr = 0xbfef7ad4, *argptr = 0.000000000 argptr = 0xbfef7adc, *argptr = 0.000000000 sum of series is 0.937540   [/quote]  可以改为：                         printf("argptr = %p, *argptr = %10.9f\n", argptr, *((double *)argptr));                         t = va_arg(argptr, double); 这样就对了

user: user-1
content: printf("argptr = %p, *argptr = %10.9f\n", argptr, *((double *)argptr));

user: user-0
content: 引用 1 楼 user-1 的回复:%f需要一个double，但是*argptr并不是double              t = va_arg(argptr, double);             printf("argptr = %p, *argptr = %10.9f\n", argptr, t);  这样试试？ 想直观的看0.5, 0.25, 0.125, 0.06254在栈中的分布， va_start(argptr, num)执行后argptr指针指向0.5， va_arg(argptr, double)执行的话，先在&0.5地址处按8字节(double)取0.5给t,然后argptr+1即&0.5地址 0xbfa0ef64+0x8，这样解释对不              printf("argptr = %p, *argptr = %10.9f\n", argptr, (double *)argptr);//这里将argptr强制转换为  double指针             t = va_arg(argptr, double); 运行结果还是如此：  root@book-desktop:/work/video_example# cc doublesum.c  doublesum.c: In function ‘sum_series’: doublesum.c:12: warning: format ‘%10.9f’ expects type ‘double’, but argument 3 has type ‘double *’ root@book-desktop:/work/video_example# ./a.out  argptr = 0xbfef7ac4, *argptr = 0.000000000 argptr = 0xbfef7acc, *argptr = 0.000000000 argptr = 0xbfef7ad4, *argptr = 0.000000000 argptr = 0xbfef7adc, *argptr = 0.000000000 sum of series is 0.937540

user: user-1
content: %f需要一个double，但是*argptr并不是double              t = va_arg(argptr, double);             printf("argptr = %p, *argptr = %10.9f\n", argptr, t);  这样试试？
user-0 提问: 《C和指针》里面的虚线和实线代表的是什么意思？

回复:
user: user-1
content: 感觉楼主问的很高深的样子， 但是不管虚实， 箭头不都是指向表达式的结果么？ 不同的是，虚线是直接访问。 虚线是通过 * 取地址的值 节间访问。  不过感谢楼主，第一次这么样子认识左值和右值。

user: user-2
content: 你一个人说没用就真没用了？

user: user-0
content: 可以归纳一下这些回复么？  1） 坚决反对一切与本人有别的观点。 2） 每个问题都有的万能又没用的标准答案。  特别强调一下，这位老师，，，，，，，，，，，，

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

user: user-3
content: 直接访问与间接访问，地址与值，左值与右值，

user: user-3
content: 这是谁写的书？或者是翻译的？不就是讲一个左值与右值吗？讲半天，举的例子还不如没有好。

user: user-1
content: 帮顶 请 @supermegaboy

user: user-4

user: user-0
content: 楼主都快疯了，跟疯子说话还说不过！

user: user-2
content: 对笃信“使用画示意图的方法对理解指针最有帮助”的人，请试试画这个代码对应的示意图。 十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495 如果画完了，还继续笃信的话，请试试画三维分割和碰撞检测时使用的八叉树数据结构对应的示意图。 如果画完了，还继续笃信的话，请试试画人的大脑神经元突触连接示意图。

user: user-0
content: 引用 10 楼 zhao4zhong1 的回复:理解和讨论之前请先学会如何观察！  你赢了，你是觉得我没事屁颠屁颠下载该书的PDF，截图，贴图上来问你这样的大神的啊？！

user: user-0
content: 引用 7 楼 TheNewIpad 的回复:感觉楼主问的很高深的样子， 但是不管虚实， 箭头不都是指向表达式的结果么？ 不同的是，虚线是直接访问。 虚线是通过 * 取地址的值 节间访问。  不过感谢楼主，第一次这么样子认识左值和右值。  谢谢！你说的有道理。 其实本书后面还有几个例子的，我没全部贴上来，也不方便。 经你这么一说，我是发现&ch，cp一类的都是虚线的，带*指向最终结果的都是实线的，我自己再去消化理解一下，谢谢！

user: user-2
content: 理解和讨论之前请先学会如何观察！

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:你一个人说没用就真没用了？  好吧，我说错了，很有用，到哪都很有用。 那么，请问你解答了我哪些疑惑？  好像我问老师一个英语单词什么含义怎么个用法，你老回答我英语应该怎么怎么学就能学好英语，还每节课每个问题都这样跟同学说，你不说一下大家还不知道你是个老师的样子……

user: user-2
content: 这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！
user-0 提问: 我想让程序实现通过产生0到1的随机数，从而有比阈值0.026。（就是那个s）小的随机数，使得N_walkers递减，可无法实现此功能。

回复:
user: user-1
content: 提示：可以先搞一个从0~259（或者0~2599，这个随意）的随机数组，然后递减排序，最后每个元素除以1000（或者10000）即可。 rand()%260        这是0~259的随机数
user-0 提问:  C Primer Plus 自学

回复:
user: user-1
content: 多做题就好了

user: user-2
content: 正常人第一遍都无法都理解全部内容的，你要多看几遍。 从哪里重新开始，要看你个人的学习情况。 所谓书读百遍，其义自见，这句话对编程学习一点都不过时。
user-0 提问: pokeb写入后再peekb读出内容不一样

回复:
user: user-0
content: 笔误了,用的是BC(Borlan C),不是TC. 后来问题找到了,我是写到FLASH里面,那个FLASH坏掉了,更换新的之后,结果正确.

user: user-1
content: 学会使用Turbo Debugger是楼主的当务之急！ http://download.csdn.net/source/2805028

user: user-2
content: pokeb(BASE_ADDR, i, i); BASE_ADDR =？？？

user: user-0
content: 改过了，跟使用%d所打印的结果一样。 用0x01写进去的结果，打印出来的也是这个数。

user: user-3
content: printf("value[%d] = %d\n", i, value[i]);  第二个%d改成%c
user-0 提问: 1、编写一个程序读取a.txt文件，将文件内容数字从小到大排序，并将排序结果写入b.txt。麻烦看一下我的代码排序不了

回复:
user: user-1
content: for (i=0;i<n-1;i++) {     for (j=i+1;j<n;j++) {         if (a[i]>a[j]) {             temp = a[i];a[i] = a[j];a[j] = temp;         }     } }
user-0 提问: 希望有谁帮我改改这个二手市场的代码！万分感谢！

回复:
user: user-1
content: 函数名: exit() 所在头文件：stdlib.h 功 能: 关闭所有文件，终止正在执行的程序。 exit(1)表示异常退出. exit(0)表示正常退出

user: user-1
content: exit(0) 这个就是直接退出程序啊，不是从该函数返回！！！！

user: user-0
content: 非常感谢了你帮忙！

user: user-2
content: 引用 9 楼 liuxin23 的回复:我的意思是：例如：我输入1时，我将数据输入进去了     而后我要返回主菜单在进行其他的输入，如：我要在进行case 2：的功能现在没怎么看你的代码 晚上我看看吧

user: user-0
content: 我的意思是：例如：我输入1时，我将数据输入进去了     而后我要返回主菜单在进行其他的输入，如：我要在进行case 2：的功能

user: user-2
content: 引用 7 楼 liuxin23 的回复:那要怎么改呢？    为什么我的老师用了break;都有用呢？不知道你想要的是怎么样的意思 什么是break管到了while？

user: user-0
content: 那要怎么改呢？    为什么我的老师用了break;都有用呢？

user: user-2
content: 引用 5 楼 liuxin23 的回复:还是不行， int main() {     while(1)     {         switch(menu1())         {              case 0: exit(0);                      break;              case 1: input();                      break;              case 2: Addrecode();                      break;              case 3: cancel();                      break;              case 4: output();                      break;              case 5: search();                      break;         }     } }  是这里出了问题！为什么break管到了while循环？？你确定你了解break的用法？

user: user-0
content: 还是不行， int main() {     while(1)     {         switch(menu1())         {              case 0: exit(0);                      break;              case 1: input();                      break;              case 2: Addrecode();                      break;              case 3: cancel();                      break;              case 4: output();                      break;              case 5: search();                      break;         }     } }  是这里出了问题！为什么break管到了while循环？？

user: user-2
content: int menu1() { int num，flag;    system("cls");  	    printf("***************二手车管理系统*****************\n");         printf("*********************功能*********************\n");         printf("*                0.退出程序                  *\n");     printf("*              1.创建车辆信息                *\n");         printf("*              2.添加车辆信息                *\n");         printf("*              3.删除车辆信息                *\n");         printf("*              4.显示车辆信息                *\n");         printf("*              5.查找车辆信息                *\n");         printf("**************6.按价格进行排序****************\n");         printf("**********************************************\n");        printf("请输入您需要的功能编号0--5："); while(1)     {  	  scanf("%d",&num); if(num<0||num>6)         { printf("您输入的编号有误，需要重新输入么：1是，0否"); scanf("%d",&flag); if(flag==1) continue; else break; } return num; } return num; }  这有就可以了

user: user-2
content: 引用 2 楼 liuxin23 的回复:主函数为什么不能循环输出呢？？    我用了while(1)       本来设计按0就退出的，但的我就运行了一个程序就退出了！ 哈哈 要我帮你改么 代码可能会有点差别的

user: user-0
content: 主函数为什么不能循环输出呢？？    我用了while(1)       本来设计按0就退出的，但的我就运行了一个程序就退出了！

user: user-2
content: 改什么？ 先要把问题 错误 需求给出来啊 就这有贴代码 谁知道代码是什么需求
user-0 提问: 求解参数问题

回复:
user: user-1
content: 引用 12 楼 sadadi 的回复:[quote=引用 11 楼 sadadi 的回复:] 取余 当小于10的时候 就是他的个数 n++ ...不好意思 看错了... void get_s(unsigned char *ints,int i=sizeof(ints))[/quote] strlen()

user: user-1
content: 引用 11 楼 sadadi 的回复:取余 当小于10的时候 就是他的个数 n++ ...不好意思 看错了... void get_s(unsigned char *ints,int i=sizeof(ints))

user: user-1
content: 取余 当小于10的时候 就是他的个数 n++

user: user-2
content: void get_s( unsigned char *ints)//传进去的是地址，不是数组本身，数组名做参数的时候，自动转化为指针，所以占4字节

user: user-3
content: 一个相同的变量名可以在同场合代表不同东西

user: user-4
content: void fun(int *p); void fun(int p[]); 这两种写法中，都是把p当做char *类型来看的， 所有你无论是哪种sizeof(p)都为4， 在对数组进行操作时，一般都是传两个参数，数组首地址和长度

user: user-5
content: 数组名作为参数传递后就退化成指针了，是没有办法获得长度的，只能返回指针的长度

user: user-6
content: 当数组作为一个函数参数传递过去的时候  数组就会化为一个指针  而指针是一个类型 指针的长度在32位机子是4个字节  64位是8个字节

user: user-7
content: unsigned char ints[12];      for (i=0; i<10; i++) {         ints[i]=i;     }  上面的代码执行完后 ints[]数组中的值为：0,1,2,3,4,5,6,7,8,9  printf("%d\n",sizeof(ints));    sizeof求的是ints它的类型的长度，类型为 char[] 分配的长度为12 所以sizeof(ints) = 12*1;     1为char所占字节数  但是传入到get_s中后， ints为 unsigned char * 。 用strlen求长度时，是以'\0'为结束标志位， '\0'的ASCII值正好为0; 所以你求出来的长度 strle(ints) = 0;

user: user-8
content: strlen能获得一个以0结束的字符串的长度，不知道是不是你想要的。

user: user-9
content: sizeof(ints) 是指针的 长度  不是数据的长度

user: user-10
content: 请增加一个参数，用来传递个数

user: user-11
content: 函数里没法获得，只能你增加一个参数传进去

user: user-12
content: 传参数的时候数组会退化成指针
user-0 提问: 为什么结构声明不能够被多次包含,而有些头文件就可以?

回复:
user: user-1
content: 引用 6 楼 hollebab 的回复:[quote=引用 4 楼 user-5 的回复:] 任何东西都可以声明无数次， 但是，只能被定义一次。 我还没定义呢 我认为我的那个是声明,要说定义的话,应该有结构变量,比如: struct token this;//我认为这才是定义[/quote]  你认为错了！这个是定义变量，不是定义结构体，而且你定义变量是this也不对啊！定义是需要有具体结构体的。  而且声明的话在同一个地方可以声明多次。 所以 struct token; struct token; 是可以的 但是 struct token { 	char a; };  struct token { 	char a; };就不行了，因为是定义了两次！

user: user-2
content: 您相当定义了二个名叫 token的数据类型。

user: user-3
content: ... ifndef//如果没定义,如果定义了,就不执行 xxxx    //定义部分 endif  把你的头文件定义放里面就可以了

user: user-0
content: 引用 11 楼 cao_julians 的回复:#ifdef   sth //如果已经“宏定义”了sth  则。。。  <stdio.h>之类的标准头文件就是这样避免重复“宏定义”的 难怪,这回说到点子上了

user: user-4
content: #ifdef   sth //如果已经“宏定义”了sth  则。。。  <stdio.h>之类的标准头文件就是这样避免重复“宏定义”的

user: user-0
content: 经过我的仔细分析,我初步判断楼上的两位自己也没搞明白

user: user-0
content: 那你能完整说下应该怎么编呢?除了pragma那种方法

user: user-5
content: 定义一个结构。 和定义这个结构的变量是不同的。

user: user-5
content: 这叫定义。 struct token {     char type;     char string[MAXTOKENLEN]; };   这叫签名。 struct token;   所有的东东定义的时候，同时也就签名了。

user: user-0
content: 引用 4 楼 user-5 的回复:任何东西都可以声明无数次， 但是，只能被定义一次。 我还没定义呢 我认为我的那个是声明,要说定义的话,应该有结构变量,比如: struct token this;//我认为这才是定义

user: user-0
content: 引用 3 楼 u014161864 的回复:呢的结构体属于多次定义！不属于多次包含。  可以这么做！ 其一：在你定义的结构头文件中加入防重复包含的代码 其二：在你的struct_decl.h文件中只声明该结构体，在struct_decl.cpp中定义该结构体   这样，可以随便包含你的头文件struct_decl.h了！ 可是,我的struct_decl.h中本来就是仅有声明,没有定义啊,也就是你说的方法二

user: user-5
content: 任何东西都可以声明无数次， 但是，只能被定义一次。

user: user-1
content: 呢的结构体属于多次定义！不属于多次包含。  可以这么做！ 其一：在你定义的结构头文件中加入防重复包含的代码 其二：在你的struct_decl.h文件中只声明该结构体，在struct_decl.cpp中定义该结构体   这样，可以随便包含你的头文件struct_decl.h了！

user: user-0
content: 引用 1 楼 user-5 的回复:#pragma once 或者 #ifndef XXXX #define XXXX 。。。 #endif 这些方法我知道,我问的是为什么,而不是怎么办

user: user-5
content: #pragma once 或者 #ifndef XXXX #define XXXX 。。。 #endif
user-0 提问: 这是什么错误？？？？

回复:
user: user-1
content: 不是mian是main，你写错了

user: user-2
content: 看看下面这个 http://bbs.csdn.net/topics/120050960

user: user-2
content: 这貌似是因为 VC 的环境出了一些问题导致的

user: user-2
content: 其实，编译器给出的提示的意思是 启动 cl.exe 失败 连编译器 cl.exe 都没有启动，自然就没有检查语法错误了

user: user-3
content: 其实楼主，我最关心的是为什么你的编译器没有提示     未识别标识符@MIAN

user: user-4

user: user-5
content: 注意细节。 int main()

user: user-6
content: int mian()

user: user-7
content: 竟然还学到一点，函数声明可以放在函数里呀！

user: user-8
content: int mian（） 这是主函数吗？？？不是这么写的int main（）？？？

user: user-9
content: main typo error

user: user-10
content: http://zhidao.baidu.com/link?url=F64Wol2vdb__QVVuJFhdsp07UvUOCZUIR81tUbL-s3aGAfMukSlDoyaDY_m3L_feR6tGIx_ujajrExwhwK424K

user: user-11
content: main..... 不是mian

user: user-12
content: int mian()。。 应该是int main()?

user: user-13
content: 关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”
user-0 提问: 大一要学c语言

回复:
user: user-1
content: http://download.csdn.net/detail/sagittarius_520/7687323这是我自己下的一个VC++ 6.0我现在用的也是这个，是中文版。适用于C语言的学习。

user: user-2
content: http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装

user: user-3
content: 一般新手推荐ide小巧一点的，C-free pro 可以的，然后就是visual studio2013 express desktop了，再说的话就用的dev -c++，这个还有人在跟新的，cfree倒是已经荒废了。

user: user-4
content: 上什么大学?退学得了

user: user-5
content: 安装VS2010。  在桌面新建一个.c文件， 右键点击选择打开方式VS2010。将此程序锁定到任务栏。 再也不怕找不到了。。

user: user-6
content: VC6.0是比较老的版本了，不过稳定。我个人建议还是用VS2012吧。如果想要VC6.0的话我倒是可以找找安装比较小的版本的路径，

user: user-7
content: 引用 3 楼 u014403258 的回复:[quote=引用 1 楼 u013823973 的回复:] 直接2013走起，百度，google一大堆 我刚刚下载了一个   安装了， 但是在哪里打开啊？？？没有快捷方式[/quote]  楼主你好，楼主再见！

user: user-8
content: 直接用linux 标准C99

user: user-9
content: 引用 3 楼 u014403258 的回复:[quote=引用 1 楼 u013823973 的回复:] 直接2013走起，百度，google一大堆 我刚刚下载了一个   安装了， 但是在哪里打开啊？？？没有快捷方式[/quote]开始——>所有程序——>Microsoft Visual C++ 6.0  Microsoft Visual C++ 6.0 可以拖到“开始”上方的快速启动区，也可以直接拖到桌面

user: user-10
content: 引用 13 楼 jiangjieqiFIsh 的回复:直接用linux 标准C99+1

user: user-11
content: codeblocks我一直用

user: user-12
content: VS2010走起，别用VC6这么老的版本了

user: user-13
content: 引用 3 楼 u014403258 的回复:[quote=引用 1 楼 u013823973 的回复:] 直接2013走起，百度，google一大堆 我刚刚下载了一个   安装了， 但是在哪里打开啊？？？没有快捷方式[/quote]开始》所有程序》Visual Studio 2013》Visual Studio 2013

user: user-14
content: 装个xp虚拟机，在这里面有VC6.0

user: user-0
content: 引用 1 楼 u013823973 的回复:直接2013走起，百度，google一大堆 我刚刚下载了一个   安装了， 但是在哪里打开啊？？？没有快捷方式

user: user-15
content: 不一定非要用VC++6.0啊，好多IDE可以用的啊，比如code::blocks，VS2010或更高版本，

user: user-16
content: 直接2013走起，百度，google一大堆

user: user-17
content: 我也是win7，在微软“msdn我告诉你”开发人员工具里的Visual Studio 2012

user: user-18
content: 推荐codeblocks，开源免费，我就是用它

user: user-19
content: 直接上linux不好么？
user-0 提问: C语言的一个小问题

回复:
user: user-1
content: 搜“跟我一起写makefile”

user: user-2
content: 双管齐下： 1.对应每个*.c文件（代码文件）写对应的*.h文件（头文件），对*.c文件中函数、外部变量、宏、类型等进行声明 一般在含有mian（）的文件用#include “*.h"形式包含这些头文件  2.在project（称为项目或工程）中”导入“这些头文件对应的代码文件  ****在更高层次上，*.h称为”接口“；×.c称为"实现"

user: user-3
content: 引用 1 楼 longburulin 的回复:几个CPP文件涉及工程的概念: 有多个CPP文件,且在同一个工程下时,编译器单独编译各个文件,然后由链接器进行链接,最后生成可执行文件.  include放在cpp文件中,编译的时候首先会展开这个include的头文件,其中包含了所需的数据类型,函数原型等,这样在本cpp文件中就可以使用和编译了,否则不知道类型,编译器将无法完成编译.你也无法使用,因为函数必须先声明原型才能使用.  任何cpp文件中调用的数据类型和函数都需要知道类型,所以包含main函数的主文件也是一样的.  另外:编译阶段,include进来的函数并不会嵌入实际的函数代码,但这将确保你可以在当前文件中有效使用,链接器连接各个文件后,将确保能够调用到真正的代码.   你应该了解一下,源文件,目标文件,可执行文件,编译,链接等等这些基本概念. 同时了解一下多文件编译,头文件技术这些基本概念.  各个功能模块放在不同的cpp文件和h文件中,一便于分类管理,二也有代码重用的概念在里面,比如第三方的代码可能只提供头文件和库文件,而没有源代码,但并不影响你使用或者扩展. 引用 5 楼 zhao4zhong1 的回复:搜“跟我一起写makefile”都不错

user: user-4
content: 几个CPP文件涉及工程的概念: 有多个CPP文件,且在同一个工程下时,编译器单独编译各个文件,然后由链接器进行链接,最后生成可执行文件.  include放在cpp文件中,编译的时候首先会展开这个include的头文件,其中包含了所需的数据类型,函数原型等,这样在本cpp文件中就可以使用和编译了,否则不知道类型,编译器将无法完成编译.你也无法使用,因为函数必须先声明原型才能使用.  任何cpp文件中调用的数据类型和函数都需要知道类型,所以包含main函数的主文件也是一样的.  另外:编译阶段,include进来的函数并不会嵌入实际的函数代码,但这将确保你可以在当前文件中有效使用,链接器连接各个文件后,将确保能够调用到真正的代码.   你应该了解一下,源文件,目标文件,可执行文件,编译,链接等等这些基本概念. 同时了解一下多文件编译,头文件技术这些基本概念.  各个功能模块放在不同的cpp文件和h文件中,一便于分类管理,二也有代码重用的概念在里面,比如第三方的代码可能只提供头文件和库文件,而没有源代码,但并不影响你使用或者扩展.

user: user-5
content: 在DEV C++中新建一个project，把源文件扔进去。

user: user-6
content: 头文件定义 .c文件写函数体  引用头文件
user-0 提问: c语言习题求解释

回复:
user: user-0
content: #define pingfang(a) (a*a) #include "stdio.h" int main() {     int c = pingfang(5+5);     printf("c is %d\n", c);     return 0; } 求大神解答。。。。

user: user-1
content: 第一题可以看各种进制数的表示方法  只有C正确  第二题  赋值的时候 = 左边必须为变量 所以D错   不能给 x +1  赋值  第三题  从后往前计算 x = 6.5    c = c*x = 65    f = f / c = 1. 538...     a = f = 1

user: user-2
content: 这些都是c的基础题啊～
user-0 提问: 这个问题肯定不只困扰我一人吧

回复:
user: user-1
content: 看一下这个对应的汇编： #include "stdio.h" void budong(int a); void sub1() {     int i=1;     budong( i ); } void sub2() {     int i=2;     budong( i );     sub1(); } void main() {     sub1();     sub2(); }  void budong(int a ) {     printf("%d",a); }

user: user-2
content: 引用 4 楼 sadadi 的回复:BP为基指针(Base Pointer)寄存器，用它可直接存取堆栈中的数据，它的作用是在调用函数时保存ESP使函数结束时可以正确返回；加E（enhance）代表增强型寄存器，用于32位数据处理 顺带 要在运行时才能知道变量地址

user: user-2
content: BP为基指针(Base Pointer)寄存器，用它可直接存取堆栈中的数据，它的作用是在调用函数时保存ESP使函数结束时可以正确返回；加E（enhance）代表增强型寄存器，用于32位数据处理

user: user-3
content: 楼主可不可以告诉我你用什么编译软件啊

user: user-4
content: 这个地址是编译期不能知道的。可以从两个例子来验证  1、写两个dll，名字不同，代码相同，先加载一个，在加载另一个的时候会发现那个地址是不同的  2、在exe中创建若干线程，观察不同线程中的地址，也是不同的

user: user-5
content: 间接与直接的区别在于：复杂了但灵活了，从而能应付一大类问题而不仅仅是一个问题

user: user-0
content: 引用 3 楼 u013697891 的回复:楼主可不可以告诉我你用什么编译软件啊 是visual 6.0  ，是看到给位大侠都在用它，所以我才用的，感觉不错，功能花哨且丰富，比我以前那个实验学习版本好点。

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:看一下这个对应的汇编： #include "stdio.h" void budong(int a); void sub1() {     int i=1;     budong( i ); } void sub2() {     int i=2;     budong( i );     sub1(); } void main() {     sub1();     sub2(); }  void budong(int a ) {     printf("%d",a); }   谢谢诸位朋友的热心回复，懂了，可以结贴了。

user: user-6
content: mov      dword ptr [96],3 mov      dword ptr [ebp-4],3   通常 是  push ESP move EBP， ESP；  参数 是 以 当前堆栈 为 基准。  每次调用 EBP 都 不一样的

user: user-7
content: 你的这句 “如果编译器在编译C代码时就能确定ebp的值”  编译器在编译时根本不知道ebp的值，只有操作系统在装入程序运行时才能确定
user-0 提问: 怎样找出一个数组中第k大小的数，输出数所在的位置。要去重复的数据的序号也输出

回复:
user: user-1
content: nth_element

user: user-2
content: 先将数组排序，同时也要记录其原始序号（也可用二维数组排序的时候将原始序号也对应改变位置）。挑出第K大的，同时输出序号。具体代码自己试着实现。

user: user-0
content: 好的，谢谢啦

user: user-3
content: google top n算法。
user-0 提问: 能不能再vc++6.0中写出printf或者scanf那两个系统函数？

回复:
user: user-1
content: 引用 1 楼 songjiaweizangai 的回复:找到printf 函数的实现方法  看人家怎么实现的 同意。  http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装  再参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c

user: user-2
content: 可以。  要点有这样几个： 1、C中的变参函数的应用； 2、了解int、double各种类型的数据在内存中是如何存的，并且能将其转换成char *（即字符串），即能将123转成"123"； 3、输出字符串，这个需要依靠系统的API。

user: user-1
content: VC6参考 C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\OUTPUT.C C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\INPUT.C

user: user-1
content: 参考 C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\input.c

user: user-3
content: http://blog.chinaunix.net/uid-24567872-id-87686.html

user: user-4
content: 找到printf 函数的实现方法  看人家怎么实现的
user-0 提问: 八嘎!这是声明还是定义?

回复:
user: user-0
content: 引用 1 楼 q191201771 的回复:你首先要知道什么是编译单元 嗯,现在知道了,不过好像和我的问题不相干

user: user-1
content: 你首先要知道什么是编译单元
user-0 提问: 链接器怎么处理文件包含的?

回复:
user: user-1
content: 我觉得LZ首先应先看下编译器报出的错误是什么.  我想编译器在编译test1.c,test2.c时应该是分开编译的，也就是每个.c文件包含的头文件只展开一次. 但是如果在test3.c包含头文件2次，那在编译次文件时，头文件被展开了两次。 可能GCC默认这种行为是不合法的，当然我们可以通过宏定义的形式去避免.

user: user-0
content: 好吧,这个问题留到N年后再来看

user: user-2
content: 引用 4 楼 hollebab 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] 参考gcc和ld源代码。 有那个能力早自己看了[/quote] 但我看好你有这个能力。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:参考gcc和ld源代码。 有那个能力早自己看了

user: user-2
content: 参考gcc和ld源代码。

user: user-0
content: 引用 1 楼 user-3 的回复:1.  不关链接器的事情，出错在编译阶段。 2.  4.c 重复包含了3.h 3. .h 文件应该使用header guard, 防止重复定义。  #ifndef HEADER_3_H #define HEADER_3_H struct token {     int i;     int j; }; #endif /* HEADER_3_H */  但是gcc test1.c test2.c这种情况对于编译器来说,不就相当于重复包含吗?因为编译器看到了2次#include语句啊

user: user-3
content: 1.  不关链接器的事情，出错在编译阶段。 2.  4.c 重复包含了3.h 3. .h 文件应该使用header guard, 防止重复定义。  #ifndef HEADER_3_H #define HEADER_3_H struct token {     int i;     int j; }; #endif /* HEADER_3_H */
user-0 提问: 怎么改进本程序，使该链表的每个节点存储一个字符串？（字符串的长度未知），求各位大神指教~~

回复:
user: user-1
content: 引用 1 楼 user-3 的回复:把链表改为一个char *的就可以了，然后用的时候根据字符串长度进行动态分配。不用了就将其释放掉。 把结构体中的字符串数据元素定义一个指向字符串的字符指针，即：char *pstring； 然后在需要初始化字符串的时候，根据字符个数来用malloc动态申请堆空间来分配。

user: user-2
content: 或者使用C++ string。

user: user-3
content: 把链表改为一个char *的就可以了，然后用的时候根据字符串长度进行动态分配。不用了就将其释放掉。
user-0 提问: 3D空间如何判断两点是否在同一个矩形框内

回复:
user: user-1
content: 你可以将四边形拆分成两个三角形，然后判断点是否在三角形内 http://www.blackpawn.com/texts/pointinpoly/default.html

user: user-2
content: http://blog.csdn.net/pizi0475
user-0 提问: 定义只能有一次,那为什么我能定义两次?

回复:
user: user-0
content: 引用 13 楼 TheNewIpad 的回复:[quote=引用 12 楼 hollebab 的回复:] 楼上两位的回答我实在看不懂,我就说下我现在的观点吧. 我打了这个命令: gcc test1.c test2.c 这两条命令的意思是把两个文件分别编译,然后链接. 链接的意思是gcc把两个编译得到的.o文件头尾连在一起,那不就相当于我单纯地把两个源文件test1.c和test2.c头尾连在一起,然后编译,那不就重复定义了吗?可是为什么gcc test1.c test2.c这样编译就不会产生错误信息呢?  定义，可以理解成占用内存的行为。  比如定义一个变量。 int a; 这就是定义。 比如实现一个函数。 声明： 告诉编译器，你有某个东西。 比如声明一个变量 extern int a；  比如声明一个函数。 int func();[/quote] 我知道,然后呢?

user: user-1
content: 引用 12 楼 hollebab 的回复:楼上两位的回答我实在看不懂,我就说下我现在的观点吧. 我打了这个命令: gcc test1.c test2.c 这两条命令的意思是把两个文件分别编译,然后链接. 链接的意思是gcc把两个编译得到的.o文件头尾连在一起,那不就相当于我单纯地把两个源文件test1.c和test2.c头尾连在一起,然后编译,那不就重复定义了吗?可是为什么gcc test1.c test2.c这样编译就不会产生错误信息呢?  定义:     可以理解成占用内存的行为。  比如          int a; 定义一个变量。           int func(){//...}  定义（实现）一个函数 声明：      告诉编译器，你有某个东西。 比如          extern int a； 声明一个变量          int func();    声明一个函数。

user: user-1
content: 引用 12 楼 hollebab 的回复:楼上两位的回答我实在看不懂,我就说下我现在的观点吧. 我打了这个命令: gcc test1.c test2.c 这两条命令的意思是把两个文件分别编译,然后链接. 链接的意思是gcc把两个编译得到的.o文件头尾连在一起,那不就相当于我单纯地把两个源文件test1.c和test2.c头尾连在一起,然后编译,那不就重复定义了吗?可是为什么gcc test1.c test2.c这样编译就不会产生错误信息呢?  定义，可以理解成占用内存的行为。  比如定义一个变量。 int a; 这就是定义。 比如实现一个函数。 声明： 告诉编译器，你有某个东西。 比如声明一个变量 extern int a；  比如声明一个函数。 int func();

user: user-0
content: 楼上两位的回答我实在看不懂,我就说下我现在的观点吧. 我打了这个命令: gcc test1.c test2.c 这两条命令的意思是把两个文件分别编译,然后链接. 链接的意思是gcc把两个编译得到的.o文件头尾连在一起,那不就相当于我单纯地把两个源文件test1.c和test2.c头尾连在一起,然后编译,那不就重复定义了吗?可是为什么gcc test1.c test2.c这样编译就不会产生错误信息呢?

user: user-2
content: 编译器看到的是 .c 文件。 #include 被直接包含在 .c 文件内。

user: user-3
content: 你没有使用test2.c 编译器不会处理 使用的时候才会进行定义 没有定一两次 调试一下就知道了

user: user-0
content: 不是,是重复定义了

user: user-0
content: 既然是声明,那就是说能声明多次,那为什么我这样又显示重复声明了? #include "3.h" #include "3.h" main() { }

user: user-4
content: c语言的struct token  等于C++的token  楼主只是在声明变量而已

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:定义和声明不是一回事！ 你的意思是3.h中的内容是声明?

user: user-5
content: 定义和声明不是一回事！

user: user-0
content: 因为上个帖子中别人说定义只能出现一次,而现在我包含了2次3.h这个文件,那就是定义了2次了

user: user-0
content: 我问的是为什么3.h中的内容能被定义两次?

user: user-6
content: struct token x 是声明变量。同样的对y也一样。

user: user-7
content: struct token {     int i;     int j; };  这个是定义struct的具体内容。  struct token y;  这个是定义一个struct token类型的变量。
user-0 提问: 数据结构C语言版实习题10个题目求解答

回复:
user: user-1
content: 看起来不难，要自己多练啊！

user: user-2
content: 不是有本课后答案的书吗

user: user-3
content: 这是谁谁的什么出版社的书啊？楼主你从网上搜过课后题答案吗？

user: user-4
content: 1. MergeSort

user: user-5
content: 《算法精解（C语言描述）》

user: user-6
content: 我只能说你的胃口很大。

user: user-7
content: 作业题拜拜            。

user: user-8
content: 你这样的话,这道题目得300分
user-0 提问: c语言面试考些什么？

回复:
user: user-1
content: 考“strlen,strcpy,ctrcat”是必要的，这样可以把那些根本跑来打酱油的人用最低的成本挡在技术面试官办公室的门外。这种面试其实根本不算面试，无非就是公司派一个前台小姐（根本不用懂技术）发你一张纸让你写写，写不出来就可以打发走了。  你要知道，现在连初中毕业的待业青年，随便报个班学几天，也想当“程序员”。

user: user-2
content: 我感觉应届生可能会面试这些，一般社会招人如果是我的话，不会问这些。
user-0 提问: 设计一个简单计算器

回复:
user: user-1
content: 楼主是什么意思，给我们派作业吗

user: user-2
content: http://bbs.csdn.net/topics/390623576 http://zhidao.baidu.com/link?url=UPAQhrKEBOzB9HkJeoJ1oeT5Zy9db6mRdSSFdKyFSilJW12N9ZkNc_YR1A3E2vsL_8ojubDIb3ngvJxNJndqWa http://www.baidu.com/baidu?word=设计一个简单计算器&ie=utf-8

user: user-3
content: 源码一大堆，思想就是树

user: user-4
content: 楼主是课程设计？

user: user-5
content: 作业帖？？？

user: user-6
content: google中搜索： site:download.csdn.net VC++ 计算器
user-0 提问: c语言宏定义问题

回复:
user: user-1
content: 引用 6 楼 q191201771 的回复:因为编译前有个预处理阶段，会把宏定义进行替换 所以就相当你直接在main里面写了那三行代码

user: user-0
content: 引用 6 楼 q191201771 的回复:因为编译前有个预处理阶段，会把宏定义进行替换 所以就相当你直接在main里面写了那三行代码好的~理解了~谢谢

user: user-2
content: 因为编译前有个预处理阶段，会把宏定义进行替换 所以就相当你直接在main里面写了那三行代码

user: user-0
content: 引用 3 楼 q191201771 的回复:for (i = 0; i <= 2; i++) 越界访问内存了 a[2]的话只能a[0],a[1] <=改成< 谢谢不过可以再请教一下为何利用宏不用指针等也能进行互换呢忘解答~谢谢~

user: user-0
content: 引用 1 楼 user-3 的回复:若要用函数改变函数外部的变量的值，要么此变量是全局的，要么你传递的是变量的指针。 void swap(int * x, int * y){int n;n = *x;*x = *y;*y = n;}   这样就能改变了。 若是C++，传递引用也行。 这个我知道，就是不太清楚为什么利用宏不用指针等也可以解决这种问题

user: user-2
content: for (i = 0; i <= 2; i++) 越界访问内存了 a[2]的话只能a[0],a[1] <=改成<

user: user-3
content: 至于为何会报错....我没看出来

user: user-3
content: 若要用函数改变函数外部的变量的值，要么此变量是全局的，要么你传递的是变量的指针。 void swap(int * x, int * y){int n;n = *x;*x = *y;*y = n;}   这样就能改变了。 若是C++，传递引用也行。
user-0 提问: 邻接矩阵创建输入问题

回复:
user: user-0
content: 谢谢，还是不明白原理，还要继续学习啦

user: user-1
content: scanf里敢加空格？！

user: user-2
content: for(i=0; i<G.vexnum; ++i)         scanf("%c",&G.vexs[i]); getchar();//添加这个，尝试一下。或刷新一下输入缓存也可行，下文紧接着输入字符，它可能获得是个回车字符，导致输入异常

user: user-3
content: 看起来好像是输入缓冲区的问题。在G.arcs[j][i]=w;后添加fflush（stdin）
user-0 提问: c语言求助

回复:
user: user-1
content: 你的单科成绩是整数吗？如果是的话用浮点型输出又没有强制类型转换可能会出问题。

user: user-0
content: 请问能告诉我为什么数字成员打印出来全是0

user: user-2
content: for(p=stud;p<stud+SIZE;p++) 不建议进行指针的比较  何不 p=stud;  for(int i=0;i<SIZE;i++) {    dosometing;   p++; }
user-0 提问: C语言中关于字符串的一些问题

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

user: user-2
content: 连续的内存：字符指针变量一次加1，内存是字节编址，一次过一个字节。当然是连续的内存！ 道理很简单，x初始化位1.每次加一，就是x[1,n],x属于N+(自然数)！这是个等差数列。在自然数范畴内，它是连续的

user: user-3
content: 至少你这个例子中是连续的（指地址连续），不然的话你的string++就会崩掉。数据结构有很多种，有连续的，也有不连续的，这要看你是什么情况，根据不同的情况使用不同的数据结构。至于内存是怎么存储的，现在不必去深究，你只要知道数据在内存中是以什么样的数据结构存储的就OK了。计算机可表示的最小信息单位为“位”（bit），但计算机可存取的最小单位却不是位，而是字节，一个字符（比如字母）的大小就是一个字节，每一个字节有一个地址。

user: user-4
content: 不知道楼主的内存单元具体大小是多少，如果一个内存单元存的下就是一个，存不下就用两个或三个等等

user: user-5
content: 调试，ALT+6查看内存，你就懂了、、、

user: user-6
content: c的字符串只是指针而已，

user: user-7
content: 比如char* str="abcdef"，给这个字符串分配的就是连续的7个字节，因为char类型占用一个字节。然后，str指针指向这个字符串的首地址。

user: user-7
content: 连续的内存单元。 不知道你说的可能存在一个内存单元，这里面内存单元是什么含义。
user-0 提问: 还是我！真的不会啊！

回复:
user: user-1
content: printf ("sum=%d t=%d p=%f\n", sum, t, p);

user: user-0
content: 哈哈哈！刚脑门开了个洞！没想到！刚睡下 就想起来了！不过还是谢谢了！！

user: user-2
content: # include <stdio.h> main () {     int i, sum=0, t=0;//sum  总数     int p;     for (i=1; i<=100; ++i)     {         if (i%2!=0)         {             sum = sum+i;//1到100的奇数之和！             t = t+1;//1到100的奇数的个数！            }     }          p = sum/t;//求平均值！       printf ("sum=%d t=%d p=%d\n", sum, t, p);   }

user: user-3
content: 两个问题； 一、p = sum/t;//求平均值！会产生数据丢失，int / int再传给float,改成 p = (float)sum / t; 二、格式化输出问题； p是float类型的数据，你用%d输出，能输出吗？？？ 改为p=%f

user: user-4
content: 因为平均值是一个浮点数，输出的时候用%f而不是%d
user-0 提问: 字符串处理大数据问题，自己测试没什么问题，提交不过，不知道错哪了

回复:
user: user-1
content: 请贴题目. 建议检查输出格式是否符合要求.

user: user-2
content: scanf("%1009s%1009s",as[i],bs[i]);  防止越界。

user: user-2
content: 引用 7 楼 fendouqingchun123 的回复:谢谢，不过我刚试了，答案还是错误 编译器，版本号？

user: user-0
content: 谢谢，不过我刚试了，答案还是错误

user: user-2
content: 引用 5 楼 fendouqingchun123 的回复:是要加句  if(1<=t<=20)  吗？  嗯，是的，也可以   t = t % 20 + 1;

user: user-0
content: 是要加句  if(1<=t<=20)  吗？

user: user-3
content: 是不是输入没有取地址符

user: user-2
content: 引用 2 楼 fendouqingchun123 的回复:最多有20组数据，每次只计算其中一组a+b之和，所以定义为二维数组，但每次调用只用其中一行数据  scanf("%d",&t);   t的合法边界没有检测。

user: user-0
content: 最多有20组数据，每次只计算其中一组a+b之和，所以定义为二维数组，但每次调用只用其中一行数据

user: user-2
content: char as[20][1010],bs[20][1010],cs[20][1010];   二维数组到后面怎么又变成一维了？
user-0 提问: 谭浩强C程序设计中一道作业题

回复:
user: user-0
content: 解决了，妹的，开辟内存的时候忘了乘以单位 也就是指针的size了

user: user-1
content: for (int i = 0; i < num_count; i++)     {         printf("%s\n", *nums);         free(*nums);     } 这里，如果free第一次释放之后，*nums无指向了。但是我没看完，也没看懂。而且LZ这种算法有点渣，且浪费内存

user: user-0
content: 顶住顶住顶住

user: user-0
content: 顶一下，在线等。。。
user-0 提问: 关于const_cast转换问题

回复:
user: user-1
content: 内存中是已经修改了的，但是因为编译器的处理，导致一些代码变量在运行前直接被替换了，而不是运行时对内存访问来输出数据。

user: user-2
content: const folding和copy propagation的问题。 http://blog.csdn.net/tobebetterprogrammer/article/details/25333613
user-0 提问: 谁帮忙看看这个斐波那契数列的问题出在哪啊

回复:
user: user-0
content: 引用 8 楼 a515360208 的回复:[quote=引用 6 楼 mimimayia 的回复:] [quote=引用 1 楼 a515360208 的回复:] 斐波那契数列定义的初始条件你都弄错啦， F0=0，F1=1，Fn=F(n-1)+F(n-2)（n>=2，n∈N*） 我没有用递归,因为我看不懂 我一直没弄明白这句程序怎么执行 Fn=F(n-1)+F(n-2)（n>=2，n∈N*）[/quote] 是递归不明白还是什么不明白？？？ 递归要多调试菜懂的、、、、[/quote] 就是不明白Fn=F(n-1)+F(n-2)这句怎么执行 我看过别人编的递归的,可是怎么也不明白程序到哪去找这几个参数

user: user-0
content: 引用 7 楼 longburulin 的回复:[quote=引用 5 楼 mimimayia 的回复:] [quote=引用 2 楼 longburulin 的回复:] #include <stdio.h> int  main(){ long long  a1,a2,a3,N; a1=1; a2=2; scanf("%lld",&N);  if (N==0||N==1||N==2){ printf("%lld",N); } else if(N>2 && N<=50){  for(int i=2;i<N;i++){  a3=a1+a2; a1=a2; a2=a3; } printf("%lld",a3);}  else  { printf("wrong number"); }     return 0; } 用long long 就可以了 这个我也改了,改完之后还是通不过,不过我觉得也有道理,可是我两个地方都错了吧  [/quote]哪里通不过？ 应该是可以的 除了F0=1;其他都能得出正确结果啊[/quote] 已经过了,除了你说的这个改 了 还有就是1,1,2,3那个位置,加上个1就对了,谢谢啊

user: user-1
content: 引用 6 楼 mimimayia 的回复:[quote=引用 1 楼 a515360208 的回复:] 斐波那契数列定义的初始条件你都弄错啦， F0=0，F1=1，Fn=F(n-1)+F(n-2)（n>=2，n∈N*） 我没有用递归,因为我看不懂 我一直没弄明白这句程序怎么执行 Fn=F(n-1)+F(n-2)（n>=2，n∈N*）[/quote] 是递归不明白还是什么不明白？？？ 递归要多调试菜懂的、、、、

user: user-2
content: 引用 5 楼 mimimayia 的回复:[quote=引用 2 楼 longburulin 的回复:] #include <stdio.h> int  main(){ long long  a1,a2,a3,N; a1=1; a2=2; scanf("%lld",&N);  if (N==0||N==1||N==2){ printf("%lld",N); } else if(N>2 && N<=50){  for(int i=2;i<N;i++){  a3=a1+a2; a1=a2; a2=a3; } printf("%lld",a3);}  else  { printf("wrong number"); }     return 0; } 用long long 就可以了 这个我也改了,改完之后还是通不过,不过我觉得也有道理,可是我两个地方都错了吧  [/quote]哪里通不过？ 应该是可以的 除了F0=1;其他都能得出正确结果啊

user: user-0
content: 引用 1 楼 a515360208 的回复:斐波那契数列定义的初始条件你都弄错啦， F0=0，F1=1，Fn=F(n-1)+F(n-2)（n>=2，n∈N*） 我没有用递归,因为我看不懂 我一直没弄明白这句程序怎么执行 Fn=F(n-1)+F(n-2)（n>=2，n∈N*）

user: user-0
content: 引用 2 楼 longburulin 的回复:#include <stdio.h> int  main(){ long long  a1,a2,a3,N; a1=1; a2=2; scanf("%lld",&N);  if (N==0||N==1||N==2){ printf("%lld",N); } else if(N>2 && N<=50){  for(int i=2;i<N;i++){  a3=a1+a2; a1=a2; a2=a3; } printf("%lld",a3);}  else  { printf("wrong number"); }     return 0; } 用long long 就可以了 这个我也改了,改完之后还是通不过,不过我觉得也有道理,可是我两个地方都错了吧

user: user-0
content: 引用 3 楼 Baoge_leopard 的回复:你的这个程序没问题，只是第一个数是从1开始的，斐波那契数列变成了1、2、3、5、8、13…… 原来是缺个1,郁闷,

user: user-3
content: 你的这个程序没问题，只是第一个数是从1开始的，斐波那契数列变成了1、2、3、5、8、13……

user: user-2
content: #include <stdio.h> int  main(){ long long  a1,a2,a3,N; a1=1; a2=2; scanf("%lld",&N);  if (N==0||N==1||N==2){ printf("%lld",N); } else if(N>2 && N<=50){  for(int i=2;i<N;i++){  a3=a1+a2; a1=a2; a2=a3; } printf("%lld",a3);}  else  { printf("wrong number"); }     return 0; } 用long long 就可以了

user: user-1
content: 斐波那契数列定义的初始条件你都弄错啦， F0=0，F1=1，Fn=F(n-1)+F(n-2)（n>=2，n∈N*）
user-0 提问: DevC++ 在编译后调试时却弹出对话框“源文件未编译”

回复:
user: user-1
content: 提示已经很清楚了，少提示里面对应的文件。 可能你DevC++安装不全

user: user-1
content: http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装

user: user-1
content: 引用 2 楼 zhao4zhong1 的回复:No such file or firectory 都提示 No such file or directory 了

user: user-1
content: No such file or firectory

user: user-1
content: 吃饱了撑的你，文件名带空格。
user-0 提问: 想学汇编的看进来

回复:
user: user-1
content: 第一个下载了，第二个打不开

user: user-2
content: 好高端的样子，ding一个

user: user-0
content: 引用 4 楼 TheNewIpad 的回复:有Intel汇编语言程序设计简单易学？ arm显得指令更简洁易懂一些，虽然有时重复比较集中候看起来繁琐，但对新手来说相对友好。  不选powerpc和mips也有原因，powerpc有些寄存器的不同位表示了不同信息，但偏偏又要用到，用起来的时候感觉缚手缚脚的比较蛋疼。  mips条条框框比较多，需要顾及cpu的特性。

user: user-0
content: 引用 5 楼 hollebab 的回复:虽说是x86汇编,但windows下和linux下又有区别,我无语,这是每个系统都要学一遍吗> 学汇编是让你理解cpu工作的方式，并不是让你直接用来写代码 除开原厂的工程师，基本上大部分程序员很难用汇编写几行代码。

user: user-0
content: 引用 4 楼 TheNewIpad 的回复:有Intel汇编语言程序设计简单易学？ 你让一个新手连指针都没玩透就去玩x86各种蛋疼的寻址方式，不把他们搞晕才怪

user: user-3
content: 虽说是x86汇编,但windows下和linux下又有区别,我无语,这是每个系统都要学一遍吗>

user: user-4
content: 有Intel汇编语言程序设计简单易学？

user: user-5
content: 想学。但是它真的好难。作为深入理解计算机系统的基础吧

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:据说arm不支持非对齐的双字读写。 RISC通病，基本都有一些要求，要在编码上迁就CPU

user: user-6
content: 据说arm不支持非对齐的双字读写。
user-0 提问: 使用冒泡排序的时候出现的异常

回复:
user: user-1
content: for (b=0;b<6-k;b++) 造成问题的原因基本上是不好的习惯导致的，

user: user-2
content: 16行b++  引用 楼主 k91191 的回复:中断指向第22行，但是把第21行删掉后又能成功运行，这是为什么？ 把第21行删掉后又能成功运行？？？ 你确定？  一个简单的冒泡排序没必要#define吧  # include <stdio.h>  void sort(int * a, int len);  int main(void) { 	int a[6] = {10, 2, 8, -8, 11, 0}; 	int i;  	sort(a, 6);  	for (i=0; i<6; ++i) 	{ 		printf("%d ", a[i]); 	} 	printf("\n");  	return 0; }  //冒泡排序 void sort(int * a, int len) { 	int i, j, t;  	for (i=0; i<len-1; ++i) 	{ 		for (j=0; j<len-1-i; ++j) 		{ 			if (a[j] > a[j+1])  // >表示升序 <表示降序 			{ 				t = a[j]; 				a[j] = a[j+1]; 				a[j+1] = t;  			} 		} 	} }

user: user-3
content: 引用 3 楼 u012514171 的回复:void pai (int a[]) /*对数组进行排序*/ {     int k,b,tem;     for (k=1;k<7;k++)     {         for (b=0;b<6-k;a++)//b++         {             if (a[b]>a[b+1])             {                 tem = a[b];                 a[b] = a[b+1];                 a[b+1] =tem;             }         }     } }第一个循环k = 1还有第二个for循环的第三个参数是b++

user: user-3
content: void pai (int a[]) /*对数组进行排序*/ {     int k,b,tem;     for (k=1;k<7;k++)     {         for (b=0;b<6-k;a++)         {             if (a[b]>a[b+1])             {                 tem = a[b];                 a[b] = a[b+1];                 a[b+1] =tem;             }         }     } }第一个循环k = 1

user: user-4
content: 引用 楼主 k91191 的回复:void pai (int a[]) /*对数组进行排序*/ { 	int k,b,tem; 	for (k=0;k<7;k++) 	{ 		for (b=0;b<6-k;a++) // 这一行貌似有问题 		{ 			if (a[b]>a[b+1])  // ？ 			{ 				tem = a[b]; 				a[b] = a[b+1];  // ？ 				a[b+1] =tem;   // ？ 			} 		} 	} } [  冒泡排序也搞得这么复杂

user: user-5
content: 第二个循环for (b=0;b<6-k;a++)？

user: user-6
content: for (b=0;b<6-k;a++)  这个a++是怎么个意思捏？

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

回复:
user: user-1
content: 第一个没有内存，第二个有内存，比如int a[]跟int *a的区别。。

user: user-2
content: 引用 13 楼 zhao4zhong1 的回复:[quote=引用 12 楼 hjgzj 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！  果然是一处复制 到处粘贴啊   请给我用你的模版的权利 不然我举报你作弊[/quote] 本ID所有回帖内容遵循GPL协议。[/quote]

user: user-3
content: 引用 6 楼 u010059563 的回复:那请问**q和*q[]的区别是什么？ 一个是指针的指针，一个是指针数组。

user: user-4
content: 引用 12 楼 hjgzj 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！  果然是一处复制 到处粘贴啊   请给我用你的模版的权利 不然我举报你作弊[/quote] 本ID所有回帖内容遵循GPL协议。

user: user-5
content: 引用 1 楼 zhao4zhong1 的回复:#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！  果然是一处复制 到处粘贴啊   请给我用你的模版的权利 不然我举报你作弊

user: user-6
content: 有两点提示： 1.**menu是一个指向字符串的二级指针变量；*menu[]是一个一级指针变量数组；前者一个，后者多个；前者二级，后者一级；前者单个变量，后者数组； 2.数组初始化可以不指定维数，有初始化成员个数决定。

user: user-6
content: 有两点提示： 1.**menu是一个指向字符的二级指针变量；*menu[]是一个一级指针变量数组；前者一个，后者多个；前者二级，后者一级； 2.数组初始化可以不指定维数，有初始化成员个数决定。

user: user-7
content: 一个在栈区，一个在代码区，你说行吗？

user: user-8
content: 你的数组里面实际存的是char* 类型的。一般多级指针我是先用typedef取个别名，然后再用就不会弄混了。比如楼主的数组，可以先typedef char* pchar；pchar* menu[]{}； 这样我觉得要好理解一些。 因为楼主的数组是双重指针，所以用的时候是不是要解引用两次，但是实际存的是char*，解引用两次就会出错了。解引用一次已经得到字符串了，再次解引用的话就会出错了，把数据当地址来用了。个人见解而已，仅供楼主参考~

user: user-0
content: 那请问**q和*q[]的区别是什么？

user: user-9
content: 二级的指针 就是指向地址的地址

user: user-10
content: 没内存你往哪里放数据呢。

user: user-11
content: 不行就换一种呗！ 不要嫌麻烦。。。。。。。  。。。。。。。。容我吐槽一句：为什么我们学校是先上数据结构再上离散数学。。。。。。。。。。。。

user: user-12
content: char **menu是一个指针，不过是二级指针  *menu[]是一组指针，每一个是一级指针  用二级指针时必须有一级指针（一个或一组）”过渡“，才能用来引用对象  二级指针用法的形象比喻： 你（二级指针）知道有个人（一级指针），他拥有所有房间的钥匙（多个对象）。 但现在那个”他“是谁、在哪？不知道！

user: user-4
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-12
content: 引用 楼主 u010059563 的回复:char **menu = { 	"a - add new record", 	"d - delete record", 	"q - quit", 	NULL,  }; 我通过这种方式赋值，结果在运行的时候出现段错误，但是换成*menu[]后，就不会出现错误，请大神指教，关于这方面的问题我好纠结啊！ 如果你会使用%p格式输出指针值（地址的话），你可以看到menu指针指向了串的首字符‘a',它会将从’a'开始的四个字符当作指针用，'a'的码值是0x61，指针值最后一个字节就是0x61
user-0 提问: 求一个三层交换机的代码实现！！

回复:
user: user-1
content: 牛逼的华为有没有出G级别的Wi-Fi路由器？

user: user-0
content: 三层交换机有路由的功能，但它终究不是路由器，还是交换机！

user: user-0
content: 引用 12 楼 Symfund 的回复:你这个贴我要顶上 了  三层交换机其实就是一个在硬件层面上实现了快速前转的路由器.  IP前转(IP forwarding)典型地涉及到路由查找(route lookup)，TTL计数器(TTL count)自减，重新计算checksum，  基于layer 3 路由协议有：IP, IPX, AppleTalk  （三层交换机其实就是一个在硬件层面上实现了快速前转的路由器.）这几话不能这么说！！

user: user-1
content: 研究下一代的路由器吧，10Gbps的Wi-Fi路由器已经出来了，性能不再是问题了！  802.11ac, multiuser-MIMO, Broadcom, Qualcomm, VIVE,   Asus的1.7GbpsWi-Fi路由器已经上市了，  你的算法再好，也比不上上成的硬件！

user: user-1
content: 你这个贴我要顶上 了  三层交换机其实就是一个在硬件层面上实现了快速前转的路由器.  IP前转(IP forwarding)典型地涉及到路由查找(route lookup)，TTL计数器(TTL count)自减，重新计算checksum，  基于layer 3 路由协议有：IP, IPX, AppleTalk

user: user-2
content: Linux就是一个“三层交换机”

user: user-0
content: 扯远了！！。。

user: user-1
content: 说来说去，一切都归于算法，数学。微积分都能搞定，非线性的图，分形都能搞定，这个应该能搞定吧。

user: user-1
content: forwarding algorithm  前转算法  在硅芯级上实现前转算法哦！

user: user-1
content: 按照这个Layer 3 switch东西顺藤摸瓜，一目了然，轻车熟路，豁然开朗。  Layer-3 switch vs. router ASICs, QoS, Netflow 路由器需要更多的CPU与horsepower(马力）

user: user-0
content: 引用 4 楼 Symfund 的回复:我虽然不懂，但猜对了，三层交换机的翻译确实是：Layer 3 switch 你有没有去百度一下，，看都是什么？？

user: user-1
content: 你这个课题很好，收藏了！

user: user-1
content: 我虽然不懂，但猜对了，三层交换机的翻译确实是：Layer 3 switch

user: user-1
content: 请给出三层交换机当中所有涉及到的英文关键词，比方说：  三层？ --> layer 3 ?  交换机  -> switch ?  算法 -> algorithm  路由 -> route  ISO,

user: user-0
content: 引用 楼主 u012889234 的回复:求一个三层交换机的代码实现！！   邮箱  1505086281@qq.com 百度，，谷歌都没找到啊，找了半天！！

user: user-1
content: 哈哈，伸手党，都懒得找开源代码了？
user-0 提问: string 问题

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

user: user-2
content: 等效与等价！ 有位网上writer（高手！）用过”等效与等价“的说法及相关探讨。  等效是指，两个形式上不同的讨论对象，在某些情况下有同样（或者相似）的效果，但并不能将这种相同、相似扩展到所有情况下  等价是指，两个形式上不同的讨论对象，在所有情况下是相同的，即实际上这两个对象本质上是同一个、而形式上不同而已（典型例子就是一维数组元素引用时的a[i]与*(a+i)）  char*(char [ ])对象与string 对象是等效关系，某些时候是有相同效果，但不是等价关系。

user: user-3
content: 楼主要散分哦，至少给我一半的分！

user: user-4
content: #include <cstdio> #include <string> #include <iostream> using namespace std;  int main(int argc, char* argv[]) { 	string str= "sdf"; 	str += "asdgvsd"; // string类型支持+=运算符重载操作 	cout << str << endl; // cout会根据str的类型智能输出 	printf("%s\n",str.c_str()); // printf支持的是C字符串，因此需要用c_str进行转换  	return 0; }

user: user-5
content: 你看是不是加掉了头文件string #include <iostream> #include <string> using namespace std;  int main() { 	char *p = "asdfag";  	string str = "sdf"; 	str += "asdgvsd";  	cout << str << endl;  //%s输出的是字符串，后面要有'\0'，而string类型是没有'\0'的，要做一个转换 	printf("%s", str.c_str()); 								 	return 0; }

user: user-6
content: 首先，string是一个类，char* 是一个指针类型。 string对+=进行了+的操作符重载，我记得+=会因为+重载了而自动重载。在这里，+=就相当于string.h中的strcat，是对字符串的拼接。 string应该使用流操作，即cout<<str;显示没有匹配操作，是因为楼主没有引用string头文件，或者其他可能的原因。在string类中，对<<操作符的重载是已经有的。左操作数为流对象引用，右操作数为string对象。

user: user-7
content: cout<<str;//为什么这里会显示无匹配操作符，编译是怎么编译的  string 类的 << 重载定义声明和实现在<string>中，楼主包含了这个头文件了没啊？    printf("%s",str);//当改为printf输出时为什么初始赋值是乱码，后面添加的字符串有错  string通过printf打印不是这么干的 应该是 printf("%s", str.c_str());

user: user-3
content: char *p="asdfag"; string str="sdf"; str += "asdgvsd";//这个追加在编译时不会有错 cout << str.c_str();//为什么这里会显示无匹配操作符，编译是怎么编译的 printf("%s",str.c_str());//当改为printf输出时为什么初始赋值是乱码，后面添加的字符串有错   str += "asdgvsd";//这个追加在编译时不会有错，是因为string类重载了操作符+=，支持char *类型 cout << str.c_str();//为什么这里会显示无匹配操作符，编译是怎么编译的 -> cout 不支持string数据类型，支持char, char*类型 printf("%s",str.c_str());//当改为printf输出时为什么初始赋值是乱码，后面添加的字符串有错 -> printf只支持char, char *类型。
user-0 提问: 我想高手们给我指出我这个程序框架的问题

回复:
user: user-0
content: 其实我就是想以提问形式做一个程序，但是以我现在的知识还不能做出来，想找人帮忙！

user: user-1
content: char ch;  do {     scanf("%c", &ch);      switch (ch)     {         case '1':             printf("Question 1 is:");             break;         default:             break;     }  } while (ch != 'e' );

user: user-2
content: 需求是哈？？？问题都描述不清楚，谁会回复？

user: user-0
content: 怎么就没有人回复？
user-0 提问: window获取各个网卡总的发包大小和收包大小

回复:
user: user-1
content: dwInOctets和mi.dwOutOctets都是DWORD类型的，如果流量超过4G，需要怎么处理才能正确显示，谢谢！

user: user-2
content: 还有一个就是 因为mi.dwInOctets和mi.dwOutOctets都是DWORD类型的，当你实际接收发送字节数超出了DWORD能表示的范围，实际上4GB是很容易超出的，mi.dwInOctets和mi.dwOutOctets溢出之后就是又从0开始记得

user: user-2
content: 引用 4 楼 ztjfromnowon 的回复:这个在win7下好像不能获取到正确的值。。。。。？？  我的本机就是win7的 测试是没有问题的   注意mi.dwInOctets和mi.dwOutOctets是目前接受和发送的总量，你如果是要每秒或者每分钟的数据，需要用本次总量-上次的总量

user: user-3
content: http://blog.csdn.net/yy405145590/article/details/9242463 看看这个.

user: user-0
content: 引用 3 楼 zilaishuichina 的回复:__int64 CPerfInfo::GetNetBytes() { 	char *buff = NULL; 	DWORD dwSize = 0;  	IP_ADAPTER_INFO *pInfo = NULL; 	if (ERROR_BUFFER_OVERFLOW == GetAdaptersInfo(pInfo, &dwSize)) 	{ 		buff = new char[dwSize]; 		if (buff == NULL) 		{ 			return 0; 		}  		pInfo = (IP_ADAPTER_INFO *)buff; 		if (NO_ERROR != GetAdaptersInfo(pInfo, &dwSize))  		{ 			delete[] buff; 			return 0; 		}  		MIB_IFROW mi; 		while (pInfo) 		{ 			mi.dwIndex = pInfo->Index; 			if(NO_ERROR == GetIfEntry(&mi)) 			{ 				if (mi.dwOperStatus == IF_OPER_STATUS_CONNECTED || mi.dwOperStatus == IF_OPER_STATUS_OPERATIONAL) 				{ 					delete[] buff; 					return mi.dwInOctets + mi.dwOutOctets;//这就是接收字节和发送字节数 				} 			}  			pInfo = pInfo->Next; 		}  		delete[] buff; 		return 0; 	} 	else 	{ 		return 0; 	} }   这个在win7下好像不能获取到正确的值。。。。。？？

user: user-2
content: __int64 CPerfInfo::GetNetBytes() { 	char *buff = NULL; 	DWORD dwSize = 0;  	IP_ADAPTER_INFO *pInfo = NULL; 	if (ERROR_BUFFER_OVERFLOW == GetAdaptersInfo(pInfo, &dwSize)) 	{ 		buff = new char[dwSize]; 		if (buff == NULL) 		{ 			return 0; 		}  		pInfo = (IP_ADAPTER_INFO *)buff; 		if (NO_ERROR != GetAdaptersInfo(pInfo, &dwSize))  		{ 			delete[] buff; 			return 0; 		}  		MIB_IFROW mi; 		while (pInfo) 		{ 			mi.dwIndex = pInfo->Index; 			if(NO_ERROR == GetIfEntry(&mi)) 			{ 				if (mi.dwOperStatus == IF_OPER_STATUS_CONNECTED || mi.dwOperStatus == IF_OPER_STATUS_OPERATIONAL) 				{ 					delete[] buff; 					return mi.dwInOctets + mi.dwOutOctets;//这就是接收字节和发送字节数 				} 			}  			pInfo = pInfo->Next; 		}  		delete[] buff; 		return 0; 	} 	else 	{ 		return 0; 	} }

user: user-4
content: 在MSDN里面搜“PDH Counter”

user: user-5
content: 引用 楼主 ztjfromnowon 的回复:在window下，有什么api可以直接获取到网卡的总的发包大小和收包大小 吗 ？？ 求大神指教 linux下设备net_device结构，dev里面相关成员记录。 例如： net_device->stats->rx_packets++; net_device->stats->rx_bytes += skb->len;  windows这大爷我不知道
user-0 提问: 《数字游戏》问题求解

回复:
user: user-1
content: 标准答案的时间规模是t，而你的程序规模是2*n*t。很明显，当n和t都很大的时候，标准答案时间复杂度O(n)，你的答案时间复杂度O(n^2)。 不论多少个人的报数，你只用考虑这个栋栋！人数大小只是改变栋栋报的每两个数之间的差值。如果是1个人，那么栋栋第一次和第二次报数差1，如果两个人，差3，如果三个人，差6，以此类推。把这个差值把握好，就可以得出op1的公式了，然后剩下的操作都很简单，最后把total输出。 而且程序完全不用数组来存储栋栋报的数字，因为最后只求和，所以不用浪费内存。

user: user-0
content: 没有人回复呢。。求帮助。。
user-0 提问: while循环中的malloc与free出错

回复:
user: user-0
content: 非常感谢各位高手，问题解决了，是数组初始化的问题，不过感觉比较奇怪，原本以为calloc函数分配内存之后会随即将内存中的值置零，结果在Debug的时候发现并非如此，不知是何原因。

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

user: user-1
content: 仅供参考//使用动态分配 #include <stdio.h> #include <stdlib.h> #include <malloc.h> int i,L; char *p; void main() {     for (i=0;i<20000;i++) {         L=rand();         p=malloc(L);         if (NULL==p) {             printf("malloc error!\n");             continue;         }         memset(p,0,L);         free(p);     } } //不使用动态分配 #include <stdio.h> #include <stdlib.h> #include <memory.h> #define MAXLEN 30000 int i,L; char buf[MAXLEN]; char *p; void main() {     p=&buf[0];     for (i=0;i<20000;i++) {         L=rand();         if (L>MAXLEN) {             printf("L>MAXLEN==%d, ignore spilth.\n",MAXLEN);             L=MAXLEN;         }         memset(p,0,L);     } }

user: user-2
content: free失败无非这两种情况： 1 内存越界，free的时候free多了。检查中间任何和内存写有关的地方。这种问题一般是必现 2 内存破坏，相邻的内存越界。检查所有内存拷贝和内存写的地方。这种问题一般非必现。  楼主的应该是内存破坏。你在调试状态，把出错的指针在memory里，看看相邻内存里的内容是啥

user: user-3
content: 感觉会不会是malloc失败？给if加上else，在else中free并置NULL试试

user: user-0
content: 谢谢user-5和adlay！  1. 因为看到有的书上讲指针变量free之后，应当将其设置为NULL，以免出现错误，这个错误可能真是编译系统不同引起的。  2. 完整的代码比较长，我截取其中与Ai和Ax相关的一段：   #define NONZEROLIMIT 1.0e-8  while(iteration_flag) { 			//................  			//------------------------------------------ 			num_non_zero = 0;  			for (i_dof_struc = 0; i_dof_struc<num_dof_struc; i_dof_struc++) 			for (j_dof_struc = 0; j_dof_struc<num_dof_struc; j_dof_struc++) 			if (fabs(A[i_dof_struc][j_dof_struc])>NONZEROLIMIT) 				num_non_zero++;  			//------------------------------------------ 			Ai = (int *)malloc(num_non_zero * sizeof (int)); 			if (!Ai) printf("Allocation problem for Ai !!!");  			Ax = (double *)malloc(num_non_zero * sizeof (double)); 			if (!Ax) printf("Allocation problem for Ax !!!");  			SYS_Zero_Vec(num_dof_struc, x);  			i_non_zero = 0; 			k = 0; l = 0; m = 0;  			for (j = 0; j<num_dof_struc; j++) 			{ 				for (i = 0; i<num_dof_struc; i++) 				{ 					if (fabs(A[i][j])>NONZEROLIMIT) 					{ 						i_non_zero++; 						Ai[l++] = i; 						Ax[m++] = A[i][j]; 					} 				} 			}  			//------------------------------------------  			(void)umfpack_di_symbolic(num_dof_struc, num_dof_struc, Ap, Ai, Ax, &Symbolic, NULL, NULL); 			(void)umfpack_di_numeric(Ap, Ai, Ax, Symbolic, &Numeric, NULL, NULL); 			umfpack_di_free_symbolic(&Symbolic); 			(void)umfpack_di_solve(UMFPACK_A, Ap, Ai, Ax, x, B, Numeric, NULL, NULL); 			umfpack_di_free_numeric(&Numeric);  			free(Ax); Ax = NULL; 			free(Ai); Ai = NULL;                          //.........  }   其中 A为一个方阵，这段代码是调用UMFPACK库函数求解代数方程组Ax=B，在某次迭代中，Ai与Ax分配好内存大小之后，访问它们的时候应该没有越界，不知道可能是什么原因？

user: user-4
content: 估计是中间访问 Ai 和 Ax 越界了 还是给完整代码吧，这样看不出问题的。

user: user-5
content: free后的指针最好不用，不同的编译系统处理不同，如果用了，会留下隐患。
user-0 提问: 还是我！还是一样的问题！

回复:
user: user-1
content: 请你以后写判断的时候常量写在前面 0 == x  当你写成0=x的时候编译器就会报错的

user: user-2
content: 引用 1 楼 zhao4zhong1 的回复:x=0和x==0不是一回事！ +1   对于==的使用，编程规范一般要求某个变量和数字相等比较，数字放在左操作数，变量名放在右操作数，比如这样写： 0 == x

user: user-3
content: 引用 1 楼 zhao4zhong1 的回复:x=0和x==0不是一回事！  ++++

user: user-4
content: x=0和x==0不是一回事！