Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: scanf无法将输入的数存入变量

回复:
user: user-0
content: 引用 10 楼 Zidane_2014 的回复:我再VC里面跑了一下。 没有问题。 按照你的方法打断点也能正常运行的。 怀疑你是不是输入的时候出现了问题。  我又试了试，果然还是断点用的不熟悉，应该在运行到scanf并停下来等待输入时再输入，我输早了

user: user-1
content: 上面已经能说清楚了，你看那边提示的"以‘,’分隔"的逗号跟你下面敲的逗号都不一样，能生效才怪了。

user: user-2
content: 再供参考：#include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }

user: user-3
content: 我再VC里面跑了一下。 没有问题。 按照你的方法打断点也能正常运行的。 怀疑你是不是输入的时候出现了问题。

user: user-4
content: int main(int argc, const char * argv[]) //main可能第一个参数是文件名。 仅供参考

user: user-0
content: 引用 4 楼 HIN735 的回复:我看到了，你的逗号是全角'，'应该用半角',' 我运行的时候是半角，运行成功  我正常运行的时候也没问题，但就是逐行运行的时候不能正常走下去 不清楚这是怎么回事

user: user-5
content: #include <stdio.h>   //求三个数的平均值 float avg(int x, int y, int z){     return (x+y+z)/(3.0f);//} } int main(int argc, const char * argv[]) {     int x=1,y=1,z=1;     printf("请输入三个整数，以‘,’分开:\n");     scanf("%d,%d,%d",&x,&y,&z);          float aa;     aa=avg(x,y,z); 	printf("%d,%d,%d这三个数的平均值：%f",x,y,z,aa); 	     return 0; }

user: user-5
content: 运行没问题啊，你的avg函数返回值没有接收。

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

user: user-6
content: 从图片右下角看，你的程序实际已经退出了，输入数字的时候，命令行终端把23当成了命令。你是不是在linux系统运行？可能调用scanf时程序崩溃了。

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

user: user-5
content: 我看到了，你的逗号是全角'，'应该用半角',' 我运行的时候是半角，运行成功

user: user-0
content: 引用 1 楼 HIN735 的回复:运行没问题啊，你的avg函数返回值没有接收。  ...看来脑袋真是短路了，居然没打印出来  我这断点逐行运行到scanf那里就老是出错呢，执行不下去
user-0 提问: glib GString 释文问题

回复:
user: user-1
content: g_string_new和g_string_free是一对，配对使用就好了，再用g_free是画蛇添足的做法。

user: user-2
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。
user-0 提问: 关于return

回复:
user: user-1
content: 如果函数返回是void，可以return；也可以不写 其它情况下都要写，return函数的类型和你函数的定义有关。 return ( auth_info.attest_crt_ptr != NULL ); 这里返回的是true或者false.()里是一个判断式

user: user-2
content: return  根据函数声明的返回值的类型，可以不返回任何东西 也可以返回 return 表达式的值 要和 返回值的类型兼容。。。 类型兼容 指的是可以隐式转换为 返回值类型。  return 语句 有两种形式； return; // 不带 return 表达式，不返回任何值， 类型 void ； void 类型函数，以及C++，构造函数，析构函数 中的return   return expr; //带 return 表达式 ，,返回表达式的值 。 类型为定义 函数时的（返回值）类型 。  另外： return (expr) ；只是一种习惯 ，其中的（) 完全是多余的；

user: user-3
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的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-4
content: return 只能返回函数声明的类型，先计算出结果，再返回结果。

user: user-5
content: 这是一个表达式，而这个表达式是有值得。所以可以被 return 返回的。

user: user-6
content: 返回判断的结果啊
user-0 提问: 指针问题

回复:
user: user-1
content: char *squeeze(char *s1,char *s2) {     int flag = 0;     int i=0;     int j=0;     int k = 0;     while(*s1!='\0')     {                 //根据该字段判断是否s1当前字符匹配s2中某一个字符         flag = 0;         while(*s2!='\0')         {             if(*s2 == *s1)             {                 flag = 1;   ----这里找到了是不是应该跳出循环             }             s2++;         }         if(!flag)   ------这里的操作是想做什么？我的理解应该是找到了进行删除操作吧，但是这个条件？这块仔细看看         {             *(s1+j) = *s1;               j++;         }         s1++;     }     s1[j]='\0';     return s1; }

user: user-2
content: 你使用字符指针是不能改变他指向的内容，要改变内容需要使用字符数组。

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

user: user-4
content: #include<stdio.h> #include<string.h> char *squeeze(char *s1, char *s2){ 	int i, j; 	int len = strlen(s1); 	char *tmp = (char *)malloc(sizeof(char) * (len + 1)); 	memset(tmp, '\0', len + 1); 	for(i = 0,j = 0; i < strlen(s1); i++){ 		if(strchr(s2, *(s1 + i)) == NULL){ 			*(tmp + j) = *(s1 + i); 			j++; 		} 	} 	return tmp; } int main(){ 	char *s1 = "abcdefg"; 	char *s2 = "abc"; 	char *result = squeeze(s1, s2); 	printf("%s\n", result); 	free(result);	 	return 0; }  char  *s1指向字符串常量，不可修改

user: user-5
content: 前面加个const不就好了，char数组得指定长度才好删

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:char  s1[] = "abcdefg";  char  s2[] = "abc"; 首先我源程序中指针指向的是一个字符串常量，而这个字符串常量是存储在代码区中的！  引用 6 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 我指针指向的是一个字符串常量，指针在栈上分配空间，他的值是指向字符串常量的首地址的地址，而常量的值是不能够被修改的。而数组就不一样，首先会在栈上面开辟一段空间存放数组p的内容，而他的内容是字符串常量的的拷贝（一个很大的区别）。这样理解对吗？

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

user: user-6
content: 另外你把主函数里的定义改成这样就不会报错   char s1[100] = "abcdefg"; char s2[100] = "abc";   因为你之前的s1 s2是指向常量字符串  参看：http://blog.csdn.net/zlqqhs/article/details/39290977

user: user-6
content: 你要在你程序上改，可我看了半天也没看懂你那些操作是什么意思，你可以自己单步调试看下  另参看：http://www.cnblogs.com/hellophone/archive/2013/08/11/3252070.html

user: user-3
content: char  s1[] = "abcdefg";  char  s2[] = "abc";
user-0 提问: 【新人求助！急！！】用STC12C5A60S2同时测温度（DS18B20）和电压（内部AD转换）会出现错误？）

回复:
user: user-1
content: 顶顶，解决了能分享吗，

user: user-2
content: 那最终问题是怎么解决的？望楼主与后辈分享。

user: user-0
content: 赵老师，您好！ 我把延时函数的i改为1000，3000，5000，8000都不行啊 void delay_1ms(uint a) //延时约1ms {     uint i;     while (a--)         for(i=1000;i>0;i--);   //1T单片机i=600，若是12T单片机i=125 }

user: user-2
content: 个人经验：delay或sleep的时间加大再试试。
user-0 提问: 求Linux C 下开发使用的轻量级网络库。

回复:
user: user-1
content: https://www.baidu.com/s?wd=Linux%20C%20%E4%B8%8B%E5%BC%80%E5%8F%91%E4%BD%BF%E7%94%A8%E7%9A%84%E8%BD%BB%E9%87%8F%E7%BA%A7%E7%BD%91%E7%BB%9C%E5%BA%93&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=2&rsv_sug1=1&rsv_n=2

user: user-2
content: libevent
user-0 提问: 初学者关于MFC常规动态链接库的问题

回复:
user: user-0
content: 出错在哪里我也不大清楚，明天我再仔细看看吧

user: user-0
content: 的确是不配对 但是报错却是无法修改指向数据的指针，我想问一下，导出函数类型可以是 char *吗 因为我想返回一个buffer

user: user-1
content: extern "C" char _declspec(dllexport)_stdcall *Converte( char *OpenFilePath,char *SaveFilePath );  ?? char *Converte( char *OpenFilePath,char *SaveFilePath ) ?? 这两个不配对吧

user: user-2
content: 出错在那里?

user: user-3
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。
user-0 提问: 求助，相当简单的一个输出函数，怎么运行是空的？

回复:
user: user-1
content: 试了一下没问题啊，你怎么调用的 show?

user: user-2
content: void show(double array[],int geshu); 这句话不是函数调用。去掉void

user: user-3
content: main函数中的这一行不是函数调用，是声明。声明与调用的格式不一样。
user-0 提问: 命令行编译运行C程序，链接报错：fatal error LNK 1104

回复:
user: user-0
content: 引用 4 楼 adlay 的回复:你是打开 cmd.exe 然后切换到 VC 的安装目录下去编译的吗？ 你应该在开始菜单中选 Vistual Studio Tools 中的 Vistual Studio XXX Command Prompt 来进行编译。 经过你的提示，测试了确实是WIN10系统系统盘权限的问题。如下图：

user: user-0
content: 引用 4 楼 adlay 的回复:你是打开 cmd.exe 然后切换到 VC 的安装目录下去编译的吗？ 你应该在开始菜单中选 Vistual Studio Tools 中的 Vistual Studio XXX Command Prompt 来进行编译。 是的。。直接cmd然后切到VC目录下编译的，不过没有成功。最后没有在系统盘编译就成功了。

user: user-1
content: 你是打开 cmd.exe 然后切换到 VC 的安装目录下去编译的吗？ 你应该在开始菜单中选 Vistual Studio Tools 中的 Vistual Studio XXX Command Prompt 来进行编译。

user: user-0
content: 最终还是解决了。最终的原因是c文件不要放在C盘根目录下。2l说的也对，就要指明基础库的位置，但是感觉-l链接挺麻烦。其实将首页的文档中的批处理文件复制到.c文件其他盘同一个目录下执行就可以了。 之前我坑了用了C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT这个文件。。。

user: user-0
content: 引用 1 楼 u012033027 的回复:stdio.h只是头文件。如果要运行，得链接基础库，在linux下面叫libc。 在开发环境下面当然不用考虑，但是你要用命令行，就要指明基础库的位置，并且用“-l”选项与之相连。 好的，谢了，我先试一下。

user: user-2
content: stdio.h只是头文件。如果要运行，得链接基础库，在linux下面叫libc。 在开发环境下面当然不用考虑，但是你要用命令行，就要指明基础库的位置，并且用“-l”选项与之相连。
user-0 提问: 请问一下这个期望是咋算的？

回复:
user: user-1
content: 这个不是概率论的知识吗？和编程有毛关系

user: user-2
content: 算了，前面的算法不要了，我总是把简单的问题弄得很复杂。没人喜欢这种解题方法。 为了得分，我千方百计寻找一种容易的图径。。。          2z=2+x+y         2x=2+y         2y=2+z   望着三个方程，我在发呆，这能用得上吗？   我正在发呆着。。。  版主，能给分了吗？   我只要5分就可以了，这是我花很多时间才找到的。

user: user-3
content: 第1个四格 终止的 步数 4，3，2 概率 1/16,3/8,1/4,跨过 4,3 概率 1/16,1/4  第n个四格 终止的 步数 +3，+2 概率 *1/8,*1/2,跨过 +3,+2 概率 *1/8,*1/4 大概算到 第 4个 四格子 就可以确定大概的步数了

user: user-2
content: 您这是版主吗？ 不要开玩笑了，说得这么祥细了，舍不得分说一下 一个很简单的问题，快给分。

user: user-0
content: 引用 13 楼 c090869 的回复:版主，可以结贴吗？可以给分了吗？  如果我说的正确的话。 因为这题是寻择题，还可以应付的来，要不然可没办法， 应用基础知识，让机器算一下，这样简单多了。 如果进行了 1024*4 组跳，用二叉树分布下去到底13层，一共跳了14192+37*12次跳， 还剩37分枝没跳完，根据所给4种答案，最高期望值为4， 所以总的最高期望值为 （14192+37*16）/(1024*4)=3.609375,                  最低 “”“”“”“”“”（14192+37*13）/(1024*4)=3.5822.  没看懂。。。

user: user-2
content: 版主，可以结贴吗？可以给分了吗？  如果我说的正确的话。 因为这题是寻择题，还可以应付的来，要不然可没办法， 应用基础知识，让机器算一下，这样简单多了。 如果进行了 1024*4 组跳，用二叉树分布下去到底13层，一共跳了14192+37*12次跳， 还剩37分枝没跳完，根据所给4种答案，最高期望值为4， 所以总的最高期望值为 （14192+37*16）/(1024*4)=3.609375,                  最低 “”“”“”“”“”（14192+37*13）/(1024*4)=3.5822.

user: user-2
content: 算了1024*4种算法，平均最低步数为3.57324，还有37钟跳法没结束，按照1/3的缩小率。。。。。 明天再算

user: user-3
content: 引用 9 楼 lm_whales 的回复:22      3步，概率为 1/8  ----> 22      2步，概率为 1/4 2）出格， 下一个四格接着计算 3）第二 以及以后各个 4格，3格 终止，4格跨越 n.1) 不出格,止步     111       Si +3 步,  pi * 1/8.     12         Si +2 步,  pi * 1/8. -->1/4     21         Si +2 步，pi * 1/8  ---1/4 n.2)  出格,继续   112     Si+3+...步，pi *1/8*...     22       Si+2+...步，pi *1/4*...       第一个四格内部，跨出的概率为１/16 止步的概率为 15/16    第二个四格内　跨出的概率为３/８*１/16, 止步的概率为 5/8 *1/16 到二个四格 止步的步数，分别是  ４*1/16,3*1/8*3,2*1/4 ,　  （4+3） *1/16 *1/8 ,（4+２）*　 1/16 *1/４*２ （３+3)*１/８*1/8,(3+3)*1 /8*1/4*2

