Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 求教~~~，逗号运算符的问题。

回复:
user: user-1
content: 月经贴了！讨论没意思！看看置顶吧

user: user-0
content: 我的意思是执行完（a++，b++）后，此时b的值是多少？如果通过程序结果来分析，应该是此时a的值是2，b的值是1，所以接着执行a+b，结果是3，然后输出，最后再执行b++。但是，感觉应该是先执行b++，把b的值变成2，然后再执行a+b，。这点想不明白。

user: user-2
content: 函数参数的运算顺序标准没有规定。所以这代码和a++ + a同一个性质。

user: user-3
content: b++是b操作完后自加1，所以第一个（逗号表达式）的输出值是1，而第二个%d和第一个%d同级，所以此时b仍为1，a已经自加一次，变成了2，所以输出为3，输完后，b才自加1 # include <stdio.h>  int main() { 	int a = 1, b = 1; 	printf("%d, %d\n", (a++, b++), a+b); 	printf("%d\n", b);  	return 0; } lz可以看看这个——http://bbs.csdn.net/topics/370153775

user: user-4
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对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-5
content: 不同的编译器有不同的结果，想这种问题等于慢性自杀

user: user-6
content: 结果是不确定的，不用想了
user-0 提问: 关于sizeof函数问题

回复:
user: user-1
content: 引用 7 楼 ZJQLOVELYY 的回复:[quote=引用 2 楼 czarten 的回复:] 没太看懂 首先sizeof不是函数，其次你说的"指针指向的内存大小"是什么概念？？ 就是要求函数调用时 比如前面char Merroy[20]; 调用时是copy_n(Merroy,...)这样，然后在函数里面求Merroy数组的大小[/quote]  不能的，指针只是一个地址，它只包含“从哪里开始”的信息，不包含“有多大”的信息

user: user-2
content: sizeof无能为力。 调用函数时，传入的是一个指针，任何类型(int/char....struct)的指针大小都是一样的（32位系统4字节），sizeof值一样。 解决办法： 1.商定所有char *字符串都是以 '\0'结尾，用strlen求长度 2.传入长度

user: user-3
content: sizeof是编译时就已经计算完成了，不是运行时才计算的！

user: user-4
content: sizeof是编译的时候计算好了, 所以没办法知道你程序运行到这里会有多大空间.  老老实实传一个长度进去吧, 最正规的做法了.

user: user-5
content: 先说明一下sizeof不是函数 是关键字。和int，for， while等等是一类东西。 //下面这两句话你没有查仔细，你这么写是不对的 const int lenDst = sizeof(dst)/sizeof(dst[0]);//计算dst数组长度 const int lenSrc = sizeof(src)/sizeof(src[0]);//计算src数组长度 你这里sizeof（dst）中的dst仅仅是一个形参，它的类型是指针，所以这个就是计算一下指针的大小，等于4。 所以你这个绝对的不能进行字符串的复制。 往我的邮箱里发一个邮件我把答案和详细的解释给你发过去  很简单的。

user: user-6
content: 引用 5 楼 ZJQLOVELYY 的回复:[quote=引用 4 楼 PDD123 的回复:] 1.无法实现你想要的功能 2.     /*经过查资料，以下两行是直接计算dst的内存字节大小而不是计算数组长度*/    const int lenDst = sizeof(dst)/sizeof(dst[0]);//计算dst数组长度    const int lenSrc = sizeof(src)/sizeof(src[0]);//计算src数组长度 这段是错的。两个长度结果都为4，sizeof(dst)计算的是，dst变量所占的空间，指针类型都为4。  如果你定义了一个变量，char dat[100];那么sizeof(dat)的结果就为100；  不是的，在函数中不一样的。你可以去试下[/quote]  我看到你说你查了资料之后再去验证一下，才回复的，要不我就是一楼 了。  sizeof(dst)，在定义dst的时候，定义成了指针，那么结果就是4，如果定义成了数组，那么结果就是数组元素大小乘以数组元素个数。而在函数void copy_n(char* const dst, char* const src,const int n)中，括号里面的“char* const dst”实际上是定义了dst，定义成了指针。  编译器在编译一个函数的时候，是只考虑函数本身的，函数是独立的。

user: user-2
content: 引用 12 楼 czarten 的回复:[quote=引用 7 楼 ZJQLOVELYY 的回复:] [quote=引用 2 楼 czarten 的回复:] 没太看懂 首先sizeof不是函数，其次你说的"指针指向的内存大小"是什么概念？？ 就是要求函数调用时 比如前面char Merroy[20]; 调用时是copy_n(Merroy,...)这样，然后在函数里面求Merroy数组的大小[/quote]  不能的，指针只是一个地址，它只包含“从哪里开始”的信息，不包含“有多大”的信息[/quote] 指针包含了多大，但是没包含这个之后还有多少个～～

user: user-7
content: 首先数组名作为参数处理的时候表示指针 sizeof其大小4.. 你可以通过循环判断'\0',来确定数组长度。

user: user-0
content: 引用 2 楼 czarten 的回复:没太看懂 首先sizeof不是函数，其次你说的"指针指向的内存大小"是什么概念？？ 就是要求函数调用时 比如前面char Merroy[20]; 调用时是copy_n(Merroy,...)这样，然后在函数里面求Merroy数组的大小

user: user-0
content: 引用 3 楼 akirya 的回复:1 sizeof理解有误 2 不能  也就是说只能通过显示传递数组大小参数了？

user: user-0
content: 引用 4 楼 PDD123 的回复:1.无法实现你想要的功能 2.     /*经过查资料，以下两行是直接计算dst的内存字节大小而不是计算数组长度*/    const int lenDst = sizeof(dst)/sizeof(dst[0]);//计算dst数组长度    const int lenSrc = sizeof(src)/sizeof(src[0]);//计算src数组长度 这段是错的。两个长度结果都为4，sizeof(dst)计算的是，dst变量所占的空间，指针类型都为4。  如果你定义了一个变量，char dat[100];那么sizeof(dat)的结果就为100；  不是的，在函数中不一样的。你可以去试下

user: user-6
content: 1.无法实现你想要的功能 2.     /*经过查资料，以下两行是直接计算dst的内存字节大小而不是计算数组长度*/    const int lenDst = sizeof(dst)/sizeof(dst[0]);//计算dst数组长度    const int lenSrc = sizeof(src)/sizeof(src[0]);//计算src数组长度 这段是错的。两个长度结果都为4，sizeof(dst)计算的是，dst变量所占的空间，指针类型都为4。  如果你定义了一个变量，char dat[100];那么sizeof(dat)的结果就为100；

user: user-8
content: 1 sizeof理解有误 2 不能

user: user-1
content: 没太看懂 首先sizeof不是函数，其次你说的"指针指向的内存大小"是什么概念？？

user: user-9
content: 不知道你什么意思，你的参数的内存大小不是已经在实现中求出来了。
user-0 提问: esql / c求大神帮忙啊

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:居然还有人用ESQL啊， 用ODBC不好么？ 免得informix换成其他数据库就杯具了 哎，你以为我想啊，给我出的题就是这样的。。

user: user-1
content: 居然还有人用ESQL啊， 用ODBC不好么？ 免得informix换成其他数据库就杯具了
user-0 提问: Program received signal SIGSEGV, Segmentation fault.

回复:
user: user-0
content: 我按你的意思研究了下，发现没什么名堂嘛 #0  0x0804857b in edit (pattern=0x8048630 "*#,###", digits=0x8048637 "1234")     at 1.c:55 #1  0x0804842a in main () at main.c:7

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

回复:
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对应的汇编并单步执行观察相应内存和寄存器变化。）  《Windows核心编程》 《深入解析Windows操作系统-Windows Internals》

user: user-2
content: lz最近在学习linux内核？

user: user-3
content: 把不开心的说出来 大家开心下嘛

user: user-4
content: 小河沟里经常翻船！

user: user-4
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对应的汇编并单步执行观察相应内存和寄存器变化。）  《Windows核心编程》 《深入解析Windows操作系统-Windows Internals》

user: user-5
content: ~~~~

user: user-6
content: 大水笔，给分。

user: user-7
content: 我们经常被嵌入式坑。  引用 楼主 nadleeh123 的回复: 又给内核坑了一把
user-0 提问: 循环链表解决约瑟夫环问题，有段代码不懂，有大神解释啊

回复:
user: user-1
content: vector<int> yuesefeng(int n,int m)//n代表初始人数，m代表初始号码 { 	vector<int> out; 	list<int> in; 	list<int>::iterator pos; 	int i; 	for(i=1;i<=n;i++) 		in.push_back(i); 	pos=in.begin(); 	int kk=m;     while(in.size()!=0) 	{	 		if(kk!=1) 		  { 			  pos++; 			  kk--; 		   if(pos==in.end())//注意要判断是否到尾部了，到尾部就指向头部 			pos=in.begin(); 		   } 		else 		{ 			out.push_back(*pos);//到数了，点到的人保存到输出 			pos=in.erase(pos);///将此人从列表中删除，注意erase返回的是下个人的指针 			if(pos==in.end()) 				pos=in.begin(); 		}	     	} 	return out; } 这是我自己写的。。没优化过。。用list实现

user: user-2
content: 引用 1 楼 truelance 的回复:这段代码里错误不是一般多啊. 明显是一本误人子弟的书.+1,简单问题不要复杂化

user: user-3
content: for循环没有问题，有一点要知道：while循环开始时，x指向的是循环链表的尾节点，你再分析分析； 这个代码不但没有错，而且还有些经典