user: user-3
content: 题目只有前跳，一格，两格 所以概率各为1/2，不然就不是1/2 了  第一个四格，4格终止，5格跨越 1）不出格，在此止步 1111   4步，概率为 1/16 112    3步，概率为 1/8 121    3步，概率为 1/8 211    3步，概率为 1/8 22      3步，概率为 1/8  2）出格， 下一个四格接着计算 1112  4步+nextS+..., 1/16* nextP*... 122    3步+nextS+..，1/8 *nextp*... 212    3步+nextS+..，1/8 *nextp*...  3）第二 以及以后各个 4格，3格 终止，4格跨越 n.1) 不出格,止步     111       Si +3 步,  pi * 1/8.     12         Si +2 步,  pi * 1/8.     21         Si +2 步，pi * 1/8 n.2)  出格,继续   112     Si+3+...步，pi *1/8*...   22       Si+2+...步，pi *1/4*...     以此类推

user: user-4
content: 1号格子与2号都只能前进吗？因为没有两格来退  另外退后是否也算是走了一步？  楼主发在了C/C++版块，我就觉得自己算会很复杂，写一个函数来执行，通过随机数判断前进与后退，并统计步数，达到要求退出，然后调用这个函数多次，看平均步数与选项哪一个最接近。。

user: user-5
content: 请参考，虽然我看不懂 http://blog.csdn.net/u010476094/article/details/48110405

user: user-3
content: 按照 每四格 作为一个 步骤，求出跨越四格的概率，和不跨越的概率  统计所有不跨越的概率

user: user-3
content: 步数越多，概率越小

user: user-3
content: 所谓期望，指的是数学期望，类似平均值  最少 步数 为 2 步  每步两格子 最多步数不确定 按照概率算出某种（加权）平均值 就是 期望的步数

user: user-0
content: 引用 7 楼 paschen 的回复:1号格子与2号都只能前进吗？因为没有两格来退  另外退后是否也算是走了一步？  楼主发在了C/C++版块，我就觉得自己算会很复杂，写一个函数来执行，通过随机数判断前进与后退，并统计步数，达到要求退出，然后调用这个函数多次，看平均步数与选项哪一个最接近。。...

user: user-6
content: 选 2 吧  跳 2 次，一步和二步的概率都是 50%，那期待的结果就是 1 次跳 1 步，1 次 跳 2 步，总共跳了 3 步，编号 1 开始，经过 3 步编号就是 4 了

user: user-7
content: 步数*概率，求和。 例如： 1步结束的概率为0，2步结束的概率为1/2*1/2+1/2*1/2，对应的情况是1格、两格；两格、一格。 所以，期望步数是： 1*0 + 2 *(1/2*1/2 + 1/2*1/2) + 3 *... 抱歉没有算完，有点复杂。
user-0 提问: 笔试题目

回复:
user: user-1
content: 输入的时候按ctrl+z;

user: user-2
content: 先输入2 8 回车 输入一个字符串后回车 就会出现结果 然后再输入一个字符串 再回车

user: user-3
content: 小bug：  printf("%.*s\n", 8, p); 改为： printf("%.*s\n", N, p);

user: user-3
content: 参考如下：  /* 按要求分解字符串，输入两个数M，N；M代表输入的M串字符串，N代表输出的每串字符串的位数，不够补0。 例如：输入2, 8， “abc” ，“123456789”，则输出为“abc00000”, “12345678“, ”90000000” */ #include <stdio.h> #include <string.h> #define MAXSIZE 100 char ln[MAXSIZE]; int i, j, L; static int M, N; char *p; int main(void) { 	i = 0; 	scanf("%d%d", &M, &N); 	while (i < M) 	{ 		scanf("%s", ln); 		L = strlen(ln); 		p = ln; 		while (L > 0) 		{ 			if (L >= N) 			{ 				printf("%.*s\n", 8, p); 				p += N; 			} 			else 			{ 				printf("%s%0*d\n", p, N - L, 0); 				break; 			} 			L -= N; 		} 		i++; 	} 	return 0; }

user: user-4
content: 题目的意思是需要你自己去实现 函数功能，至于输入  楼上的已经跟你解析清楚了 void solve(char* str,int n,int len) { 	while(n<len) 	{ 		printf("%.*s\r\n",n,str); 		str = str+n; 		len = len - n; 	} 	for (int i=0;i<n;++i) 	{ 		if (i<len) 		{ 			printf("%c",*(str+i)); 		} 		else 		{ 			printf("0"); 		} 	} }

user: user-5
content: scanf的返回值由后面的参数决定 scanf("%d%d", &a, &b); 如果a和b都被成功读入，那么scanf的返回值就是2 如果只有a被成功读入，返回值为1 如果a和b都未被成功读入，返回值为0 如果遇到错误或遇到end of file，返回值为EOF。 且返回值为int型.scanf返回的是成功扫描进的数的个数

user: user-6
content: 按照你的代码，你编译运行后，控制台会出现输入光标，你输入的头两个数字就代表M,N（以空格间隔，输入完M,N按回车），然后依次输入M个字符串，每输入一个字符串，按下回车，就会得到分解后的字符串结果（如果你的solve函数完成了分解代码编写）。 输入完M个字符串后，又到了另一轮的输入M,N——依次输入字符串——得到分解字符串  如果想结束while(scanf("%d %d",&m,&n) != EOF)循环，在每轮输入的开始，按下Ctrl+Z，scanf函数就会返回EOF
user-0 提问: main(t,_,a)char *a;{}这个声明怎么理解?

回复:
user: user-0
content: 感谢感谢感谢

user: user-1
content: 这种是以前很老的 C 语言语法了  main 返回 int, 默认的 t, _ 的类型也是默认成 int a 的类型为 char×  所以就是  int main(int t, int_, char* a) { }
user-0 提问: 新手急求帮忙！简单C语言程序！急求重谢！

回复:
user: user-1
content: 引用 2 楼 D_CHRIS 的回复:[quote=引用 1 楼 user-1的回复:] if(strcmp(W[i].name,s)==0)   //如果重复        {                          W[i].time++;                 flag=1;                 sum++;                }        重复的 sum 就别 ++ 了吧 请问一下如果想要不分大小写单词统计词频，如何实现最小程度的改动？[/quote]  strcmp 换成 stricmp

user: user-0
content: 引用 1 楼 user-1的回复: if(strcmp(W[i].name,s)==0)   //如果重复        {                          W[i].time++;                 flag=1;                 sum++;                }        重复的 sum 就别 ++ 了吧 请问一下如果想要不分大小写单词统计词频，如何实现最小程度的改动？

user: user-1
content: if(strcmp(W[i].name,s)==0)   //如果重复        {                          W[i].time++;                 flag=1;                 sum++;                }        重复的 sum 就别 ++ 了吧
user-0 提问: 写了一段程序，不知道是什么错误，求指点

回复:
user: user-1
content: 存指针试试呢?

user: user-2
content: 引用 2 楼 user-3 的回复:[quote=引用 1 楼 hnwyllmm 的回复:] it=V.find(A);这里返回的是不能修改的，相当于const * 引用 1 楼 hnwyllmm 的回复:it=V.find(A);这里返回的是不能修改的，相当于const *  那么从set中查找出来的对象，有什么办法去修改呢？[/quote] 按说是不能修改的，不过你可以强制转换成非const *再修改，虽然可行但是违反了set的设计原则 看楼主设计的这个类，应该是cost是key，其它的做value，用map结构正合适

user: user-3
content: 引用 1 楼 hnwyllmm 的回复:it=V.find(A);这里返回的是不能修改的，相当于const * 引用 1 楼 hnwyllmm 的回复:it=V.find(A);这里返回的是不能修改的，相当于const *  那么从set中查找出来的对象，有什么办法去修改呢？

user: user-2
content: it=V.find(A);这里返回的是不能修改的，相当于const *
user-0 提问: 前辈们dev c++如何静态链接

回复:
user: user-1
content: 用depends.exe查看exe依赖的dll及其版本号。

user: user-0
content: 已经测试了，没问题，dev不错

user: user-2
content: 参考http://blog.csdn.net/visioncat/article/details/79950

user: user-0
content: 引用 1 楼 宋寒松的回复:取决于具体的LIB和应用。 就是控制台程序，不是vs有个选择mt那个选项吗，这个不知道咋弄呢，就是生成的exe在别的电脑可以直接运行

user: user-2
content: 取决于具体的LIB和应用。
user-0 提问: 代码26行的LINK_NODE** pNext是什么意思，是指针吗？

回复:
user: user-1
content: LINK_NODE** pNext  二级指针，用来存储指针的地址，即指向指针的指针

user: user-2
content: 指针的指针，当然也是指针

user: user-3
content: 因为要修改 指针本身，所以传递二级指针 因为 需要传递二级指针，所以不能直接用 (*pNode)->next 只能用它的地址 因为 & 的优先级不如 -> 高， 所以 & (*pNode)->next 是 (*pNode)->next的地址， 即& （(*pNode)->next） 而不是 （&(*pNode)）->next -------这个表达式不是一个合法表达式-----

user: user-4
content: LINK_NODE** pNext  表示二级指针。 在函数中如果需要修改指针指向的地址时，需要使用二级指针。因为如果传入如void xxxx(*p)在函数中写p=&other是不能修改原指针指向的。同值传递的概念相同。
user-0 提问: 前辈们vs2015如何创建c语言win32项目，不是控制台

回复:
user: user-1
content: 这和win10没关系啊，你建立项目时候选择控制台，或者是空项目就可以了

user: user-0
content: 好的各位前辈，麻烦了，我记下了，等以后再装回win10再试试，先在xp下学习了

user: user-2
content: 不好意思，刚才看错了。以为是要创建控制台程序。 要创建win32，只要把MFC的框架关掉就能正常编译。

user: user-2
content: 改一下你的Link选项。

user: user-3
content: 创建的时候选 Win32 项目，在向导的时候有个勾选 Empty Project 勾上就行了。

user: user-0
content: 引用 1 楼 user-4的回复:微软的编译器是靠后缀区别c和c++的, 后缀名改成c就行了。  不过做软件开发, c++比较好, 反正基本兼容c. 是的前辈，我的意思是，控制台程序可以建立空白项目，然后往里面再加入.c源文件就行了，可是，建立win32窗口程序就没办法只建立空白项目，而是创建后里面有很多的头文件和源文件，选择空白项目也不行，我是想按照 Windows程序设计 这本书写入代码，但是要怎么弄呢，建立空白控制台程序写这书上的代码出错，而win32窗体程序又无法建立空白程序，咋办呢

user: user-0
content: 引用 3 楼 user-4的回复:[quote=引用 2 楼 hahajing3998 的回复:] [quote=引用 1 楼 user-4的回复:]微软的编译器是靠后缀区别c和c++的, 后缀名改成c就行了。  不过做软件开发, c++比较好, 反正基本兼容c. 是的前辈，我的意思是，控制台程序可以建立空白项目，然后往里面再加入.c源文件就行了，可是，建立win32窗口程序就没办法只建立空白项目，而是创建后里面有很多的头文件和源文件，选择空白项目也不行，我是想按照 Windows程序设计 这本书写入代码，但是要怎么弄呢，建立空白控制台程序写这书上的代码出错，而win32窗体程序又无法建立空白程序，咋办呢[/quote]  直接空白项目就行，我建立桌面程序从来都是空白程序，建立win32项目只是IDE事先配置好了一些项目属性。 比如: 默认给了一个烂框架, 设置了连接器里面的“子系统”等等。 默认的空白项目很不错，main, wmain, WinMain wWinMain这几个入口函数直接用就行, 自动识别 [/quote] 我换回了xp，学好以后再说吧，用的devc

user: user-4
content: 引用 2 楼 hahajing3998 的回复:[quote=引用 1 楼 user-4的回复:]微软的编译器是靠后缀区别c和c++的, 后缀名改成c就行了。  不过做软件开发, c++比较好, 反正基本兼容c. 是的前辈，我的意思是，控制台程序可以建立空白项目，然后往里面再加入.c源文件就行了，可是，建立win32窗口程序就没办法只建立空白项目，而是创建后里面有很多的头文件和源文件，选择空白项目也不行，我是想按照 Windows程序设计 这本书写入代码，但是要怎么弄呢，建立空白控制台程序写这书上的代码出错，而win32窗体程序又无法建立空白程序，咋办呢[/quote]  直接空白项目就行，我建立桌面程序从来都是空白程序，建立win32项目只是IDE事先配置好了一些项目属性。 比如: 默认给了一个烂框架, 设置了连接器里面的“子系统”等等。 默认的空白项目很不错，main, wmain, WinMain wWinMain这几个入口函数直接用就行, 自动识别

user: user-4
content: 微软的编译器是靠后缀区别c和c++的, 后缀名改成c就行了。  不过做软件开发, c++比较好, 反正基本兼容c.
user-0 提问: write函数返回值总是为-1

回复:
user: user-1
content: OPEN时设置O_RDWR，表示可读可写，再试试看

user: user-2
content: 楼主是用读模式打开文件吗？那样肯定不能写了。系统调用返回失败，看看errno是什么才容易定位问题

user: user-0
content: 少了个字，望各位不吝赐教，谢谢
user-0 提问: 关于指针的一些问题

回复:
user: user-1
content: 引用 3 楼 zwy1114860564 的回复:指针是地址，指向int和指向double的指针有什么不同，指针本身除了地址信息之外，还有其他信息，例如怎么解析这个地址的内容，指向int的指针就说明了这个地址后面的两个字节的内容是可以解析为int的，同理指向double的指针就说这个指针后面的四个字节的内容可以解析为double。可以看到两个指针首先是指向内存大小不一样，然后是最后解析成的内容不一样。 有道理

user: user-2
content: 指针是地址，指向int和指向double的指针有什么不同，指针本身除了地址信息之外，还有其他信息，例如怎么解析这个地址的内容，指向int的指针就说明了这个地址后面的两个字节的内容是可以解析为int的，同理指向double的指针就说这个指针后面的四个字节的内容可以解析为double。可以看到两个指针首先是指向内存大小不一样，然后是最后解析成的内容不一样。