user: user-4
content: /**adv30@126.com  *内容：  * 有n个猴子，按顺时针方向围成一个圈选大王。  * 从第1号开始报数1，2，……，数到m号时该猴子退出到圈外，  * 如此报数直到圈内只剩下一个猴子时，此猴子便是大王。  * 由键盘输入 n，m，打印出猴子大王序号。  *输入说明：  * 一行2个整数  *输出说明：  * 一行一个整数  *输入样例：  * 10 3  *输出样例 ：  * 4  */ #include <stdio.h> typedef struct Noier {     int number;     int onoff; } NOIER ; int main(void) {     int n,m,i,k=1,cnt=0;     NOIER noier[1000];     scanf("%d %d",&n,&m);     for(i=0; i<n; i++)     {         noier[i].number=i+1;         noier[i].onoff=1;     }     i=0;     while ((n-cnt) > 1)     {         if(noier[i].onoff)         {             if(k%m==0)             {                 noier[i].onoff=0;                 cnt++;             }             k=(k+1)%m;         }         i=(i+1)%n;     }     while(noier[i].onoff == 0)     {         i++;     }     printf("%d\n",noier[i].number);     return 0; }

user: user-5
content: //假设有n个人团团围做，从第1个人开始数数，数到第m个人时候，第m个人出列， //然后继续从1开始数数，数到第m个人退出 #include <stdio.h> #include <conio.h> int i,k,t; int n,m; static char f[1001];//0该座位未出圈,1该座位已出圈 void main() {     while (1) {         printf("Input n m(1000>=n>=m>=1):");         fflush(stdout);         rewind(stdin);         if (2==scanf("%d%d",&n,&m)) {             if (1000>=n && n>=m && m>=1) break;         }     }     t=0;//已出圈总人数     i=1;//座位编号     k=1;//当前要数的数     while (1) {         if (0==f[i]) {             if (m==k) {                 t++;                 f[i]=1;                 printf("%3d ",i);                 if (0==t%10) printf("\n");                 if (t>=n) break;             }             k++;if (k>m) k=1;         }         i++;if (i>n) i=1;     }     cprintf("Press any key ...");     getch(); }

user: user-6
content: 代码就不看了，自己看wiki百科吧：  http://zh.wikipedia.org/zh-cn/%E7%BA%A6%E7%91%9F%E5%A4%AB%E6%96%AF%E9%97%AE%E9%A2%98 英文版有例子程序 http://en.wikipedia.org/wiki/Josephus_problem

user: user-7
content: 约瑟夫环问题可以抽象出一个数学模型，比用循环链表简单多了。 http://blog.csdn.net/changyuanchn/article/details/20653215 and你这段代码太凌乱了。

user: user-8
content: 这段代码里错误不是一般多啊. 明显是一本误人子弟的书.
user-0 提问: IOCP 服务 线程  和缓存问题

回复:
user: user-1
content: 如果你的工作线程是CPU计算密集型的，那么根据CPU核心数量确定工作线程数的做法是正确的，这就好像是4车道满满的跑了4两车，没有浪费。 否则工作线程数据与计算/IO比例相关，IO阻塞的时候可以把车道让给别的车。  工作线程不是收数据，而是从缓存池里面去数据出来处理，缓存池中的数据应该包含对应的连接信息。

user: user-2
content: 引用 2 楼 user-3 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 参考Microsoft SDK\samples\netds\WinSock\iocp\*.* ? 膜拜大神，什么帖子里都有您的脚印[/quote]

user: user-3
content: 引用 1 楼 zhao4zhong1 的回复:参考Microsoft SDK\samples\netds\WinSock\iocp\*.* ? 膜拜大神，什么帖子里都有您的脚印

user: user-2
content: 参考Microsoft SDK\samples\netds\WinSock\iocp\*.* ?
user-0 提问: linux c编程 文件内容为空时，读取文件出现乱码

回复:
user: user-1
content: feof（）很少用这个函数

user: user-2
content: 参考 http://blog.csdn.net/bingqing07/article/details/5785080

user: user-3
content: 不要用feof()来判断文件的结束，一般都是用fread() 或read()的返回值来判断文件是否结束，你可以看一下man手册 一般文件结束的时候会返回0。
user-0 提问: 关于读写文件的问题

回复:
user: user-1
content: 当前进程目录下

user: user-2
content: FILE* f; f = fopen(“/home/file”, "w"); fputs(“abcd”，f)； fclose(f)； 这样的话，你写的内容就存放在了/home/file文件中了

user: user-3
content: 工程文件夹下面，找找debug目录

user: user-4
content: FILE* f;只是定义了一个文件类型指针变量。在你的代码中并未关联一个文件。这段代码错误。

user: user-5
content: file不就是你的文件路径吗？f是文件指针
user-0 提问: 看c语言源码，其中有好多回调函数，求方法

回复:
user: user-1
content: emacs + cscope

user: user-2
content: 这个没办法避免的！回调也只是一个指针而已！要习惯！  很多开源的东西都是回调来搞的

user: user-3
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。

user: user-4
content: SourceInsight  引用 楼主 a971124568 的回复:小弟现在正在看c语言的一个开源项目的源码，但里面都是回调函数，看起来十分麻烦，一会就把自己转晕了，想请问一下大家，有没有好的方法或者工具
user-0 提问: 中缀转后缀的 递归，处理括号有问题，求指教