user: user-3
content: 指针本身是相同类型的， 但用*来取值时，就依赖它所指的变量类型。

user: user-4
content: 指针变量都是用来存放其它类型数据的地址，地址都是一样的  定义为不同类型的指针，主要是便于取值，以及告诉程序员指针指向的是什么类型的数据，便于访问。如将double类型指针强制转换成int型时，在使用*取值符号时，程序就会以Int型格式来取double的数据，而浮点型和整形在存储格式上的差异，导致取出的数据不光是精度的丢失，显示结果完全不一样
user-0 提问: C语言新手求助，想编一个小程序但是有一部分卡住了

回复:
user: user-1
content: 楼主，可以考虑以字符ASCII码为数组下标值，ASCII总共128个字符 ，就定义128个元素的数组。 先都将time初始化为0，word = 数组下标值（存储字符，便于后续排序，且没必要声明为一个数组，一个char就行）。 当读入一个字符时，直接w[ch]++;   如果统计的是字符串，可以用map，hash_map
user-0 提问: 这个素数表输出为什么出问题了？求大神

回复:
user: user-1
content: 楼主，你插断点看看，是不是数组越界了

user: user-2
content: 问题明白了记得结贴哦

user: user-2
content: # include<stdio.h> # define stu 11 int sum(int x, int a[], int st2);  int main(void) {     int a[stu] = { 2 };     int x = 3;     int i = 2;      sum(x, a, stu);      for (i = 2; i < stu; i++)     {         printf("素数表：%d\t", a[i]);     }      return 0; } int sum(int x, int a[], int st2) {     int i = 2;     int b = 3;     int j;      for (j = 2; j < st2; x++, j++)     {         for (i = 2, b = 3; i < x; i++, b++)         {             if (x % i == 0)             {                 x++;                 continue;             }              if (x == b)             { 				/********当b=10时，会出现数组越界，所以会导致程序崩溃*******/                 //a[b] = x; printf("a[b] -> %d\n", a[b]); continue;   				/**************************************** 				* 				* 修改：qianghaohao 				* 出错主要原因是数组越界问题！！！ 				* 				*****************************************/ 				a[b - 1] = x;  				printf("a[b] -> %d\n", a[b -1]); continue;             }  			/*****这样终止循环也会导致数组越界*****/ 			//if (st2 == j) 			//{ 			//	break; 			//} 			         }  		/**************************************** 		* 		* 修改：qianghaohao 		* 出错主要原因是数组越界问题！！！ 		* 将退出循环条件写到外面并改一下条件。 		* 		*****************************************/ 		if (st2 == x) 		{ 			break; 		}     }      {         int i;         for (i = 2; i < st2; i++)         {             printf("实验素数表：%d\t", a[i]);         }     }      return a[b - 1]; 	 }   出错原因已经注释了，主要原因是数组越界问题，程序逻辑设计不太好，所以容易不知不觉就越界了。
user-0 提问: 有木有人在吗？关于指针函数的函数指针这个绕绕的词

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  typedef int* (*pfun_t)(void);  int* create(void) {     int* ai = (int*)malloc(sizeof(int));     return ai; }  void destory(int* ai) {     if(ai != NULL){         free(ai);     } }  int main(int argc, char* argv[]) {     /** fun就是指针函数的函数指针 */     pfun_t fun = create;     printf("%p\n", fun);      return 0; }  引用 楼主 yff12321 的回复: 如上，能有味大神给解释一下吗？实在是想不通and想不懂啊？函数指针指向了一个函数的首地址，那指针函数的函数指针又是个什么玩意？

user: user-2
content: 引用 2 楼 yff12321 的回复:[quote=引用 1 楼 cjqpker 的回复:] 首先， 指针函数 —— 是一个函数，这个函数返回值是指针类型 函数指针 —— 是一个指针，这个指针指向一个函数 其次， 函数指针，是个相对比较正式的概念，实际中也会偶尔使用到函数指针，多用于注册回调函数。 指针函数，我觉得不应该作为一个概念被提出来，多半是为了混淆人或达到一种字面上的效果而被提出来的，因为返回值各种各样，没必要把返回指针的函数单独拎出来给个概念。不然，也可以说整形函数、浮点函数、向量函数、引用函数、空函数等等等等，没什么实际用处，楼主不需要重视这个东西。那我想问的是，函数指针a也可以是一个函数吗？我真的有点被绕晕[/quote]  函数指针指向一个函数的地址，而调用函数的过程也就是跳转至函数的首地址处开始执行，因此函数指针可以正常调用的。

user: user-0
content: 引用 1 楼 cjqpker 的回复:首先， 指针函数 —— 是一个函数，这个函数返回值是指针类型 函数指针 —— 是一个指针，这个指针指向一个函数 其次， 函数指针，是个相对比较正式的概念，实际中也会偶尔使用到函数指针，多用于注册回调函数。 指针函数，我觉得不应该作为一个概念被提出来，多半是为了混淆人或达到一种字面上的效果而被提出来的，因为返回值各种各样，没必要把返回指针的函数单独拎出来给个概念。不然，也可以说整形函数、浮点函数、向量函数、引用函数、空函数等等等等，没什么实际用处，楼主不需要重视这个东西。那我想问的是，函数指针a也可以是一个函数吗？我真的有点被绕晕

user: user-2
content: 首先， 指针函数 —— 是一个函数，这个函数返回值是指针类型 函数指针 —— 是一个指针，这个指针指向一个函数 其次， 函数指针，是个相对比较正式的概念，实际中也会偶尔使用到函数指针，多用于注册回调函数。 指针函数，我觉得不应该作为一个概念被提出来，多半是为了混淆人或达到一种字面上的效果而被提出来的，因为返回值各种各样，没必要把返回指针的函数单独拎出来给个概念。不然，也可以说整形函数、浮点函数、向量函数、引用函数、空函数等等等等，没什么实际用处，楼主不需要重视这个东西。
user-0 提问: openssl库使用求解

回复:
user: user-1
content: 确定代码是这么写的(../..crypto/evp/evp.h)？..crypto 根本就是错的啊。

user: user-0
content: 这个头文件确实有问题   我也发现了  但是改过来还是会报这个错误
user-0 提问: 求助,关于c的小问题

回复:
user: user-1
content: #ifdef xxx typedef int elem_type; #define ELEM_FORMAT  "%d" #else typedef char elem_type; #define ELEM_FORMAT  "%c" #endif  ....  printf("Some Worlds"  ELEM_FORMAT  "Other Worlds",  var_of_elem);

user: user-2
content: 可以考虑使用sizeof进行判断。

user: user-3
content: 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George

user: user-4
content: 引用 6 楼 CrabKun 的回复:     switch(sizeof(elem_type))     {         case sizeof(int):printf("int");break;         case sizeof(char):printf("char");break;         case sizeof(double):printf("double");break;     }  如果是非内置类型，怎么办？

user: user-5
content: switch(sizeof(elem_type))     {         case sizeof(int):printf("int");break;         case sizeof(char):printf("char");break;         case sizeof(double):printf("double");break;     }

user: user-4
content: 使用cout

user: user-6
content: 2楼正解...

user: user-7
content: 你这段代码不是已经给出了答案了吗elem_type是 int     那么 printf("%d",....) elem_type是 char     那么 printf("%c",....)

user: user-8
content: C语言中没有直接的办法，可以尝试：  if(sizeof(elem_type) == 1){     printf("%c",....); } else{     printf("%d",....); }

user: user-9
content: 用if + typeid判断进行输出
user-0 提问: 文件指针

回复:
user: user-1
content: FILE 是C语言，文件流 数据结构。 FILE指针，不是文件指针，只是FILE流指针，是FILE这种数据结构的指针。  文件指针，指的是文件打开后，准备读写的文件位置， 这个位置文件打开后，文件系统中，存有它的记录。 一些文件操作，会用到它，读写它。  文件指针 ，也不是C语言的指针概念，虽然在某种程度上，有相似的含义。

user: user-2
content: 你只是保存指针地址是没用，要复制整个FILE结构体。  引用 3 楼 u011084550 的回复:[quote=引用 1 楼 user-3 的回复:] 在filecpy的时候，文件指针已经移动到了文件尾部，所以在filecpy的时，可能读不到东西，所以就跳出了。 引用 2 楼 walkiz 的回复:filecopy的时候，fp1和fp2的文件指针已经移到末尾，所以filecmp会出错。你可以在filecmp之前用fseek函数把fp1和fp2的文件指针移到前面：  fseek(fp1, 0L, SEEK_SET); fseek(fp2, 0L, SEEK_SET);  我之前定义了fp5,fp6保存fp1, fp2初始的值,然后在调用filecmp之前又赋值给fp1,fp2,为什么也是一样? [/quote]

user: user-0
content: 引用 1 楼 user-3 的回复:在filecpy的时候，文件指针已经移动到了文件尾部，所以在filecpy的时，可能读不到东西，所以就跳出了。 引用 2 楼 walkiz 的回复:filecopy的时候，fp1和fp2的文件指针已经移到末尾，所以filecmp会出错。你可以在filecmp之前用fseek函数把fp1和fp2的文件指针移到前面：  fseek(fp1, 0L, SEEK_SET); fseek(fp2, 0L, SEEK_SET);  我之前定义了fp5,fp6保存fp1, fp2初始的值,然后在调用filecmp之前又赋值给fp1,fp2,为什么也是一样?

user: user-2
content: filecopy的时候，fp1和fp2的文件指针已经移到末尾，所以filecmp会出错。你可以在filecmp之前用fseek函数把fp1和fp2的文件指针移到前面：  fseek(fp1, 0L, SEEK_SET); fseek(fp2, 0L, SEEK_SET);

user: user-3
content: 在filecpy的时候，文件指针已经移动到了文件尾部，所以在filecpy的时，可能读不到东西，所以就跳出了。
user-0 提问: centos中守护进程的fputs（）输出的内容会存到什么地方？

回复:
user: user-1
content: 守护进程出错处理 守护进程调用了setsid函数就不再拥有控制终端，所以就无法正常向标准输出stdout或标准出错stderr（比如出错信息）输出信息。幸运的是系统日志守护进程syslogd可以提供这一服务。   Syslog 函数 #include<syslog.h> voidopenlog(char *ident, int option, int facility);         //打开日志 voidsyslog(int priority, char *format, …);                 //写入消息 voidcloselog(void);                                                 //关闭日志
user-0 提问: 仿真时VS监视的数据和我赋的值不一致

回复:
user: user-1
content: http://bbs.csdn.net/topics/390676437 char s[20]; sprintf(s,"%lg",num0);

user: user-0
content: 引用 2 楼 wang0635 的回复:二进制里的12.45是无限小数，只能存有限位，所以不准了。小数要都准确，不能用float、double，要自己想办法 谢谢回复：如果想将12.45转化成字符串，那结果完全都不对了，请问有什么解决办法吗

user: user-2
content: 二进制里的12.45是无限小数，只能存有限位，所以不准了。小数要都准确，不能用float、double，要自己想办法

user: user-3
content: 正常
user-0 提问: 求助，getchar（）能读取float数吗？

回复:
user: user-1
content: 可以用cin直接输入到float变量 如果输入到字符数组中，需要转换成double可以使用_ttof，该函数如果输入的是字母等非法值，返回的是0.0 如果要检查字符数组是否是合法浮点数，可以参看：http://download.csdn.net/download/paschen/4243026

user: user-2
content: 引用 4 楼 qq_30446977 的回复:[quote=引用 3 楼 heroesjun 的回复:] [quote=引用 2 楼 qq_30446977 的回复:] [quote=引用 1 楼 heroesjun 的回复:] 不行的， getchar只能读取一个char，也就是一个字节，但输入一个浮点数，有多个字符。用gets函数和strtof函数： char buf[32] = {0}; gets(buf); float f = strtof(buf, NULL);  怎么判断输入流上哪个是float数呢？？ 怎么判断输入流上哪个是float数呢？？[/quote]  输入流失什么格式，举个例子。[/quote]  原题是，编写一个程序，读入、存储以及输出下列5中类型的字符串，每个字符串占一行，字符串间不能有空格。 1.类型1：一串小写字母，后跟一个数字（如number1 2.类型2：两个单词，每个单词的第一个字母大写，单词间用—分隔（如Olive-Up 3.类型3：小数如3.21 4.类型4：一串大小写字符加空格（如Seven Up 5.类型5：一串除了空格及数字外的任何字符（如floating-point 第1和2编写玩了，第3个就抓瞎了。不过研究半天了，对输入流和返回流了解加深了。已经能做到从流上用gets读取字符到字符串，然后用atof提取浮点数。但是实验半天后发现，发现43.21读到字符串中时，是3个字符分别是“43“、”.”、“21”是3个字符。[/quote]getchar()循环存数组里,然后atof(s)判断返回值时候否是浮点数

user: user-3
content: 你先要理解字符和字符串的区别。

user: user-4
content: 你的需求其实跟自己写词法分析器是一样的，参考http://blog.csdn.net/felicitia/article/details/8109137。

user: user-0
content: 引用 3 楼 heroesjun 的回复:[quote=引用 2 楼 qq_30446977 的回复:] [quote=引用 1 楼 heroesjun 的回复:] 不行的， getchar只能读取一个char，也就是一个字节，但输入一个浮点数，有多个字符。用gets函数和strtof函数： char buf[32] = {0}; gets(buf); float f = strtof(buf, NULL);  怎么判断输入流上哪个是float数呢？？ 怎么判断输入流上哪个是float数呢？？[/quote]  输入流失什么格式，举个例子。[/quote]  原题是，编写一个程序，读入、存储以及输出下列5中类型的字符串，每个字符串占一行，字符串间不能有空格。 1.类型1：一串小写字母，后跟一个数字（如number1 2.类型2：两个单词，每个单词的第一个字母大写，单词间用—分隔（如Olive-Up 3.类型3：小数如3.21 4.类型4：一串大小写字符加空格（如Seven Up 5.类型5：一串除了空格及数字外的任何字符（如floating-point 第1和2编写玩了，第3个就抓瞎了。不过研究半天了，对输入流和返回流了解加深了。已经能做到从流上用gets读取字符到字符串，然后用atof提取浮点数。但是实验半天后发现，发现43.21读到字符串中时，是3个字符分别是“43“、”.”、“21”是3个字符。

user: user-3
content: 引用 2 楼 qq_30446977 的回复:[quote=引用 1 楼 heroesjun 的回复:] 不行的， getchar只能读取一个char，也就是一个字节，但输入一个浮点数，有多个字符。用gets函数和strtof函数： char buf[32] = {0}; gets(buf); float f = strtof(buf, NULL);  怎么判断输入流上哪个是float数呢？？ 怎么判断输入流上哪个是float数呢？？[/quote]  输入流失什么格式，举个例子。

user: user-0
content: 引用 1 楼 heroesjun 的回复:不行的， getchar只能读取一个char，也就是一个字节，但输入一个浮点数，有多个字符。用gets函数和strtof函数： char buf[32] = {0}; gets(buf); float f = strtof(buf, NULL);  怎么判断输入流上哪个是float数呢？？ 怎么判断输入流上哪个是float数呢？？

user: user-3
content: 不行的， getchar只能读取一个char，也就是一个字节，但输入一个浮点数，有多个字符。用gets函数和strtof函数： char buf[32] = {0}; gets(buf); float f = strtof(buf, NULL);
user-0 提问: pat不满分不知道为什么  求助=。=  Basic Level 1007素数对猜想

回复:
user: user-1
content: #1有错。数组够大了。char不够。试改为int p[50000];

user: user-1
content: 注意题中N的范围。LZ程序中的char p[50000]数组不够大,char类型也太小.试改为: static int p[100000];
user-0 提问: C语言 帮我看看哪里错了  在线求大神

回复:
user: user-1
content: 修改如下：  #include <stdio.h> #include <math.h> int Discriminant(int a, int b, int c) { 	int sam; 	//sam = b ^ 2 - 4 * a*c;   //^是异或运算，下同 	sam = b * b - 4 * a*c; 	return sam; } float Boot1(int a, int b, int c) { 	float boot1; 	boot1 = (-b + sqrt(b * b - 4 * a*c)) / (2 * a); 	return boot1; } float Boot2(int a, int b, int c) { 	float boot2; 	boot2 = (-b - sqrt(b * b - 4 * a*c)) / (2 * a); 	return boot2; } int main() { 	int a, b, c; 	a = b = c = 0; 	float boot1, boot2; 	printf("请输入二次项系数（以回车结束）："); 	scanf("%d", &a); 	printf("请输入一次项系数（以回车结束）："); 	scanf("%d", &b); 	printf("请输入常数项（以回车结束）："); 	scanf("%d", &c); 	if (Discriminant(a, b, c) >= 0) 	{ 		boot1 = Boot1(a, b, c); 		boot2 = Boot2(a, b, c); 		printf("根1：%.2f\n", boot1); 		printf("根2：%.2f\n", boot2); 	} 	else 	{ 		printf("此函数无实数根！\n"); 	} 	return 0; }

user: user-2
content: 函数重名了啊啊 啊 啊啊

user: user-3
content: 函数名字写错了啊，楼主辛苦了～～

user: user-4
content: int main（）      2个 Boot1！
user-0 提问: 请教一个C语言指针问题

回复:
user: user-1
content: 13行，p是NULL,，给*p赋值就是写0位置的内存，这个内存是不可以写的，所以非法操作内存，自然错误。

user: user-2
content: 局部指针不能返回，函数退出后栈中的数据是无法掌控的：  #include <stdio.h> #include <stdlib.h> #include <time.h>  int arr[100];  void arry(void) {     int i;     srand(time(0));     for(i = 0; i < 10; i++) {         arr[i] = rand()%100 + 1;     } }  int main(void) {     int i;     arry();     for(i = 0; i < 10; i++) {         printf("%d\n", arr[i]);     } }

user: user-3
content: 你具体想做什么？ 12行类型转换、13行返回一个局部变量都有问题。

user: user-4
content: 老是发错 再来一次  #include <stdio.h> #include <stdlib.h> #include <time.h>  void arry(int arr[]){      int i;     srand(time(0));     for(i = 0; i < 10; i++){         arr[i] = rand()%100 + 1;     }  }  int main(void){     int i, arr[100];      arry(arr);     for(i = 0; i < 10; i++){              printf("%d ", arr[i]);     } }