回复:
user: user-1
content: 建议LZ针对出现的问题检查代码是否正确实现了关于左右括号的语法规则. 函数factor中要删除3行以保证出现了左括号后必须有右括号: void factor() {   char s;   if(expr[i] >= 48 && expr[i] <= 57){     s = expr[i];     i++;     printf("%c",s);   }   else{     if(expr[i] == '('){       i++;       total();     //删 }     //删 else{     //删   printf("the char is :  %c\n",expr[i]);       if(expr[i] == ')'){         i++;         if(expr[i] == '+' || expr[i] == '-')           rest1();         else           rest2();       }       else         printf("Error\n");     }   } }

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。
user-0 提问: 在ubuntu 64bit上怎么交叉编译libffi for android

回复:
user: user-0
content: 使用ndk standalone-toolchain 成功 host=arm-linux-androideabi i686linux-androideabi都成功了，只是mipsel没有成功 谢谢大家

user: user-1
content: 引用 2 楼 nadleeh123 的回复:[quote=引用 楼主 blackant2 的回复:] 不太会用gcc,使用ndk-build也行,gcc更好  一般的开源资源都有 configure 这个脚本,直接help 里面有--build 和 --host参数[/quote] ./configura --build=i386/i686 --host=arm make 一般都这样,某些比较非主流的或许要自己改改make或者借助某些补丁,比如那个坑爹的perl解释器源码

user: user-1
content: 引用 楼主 blackant2 的回复:不太会用gcc,使用ndk-build也行,gcc更好  一般的开源资源都有 configure 这个脚本,直接help 里面有--build 和 --host参数

user: user-2
content: 参考http://sourceware.org/libffi/ 参考http://blog.sina.com.cn/s/blog_79b04d6d0100rt2d.html  引用 楼主 blackant2 的回复:不太会用gcc,使用ndk-build也行,gcc更好
user-0 提问: 语法错误

回复:
user: user-0
content: 引用 楼主 u012523688 的回复:while( j <= n ) 	{ 		scanf("%d",&a[j++]); 	} 想要往数组中输入n个数，上述错误在哪里，楼主懵了！ 。。。我怎么犯这么低级的错误，谢谢！

user: user-1
content: j==n的时候也能进循环，但这个时候已经越界了。
user-0 提问: 求指教

回复:
user: user-1
content: 环境问题或者是头文件包含问题

user: user-2
content: #include <stdio.h> 集成环境最好改用Code::Blocks(http://www.codeblocks.org/)  引用 楼主 u013926949 的回复:getchar在DEV-C++5.6.1中运行为什么会出错?
user-0 提问: 关于《C陷阱》中不明白的部分，求指教！

回复:
user: user-0
content: 多谢楼上网友细心解释，谢谢大家啦

user: user-1
content: 详细补充一下：例如你在gcc下编译这程序，生成a.out可执行文件，你同一目录下有1.txt文件，文件里存的内容就是0 1 2 3 4。那么你在字符终端下输入"./a.out < 1.txt"命令，那么就会和作者得到结果一模一样。这个不属于语言范畴的问题不理解也很正常。

user: user-2
content: 进来学习一下，长知识了

user: user-1
content: 第二个问题：标准输入不一定是字符终端输入，标准输入如果重定向为文件就会有文件结束符的意义，在 linux下编程应该知道重定向的含义。

user: user-0
content: 谢谢这位网友的答复，我已经基本上明白了这些问题，关键是在文件结束符上！当scanf接受到文件结束符时就会不再执行然后在输出1234.但是我在之前只是出入了5个数据，并没有输入文件结束符，所以显然，scanf仍然在执行。所以无法输出1234.

user: user-3
content: 可能影响了i的高位，或者符号位，导致循环第五次后i值>=5了，这个每个编译器不一样的表现。你可以在for循环后，再将i值print出来看一下，应该是个负数，或者比较大。  main() { int i; char c; for(i = 0; i < 5; i++) { scanf("%d", &c); printf("%d", i); }  printf("%d",i); //这里加一句看一下就知道了。  printf("/n"); }
user-0 提问: 试着写了一个判断是否继续的函数，能运行但是这几个警告是什么意思？

回复:
user: user-1
content: select=(char*)malloc(sizeof(char));  只分配了一个字节空间 可以sizeof(char)写成100规定最大输入100字节 然后初始化memset(select,0,100); 然后main()之前加返回值void 或者int char *a="yes";

user: user-0
content: 感谢

user: user-2
content: 一切的根源在于： char* select,a="yes";  这样的定义相当于是char a="yes"，所以应该改为： char* select,*a="yes";   另外有些编译器会要求源代码的最后一行留空，你在最后回车一下添加一个空行即可。  引用 楼主 wpx9184 的回复: #include <stdio.h> #include <stdlib.h> #include <string.h>  int choice()					//判断是否继续的函数  { 	char* select,a="yes";  	select=(char*)malloc(sizeof(char)); 	printf("是否继续输入？\n"); 	gets(select); 	if(strcmp(select,a)==1) 		{ 		free(select); 		return 0; 		} 	else 		{ 		free(select); 		return 1;	 		} }  main() { 	int choice(); 	int count=1; 	while(choice()) 	{ 		printf("%d\n",count); 		count++; 	} 	printf("The End!\n"); 	return 0; }   --------------------配置: mingw5 - CUI Debug, 编译器类型: MinGW--------------------  检查文件依赖性... 正在编译 D:\KNNR\test.c... [Warning] D:\KNNR\test.c:7: warning: initialization makes integer from pointer without a cast [Warning] D:\KNNR\test.c:11: warning: passing arg 2 of `strcmp' makes pointer from integer without a cast [Warning] D:\KNNR\test.c:34:2: warning: no newline at end of file 正在连接...  完成构建 test: 0 个错误, 3 个警告 生成 D:\KNNR\test.exe  想搞清楚这几个警告是什么意思
user-0 提问: 新人求教~~~

回复:
user: user-1
content: 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm

user: user-2
content: 《C Prime Plus》就看这一本书就够了

user: user-3
content: 先随便找本C语言的书入个门，看到指针前面的部分就可以了，要看完数组。然后开始啃英文版的《The C programming language》就可以达到真正的入门级别了。然后就是看很多的书，编写大量的程序。

user: user-4
content: 引用 1 楼 turingo 的回复:参考http://blog.csdn.net/turingo/article/details/8115042  引用 楼主 u013925826 的回复:本人想自学C语言 之前几乎完全没接触过，想去买点书或者下载电子本 视频教学之类的，请给小弟点推荐适合初学者入门的 万分感谢     +1  《C Prime Plus》把里面的例子多抄写,理解这本书的80%多...基本可以入门了

user: user-5
content: 坚持，多敲代码！  找一个好点的入门教材

user: user-6
content: 《C Prime Plus》 +1

user: user-7
content: 入门推荐《c语言入门经典》，初学看《C plus primer plus》感觉难看懂

user: user-8
content: 郝斌C语言视频，适合入门，推荐——http://www.xuexi111.com/jiaocheng/shipin/26243.html

user: user-9
content: 范磊的C语言视频教程——《零起点学通C语言》 希望可以帮到你

user: user-10
content: C语言教程, 清华大学谭浩强版

user: user-11
content: 参考http://blog.csdn.net/turingo/article/details/8115042  引用 楼主 u013925826 的回复:本人想自学C语言 之前几乎完全没接触过，想去买点书或者下载电子本 视频教学之类的，请给小弟点推荐适合初学者入门的 万分感谢
user-0 提问:  怎样在c语言链表中插入字符串？请看代码

回复:
user: user-0
content: 引用 5 楼 starytx 的回复:c语言中不可以直接对数组进行=(赋值)，字符数组也不例外  明白了，谢谢哈

user: user-1
content: 引用 4 楼 zczyde 的回复:[quote=引用 3 楼 starytx 的回复:] strcpy(s->name ,name);就可以了  谢谢你啊，真的可以，赞一个。 就是不知道为什么strcpy可以呢，为什么给字符数组赋值一定要用strcpy(s->name ,name)呢 [/quote]  多看看基础知识，会有很大帮助的呦

user: user-2
content: c语言中不可以直接对数组进行=(赋值)，字符数组也不例外

user: user-0
content: 引用 3 楼 starytx 的回复:strcpy(s->name ,name);就可以了  谢谢你啊，真的可以，赞一个。 就是不知道为什么strcpy可以呢，为什么给字符数组赋值一定要用strcpy(s->name ,name)呢

user: user-2
content: strcpy(s->name ,name);就可以了

user: user-0
content: 引用 1 楼 truelance 的回复:void InsertElem(LinkList *list,char *name,float y) 或者 void InsertElem(LinkList *list,char name[],float y) 都可以, 两者是一样的  谢谢你的回复。如果形参改成char *name或者char name[]时，在函数体里面，是怎么赋值的呢 我试了s->name=name;和s->name=name;都会报错的，提示“表达式必须是可修改的左值”    void InsertElem(LinkList *list,int i,char name[], float y)//在第i个元素之前插入y { 	int j; 	LinkList p,s; 	p=*list;//让p指向第一个结点 	j=1; 	while(p&&j<i) 	{ 		p=p->next; 		++j; 	} 	s=(LinkList)malloc(sizeof(struct student)); 	s->score=y; 	s->name=name;//就是这句报错。。。。。。。。。。。。。。。。。。。。。 	s->next=p->next; 	p->next=s;//插入在p结点之后 }

user: user-3
content: void InsertElem(LinkList *list,char *name,float y) 或者 void InsertElem(LinkList *list,char name[],float y) 都可以, 两者是一样的
user-0 提问: C语言中自增符++优先级及内存中运行方式？先自增还是先计算再自增？

回复:
user: user-1
content: 引用 楼主 u010450836 的回复:近在讨论一个问题，引出来这个。 比如 i = j + k++;这里边的k++的运行顺序是什么？经常说这一种是先求和再自增，但是++的优先级明明高于+，不是先算k++吗？所以有人提出k++和++k优先级是不一样的。但是++作为运算符，优先级应该不会因为放在那里就改变。所以，简单编译了一下，在汇编中貌似还是先算k++，但是把k,和k++都放在寄存器中，用的时候先用了k。（不知道理解对不对）。这样来说，还是先自增，再计算，不过没用自增的值而已。 总结一下： 1.k++和++k中优先级，有没有区别？ 2.在内存计算时候，先自增还是先计算再自增？ 把谭大爷的书扔掉，再去看顶置贴

user: user-2
content: 最好不会产生歧义的编程方式,尽量不依赖默认的优先级 不知道楼主要实现什么目的 如果是加2,就k+=2;

user: user-3
content: 先算 k++ 但是 k++ 算的结果是k啊 k的值是k+1  但那是k的值  别混淆了   表达式的值 和 操作数的值

user: user-4
content: 引用 5 楼 a345485527 的回复:这个不是置顶帖的内容么  这个跟置顶两回事 这个式子的结果有明确定义

user: user-5
content: 这个不是置顶帖的内容么

user: user-4
content: i = j + k++  假设k=3，j=2 ++优先级最高，首先计算k++，此时k=4，但（k++）这个表达式的返回值是3，所以第二步是计算j+3，这个表达式不改变j的值，仍为2，但返回值是5，第三步计算i=5，这个表达式改变i的值，i变为5，而表达式的返回值是i的引用  一句话，就是分清楚运算符的参数和运算符的返回值的区别  如果把k++写成一个函数，你就不会有此困惑  int jiajia(int& k) {     k++;     return 原来的k; }  i = j + jiajia(k)

user: user-6
content: 不好意思，++k和k++的优先级是不同的 k++的优先级更高

user: user-7
content: 参考http://bbs.csdn.net/topics/370153775  引用 楼主 u010450836 的回复:近在讨论一个问题，引出来这个。 比如 i = j + k++;这里边的k++的运行顺序是什么？经常说这一种是先求和再自增，但是++的优先级明明高于+，不是先算k++吗？所以有人提出k++和++k优先级是不一样的。但是++作为运算符，优先级应该不会因为放在那里就改变。所以，简单编译了一下，在汇编中貌似还是先算k++，但是把k,和k++都放在寄存器中，用的时候先用了k。（不知道理解对不对）。这样来说，还是先自增，再计算，不过没用自增的值而已。 总结一下： 1.k++和++k中优先级，有没有区别？ 2.在内存计算时候，先自增还是先计算再自增？

user: user-6
content: 1. 优先级是相同的 2. 这个计算的过程，编译器可以自己定，就是说这样写，得出来的结果是依赖于编译器的
user-0 提问: 函数指针的疑问

回复:
user: user-0
content: 引用 4 楼 njdyne 的回复:在程序中定义了一个函数，在编译时，会为函数代码分配一段存储空间，就有了地址。可以定义一个指向函数的指针变量来存储这个地址。 C语言中，表达式中的函数可以被解读成指向函数的指针。  这是我想要的.

user: user-0
content: [quote=引用 3 楼 turingo 的回复:] 可以的，直接强制类型转换就好了。  之前就没理解不强转类型，怎么可以，现在知道了.

user: user-0
content: 引用 1 楼 a345485527 的回复:对于函数来说 加不加取地址 & 都是一样的 你也可以加上&  是这样啊，知道了.

user: user-1
content: 指针类型可以任意转换。操作的正确性只能在程序员层面进行保证。

user: user-2
content: 对于函数来说 加不加取地址 & 都是一样的 你也可以加上&

user: user-3
content: 在程序中定义了一个函数，在编译时，会为函数代码分配一段存储空间，就有了地址。可以定义一个指向函数的指针变量来存储这个地址。 C语言中，表达式中的函数可以被解读成指向函数的指针。

user: user-4
content: 可以的，直接强制类型转换就好了。  引用 楼主 u013431701 的回复:1.typedef unsigned int (*callback)(STATUS_E Status); 2.int32 status_cbk(STATUS_E status) { ； }  3.callback  status = status_cbk; 4.SetStatusCallback(status );  想问一下能把一个函数指针status指向一个返回值是int32的函数status_cbk， 这样可以吗？  指针不应该是指向一个地址吗？
user-0 提问: 有一个c实现的所有文件，不知道怎么编译运行

回复:
user: user-1
content: 去linux下执行以下make就行了

user: user-2
content: 我编译了一下好像有错误

user: user-2
content: 在windows下面？ mingw32-make

user: user-0
content: 不要沉......求解释

user: user-3
content: make是linux下的命令, 在windows下你得装一个编译器

user: user-0
content: 引用 2 楼 derekrose 的回复:在windows下面？ mingw32-make 斑竹能加下你qq吗，我qq675722402

user: user-0
content: 引用 3 楼 derekrose 的回复:我编译了一下好像有错误 斑竹，还有一个java版的 http://sourceforge.net/projects/ntru/files/NTRU%201.2/
user-0 提问: 关于malloc的问题，坐等

回复:
user: user-0
content: 晕，打印出了，p所指的地址确实改变了。晕死

user: user-1
content: 调用malloch后，p指向内存块A; 运行p = "hello";后，p指向字符串"hello"的存储空间。 之后free(p)就是试图释放字符串"hello"的存储空间。 呵呵，这样子是不允许的，free只能释放堆空间。

user: user-2
content: 机智的楼主，你答对了

user: user-3
content: “难道”是对的

user: user-4
content: 你自己分析的是对的
user-0 提问: 往控制台上打印 数组内容 请教

回复:
user: user-0
content: 引用 1 楼 zjq9931 的回复: //PerIoData->Buffer[BytesTransferred]='\0'; //printf("%s \n",PerIoData->Buffer); int ix; for(ix=0; ix<strlen(pc); ix++) { 	printf("%x ", (unsigned char)PerIoData->Buffer[ix]); }     我的意思，能不能像字符串数组那样，，直接打印出16进制的数组内容  比如像： printf("%s \n",PerIoData->Buffer); 就把数组内的字符都打印出来了  如果数组里是 16进制的内容   printf("？？？",PerIoData->Buffer);   只在“？？？” 里约束格式，能不把数组里的16进制内容，以16进制字符串打印出来...

user: user-1
content: //PerIoData->Buffer[BytesTransferred]='\0'; //printf("%s \n",PerIoData->Buffer); int ix; for(ix=0; ix<strlen(pc); ix++) { 	printf("%x ", (unsigned char)PerIoData->Buffer[ix]); }

user: user-2
content: 每个字符printf("%x")是最简单的方法

user: user-1
content: 引用 2 楼 wanyeye 的回复:[quote=引用 1 楼 zjq9931 的回复:]  //PerIoData->Buffer[BytesTransferred]='\0'; //printf("%s \n",PerIoData->Buffer); int ix; for(ix=0; ix<strlen(pc); ix++) { 	printf("%x ", (unsigned char)PerIoData->Buffer[ix]); }     我的意思，能不能像字符串数组那样，，直接打印出16进制的数组内容  比如像： printf("%s \n",PerIoData->Buffer); 就把数组内的字符都打印出来了  如果数组里是 16进制的内容   printf("？？？",PerIoData->Buffer);   只在“？？？” 里约束格式，能不把数组里的16进制内容，以16进制字符串打印出来...  [/quote] 你说的16进制字符是什么？
user-0 提问: 关于CB使用时出现的一些意想不到的问题（C语言）

回复:
user: user-0
content: 这跟C++有关系？可是我用的是C语言啊。不过我还是去问问吧，多谢啦~

user: user-1
content: 这个。。。lz要不去C++ Builder那儿问问吧
user-0 提问: Socket接收文件以后网断开

回复:
user: user-1
content: 你调试是用的开发板么？  这里操作系统是否一直？

user: user-0
content: 问题解决了，我在发送端设置了一个心跳，每5s发送一个字符，这样就不会断了

user: user-2
content: 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html

user: user-3
content: 应该不是程序的问题吧   在弄几个同事电脑上试试，排除程序的bug。  至于网卡的问题，这个得去驱动版块去问

user: user-4
content: 驱动问题？在你的电脑上不使用USB wifi网卡测试一下不就知道了么？

user: user-0
content: 我好像发现问题了，我发送文件的时间间隔有20s左右，如果我很快的发送第二个，就不会有问题，但我程序里没有任何超时的指令，而且朋友的机子间隔1分钟以上也能接受第二个文件，难道是linux本身有什么设置么？

user: user-0
content: 引用 2 楼 xihu1364 的回复:应该不是程序的问题吧   在弄几个同事电脑上试试，排除程序的bug。  至于网卡的问题，这个得去驱动版块去问 试了两台了，都没问题，就我的开发板有问题，如果是驱动的话，请问下大概是缺少了什么您知道么？

user: user-0
content: 引用 楼主 zgzg177 的回复:本人在linux下用C编写了一个server端接收文件的程序,第一个文件接收没有问题(几MB~几百MB都能成功接收),可是接收第二个文件的时候就只能接受50~60KB,而且网也上不去了,同样的server程序我拿到我朋友的linux上能正常接收多个文件,区别是我用的是USB wifi网卡,我朋友的就是正常的笔记本配置的无线网卡.请问下这是什么原因? THX 我的那个不是个电脑，是一块安装了ubuntu的开发板，所以只能使用usb wifi网卡，因为是开发板，所以上面我只装了适合我这个网卡的5个模块，其他的都没装，请问还有什么是需要装的么？
user-0 提问: fgetc的用法

回复:
user: user-0
content: 多谢大家的回答，我最近也参考了《c primer plus》上面说fgetc需要读到结尾的下一位才会知道文本结束。

user: user-1
content: 这个问题就像 char a,b; a=getchar(); b=getchar();  你在程序中输入一个字母k回车这时候 a=k; b='回车符' 一个道理

user: user-2
content: 改成这样。  ch[i]=fgetc(fp); while(!feof(fp)) {     i++;     ch[i]=fgetc(fp); }

user: user-3
content: 引用 楼主 hb0810096672 的回复:大家好，我用fgetc读取一个文本文件里的字符，里面只有4个字符为什么会读出5个呢？下面代码和执行截图，请大家给解答一下。  代码 #include<stdio.h> #include<stdlib.h> #include<string.h> int main() {     FILE *fp;     fp = fopen("E://文本编辑//文件夹//hellow.txt","r");     if(fp==NULL)exit(0);     char ch[10]={0};     int i=0;     while(!feof(fp))     {         ch[i]=fgetc(fp);         i++;     }     int k = strlen(ch);     printf("%d\n",k);     printf("%s",ch);     printf("%c",ch[k-1]);     printf("%d",ch[k-1]);     printf("%d",EOF);     fclose(fp);     return 0; }   截图 这是执行情况  这是hellow.txt  文本文件由个EOF结束符。所以是5个字符。如果是以字符串读出，这个EOF不会读出。

user: user-4
content: 用hex模式看看文件
user-0 提问: 初学C语言，有个素数问题求教，代码如下，请尽量不要使用一些初学者不熟悉的函数什么的。。。谢谢

回复:
user: user-0
content: 谢谢大家谢谢大家 写明白了 修改后如下： #include "stdio.h" #include "stdlib.h" #include "math.h" int main(void) {     int i=0,m=0,j=0,a=0; //注意初始化     int grade[10];     double k;     printf("请输入一个数字:\n");     scanf("%d",&i);     for(m=0;i>=2 &&  m<10;i--)     {         k=sqrt(i);         for(j=2;j<=floor(k);j++)         {             if (i%j==0)             {                 break;             }         }         if (j>floor(k))         {             grade[m]=i;             m++;         }     }     for(i=0; i<m; i++)     {         a +=grade[i];         printf("第%d个素数为%d\n", i+1,grade[i]);     }     printf("sum is %d\n", a);     system("pause"); }

user: user-0
content: 引用 5 楼 martenyong 的回复:最后多输出了两个%d。 另外“2.试了很多次找不到将1,0，负数那些去掉；” 这句话是什么意思啊，是说如果你输入0.1.负数这些的话，系统还是会继续按照条件查找“质数”而不是停止吗？ 这个问题的话，你可以限制一下判断条件。 如果在2到你输入的值之间，素数没有那么多的话，那么最小判断到二，然后停止判断，提示系统不够10个，然后能输出几个输出几个。  那个，其他的问题都解决了，就是那个你说的第二个，我的意思是在判断素数的时候不把1,0，负数也算作素数然后输出，就像输入30以下数字的话，就没有十个素数，程序显示结果还是十个数，就会显示1,0，-1。。。那些，这个希望您能够解答

user: user-1
content: 最后多输出了两个%d。 另外“2.试了很多次找不到将1,0，负数那些去掉；” 这句话是什么意思啊，是说如果你输入0.1.负数这些的话，系统还是会继续按照条件查找“质数”而不是停止吗？ 这个问题的话，你可以限制一下判断条件。 如果在2到你输入的值之间，素数没有那么多的话，那么最小判断到二，然后停止判断，提示系统不够10个，然后能输出几个输出几个。

user: user-2
content: printf("%d %d %d %d %d %d %d %d %d %d %d %d" 有12个

user: user-3
content: 利用循环才可以发挥数组的作用，不然要数组这样的连续内存干嘛。输出数组时用for循环即可一次性输出

user: user-4
content: 而且，不要用这种一长串的相加，一长串的printf 你看你会用for循环 写个for(int i=0;i<10;i++) {printf("%d ",grade[i]);} 不就好了么

user: user-4
content: 很简单，你数数你printf了几个%d
user-0 提问: 买了本《windows程序设计》用哪个软件编写好啊？

回复:
user: user-1
content: 引用 5 楼 cyycxz 的回复:引用 3 楼 luoweifu 的回复:可以看你的书用的是什么或推荐什么开发环境，用与书配套的开发环境学起来会比较顺利（特别是新手）。还有就是看你的书是基于哪个标准的，如果是C++11标准（11年的新标准），在VS2010下有些新的类是不支持的，可以用VS2013。如果是基于98标准那就无所胃了。下面是书子底下小备注：从本书原版出版至今已有十多年过去了，微软的visual studio也早已不是当年的样子。读者的机器上或许已经安装了最新的visual studio 2008甚至2010测试版。本书中提到的有关visual c++ developer studio的内容已经多半不适用了，编程的方式也有些面目全非。我就是看到这个才觉得用VS2010不太合适，好像书里的范例是在VC6.0上运行的 不知道你看完了序了没，我记得上面有说是已经重新编辑并在win7 VS2008测试过，完全可以运行。 我说的是第五版珍藏版，代码在配套光盘里。

user: user-2
content: 嗯，现在的不少书都还是这个，这是Vc++6.0完整绿色版——http://download.csdn.net/detail/u012421456/6897443

user: user-3
content: Visual C++ 6.0

user: user-4
content: 那你就用VC6.0吧，这是这经典的一个版本！如果想最新的C++知识，推荐一本书《C++Primer（第五版）》，如果语言不太好，可以买中文版的（翻译的挺好，本人在用）。不过了解一些老的C++类也还是有用的，因为工作后公司很可能有很多以前开发的程序都是基于老标准的。

user: user-5
content: 引用 5 楼 cyycxz 的回复:引用 3 楼 luoweifu 的回复:可以看你的书用的是什么或推荐什么开发环境，用与书配套的开发环境学起来会比较顺利（特别是新手）。还有就是看你的书是基于哪个标准的，如果是C++11标准（11年的新标准），在VS2010下有些新的类是不支持的，可以用VS2013。如果是基于98标准那就无所胃了。下面是书子底下小备注：从本书原版出版至今已有十多年过去了，微软的visual studio也早已不是当年的样子。读者的机器上或许已经安装了最新的visual studio 2008甚至2010测试版。本书中提到的有关visual c++ developer studio的内容已经多半不适用了，编程的方式也有些面目全非。我就是看到这个才觉得用VS2010不太合适，好像书里的范例是在VC6.0上运行的  1. 就用vs2010,哪些头文件找不到？可以自行百度的搜索答案 2. 用vc6

user: user-0
content: 引用 3 楼 luoweifu 的回复:可以看你的书用的是什么或推荐什么开发环境，用与书配套的开发环境学起来会比较顺利（特别是新手）。还有就是看你的书是基于哪个标准的，如果是C++11标准（11年的新标准），在VS2010下有些新的类是不支持的，可以用VS2013。如果是基于98标准那就无所胃了。下面是书子底下小备注：从本书原版出版至今已有十多年过去了，微软的visual studio也早已不是当年的样子。读者的机器上或许已经安装了最新的visual studio 2008甚至2010测试版。本书中提到的有关visual c++ developer studio的内容已经多半不适用了，编程的方式也有些面目全非。我就是看到这个才觉得用VS2010不太合适，好像书里的范例是在VC6.0上运行的

user: user-6
content: 书上用哪个你就用哪个呗

user: user-4
content: 可以看你的书用的是什么或推荐什么开发环境，用与书配套的开发环境学起来会比较顺利（特别是新手）。还有就是看你的书是基于哪个标准的，如果是C++11标准（11年的新标准），在VS2010下有些新的类是不支持的，可以用VS2013。如果是基于98标准那就无所胃了。

user: user-0
content: 引用 1 楼 user-7 的回复:不应该啊，和这个没关系吧不是吧

user: user-7
content: 不应该啊，和这个没关系吧
user-0 提问: 快速排序的代码有不明白的地方，标题长长长长长长长

回复:
user: user-1
content: 至于那个 if( i < j )，你注意上面的while有两个循环条件，因此while结束后，可能是因为不符合第一个条件结束的，也可能是不符合第二个条件结束的，这里if( i < j )就是判断是不是第一个条件导致while结束的

user: user-1
content: 引用 3 楼 Forthe2012 的回复:[quote=引用 2 楼 czarten 的回复:] R[j]关键字小于X  注释的是上面那句= =  指针，这里的指针不是你想的那个指针，只是一种形象的说法，因为用i和j两个数字标记数组中的位置，就像两根指针一样 上面的那句是R[J]>=X啊。 还有，i，j是数组的下标吗？我觉得下标的话应该这样写啊（顺便那部分代码我觉得应该这样写） if(x<R[j]) 		{ 			/*交换R[i]和R[j]，交换后i指针加1*/ 			R[i]=R[j]; 			i++; 		}[/quote]  while(R[j]>=x) 也就是，只要R[j]>=x，就一直循环 所以当while循环结束的时候，就是R[j]<x了

user: user-0
content: 是R[J]<X

user: user-0
content: 引用 2 楼 czarten 的回复:R[j]关键字小于X  注释的是上面那句= =  指针，这里的指针不是你想的那个指针，只是一种形象的说法，因为用i和j两个数字标记数组中的位置，就像两根指针一样 上面的那句是R[J]>=X啊。 还有，i，j是数组的下标吗？我觉得下标的话应该这样写啊（顺便那部分代码我觉得应该这样写） if(x<R[j]) 		{ 			/*交换R[i]和R[j]，交换后i指针加1*/ 			R[i]=R[j]; 			i++; 		}

user: user-1
content: R[j]关键字小于X  注释的是上面那句= =  指针，这里的指针不是你想的那个指针，只是一种形象的说法，因为用i和j两个数字标记数组中的位置，就像两根指针一样

user: user-0
content: 请教各位CSDN高人。 也许问题太不起眼了...
user-0 提问: 求助！！c语言中把一个txt文件读入到一个结构体内的问题

回复:
user: user-1
content: 建议的很正确 结果正确

user: user-0
content: 引用 2 楼 turingo 的回复:用fgets读取第一行，其数据不做处理就好了。  引用 1 楼 u012494310 的回复:大神在哪里？？？？恩恩，我自己试了一下可以了，谢谢你啦

user: user-0
content: 引用 2 楼 turingo 的回复:用fgets读取第一行，其数据不做处理就好了。  引用 1 楼 u012494310 的回复:大神在哪里？？？？可以直接帮我填上去吗？？？？不太明白，初学者。。谢谢了

user: user-2
content: 用fgets读取第一行，其数据不做处理就好了。  引用 1 楼 u012494310 的回复:大神在哪里？？？？

user: user-0
content: 大神在哪里？？？？
user-0 提问: C语言中前导空格后继空格等概念

回复:
user: user-1
content: 这不是C语言专业词汇 应该是个人的称呼

user: user-2
content: C语言没这种概念。

user: user-0
content: 引用 3 楼 user-3 的回复:编程中没有空格限制。。   还有没有其他什么类似这种的概念呢？ 感觉只看了基础教程，还有好多东西不知道。。。。 看程序的时候经常会遇到很难理解的段落，就像这次的“前导空格”看了好久都没明白，于是问了网上，才了解到“前导空格”。

user: user-3
content: 编程中没有空格限制。。
user-0 提问: 用vi编译器输入源代码保存后怎么运行呢

回复:
user: user-1
content: vi就好想Windows下的记事本，只是用来编辑代码的。你如果想运行编辑后的代码，需要先使用g++或其它编译器，把它编译成可执行文件，再运行

user: user-2
content: 这样的话，建议你： sudo apt-get install codeblocks 然后在Code::Blocks环境下学习和调试C代码。  引用 楼主 u013907296 的回复:比如hello world，输完后怎么让它显示出来呢大神不要嫌弃，新手啊

user: user-3
content: 学习编程还是用VS来学习。。

user: user-4
content: 1、vi是编辑器，不加编译器 2、先编译 按: 然后输入 !g++ % 3、:!./a.out
user-0 提问: fread一个一个读不成功，请大虾讲解：）

回复:
user: user-1
content: 引用 5 楼 u012903205 的回复:[quote=引用 1 楼 gqjjqg 的回复:]  int i = 6; while(i--)           {             if ( feof(fp2) ) { break; }           // 我错了，这个要取地址，另外 这里读取出来的数据是反序，输出时 也反序输出应该就好了。           fread(&b[i],sizeof(char), 1, fp2);//一次一个地读             //这里先省略一次一个地写fwrite(b,1,1,XX)             //printf("数据已经读取到%s\n", b);              }   我按照你的改了后也不对，编译器报错的[/quote]  对不起，回复的仓促了，改了。

user: user-0
content: 引用 4 楼 ovoovo 的回复:一个汉字占两字节，你试试一次读两字节看看。 再一个，你的b，分配内存大一点。  我想一个一个读，然后一次性读倒是可以的

user: user-0
content: fread一次性读取可以的，没有出现错误

user: user-0
content: 引用 1 楼 gqjjqg 的回复: int i = 6; while(i--)           {             if ( feof(fp2) ) { break; }             fread(b[i],sizeof(char), 1, fp2);//一次一个地读             //这里先省略一次一个地写fwrite(b,1,1,XX)             //printf("数据已经读取到%s\n", b);              }   我按照你的改了后也不对，编译器报错的

user: user-2
content: 一个汉字占两字节，你试试一次读两字节看看。 再一个，你的b，分配内存大一点。

user: user-3
content: fread貌似是二进制文件专用吧。。我目前也复习到这里了，

user: user-4
content: 本人认为事 字符编码 的问题 因为 你文档是汉字，用 字符就 ok 老师教我们的时候，一般是用fwrite写入，再用 fread读取，这样不容易出现乱码。

user: user-1
content: int i = 6; while(i--)           {             if ( feof(fp2) ) { break; }             fread(b[i],sizeof(char), 1, fp2);//一次一个地读             //这里先省略一次一个地写fwrite(b,1,1,XX)             //printf("数据已经读取到%s\n", b);              }
user-0 提问: gcc的宏定义参数可以为函数调用？？求指教～

回复:
user: user-0
content: 引用 5 楼 bluesky12312388 的回复:是gcc对宏的扩展。  参考http://book.51cto.com/art/201007/213547.htm 谢谢！

user: user-0
content: 引用 6 楼 gqjjqg 的回复:少些兼容性不好的代码，对大家都好... 是我要用别人的代码，呵呵

user: user-1
content: 少些兼容性不好的代码，对大家都好...

user: user-2
content: 是gcc对宏的扩展。  参考http://book.51cto.com/art/201007/213547.htm

user: user-3
content: 这是 gcc 的用法，VC 曾经盼望已久的用法。

user: user-0
content: 也不对，似乎是括号的问题，不知道是什么个讲法，切换了c99也还是这样…

user: user-0
content: 似乎是宏定义中不能嵌套变量定义的问题…gcc中可以通过。有什么说法么？

user: user-4
content: #define MAX(x,y) 之前加个声明试试  int temp(int a,int b);
user-0 提问: 谁能帮忙解释下这个程序,是如何判断一个数是质数,谢谢!

回复:
user: user-1
content: 引用 1 楼 user-3 的回复:这算法不是算质数的把？ 给个数8，返回应该是true，显然不对  是算质数的，不过直接从3开始试，忽略掉2了 我估计调用这函数的外层把2判断掉了

user: user-1
content: while (square < candidate && (candidate % divisor))  square是divisor的平方，square<candidate 就是 divisor<根号candidate candidate % divisor就是原数能不能整除divisor，能整除的话其值为0，跳出while循环  整个过程就是，candidate为原数，然后用3,5,7……依次去试除原数，一直试到根号candidate为止，后面不用试了，这个懂吧？  如果中途出现了某个divisor可以整除原数，或是divisor超过了根号candidate，那么就可以确定是不是质数了，循环跳出    话说这程序怎么写得莫名其妙，毫无可读性

user: user-2
content: 这个程序没什么复杂的吧。不过质数是什么数呢？忘光了，呵呵

user: user-3
content: 这算法不是算质数的把？ 给个数8，返回应该是true，显然不对
user-0 提问: IOCP 实现时，句柄关闭 问题

回复:
user: user-1
content: 就这几行代码来说 在循环里建立的 它的目的不过是建立后打印哈建立结果  然后不用了 就管了啊 不然其他地方关闭很费事

user: user-2
content: http://blog.csdn.net/anye3000/article/details/7470674

user: user-3
content: 不想操作该线程句柄就关了，线程还是跑起在。
user-0 提问: udp 多线程 c++ 聊天

回复:
user: user-1
content: 一个send对应一个recv，一个recv对应一个send，贴出编译错误提示吧

user: user-2
content: UDP不可靠、基于包； TCP可靠、基于流。

user: user-2
content: 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545

user: user-3
content: 在客户端recieve函数定义中加一个Sleep(1000)就好了。

user: user-4
content: 是怎么样的错误情况？服务端没收到还是客户端未发送？找个抓包工具先看看。

user: user-5
content: 请在线程函数中下断点, 单步执行, 看运行到哪里了

user: user-6
content: 问题好笼统的说！！
user-0 提问: GCC+Emacs如何调试运行C语言程序？

回复:
user: user-1
content: ;;启动gdb-many-windows时加载的钩子函数，改变many-windows的默认布局，这个钩子函数不能勾在gdb-setup-windows，因为此时assamble-buffer还没完成初始化，不能set到window   (defadvice gdb-frame-handler-1 (after activate)     (if gdb-use-separate-io-buffer         (advice_separate_io)       (advice_no_separate_io)))      ;;生成没有单独IO窗口的gdb布局   (defun advice_no_separate_io()   ;;默认的生成gdb-assembler-buffer的函数本身也会设计调用gdb-frame-handler-1，加入此条件发生避免无限递归调用     (if (not (gdb-get-buffer 'gdb-assembler-buffer))         (progn       (shrink-window-horizontally ( / (window-width) 3))          (other-window 1)       (split-window-horizontally)          (other-window 1)       (gdb-set-window-buffer (gdb-stack-buffer-name))          (other-window 1)       (split-window-horizontally)          (other-window 1)       (gdb-set-window-buffer (gdb-get-buffer-create 'gdb-assembler-buffer))          (split-window-horizontally  (/ ( * (window-width) 2) 3))          (other-window 1)       (gdb-set-window-buffer (gdb-get-buffer-create 'gdb-registers-buffer))          (other-window 1)       (toggle-current-window-dedication)       (gdb-set-window-buffer (gdb-get-buffer-create 'gdb-memory-buffer))       (toggle-current-window-dedication)          (other-window 2)       )))      ;;生成有单独IO窗口的gdb布局   (defun advice_separate_io()   ;;默认的生成gdb-assembler-buffer的函数本身也会设计调用gdb-frame-handler-1，加入此条件发生避免无限递归调用     (if (not (gdb-get-buffer 'gdb-assembler-buffer))         (progn       (split-window-horizontally)       (enlarge-window-horizontally ( / (window-width) 3))       (other-window 1)          ;;此处不能使用(gdb-set-window-buffer (gdb-get-buffer-create 'gdb-inferior-io))代替，       ;;因为在打开gdb-use-separate-io-buffer的状态时，它还会额外调用一些函数将gdb的input，output定位到该buffer       (gdb-set-window-buffer (gdb-inferior-io-name))          (other-window 1)       (split-window-horizontally)          (other-window 1)       (gdb-set-window-buffer (gdb-stack-buffer-name))          (other-window 1)          (other-window 1)       (toggle-current-window-dedication)       (gdb-set-window-buffer (gdb-get-buffer-create 'gdb-assembler-buffer))       (toggle-current-window-dedication)          (split-window-horizontally  (/ ( * (window-width) 2) 3))          (other-window 1)       (gdb-set-window-buffer (gdb-get-buffer-create 'gdb-registers-buffer))          (other-window 1)       (toggle-current-window-dedication)       (gdb-set-window-buffer (gdb-get-buffer-create 'gdb-memory-buffer))       (toggle-current-window-dedication)          (other-window 2)       )))

user: user-2
content: linux下面调试痛苦是可想而知的，要有心理准备，经历痛苦之后就成为了高手。

user: user-3
content: gdb很好用，花点时间是值得的。

user: user-4
content: gdb是调试的核心，你可以用vim/emacs或者是eclipse去配置调试的GUI  引用 楼主 GongZiXiaoBai_ 的回复:在CentOS下如何调试运行C语言程序？除了GDB还有没有更好的方法？ 感觉在Windows下VS平台调试运行很直观，到每一步可以看到变量地址和变量值，Linux下有没有类似的操作？
user-0 提问: 初学者的弱弱的问题

回复:
user: user-1
content: 踏踏实实看本书，边看边写。这样收获也不小了

user: user-2
content: 还是看书吧，找本基础的c语言教材，先走一遍下来。

user: user-3
content: 参考书： C语言程序开发范例宝典(第2版) C语言经典编程282例 网上书店或淘宝有。

user: user-4
content: 书 C Primer Plus 或者 谭浩强的 视频 赫斌C语言

user: user-5
content: 下个小巧的编程器吧，minGW studio 学编程一定要多动手，不管是看视频还是看书还是其他方式，动手进行编程实验才是最最重要的，不动手敲代码编程实验永远别指望学会C语言！

user: user-6
content: 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm

user: user-7
content: C语言视频：  http://www.tudou.com/home/93506222  建议你去看看，适合新手。从内存角度去讲解的。

user: user-8
content: 到底是想学C还是想学C++？

user: user-9
content: 直接看书吧， 《C和指针》

user: user-10
content: C语言推荐郝斌老师的视频——http://www.xuexi111.com/jiaocheng/shipin/26243.html，C++推荐孙鑫的——http://club.topsage.com/thread-156290-1-1.html
user-0 提问: 数据库 float问题

回复:
user: user-0
content: 引用 3 楼 caozhy 的回复:你有没有为float分配空间，输入的是否合法。 恩恩，最后又找到错误了。谢谢啊。大版主

user: user-0
content: 引用 1 楼 turingo 的回复:可以把float转为字符串进行数据库存取。  [quote=引用 楼主 u012620726 的回复:] 我想把一个结构体中的数据 存到 数据库中， 当scanf输入float类型的时候就报错了。Memory fault(coredump)；这个问题怎么解决啊[/quote] 就是啊，最后还是转成字符串来读取了。。

user: user-1
content: 你有没有为float分配空间，输入的是否合法。

user: user-2
content: 引用这个问题怎么解决啊 先找到coredump的原因

user: user-3
content: 可以把float转为字符串进行数据库存取。  引用 楼主 u012620726 的回复:我想把一个结构体中的数据 存到 数据库中， 当scanf输入float类型的时候就报错了。Memory fault(coredump)；这个问题怎么解决啊
user-0 提问: 怎样使用api来控制u盘的拔插？

回复:
user: user-1
content: 被弹出的U盘需要物理拔除, 再物理插入才可以.

user: user-2
content: usb总线重新枚举需要把设备的电源断开。

user: user-3
content: 需要重新插入U盘才行。  引用 楼主 wangbaomi 的回复:我用CM_Request_Device_Eject函数  把U盘弹出后，怎样重新找回U盘呢？  该用哪个api？
user-0 提问: 请教各位大神一个问题

回复:
user: user-1
content: 那边给钱多就学哪个

user: user-2
content: 借助一些教程资料自己下功夫学吧，每天保证一定的代码量，这里教程比较全： http://www.xiaodianlv.com/group/cyvyan/

user: user-3
content: 无所谓什么语言……只要学会一门其它的就好学了……重在坚持！！！

user: user-0
content: 恩恩 我还是先入手的事python然后在反过来学C

user: user-4
content: python容易上手的！C语言相对来说复杂点

user: user-5
content: 谁说c语言是最基础的了 不一定啊楼主 不要先入为主

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

user: user-7
content: 推荐先学C语言，其他语言在工作的就很容易学了。

user: user-3
content: 引用 1 楼 user-9 的回复:每种通用语言都有不同的适用范围和特点 没有任何一门语言必须以另一门语言为前提，实际上如果你在一门语言上学艺不精，反而会影响你学习另一门语言 所以不管你学哪种语言，在精通之前，忘记这世上存在其他语言 +1

user: user-8
content: 据说学好C了再学其它就好学了，对于学C，我推荐郝斌老师的视频，浅显易懂，适合入门，这是地址——http://www.xuexi111.com/jiaocheng/shipin/26243.html 你可以下载一两个看看

user: user-0
content: 谢谢你啦，感谢感谢 坚持就是最好的

user: user-9
content: 每种通用语言都有不同的适用范围和特点 没有任何一门语言必须以另一门语言为前提，实际上如果你在一门语言上学艺不精，反而会影响你学习另一门语言 所以不管你学哪种语言，在精通之前，忘记这世上存在其他语言
user-0 提问: C语言菜鸟一枚 在线求救！！！

回复:
user: user-1
content: 引用 7 楼 u013892653 的回复:[quote=引用 6 楼 nadleeh123 的回复:] [quote=引用 楼主 u013892653 的回复:] 各位大大好 小弟现在正开始学习C语言 用的是vs 2013 今天在复习代码的时候遇到一个很奇怪的问题希望大家求教      请问这是怎么回事== 昨天运行这个代码还妥妥的，怎么今天就不能了？ hello world有没问题…… 求老鸟解答…… 请用scanf_s scanf这种没有丝毫差错判断的函数拿来干嘛?[/quote] scanf_s这个命令只能在vs上使用不是吗？[/quote] C11标准转正了

user: user-0
content: 引用 6 楼 nadleeh123 的回复:[quote=引用 楼主 u013892653 的回复:] 各位大大好 小弟现在正开始学习C语言 用的是vs 2013 今天在复习代码的时候遇到一个很奇怪的问题希望大家求教      请问这是怎么回事== 昨天运行这个代码还妥妥的，怎么今天就不能了？ hello world有没问题…… 求老鸟解答…… 请用scanf_s scanf这种没有丝毫差错判断的函数拿来干嘛?[/quote] scanf_s这个命令只能在vs上使用不是吗？

user: user-1
content: 引用 楼主 u013892653 的回复:各位大大好 小弟现在正开始学习C语言 用的是vs 2013 今天在复习代码的时候遇到一个很奇怪的问题希望大家求教      请问这是怎么回事== 昨天运行这个代码还妥妥的，怎么今天就不能了？ hello world有没问题…… 求老鸟解答…… 请用scanf_s scanf这种没有丝毫差错判断的函数拿来干嘛?

user: user-0
content: 意思就是重新建一个project来运行？    顺便一小问：请问怎么生成exe文件啊？

user: user-2
content: exe损坏了估计，把项目从新生成一下。或者重新新建一个

user: user-0
content: ……提醒大大：可以点击放大的说...

user: user-3
content: 重新build一下

user: user-4
content: 图片中的文字看不清楚  引用 楼主 u013892653 的回复:各位大大好 小弟现在正开始学习C语言 用的是vs 2013 今天在复习代码的时候遇到一个很奇怪的问题希望大家求教      请问这是怎么回事== 昨天运行这个代码还妥妥的，怎么今天就不能了？ hello world有没问题…… 求老鸟解答……
user-0 提问: 为什么计算机采用最高位1为负数，0为正数这种规则？有什么深层次的原因吗？

回复:
user: user-1
content: 引用 9 楼 u013106556 的回复:[quote=引用 6 楼 czarten 的回复:] 人眼看来最直观的方案是原码 但原码有两个0，正0和负0，因此“看起来直观”的代价是计算混乱  另外一个方案是移码，移码的问题在于，由于每个数都自带一个偏移量，当两数相加或相减时，偏移量就会出问题，同样计算麻烦  再就是补码了，补码你一开始会觉得很难理解，不明白为什么规定成这样，其实理解了之后也是很直观的：就是一个正数不断增大，增大到破表就变成了负数，相当于最大的数+1等于最小的数，也就是把整个值域连成了一个环，你玩过贪吃蛇吗，蛇从左边出界会从右边进来  补码的逆天之处在于，它的加减法可以无视两数符号，正数+正数，负数+负数，正数+负数，负数+正数，都是一样的算法，而其它方案就要根据两数符号采取不同的步骤，因此“人眼不直观”带来的好处是“机器容易算”  但是，补码乘除法就没那么方便了，不过其它码的乘除法也没方便到哪去，因此补码是最佳选择受教了，许多细节需要自己仔细琢磨。。。[/quote] 补码就是只需要完成加法的电路，就能实现加减法。

user: user-2
content: 计算机组成原理, 再去复习复习.

user: user-3
content: 最高位1为负数，0为正数这种规则的最简单解释是：系统扩充位数的时候比较便利，只需要用最高位填充就可以保持不变。 如果你要问为什么是补码，请参照上面的答案。

user: user-0
content: 引用 6 楼 czarten 的回复:人眼看来最直观的方案是原码 但原码有两个0，正0和负0，因此“看起来直观”的代价是计算混乱  另外一个方案是移码，移码的问题在于，由于每个数都自带一个偏移量，当两数相加或相减时，偏移量就会出问题，同样计算麻烦  再就是补码了，补码你一开始会觉得很难理解，不明白为什么规定成这样，其实理解了之后也是很直观的：就是一个正数不断增大，增大到破表就变成了负数，相当于最大的数+1等于最小的数，也就是把整个值域连成了一个环，你玩过贪吃蛇吗，蛇从左边出界会从右边进来  补码的逆天之处在于，它的加减法可以无视两数符号，正数+正数，负数+负数，正数+负数，负数+正数，都是一样的算法，而其它方案就要根据两数符号采取不同的步骤，因此“人眼不直观”带来的好处是“机器容易算”  但是，补码乘除法就没那么方便了，不过其它码的乘除法也没方便到哪去，因此补码是最佳选择受教了，许多细节需要自己仔细琢磨。。。

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:王八的屁股——龟腚！（规定）可能确实这样。。

user: user-0
content: 引用 1 楼 user-9 的回复:你有什么更好的办法来标识正负数吗？没有，呵呵。可能自己没理解到采用这种方法的便利之处吧。

user: user-4
content: 人眼看来最直观的方案是原码 但原码有两个0，正0和负0，因此“看起来直观”的代价是计算混乱  另外一个方案是移码，移码的问题在于，由于每个数都自带一个偏移量，当两数相加或相减时，偏移量就会出问题，同样计算麻烦  再就是补码了，补码你一开始会觉得很难理解，不明白为什么规定成这样，其实理解了之后也是很直观的：就是一个正数不断增大，增大到破表就变成了负数，相当于最大的数+1等于最小的数，也就是把整个值域连成了一个环，你玩过贪吃蛇吗，蛇从左边出界会从右边进来  补码的逆天之处在于，它的加减法可以无视两数符号，正数+正数，负数+负数，正数+负数，负数+正数，都是一样的算法，而其它方案就要根据两数符号采取不同的步骤，因此“人眼不直观”带来的好处是“机器容易算”  但是，补码乘除法就没那么方便了，不过其它码的乘除法也没方便到哪去，因此补码是最佳选择

user: user-5
content: 王八的屁股——龟腚！（规定）

user: user-6
content: baidu一下"补码"

user: user-7
content: 有助于有符号和无符号的转换？

user: user-8
content: 兼顾效率和封闭性的人为约定，除非你有更合适的方法。  引用 楼主 u013106556 的回复:看到8位char类型的数据范围为-128~127,其推导设定采用最高位1为负数，0为正数这种规则，是人为规定的还是什么原因？

user: user-9
content: 你有什么更好的办法来标识正负数吗？
user-0 提问: 学c新手，求指出错误

回复:
user: user-1
content: 要么把max放在main之前，要么在前面写上max的定义，就好了

user: user-2
content: max 函数已经被minwindef.h中定义，不能再作为函数名

user: user-3
content: Max函数要在Main之前定义一下下。。。

user: user-4
content: 这个真是低级错误啊。int max(int A[100]);main前要有函数的定义，main是一个主函数，要调用其它的函数之前，必须要在它上面有定义过。

user: user-5
content: 已知： 有max函数 int A[100] main函数中调用max    数组作为实参传递可以直接传递数组名就行，比如max（A）    数组作为形参接收可以直接max（int A[]）或者max(int *A)  两种情况在max中使用的时候都可以以下标方式访问。虽然两种表示不一样，但是对于形参A，都是一个指针，因为数组名作为函数参数传递的时候会退化成指针。

user: user-6
content: 以下程序应该是楼主想要的，请参考   #include "stdio.h"  int max(int A[100]);  int main(void) {     int a[100];     int i;     printf("产生的100个随机数分别为：\n");      /* 产生100个0~99的整型随机数，并存储在一维数组中 */     for(i=0;i<100;i++)     {         a[i]=rand()%99;           /* a从10-99之间取值，即a是两位数 */         printf("%d    ",a[i]);     }     printf("\n");          max(a);              return 0; }      int max(int A[100])               /* 常规算法 */ {     int m=A[0], j;     for(j=1;j<100;j++)     {         if (m<A[j])          m=A[j];     }     printf("%d\n",m);     return m; }

user: user-7
content: 引用 1 楼 baichi4141 的回复:第一：  local 局部 function 函数 definitions 定义 are 是 illegal 非法的  第二：  int max(int (A[100])) if m<A[j]  没见过这两种写法+1

user: user-8
content: 函数输入不对？?

user: user-9
content: 引用 6 楼 u013890716 的回复:/* 减半递推计算法和递归函数调用 */      void MAX(int A[],int p,int q) 	{ 		if(p=q)  int n=A[p]; 		else  		{ 			int M1=MAX(A,p,(p+q)/2); 			int M2=MAX(A,(p+q)/2,q); 			if (M1>M2) n=M1; 			else n=M2; 		} 		printf("方法1最大值:%d", n); 	    printf("\n\n\n"); 	 	}     MAX(a[],0,99);  请告诉我定义有什么问题，之前一直学的用的都是c++,今天下午才接触c语言  1.if(p=q)等号错了 2.你在if里面定义的n，当然不能在else里用，你可以把int n拿到外面，然后if和else里分别赋值  另外你是如何做到一直用C++却不懂C语言基础的

user: user-10
content: 同是菜鸟  可否一起学习

user: user-0
content: /* 减半递推计算法和递归函数调用 */      void MAX(int A[],int p,int q) 	{ 		if(p=q)  int n=A[p]; 		else  		{ 			int M1=MAX(A,p,(p+q)/2); 			int M2=MAX(A,(p+q)/2,q); 			if (M1>M2) n=M1; 			else n=M2; 		} 		printf("方法1最大值:%d", n); 	    printf("\n\n\n"); 	 	}     MAX(a[],0,99);  请告诉我定义有什么问题，之前一直学的用的都是c++,今天下午才接触c语言

user: user-11
content: 引用 4 楼 u013890716 的回复:求问C语言怎样定义数组为参量的函数，可以给个例子吗 在C/C++中，数组除了定义之外不能整体操作，大部分对数组的操作都是使用指向数组首元素的指针和数组长度两个参数 建议初学者不要要求语言提供自己想要的功能，而是去了解语言有哪些功能之后思考如何使用

user: user-0
content: 求问C语言怎样定义数组为参量的函数，可以给个例子吗

user: user-12
content: 把max函数定义在main函数之前。

user: user-9
content: int max(int A[])

user: user-11
content: 第一：  local 局部 function 函数 definitions 定义 are 是 illegal 非法的  第二：  int max(int (A[100])) if m<A[j]  没见过这两种写法
user-0 提问: win32 程序DialogBox使用问题

回复:
user: user-0
content: 问题已经解决

user: user-1
content: 资源的头文件里没有定义

user: user-2
content: 能把代码贴出来吗？

user: user-0
content: 问题没有解决，等待回答
user-0 提问: C语言  有关素数  自己的代码效率好低= =

回复:
user: user-1
content: 参考http://blog.csdn.net/turingo/article/details/8161061  引用 楼主 u013850910 的回复: 希望大神提供一下代码 能给个解释更好了

user: user-2
content: #include <stdio.h> #include <stdlib.h>  int odd [1000] ; int odd_count = 0 ; int even [1000] ; int even_count = 0; int total = 0 ; int Abs(int val){ return val>0?val:(-val) ;} int isPrimer(int val) {     int res = 1;     int i = 0;     if(val<2)res = 0;     for(i = 2 ; i*i <= val ;i++)     {         if(val%i == 0) {res = 0 ;break;};     }     return res ; } void input(){     total = 0 ;     odd_count = 0 ;     even_count = 0;     scanf("%d",&total) ;     int tmp ;     while(total--)     {         scanf("%d",&tmp) ;         if(tmp%2==0)even[even_count++] = tmp ;         else odd[odd_count++] = tmp ;     } } int reSolve() {     int res = 0 ;     int i=0,j=0 ;     for(i = 0 ; i < odd_count ; i++)     {         for(j=0;j<even_count ;j++)         {             int temp = odd[i]-even[j] ;             temp = Abs(temp) ;             if(isPrimer(Abs(odd[i]-even[j]))&&isPrimer(Abs(odd[i]+even[j])))             {                 res ++;             }         }     }     return res; }  int main() {     input();     printf("%d",reSolve());     return 0; }  仅供参考

user: user-3
content: 很容易证明： 两数之和为质数（也就是素数）的必要条件是一个为奇数，另一个为偶数，且两数互质。 证明： 两奇数之和一定不是质数 a=2m-1,b=2n-1，那么a+b=2m+2n-2=2(m+n-1)，可见不是质数 两偶数同样的可以证明。 因此必须要一奇数一偶数。 证明：不互质的两数和不是质数 a=km,b=kn，k>1, 那么a+b=k(m+n)，至少有因子k，不是质数。  因此：先判定两数不满足“一个为奇数，另一个为偶数，且两数互质”条件就一定不是了，满足条件的再去判定和以及差是否为质数（因为只是必要条件，不是充分条件，所以要做判断），用AKS算法判定，只需O((1og n) )的时间就能算出，如果是1000个，那么远远满足1秒的时间。

user: user-0
content: 引用 1 楼 KenZhang1031 的回复:很容易证明： 两数之和为质数（也就是素数）的必要条件是一个为奇数，另一个为偶数，且两数互质。 证明： 两奇数之和一定不是质数 a=2m-1,b=2n-1，那么a+b=2m+2n-2=2(m+n-1)，可见不是质数 两偶数同样的可以证明。 因此必须要一奇数一偶数。 证明：不互质的两数和不是质数 a=km,b=kn，k>1, 那么a+b=k(m+n)，至少有因子k，不是质数。  因此：先判定两数不满足“一个为奇数，另一个为偶数，且两数互质”条件就一定不是了，满足条件的再去判定和以及差是否为质数（因为只是必要条件，不是充分条件，所以要做判断），用AKS算法判定，只需O((1og n) )的时间就能算出，如果是1000个，那么远远满足1秒的时间。  大神能给写个代码吗  我新手...。。
user-0 提问: 特殊回文数求帮助

回复:
user: user-0
content: 引用 1 楼 naoshi 的回复:输入2答案就不对了  答案对啊。。

user: user-1
content: 输入2答案就不对了

user: user-0
content: 引用 3 楼 KenZhang1031 的回复:10010不是回文数(反过来是01001，很明显不回文)，if((z==a+b+c+d+e+f)&&(a==f && b==e && c==d))要改为： if((z==a+b+c+d+e+f)&& (a!=0) &&(a==f && b==e && c==d))的确，结果那块看错了== 感谢，经点拨已经解决。

user: user-2
content: 10010不是回文数(反过来是01001，很明显不回文)，if((z==a+b+c+d+e+f)&&(a==f && b==e && c==d))要改为： if((z==a+b+c+d+e+f)&& (a!=0) &&(a==f && b==e && c==d))
user-0 提问: 帮忙看一下这个程序有啥问题？

回复:
user: user-0
content: 顶起来 求大家帮忙啊

user: user-1
content: #include<stdio.h> main() {     int a[11],i,pos,x;//不明白为什么要11个     printf("input numbers:");     for(i=0;i<10;i++)                scanf(" %d",&a[i]); //%d前面不要空格       for(i=0;i<10;i++)         printf(" %d",a[i]);     printf("\n");     printf("input a insert number:");     scanf("%d",&x);     for(i=0;i<10;i++)     {         if(x < a[i]&&x > a[i-1])//关键是这一句错了，i=0的时候,a[i-1]就越界了         {             pos = i;             for(int s=10;s>=i;s--)             {                a[s+1] = a[s];             }             a[pos] = x;         }        }     printf("the final numbers are:");     for(i=0;i<11;i++)         printf(" %d",a[i]);     printf("\n");   }

user: user-2
content: 这个。。。lz程序本身设计的有问题吧，你输入一个和你输入的十个数中一个相同的数，亦或输入一个不再这十个数所包括的范围内的一个数，结果都不正确 lz是用VC6.0吗
user-0 提问: fflush()为什么不能清除屏幕内容？

回复:
user: user-1
content: 引用 4 楼 u013854998 的回复:非常感谢各位，我想我找到方法了，   #include <stdio.h> #include <unistd.h>  int  main(void) { 	int i; 	for (i=0; i <= 100; i++){ 		printf ("\rComplete Percent:%d%%", i); 		fflush (stdout); 		sleep (1); 	} 	printf ("\n"); }    确实，这也是一个方法，呵呵。

user: user-0
content: 非常感谢各位，我想我找到方法了，   #include <stdio.h> #include <unistd.h>  int  main(void) { 	int i; 	for (i=0; i <= 100; i++){ 		printf ("\rComplete Percent:%d%%", i); 		fflush (stdout); 		sleep (1); 	} 	printf ("\n"); }

user: user-2
content: 试试 #include <stdio.h> #include <unistd.h>  int  main(void) {   printf("Games Loading %3d%%",0);   fflush(stdout);     for(int i=0; i <= 100; ++i)   {     sleep(1);     printf("\b\b\b\b%3d%%",i);     fflush(stdout);     }   puts("");   return 0; }

user: user-1
content: 引用 楼主 u013854998 的回复: #include <stdio.h> #include <unistd.h>  int  main(void) { 	for(int i=0; i <= 100; ++i) 	{ 		printf("Games Loading %d%%\n",i); 		fflush(stdout);////////////// 		sleep(1); 	} 	return 0; }    //求解答　。。。。 //程序愿意是想在单行实现百分比显示的。 // // // fflush函数是用来刷io缓冲区的，不是用来清屏的。 http://www.cplusplus.com/reference/cstdio/fflush/  要实现你的意图，可以利用'\b'转义，或者system("cls")，或者conio.h

user: user-2
content: 因为fflush不是干这个的。 试试system("cls") 或者system("clear");