user: user-4
content: #include <stdio.h> #include <stdlib.h> #include <time.h>  void arry(int arr[]){     //int *p = 0;     int i;//, arr[100];     srand(time(0));     for(i = 0; i < 10; i++){         arr[i] = rand()%100 + 1;     }     //*p =(int) &arr;   //  return &arr; }  int main(void){     int i, arr[100];     int arr2[100]     arry(arr);     for(i = 0; i < 10; i++){         arr2[i] = arry();         printf("%d,", arr2[i]);     } }

user: user-4
content: 我也是新手 试着改一下 看看对不 #include <stdio.h> #include <stdlib.h> #include <time.h>  int arry(int arr[]){     //int *p = 0;     int i;//, arr[100];     srand(time(0));     for(i = 0; i < 10; i++){         arr[i] = rand()%100 + 1;     }     //*p =(int) &arr;     return &arr; }  int main(void){     int i, arr[100];     arry(arr);     for(i = 0; i < 10; i++){         //arr[i] = arry();         printf("%d,", arr[i]);     } }

user: user-5
content: 你返回的是指针的指针，而且这个指针还是在栈里面。实在是奇怪。
user-0 提问: 新手求帮助，题目不复杂

回复:
user: user-1
content: 引用 7 楼 ye736986237的回复:[quote=引用 6 楼 zh1599512 的回复:] 奇偶交叉，  i=0.  0%2=0为假 执行else. 输出`A`+0当然是A.    I=1执行。1+`a`=b.  入门提啊 坑爹啊，为什么下面是大写的B和C，误导我[/quote] 难道你没发现嘛?明显有错啊，

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

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

user: user-0
content: 引用 6 楼 zh1599512 的回复:奇偶交叉，  i=0.  0%2=0为假 执行else. 输出`A`+0当然是A.    I=1执行。1+`a`=b.  入门提啊 坑爹啊，为什么下面是大写的B和C，误导我

user: user-1
content: 奇偶交叉，  i=0.  0%2=0为假 执行else. 输出`A`+0当然是A.    I=1执行。1+`a`=b.  入门提啊

user: user-0
content: 引用 1 楼 cjqpker 的回复:C 这个题目就是考察ASCII表中a-z以及A-Z的分布，即使不知道这些字母的具体ASCII值，根据从小到大的顺序，也应该知道'a'+1='b'，'A'+1='B' 另外，观察一下ASCII表，就很清楚了 还是看不懂啊，能不能讲具体点，谢谢

user: user-3
content: 好复杂，太费脑。这种题目我都是抛硬币填答案：抛两次即可得到答案。

user: user-0
content: 嗯，怪不得，谢谢了

user: user-4
content: 引用 1 楼 cjqpker 的回复:C 这个题目就是考察ASCII表中a-z以及A-Z的分布，即使不知道这些字母的具体ASCII值，根据从小到大的顺序，也应该知道'a'+1='b'，'A'+1='B' 另外，观察一下ASCII表，就很清楚了 搞反了，应该是B。

user: user-4
content: C 这个题目就是考察ASCII表中a-z以及A-Z的分布，即使不知道这些字母的具体ASCII值，根据从小到大的顺序，也应该知道'a'+1='b'，'A'+1='B' 另外，观察一下ASCII表，就很清楚了
user-0 提问: 问一个移动宽带和电信宽带 应用程序通讯的问题，高手请进

回复:
user: user-0
content: 大侠，能否详细指导一下？  那业务该从哪里着手解决呢？

user: user-1
content: 路由器过滤掉了或少NAT穿透配置。

user: user-0
content: 不知道C板的大侠有没有经验的？  或者，哪位告诉我， CSDN的哪个版本， 有这方面的经验的人比较多啊
user-0 提问: cgdb调试标准输入的问题

回复:
user: user-1
content: cgdb是不是开源的？

user: user-0
content: up 起来，有高手解决了吗？

user: user-0
content: 搜索了一下，发现gdb tui模式也是如此。  看帖子： http://segmentfault.com/q/1010000000515825   有人会解决吗？
user-0 提问: c 指针下标问题 有点不太明白 请大家帮忙解释一下 

回复:
user: user-1
content: 修改如下：  #include <stdio.h> char *eatspace(char *d, char *s) { 	char *p = d; 	if(NULL == d || NULL == s) return d; 	while(*s) 	{ 		if(*s != ' ') *d++ = *s; 		s++; 	} 	*d = '\0'; 	return p; } char *leaveOneSpace(char *d, char *s) { 	char *p = d; 	if(NULL == d || NULL == s) return d; 	*d++ = *s++; 	while(*s) 	{ 		if(' ' == *(d - 1) && ' ' == *s) 			; 		else 			*d++ = *s; 		s++; 	} 	*d = '\0'; 	return p; } int main(void) { 	char s[] = "abc  def"; 	char d[20]; 	//printf("eatspace...\n"); 	//eatspace(d, s); 	//printf("s=%s\nd=%s\n", s, d); 	printf("leaveOneSpace...\n"); 	leaveOneSpace(d, s); 	printf("s=%s\nd=%s\n", s, d); 	return 0; }

user: user-2
content: 1楼的回答是正确的

user: user-3
content: 你要写成如下这样也是可以滴   void thkg(char *t ,char *p) {     while(*p != '\0')     {          if(*p !=' ' || *(p+1) != ' ')           {              *t++ = *p++;          }          else               p++;     }     *t='\0'; }

user: user-4
content: ++p可以，p++不可以，两者都会改变p的值，但是之后的 *t++ = *p;会用到p的值。需要看程序需要不需要p的值改变

user: user-5
content: 用p++的话, if(*p !=' ' || *(p++) != ' ') ||前后两个部分的是值判断是一样的，没有意义。 ++p可以用，只不过要对应修改，而且应该会比你现在这样效率更高

user: user-6
content: 引用 7 楼 eddition512 的回复:[quote=引用 1 楼 掌心的呵护的回复:]++p和p++都会改变p的值，所以不用。 不好意思 手机屏幕太小点错了。 这里的 p++ 先执行附近的运算再自增 这个好理解 但++p 是先自增 在这条语句中 它们与 p+1 有什么区别[/quote]  如下三句： if(*p !=' ' || *(p+1) != ' ') //为什么 这里的 *(p+1)  不能用 *(++p) 或 *(p++) 呢？ 编译环境 gcc 4.7.1 {      *t++ = *p; } p++; 在if判断语句这一行，可以使用++p来替换，但p的值被改变了（p=p+1），需要将下面的两句赋值修改为之前p的值；或者将最后一句去掉（因为p已完成自增）， *t++ = *p修改为 *t++ = *（p-1）;

user: user-0
content: 引用 1 楼 掌心的呵护的回复:++p和p++都会改变p的值，所以不用。 ++p和p++都会改变p的值，所以不用。[/quote] ++p和p++都会改变p的值，所以不用。[/quote] ++p和p++都会改变p的值，所以不用。[/quote] 不好意思 手机屏幕太小点错了。 这里的 p++ 先执行附近的运算再自增 这个好理解 但++p 是先自增 在这条语句中 它们与 p+1 有什么区别

user: user-6
content: ++p和p++都会改变p的值，所以不用。
user-0 提问: 求解

回复:
user: user-0
content: 引用 1 楼 赵4老师的回复:仅供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.   先 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\input.c n=4，k=-1是什么，不懂

user: user-1
content: 可以用getchar()一个个字符读，就可以不用回车来将缓冲区数据送入变量中 函数调用时，先将调用处下一条执行命令压入栈中（以便函数执行完后接着执行下一条语句），在逐个将参数压入栈中

user: user-2
content: “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。”

user: user-2
content: 调试时按Alt+7键查看Call Stack即“调用堆栈”，里面从上到下列出了对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

user: user-2
content: 仅供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.   先 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\input.c
user-0 提问: 设计一个完整的C程序，实现对某班级学生某门课程的成绩汇总与统计（班级人数不固定，用链表实现）

回复:
user: user-1
content: 每题写个函数就差不多了， 然后写个链表的数据结构： 定义链表，实现创建，插入，查找，删除，销毁

user: user-2
content: int main() {       printf("拒绝伸手党\n");       return 0; }

user: user-3
content: 楼主你真厉害，这么大的题目，有谁给你解答啊

user: user-4
content: https://www.baidu.com/s?wd=%E8%AE%BE%E8%AE%A1%E4%B8%80%E4%B8%AA%E5%AE%8C%E6%95%B4%E7%9A%84C%E7%A8%8B%E5%BA%8F%EF%BC%8C%E5%AE%9E%E7%8E%B0%E5%AF%B9%E6%9F%90%E7%8F%AD%E7%BA%A7%E5%AD%A6%E7%94%9F%E6%9F%90%E9%97%A8%E8%AF%BE%E7%A8%8B%E7%9A%84%E6%88%90%E7%BB%A9%E6%B1%87%E6%80%BB%E4%B8%8E%E7%BB%9F%E8%AE%A1%EF%BC%88%E7%8F%AD%E7%BA%A7%E4%BA%BA%E6%95%B0%E4%B8%8D%E5%9B%BA%E5%AE%9A%EF%BC%8C%E7%94%A8%E9%93%BE%E8%A1%A8%E5%AE%9E%E7%8E%B0%EF%BC%89%E3%80%82%E8%A6%81%E6%B1%82%EF%BC%9A%20%EF%BC%881%EF%BC%89%E8%AF%A5%E9%97%A8%E8%AF%BE%E7%A8%8B%E7%9A%84%E6%80%BB%E8%AF%84%E6%88%90%E7%BB%A9%3D%E5%B9%B3%E6%97%B6%E6%88%90%E7%BB%A9*30%25%2B%E6%9C%9F%E4%B8%AD%E6%88%90%E7%BB%A9*30%25%2B%E6%9C%9F%E6%9C%AB%E6%88%90%E7%BB%A9*40%25%EF%BC%9B%20%EF%BC%882%EF%BC%89%E5%AE%9A%E4%B9%89%E4%B8%80%E4%B8%AA%E7%BB%93&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_n=2&rsv_sug3=1&rsv_t=e3b1b9Ya6K50Oio3Gj5hCnGe7os4UGUQvcH6pLj9XM8UbTSeGI%2FwTD1R8suQuekqrYQ%2B&inputT=2215&rsv_sug4=2215

user: user-0
content: 诸位大神帮我看看

user: user-5
content: http://wenku.baidu.com/link?url=f7GOMaAwPs2cQ0LC_SLjsU_9TOpUZblFH_q-9FnJbXRCuVhVYPqE-vX925VwlJ_2dve71rx33yJulC_6l_M1fFjI2EBR-jS1ZheuXZ7_abi

user: user-4
content: 99%的C/C++作业题在百度都能搜到。

user: user-0
content: 赵4老师别逗我了
user-0 提问: 求解P++和P+1的区别

回复:
user: user-1
content: 引用 2 楼 zhao4zhong1 的回复:理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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-1
content: 这里用p++和p+1对于传入的参数值不同，前者就是p，而后者是p+1。 另外p++会对后续使用p带来影响。 这里的递归函数reverse01只需要p所指向的下一个地址即可，可写成p+1或者++p。但是++p改变了p值，反而后续输出则变得不正常。

user: user-3
content: p++传入的是p，之后才在自身加1，++p才是传入p+1

user: user-4
content: 你这里的reverse(p++)是先reverse(p)，再p+1，而reverse(p+1)是先p+1,在传给函数
user-0 提问: vs2008： error lnk2005 already defined in main.obj

回复:
user: user-1
content: 很明显，头文件中是不能定义变量的，你肯定这样做了

user: user-2
content: 楼主，你是不是在结构体声明时定义了结构体对象 这样定义的对象是全局变量，当有多个源文件包含它时，会出现重复定义
user-0 提问: c语言 二维数组和指针 求教。

回复:
user: user-1
content: a+1是以一维数组为整体上的的运算，偏移量为一维的大小，即a+1，指向第二行 &a+1是以二维数组为整体上的运算，偏移量为二维的大小（如a[4][5]，则二维的大小为4*5*sizeof(int)） *a是以元素为整体上的运算，偏移量为元素的大小，*a+1表示下一元素的地址

user: user-2
content: int (*p)[5] = a; int *p；  对于以上的定义，p是个指针变量，注意是变量，是变量就有其存储的地址即&p;同时由于是指针变量，所以也就有*p的操作，也就是取出其所指向的内容；一句话：p是变量本身，&p是变量p所在的地址，*p则是其指向的值；  int a[4][5]; 这个语句则定义了一个数组a，a的值本身就是个地址，是数组的起始地址，是个常量（注意，是个常量），而不是变量；所以a、*a，&a的值是相同的都是数组的起始地址；这一点要和变量区分开；

user: user-0
content: 引用 7 楼 sunday20060101的回复:int (*p)[5] = a; int *p；  对于以上的定义，p是个指针变量，注意是变量，是变量就有其存储的地址即&p;同时由于是指针变量，所以也就有*p的操作，也就是取出其所指向的内容；一句话：p是变量本身，&p是变量p所在的地址，*p则是其指向的值；  int a[4][5]; 这个语句则定义了一个数组a，a的值本身就是个地址，是数组的起始地址，是个常量（注意，是个常量），而不是变量；所以a、*a，&a的值是相同的都是数组的起始地址；这一点要和变量区分开； int (*p)[5] = a; int *p；  对于以上的定义，p是个指针变量，注意是变量，是变量就有其存储的地址即&p;同时由于是指针变量，所以也就有*p的操作，也就是取出其所指向的内容；一句话：p是变量本身，&p是变量p所在的地址，*p则是其指向的值；  int a[4][5]; 这个语句则定义了一个数组a，a的值本身就是个地址，是数组的起始地址，是个常量（注意，是个常量），而不是变量；所以a、*a，&a的值是相同的都是数组的起始地址；这一点要和变量区分开；[/quote] a+1.  &a+1.  *a+1值为什么不一样?

user: user-3
content: 引用 3 楼 user-4的回复:a 是二维数组首地址 *a 与a[0]等价，   &a  不知道 &a是一个数组的地址

user: user-1
content: 楼主，没必要纠结这个，对编程没有多大作用，只要记住，数组名并没有存储在内存空间中，在编译时，会将数组名转换成数组数据的首地址

user: user-1
content: 楼主可以将*(a+1)转换成a[1]，可以将二维数组借助数组指针理解（不能等同，毕竟数组指针是一个指针，指针本身也要内存空间），a理解为第一行的地址，a+1为第二行的地址，*（a+1）为第二行第一元素的地址。

user: user-4
content: a 是二维数组首地址 *a 与a[0]等价，   &a  不知道

user: user-0
content: 引用 1 楼 ant2012 的回复:静态数组，*a   &a  a这三个表示都是数组的首地址 这是编译机制的问题，不要用指针的方式去理解，楼主有兴趣可以看看这段代码的汇编代码，发现它们的汇编代码是一样的  也可以这么理解，a 是二维数组，由于静态二维数组物理结构是一维的，逻辑结构才是二维的，所以a是数组第一个元素的地址。*a 是第一行的第一个元素的地址，还是数组第一个元素的地址。&a是数组变量的地址，即数组的地址，即第一个元素的地址。  这个记住就行，不要用二级指针的模式去理解静态二维数组   额。。那这3个表达式的 +1后的 偏移不一样 怎么理解啊？

user: user-1
content: 静态数组，*a   &a  a这三个表示都是数组的首地址 这是编译机制的问题，不要用指针的方式去理解，楼主有兴趣可以看看这段代码的汇编代码，发现它们的汇编代码是一样的  也可以这么理解，a 是二维数组，由于静态二维数组物理结构是一维的，逻辑结构才是二维的，所以a是数组第一个元素的地址。*a 是第一行的第一个元素的地址，还是数组第一个元素的地址。&a是数组变量的地址，即数组的地址，即第一个元素的地址。  这个记住就行，不要用二级指针的模式去理解静态二维数组
user-0 提问: RadASM编译出错问题

回复:
user: user-0
content: 原来是我顺序搞错了。。。。搞定

user: user-0
content: 怎么自动回复了。。。。  mov eax,004558C8h;地址 mov word ptr [eax],0E9B5040000h 加0是可以了 但有的jmp很长代码就又出错了 error A2084: constant value too large

user: user-0
content: mov eax,004558C8h;地址 mov word ptr [eax],0E9B5040000h 加0是可以了 但有的

user: user-1
content: 前面加 0 就好了 EB14h ->  0EB14H
user-0 提问: 看一下这段程序 。

回复:
user: user-0
content: 引用 2 楼 chenxue0821 的回复:没看懂 ，buf[(i*whl+j)*3+hdl] 这个不会越界么这个 表达式是。。。？

user: user-1
content: 没看懂 ，buf[(i*whl+j)*3+hdl] 这个不会越界么

user: user-2
content: 想让看什么？

user: user-0
content: [quote=引用 楼主 jk_101 的回复:] 	for(i=0;i<whl;i++) { pd[i]=(int*)malloc(whl*sizeof(int)); for(j=0;j<whl;j++) { pd[i][j]=buf[(i*whl+j)*3+hdl]; } 这个实在给pd[i][j]分配空间吗?
user-0 提问: 关于指针数组，求大神指导！

回复:
user: user-1
content: 仅供参考：#include <stdio.h> double A[300][100]; double valuex[300]; double valuey[300]; int i; double fun00(double x,double y) {return x  +   y  ;}; double fun01(double x,double y) {return x*x+ 3*y  ;}; double fun02(double x,double y) {return x  + 2*y*x;}; //...  fun03(double x,double y) {return ...+...   ;}; //... //...  fun98(double x,double y) {return ...+...   ;}; double fun99(double x,double y) {return x/2+20*y  ;}; double (*funNN[100])(double,double)={     fun00,     fun01,     fun02, //  fun03, //  ... //  fun98,     fun99, }; int main() {     double x,y;     int f,FN;      for (i=0;i<300;i++) {         valuex[i]=(double)i;         valuey[i]=(double)i;     }     FN=3;     for (i=0;i<300;i++) {          x=valuex[i];          y=valuey[i];          for (f=0;f<FN;f++) A[i][f]=funNN[f](x,y);     }     for (i=0;i<3;i++) {         for (f=0;f<FN;f++) printf("%lg ",A[i][f]);         printf("\n");     }     return 0; } //0 0 0 //2 4 3 //4 10 10

user: user-2
content: 指针数组，是一个数组，元素为指针类型，楼主的代码，每个元素为函数指针（即指向函数的指针），说白了，数组中每个元素存放的是某个函数的地址，在使用是时，只需要将某个同类型的函数的函数名给元素赋值，就可通过指针来调用函数

user: user-3
content: 1， static void (* const fsbl_init_func_tbl[])(void) 定义了一个 无返回无参数的函数指针数组； 2， = {   fsbl_ram_init,   fsbl_hw_init, #ifdef BOOT_USES_DCACHE   boot_cache_mmu_init, #endif   NULL  }; 初始化这个函数指针数组 3，  for ( i = 0; fsbl_init_func_tbl[i] != NULL; i++ )   {     fsbl_init_func_tbl[i]();   } 遍历这个函数指针数组，并挨个调用一次
user-0 提问: 无法理解的代码

回复:
user: user-1
content: 开始，运行，cmd，确定。

user: user-0
content: 我认为六楼说的很有道理，跟我猜的差不多。但我天资愚笨，希望可以通俗的给我讲一下（有个例子最好）。九楼说的我用getchar（）试了，确实可以直接打开了，当我输入所需的数据后点击enter运行时又直接跳出来了（不运行）

user: user-0
content: 对就是闪退。

user: user-0
content: 不好意思我不会用cmd窗口。四楼说的我试了一下编译的时候他给出了这么一段话‘system' is not declared in this scope，好像是不能识别吧。可能我表述的不是太清楚吧，我再说一下我的问题！！我想知道为什么在我程序正确的情况下不能直接运行应用程序，只能通过打开源代码运行？？（我想听到原因、解释、思想……而不是方法、改变、其他途径打开……）。我编写的代码都是这样的情况。应该不是代码的问题。我是新手，有很多不懂，希望大家多多支持。谢谢。（想截个图给你们看看但是这图片一直显示在上传中）

user: user-2
content: 如果是打开闪退的话，main结束前加getchar()或者system("pause")

user: user-3
content: 如果是系统限制，杀毒软件拦截，防火墙什么的原因的话，报错信息就比较明显的

user: user-3
content: 编译器生成的程序，并没有经过封装，所以并不是一个放到哪里都能用的程序

user: user-3
content: 你编译完，编译器是知道你的程序所需要的库在哪里的，但是你直接运行程序时，需要系统知道你这个程序需要库在哪里，（一般默认是当前文件夹下），当然，所需库和程序不在同一文件夹的话系统就不知道了  所以，你把程序放到用到库的文件夹里的话，就可以了

user: user-1
content: 在cmd窗口中输入以下命令： cd /d 你的exe文件所在盘符和目录 你的exe文件名.exe 如果还是不能运行你的exe文件，关闭UAC、防火墙、杀毒软件、……

user: user-0
content: 我刚刚在网上又找了一下封装的知识并用到了我写的程序里，确实是这方面的问题。解决问题的答案就是在main函数结束之前加两个getchar（）；   然后就可以直接运行。exe文件了，很感谢大家的帮助（不管是有用的还是无用但有心的解答）。以后有不会的还请大家多多指教。

user: user-0
content: 恩。好的，关于封装这一方面我不是太了解，有谁可以推荐一些书给我看看（最好是pdf格式的）

user: user-3
content: 我试了你的程序，我这边能运行，拿到哪里都可以，，，

user: user-3
content: 刚看到你这个图，感觉并没有什么需要封装的文件，把中文都换成英文试试

user: user-3
content: 引用 16 楼 doublekill_ 的回复:请大家解答我的疑惑（就是我问什么你答什么而不是给我又引入到另一个情景中），请仔细看我的问题好吧。谢谢（例子就是像六楼那样回答，但是他讲的也不是太清晰，所以希望大家集思广益）。           打个比方，你调用了一个系统函数printf（只是打个比方），这个函数你是直接拿来用的，而它的代码就在库文件里面，你用了这个函数，就需要在运行时，能够找到这个库，确切说是能找到这些调用了的代码，让你的程序能够执行下去。         你用编译器去运行时，编译器帮你做好了找到这些库文件之类的工作，所以可以执行；但是当你直接运行exe时候，这时运行环境是win32控制台，它并不会像编译器做的那么多，它只会去它自己知道的地方去找文件，而没有找到的话，就不能运行了  真的不知道再怎么细说了，，  你想运行exe是要封装后才能做到，不明白的话也不用刻意去纠结，等你慢慢了解了就会了，非要做到，就去看看程序是怎么封装的吧

user: user-4
content: 你确定scanf真的停下来等你了？用每一个函数之前先确定这个函数的用法。

user: user-4
content: 另外，6楼应该是最不靠谱的回答了。

user: user-0
content: 请大家解答我的疑惑（就是我问什么你答什么而不是给我又引入到另一个情景中），请仔细看我的问题好吧。谢谢（例子就是像六楼那样回答，但是他讲的也不是太清晰，所以希望大家集思广益）。

user: user-0

user: user-5
content: 因为你建的是win32控制台项目

user: user-6
content: 在主函数return前加 system("pause");试试
user-0 提问: 关于 程序的段

回复:
user: user-1
content: window ,linux 段 寄存器，除了fs 都不再使用了 等于关闭了段模式 其实偶尔还会用的，不过用户（3级别代码）程序，不能够使用而已。 elf 中的段，只是操作系统，划分 代码数据等不同用途数据的一种方式，不再是 dos 时代的那种段了

user: user-2
content: CPU中的段选择子 和 PE或elf文件中的Section 不是一个概念。

user: user-3
content: 当然不一样  不管是 Linux 还是 Windows，现在都是平坦内存模型。 cs, ds, ss 所指向的段选择子基址都是 0，size 都是 0xffffffff , 也就是说偏移的范围其实就是 0～4G 整个内存地址空间。偏移值就是地址的值。 Linux 和 Windows 都采用分页机制来管理内存，通过这种设置相当于绕过分段机制了，因为分段在 CPU 中没法关闭，必须使用。
user-0 提问: 求助，输入流怎么会读不进第一个字符？帮忙看看

回复:
user: user-0
content: 引用 6 楼 qq_30446977 的回复:[quote=引用 4 楼 qq_30446977 的回复:] [quote=引用 1 楼 walkiz 的回复:] 这样写才对：  void eatspaces(void) {     char ch = 0;     while(isspace(ch = (char)getchar())){     }     ungetc(ch,stdin); }   这个是怎么运行的？是下面这样吗： 1.读取一个字符（是一次性输入一串字符回车结束）。2.如果第一个字符是空格，循环继续，读到非空格循环结束，3.将最后一个字符放回输入流。....这里后面的字符还要继续进行while循环吗？                                     2.如果第一个不是空白字符，循环结束。3.将最后一个字符放回输入流。...这里后面的字符还要继续进行while循环吗？    是这样运行的吗？ [/quote] 帮我看看我这样想对吗？如果像7楼上所说的，如果返回输入流，就结束了。 输入流中就没有空格了，那为什么主函数最后输出后是 有空格的呢？

user: user-1
content: 不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

user: user-2
content: 字符放回输入流后eatspaces函数就结束了，不用继续while循环

user: user-0
content: 引用 4 楼 qq_30446977 的回复:[quote=引用 1 楼 walkiz 的回复:] 这样写才对：  void eatspaces(void) {     char ch = 0;     while(isspace(ch = (char)getchar())){     }     ungetc(ch,stdin); }   这个是怎么运行的？是下面这样吗： 1.读取一个字符（是一次性输入一串字符回车结束）。2.如果第一个字符是空格，循环继续，读到非空格循环结束，3.将最后一个字符放回输入流。....这里后面的字符还要继续进行while循环吗？                                     2.如果第一个不是空白字符，循环结束。3.将最后一个字符放回输入流。...这里后面的字符还要继续进行while循环吗？    是这样运行的吗？ [/quote] 帮我看看我这样想对吗？

user: user-2
content: void eatspaces(void)  //测试输入是否是空白字符。  { char ch=0; while(isspace(ch=(char)getchar())) ungetc(ch,stdin);  //将不是空白字符返回输入流  }   输入空字符是会一直进入循环  void eatspaces(void) {     char ch = 0;     while(isspace(ch = (char)getchar())){     }     if(!isspace(ch = (char)getchar()))     ungetc(ch,stdin); } 这样排除返回空字符，应该就可以了

user: user-0
content: 引用 1 楼 walkiz 的回复:这样写才对：  void eatspaces(void) {     char ch = 0;     while(isspace(ch = (char)getchar())){     }     ungetc(ch,stdin); }   这个是怎么运行的？是下面这样吗： 1.读取一个字符（是一次性输入一串字符回车结束）。2.如果第一个字符是空格，循环继续，读到非空格循环结束，3.将最后一个字符放回输入流。....这里后面的字符还要继续进行while循环吗？                                     2.如果第一个不是空白字符，循环结束。3.将最后一个字符放回输入流。...这里后面的字符还要继续进行while循环吗？    是这样运行的吗？

user: user-3
content: 输入空格的时候你就死循环了  取一个是空格，放回去，再取就取到刚刚放回去那个，当然还是空格，然后再放回去，然后再取，还是放回去 ......  while 后面加 分号

user: user-0
content: 引用 1 楼 walkiz 的回复:这样写才对：  void eatspaces(void) {     char ch = 0;     while(isspace(ch = (char)getchar())){     }     ungetc(ch,stdin); }   这个函数的作用是，去除空白字符。如果改成上面这样，那么就起不到这个作用了吧。我输入空格就会输出空格。

user: user-4
content: 这样写才对：  void eatspaces(void) {     char ch = 0;     while(isspace(ch = (char)getchar())){     }     ungetc(ch,stdin); }