Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: atoi函数，将字符串转换为相应的整型数，看不懂啊~

回复:
user: user-1
content: 把数值带进代码公式 里, 你就看懂了

user: user-2
content: 请点击上方结贴，谢谢

user: user-0
content: 感谢，醍醐灌顶~最近在学ios，但想先打打c语言的基础~

user: user-2
content: 引用 2 楼 u014082409 的回复:为什么说只有(s[i]-'0')才能将将ascil码，直接的s[i]也表示字符常量，不能转换为ascil码吗？还有，那个高位转换该如何理解？ 比如你想将“123”转换成123，for循环中第一个转换的是‘1’，这就是所谓的从高位开始 ‘1’是一个char的字符，它的值是‘1’的ascii码。想转换成1，需要s[i]-'0'。这个你看下ascii码表就知道了

user: user-0
content: 为什么说只有(s[i]-'0')才能将将ascil码，直接的s[i]也表示字符常量，不能转换为ascil码吗？还有，那个高位转换该如何理解？

user: user-2
content: for(i = 0; s[ i ] >= '0' && s[i] <= ' 9 ';  ++i)               n = 10  * n + (s[i] - '0'); 这个是从高位开始转换，s[ i ] >= '0' && s[i] <= ' 9 '表示字符的ascii值在‘0’-‘9’之间，也就是说是数字。否则不转换。 n = 10  * n + (s[i] - '0');中： s[i] - '0'，才能将ascii码转换成数字。10*n是将前一次的计算结果进位。
user-0 提问: 貌似数组越界问题，求大神们帮忙指明一下应该怎么改

回复:
user: user-1
content: 复制有意思吗？只为了排名？

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

user: user-3
content: hash[101]   输入一个x = 101或者更大 不久越界了？  这段程序不知道楼主想干嘛

user: user-2
content: 判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

user: user-1
content: 引用 楼主 u013169758 的回复:#include <stdio.h> #include <stdlib.h>  int main(){ 	int i; 	int count; 	  	while (scanf("%d", &count) != EOF&&count!=0){ 		int hash[101] = { 0 }; 		 		for (i = 0; i < count; i++){ 			 int x; 			scanf("&d", &x); 			hash[x] ++; 		} 		 int x; 		scanf("%d", &x); 		printf("%d\n", hash[x]);  	} 	return 0; }  int x; scanf("&d", &x); hash[x] ++; 有两个问题，第一个scanf("%d",&x); 第二个问题,hash大小是101，所以输入x如果超过100，那就越界了。 修改为如下： int x; scanf("%d",&x); hash[x%101]++;

user: user-4
content: L14: scanf("&d", &x) --> scanf("%d", &x)

user: user-0
content: 貌似是hash[x]++那里冲突，应该怎么改啊，求指导

user: user-5
content: count should not exceed 100

user: user-0
content: 引用 3 楼 neustar1 的回复:[quote=引用 楼主 u013169758 的回复:] #include <stdio.h> #include <stdlib.h>  int main(){ 	int i; 	int count; 	  	while (scanf("%d", &count) != EOF&&count!=0){ 		int hash[101] = { 0 }; 		 		for (i = 0; i < count; i++){ 			 int x; 			scanf("&d", &x); 			hash[x] ++; 		} 		 int x; 		scanf("%d", &x); 		printf("%d\n", hash[x]);  	} 	return 0; }  int x; scanf("&d", &x); hash[x] ++; 有两个问题，第一个scanf("%d",&x); 第二个问题,hash大小是101，所以输入x如果超过100，那就越界了。 修改为如下： int x; scanf("%d",&x); hash[x%101]++; [/quote] 非常谢谢你，真的很感谢！
user-0 提问: C fnmatch函数的问题?

回复:
user: user-1
content: sprintf(dirname,"%s",lookup(filedir,filename)); printf("%s",dirname);  sprintf那个是干嘛的？直接lookup就好了啊。 lookup没有返回文件名字，但它已经完成了输出功能了

user: user-2
content: 把33行去掉就行了，再说楼主在root帐号下编程可不是个好习惯啊

user: user-0
content: 直接函数 lookup(filedir,filename)); 就不会打印出返回0

user: user-3
content: sprintf(dirname,"%s",lookup(filedir,filename)); printf("%s",dirname);  lookup返回的是0，相当于null，所以你最后打印的dirname是(null)
user-0 提问: 大家以后写完程序之后一定要记得换行啊！

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

user: user-2
content: 赞一个

user: user-3
content: 你还是写作业阶段，输出随便写写就行了。  等你水平够了，写得的代码经常要拿给别人用的时候，输出，注释，接口文档，就会越来越标准了，呵呵呵

user: user-4
content: 顶一个！  这个其实可以通过单步调试，很容易发现的。

user: user-5
content: 越是简单的错误越是容易犯，找错误的时候还总是想复杂了

user: user-6
content: 我记得了

user: user-7
content: 我知道你是来送分的 ！

user: user-8
content: 有道理，顶下周楼，

user: user-9
content: 那lz以后不要再犯这样的错误了啊

user: user-10
content: 用调试不就行了，打个断点

user: user-11
content: 顶！！！！！！！！！！！！！！！

user: user-12
content: 这是非常常见的错误，因此，我们在输出时，要记得写那个该死的\n，免得和后面的提示符混在一起了，那会看起来非常不爽的。
user-0 提问: 原来编译器也会说谎的啊

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

user: user-1
content: 引用 5 楼 YTerrenceLau 的回复:赵老板不是说要迷信编译器么？ 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

user: user-2
content: 赵老板不是说要迷信编译器么？

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

user: user-3
content: 1<<-1编译器在编译的时候做了常量折叠，直接替换成了0，而两个变量是在运行是计算的，结果就是-2147483648

user: user-2
content: 楼上好犀利，学习了。

user: user-4
content: 说明编译器里constant folding的结果和x86 cpu的shl指令结果对于负数行为不一样。 因为标准规定是undefined behavior所以他们都没错。你要这么用那是你的问题。
user-0 提问: 思考了好久，希望哪位大神可以指点指点，感激不尽！

回复:
user: user-1
content: 引用 1 楼 user-10 的回复:还思考很久，丢人  谁都曾经是菜鸟，没有什么丢人的。

user: user-2

user: user-3
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-4
content: LZ主要是没有搞明白while循环需要判定条件的

user: user-5
content: #include <stdio.h> int main(void) { 	int sno		= 0; 	int i = 5;  	while(i --) 	{ 		int score; 	                     scanf("%d",&score); 		if(score >= 60 && score <= 85) 			sno++; 	} 	printf("%d",sno); 	return 0; }

user: user-6
content: 不用这么麻烦吧  #include <stdio.h> int main(void) { 	int sno		= 0; 	int i = 0; 	while(i < 5) 	{ 		int score; 		scanf("%d",&score); 		if(score >= 60 && score <= 85) 			sno += 1; 		i += 1; 	} 	printf("%d",sno); 	return 0; }

user: user-7
content: scanf中最好不要加非输入控制符（这里指逗号），关于scanf，lz可以看看这个——http://blog.csdn.net/u012421456/article/details/18501309 关于scanf的事已经在这里见过不少次了

user: user-7
content: #include <stdio.h> void main () { 	int score[5], sum = 0, i = 0; 	 	scanf("%d %d %d %d %d", &score[0], &score[1], &score[2], &score[3], &score[4]); 	while (i < 5) 	{ 		if(score[i]>=60 && score[i]<=85) 		{ 			sum += 1; 		} 		i++; 	} 	printf("sum = %d\n", sum); 	 }  这样才行

user: user-8
content: int i = 5; while( i-- ){  }

user: user-7
content: lz啊，你。。。唉 循环里根本没有改变条件的变量，怎么能结束循环啊 一楼代码稍有点儿问题，待会儿我改改啊

user: user-9
content: 你输入的内容又没赋值给score这个变量，拿score来判断肯定是错的。再说你的循环条件也不对

user: user-10
content: 还思考很久，丢人  #include <stdio.h> void main () { int score[5], sum=0,i=0;  scanf("%d,%d,%d,%d,%d",&score[0],&score[1],&score[2],&score[3],&score[4]); while (i<5) {     if(score[i]>=60&&score[i]<=85)             sum+=1;}     i++; } printf("sum=%d",sum);  }
user-0 提问: 高分相赠 正确答案50

回复:
user: user-0
content: 引用 3 楼 JiMoKuangXiangQu 的回复:引用 2 楼 molebin 的回复:[quote=引用 1 楼 vipda 的回复:] 看着太费眼。 我也不想条件有限啊 建议LZ还是用手敲上去，一方面熟悉代码，另一方面方便大家看。[/quote]  #include "stdafx.h" #include <stdio.h> #include <string.h>  int add(int x,int y) {return x+y;} int sub(int x,int y) {return x-y;} int mul(int x,int y) {return x*y;} int div(int x,int y) {return x/y;}  int (*func[]) (int x,int y)={add,sub,mul,div}; int num,curch;  char chtbl[]="+-*/()"; char corch[]="+-*/()=0123456789";  int getach() { 	unsigned int i; 	while(true) 	{ 		curch=getchar(); 		if(curch==00f)return -1; 		for(i=0;corch[i]&&curch!=corch[i];i++); 		if(i<strlen(corch))break; 		} 	return curch; } int getid(){ 	int i; 	if(curch>='0'&&curch<='9') 	{ 		for(num=0;curch>='0'&&curch<='9';getach()) 			num= ? 		return -1;  	} 	else 	{http://bbs.csdn.net/topics/390734919?page=1 		for(i=0;chtbl[i];i++) 			if(chtbl[i]==curch)break; 		if(i<=5) getach(); 		return 1; 	} 	}

user: user-1
content: 引用 2 楼 molebin 的回复:引用 1 楼 vipda 的回复:看着太费眼。 我也不想条件有限啊 建议LZ还是用手敲上去，一方面熟悉代码，另一方面方便大家看。

user: user-0
content: 引用 1 楼 vipda 的回复:看着太费眼。 我也不想条件有限啊

user: user-2
content: 看着太费眼。
user-0 提问: 老师布置的作业，有没有哪位会啊，要求代码，可以编写出来

回复:
user: user-1
content: 提问的艺术——http://bbs.csdn.net/topics/390623576

user: user-1
content: 遇到这种问题，几乎没人会直接回答你的，建议lz自己做，遇到问题了好好想想，想不明白了看书，还不行就谷歌百度，再不行了来论坛，不然，大家怕是不会帮忙的。 不要像这样，直接就把作业往这儿一放，会有几个人有这心思回答啊？

user: user-2
content: 去兼职网站花钱去吧，骚年
user-0 提问: 关于指针运用问题，求解惑

回复:
user: user-1
content: 引用 4 楼 chybeyond123456789 的回复:数组名是常量，不能对其++ 正解 使用指针时，要注意指针指向的地址是否合法，理解指针的含义。

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

user: user-3
content: 数组名是常量，不能对其++

user: user-4
content: 数组名是不能够用于++ 的

user: user-5
content: 修改了 指针的地址呗！

user: user-6
content: 简单的讲，就是语法规定，不能这样干，不能对数组名++。 复杂的讲，去啃一下c标准文档吧。
user-0 提问: CreateProcess和子进程退出的相关疑问，求解答

回复:
user: user-1
content: 引用 10 楼 u014123498 的回复:你好，我想再问下这方面的东西应该看什么书或者资料，谢谢 MSDN  ，《Windows  核心编程》，《Windows  图形编程》，《Windows  系统编程》  其中 MSDN  ，《Windows  核心编程》应该足够了， 《Windows  图形编程》，《Windows  系统编程》可以作为补充

user: user-0
content: 引用 8 楼 lm_whales 的回复:子进程的主线程，是父进程CreateProcess建立的。 独立的进程的主线程，是Shell建立的。 线程内核数据结构和堆栈空间，是系统创建的，系统直接取回线程的返回值，再结束线程的运行即可。 堆栈不是父进程，而是操作系统创建的。 你好，我想再问下这方面的东西应该看什么书或者资料，谢谢

user: user-1
content: Windows 线程才是运行单位，进程只是线程的容器。

user: user-1
content: 子进程的主线程，是父进程CreateProcess建立的。 独立的进程的主线程，是Shell建立的。 线程内核数据结构和堆栈空间，是系统创建的，系统直接取回线程的返回值，再结束线程的运行即可。 堆栈不是父进程，而是操作系统创建的。

user: user-2
content: 引用 6 楼 u014123498 的回复:[quote=引用 3 楼 neustar1 的回复:] [quote=引用 2 楼 u014123498 的回复:] [quote=引用 1 楼 neustar1 的回复:] LZ多想了，虽然不同进程的地址空间是不一样的，但是那仅限于用户态。 要知道所有的进程都有一个共享的地址区域，也就是内核所占用的那部分地址空间。 说到这，不知道楼主是否能明白一些呢？  内核态不是高2GB的地址吗？栈段里面出现的地址都是低2GB的啊[/quote] 不是return转到了Kernel中了吗？[/quote] 是不是父进程调用kernel32.dll里的CreateProcess以后会把kernel32.dll也映射到子进程啊[/quote] kernel32.dll就是内核相关的程序啊

user: user-0
content: 引用 3 楼 neustar1 的回复:[quote=引用 2 楼 u014123498 的回复:] [quote=引用 1 楼 neustar1 的回复:] LZ多想了，虽然不同进程的地址空间是不一样的，但是那仅限于用户态。 要知道所有的进程都有一个共享的地址区域，也就是内核所占用的那部分地址空间。 说到这，不知道楼主是否能明白一些呢？  内核态不是高2GB的地址吗？栈段里面出现的地址都是低2GB的啊[/quote] 不是return转到了Kernel中了吗？[/quote] 是不是父进程调用kernel32.dll里的CreateProcess以后会把kernel32.dll也映射到子进程啊

user: user-0
content: 引用 2 楼 u014123498 的回复:[quote=引用 1 楼 neustar1 的回复:] LZ多想了，虽然不同进程的地址空间是不一样的，但是那仅限于用户态。 要知道所有的进程都有一个共享的地址区域，也就是内核所占用的那部分地址空间。 说到这，不知道楼主是否能明白一些呢？  内核态不是高2GB的地址吗？栈段里面出现的地址都是低2GB的啊[/quote] 关键是那个kernel是哪来的，我导入表是空的啊

user: user-3
content: 父进程用CreateProcess创建一个子进程，子进程ret退出的话是返回父进程吧  这好像不是真的。子进程退出就退出了。

user: user-2
content: 引用 2 楼 u014123498 的回复:[quote=引用 1 楼 neustar1 的回复:] LZ多想了，虽然不同进程的地址空间是不一样的，但是那仅限于用户态。 要知道所有的进程都有一个共享的地址区域，也就是内核所占用的那部分地址空间。 说到这，不知道楼主是否能明白一些呢？  内核态不是高2GB的地址吗？栈段里面出现的地址都是低2GB的啊[/quote] 不是return转到了Kernel中了吗？

user: user-0
content: 引用 1 楼 neustar1 的回复:LZ多想了，虽然不同进程的地址空间是不一样的，但是那仅限于用户态。 要知道所有的进程都有一个共享的地址区域，也就是内核所占用的那部分地址空间。 说到这，不知道楼主是否能明白一些呢？  内核态不是高2GB的地址吗？栈段里面出现的地址都是低2GB的啊

user: user-2
content: LZ多想了，虽然不同进程的地址空间是不一样的，但是那仅限于用户态。 要知道所有的进程都有一个共享的地址区域，也就是内核所占用的那部分地址空间。 说到这，不知道楼主是否能明白一些呢？
user-0 提问: 统计X中值为1的二进制位数。

回复:
user: user-1
content: 引用 2 楼 u014082409 的回复:这么理解题目是对的，但是感觉这么说不严谨，因为为真为假是逻辑运算符的那个啥的，这个&是位运算符。  if 中为 0 则为假，非 0 都是真

user: user-2
content: 按位右移，判断最后一位是否为1，直到没有1为止。 也可用std::bitset

user: user-0
content: 这么理解题目是对的，但是感觉这么说不严谨，因为为真为假是逻辑运算符的那个啥的，这个&是位运算符。

user: user-3
content: (x & 1)  就是当x的最后一位是1的时候为真
user-0 提问: 关于指针和以为操作的问题（在线等）

回复:
user: user-0
content: 已解决，其实是我定义的变量类型问题。

user: user-1
content: 会不会是因为编译器？我用的vs2013写了一个测试：

user: user-2
content: lz你的第一个怎么还有个等号？ 会不会是因为优先级啊
user-0 提问: 我这个二进制转十进制程序怎么10个1可以，11个1就错呢？

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉

user: user-2
content: 可表示范围的问题

user: user-3
content: 11位已经超出整形的表示范围了.  int 按32位算: 4294967295   已经不能表示11个1了.

user: user-4
content: 参考一下

user: user-4
content: scanf("%d",&val);这个可以支持16进制，10进制和8进制，但是不支持2进数。

user: user-5
content: 用字符串吧，用long能处理的有效位数只有10位

user: user-6
content: 一楼正解，lz的情况是因为溢出，毕竟你输入的数太大，已经超出范围了。按二楼改了是不行的

user: user-7
content: 可能跟你电脑的long有关，有些电脑的long只能表示十位二进制数，你试试将引用long val,sjz,sum=0;改成long long val,sjz,sum=0;

user: user-8
content: printf("请输入一个二进制数："); scanf("%d",&val); 你用整形11位肯定溢出了，觉得2进制用字串表示为妥...
user-0 提问: 100个16位无符号整形数组的增序函数

回复:
user: user-1
content: 参考http://www.cnblogs.com/ForeverJoker/archive/2013/05/25/qsort-sort.html  引用 楼主 Chaos_upc 的回复:如题，求教大神写个函数，用C，JAVA都可以。 然后是对输出结果进行指定输入数值的相应位置查找函数(能再写出这个就更好了)

user: user-2
content: 数组排序？直接用qsort就可以了
user-0 提问: C opendir 函数，下查找读取文件名？

回复:
user: user-1
content: fnmatch()的确更合适

user: user-0
content: 多谢了，我用int main(int argc, char *argv[]) {         char *pattern;         DIR *dir;         struct dirent *entry;         int ret;          dir = opendir(argv[2]); //打开指定路径          pattern = argv[1];                        //路径存在         if(dir != NULL)         {                 //逐个获取文件夹中文件             while( (entry = readdir(dir)) != NULL)                 {               ret = fnmatch(pattern, entry->d_name, FNM_PATHNAME|FNM_PERIOD);               if(ret == 0)                      //符合pattern的结构                         {                 printf("%s\n", entry->d_name);               }else if(ret == FNM_NOMATCH){                 continue ;               }else                         {                 printf("error file=%s\n", entry->d_name);                         }                 }          closedir(dir);         } }  也可以使用了

user: user-1
content: #include <stdio.h> #include <string.h> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> char filename[256][256]; int len = 0; int trave_dir(char* path, int depth) {     DIR *d;//声明一个句柄     struct dirent *file;//readdir函数的返回值就存放在这个结构体中     struct stat sb;            if(!(d = opendir(path)))     {         printf("error opendir %s!!!\n",path);         return -1;     }     while((file = readdir(d)) != NULL)     {         if(strncmp(file->d_name, "aaaa_", 5) != 0)  // 你需要的前缀             continue;         strcpy(filename[len++], file->d_name);//保存遍历到的文件名     }     closedir(d);     return 0; } int main() {     int depth = 1;     int i;     trave_dir("/usr/keygoe/ini/", depth);     for(i = 0; i < len; i++)     {         printf("%s\t", filename[i]);     }     printf("\n");     return 0; }
user-0 提问: 关于C URL正则表达式报错

回复:
user: user-1
content: char url[] = "https?://[\d\-a-zA-Z]+(\.[\d\-a-zA-Z]+)*/?"; 改为 char url[] = "https?://[\da-zA-Z-]+(\.[\da-zA-Z-]+)*/?"; 试试看？

user: user-0
content: 我自己，运行程序出现以下问题：Invalid range end: url :https?://[d-a-zA-Z]+(.[d-a-zA-Z]+)*/?  这个正则表达式在网上验证了可以通过的
user-0 提问: 学渣求助   求大神帮忙

回复:
user: user-0
content: 引用 3 楼 u012421456 的回复:这是一个课程设计吧。建议lz还是自己做吧，不会了自己想，想不出来可以看书，还不行就谷歌百度，在不行了来论坛问吧，像这样，即使有人帮忙弄出来，也是很难有所收获的 如果lz不想自己做或难度实在太大，最起码也该把原文链接发出来啊我一点儿不会呀

user: user-0
content: 引用 1 楼 u014199915 的回复:求助求助~~~~~~~~~~~~~~ 引用 2 楼 vipda 的回复:i是哪来的？你这代码不全啊，把原文链接发过来h t t p : // wenku.baidu.com/view/a0d6651555270722192ef7d3.html

user: user-1
content: 这是一个课程设计吧。建议lz还是自己做吧，不会了自己想，想不出来可以看书，还不行就谷歌百度，在不行了来论坛问吧，像这样，即使有人帮忙弄出来，也是很难有所收获的 如果lz不想自己做或难度实在太大，最起码也该把原文链接发出来啊

user: user-2
content: i是哪来的？你这代码不全啊，把原文链接发过来

user: user-0
content: 求助求助~~~~~~~~~~~~~~
user-0 提问: 有没有可以操作缓存的函数？

回复:
user: user-1
content: 引用 6 楼 TheNewIpad 的回复:这种操作是CPU自动控制的吧。  记得深入探索里面说，当你访问 一个地址A的话， CPU会把A附近的数据也向上缓存（如果地址是在硬盘，存入内存， 如果在内存，存入高速缓存。 具体读取的数据大小， 由相关硬件决定。如硬盘4kb向内存缓存， 内存一次读取一行。大小由硬件决定）。 这就是地址访问的局部性。  二级缓存向一级缓存一次缓存64字节（我的机器）。

user: user-1
content: 这种操作是CPU自动控制的吧。  记得深入探索里面说，当你访问 一个地址A的话， CPU会把A附近的数据也向上缓存（如果地址是在硬盘，存入内存， 如果在内存，存入高速缓存。 具体读取的数据大小， 由相关硬件决定。如硬盘4kb向内存缓存， 内存一次读取一行。大小由硬件决定）。 这就是地址访问的局部性。

user: user-2
content: 有吧？即使有也没有大面积传播，因为cache 主要是操作系统在操纵。

user: user-3
content: 通常来讲，CPU的缓存对于编程人员是透明的，它压根没打算让你控制。

user: user-4
content: 引用 楼主 cs_huster 的回复:比如把内存中4M的数据读入到处理器的LLC当中，也就是最后一级缓存 因芯片而异，具体看对应芯片的手册。

user: user-5
content: CPU的cache应该不能直接操作。即便可以，也不提倡。看看intel的编程手册。

user: user-6
content: 没有
user-0 提问: union 的小问题（在线等，问题解决即结贴）

回复:
user: user-1
content: 引用 2 楼 niceworkteam 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 全部存为varchar类型。  使用sprintf函数将 double转为char long也转为char 可是我并不知道需不需要转，也不知道该怎么转，我只是直接使用联合体的字符串去存。  DevInfo di;   di.uVal.s ...// 我直接使用的是 s 字段，但是不知道啥时候该转，也不知道该怎么转。 [/quote]  保存&di.uVal地址，sizeof(DevInfo::UVAL)字节的数据就行了。

user: user-2
content: 绝对没有  但是可以在一定程度上进行猜测,但并非准确

user: user-3
content: 引用 5 楼 u013573183 的回复:给这个变量赋值的地方通知你,不过既然是黑暗的角落里,那通知也不会有  以上3种方法,没了  设计缺陷,无解  确定没有办法知道当前存储类型？

user: user-2
content: 给这个变量赋值的地方通知你,不过既然是黑暗的角落里,那通知也不会有  以上3种方法,没了  设计缺陷,无解

user: user-3
content: 引用 3 楼 u013573183 的回复:typedef struct Dev {      int  ID;      int  Type;      union  UVAL      {             char s[128];             double d;             long   l;      }uVal; }DevInfo;  Type记录当前枚举的类型  或者 在你这个情况中,不需要使用枚举,都使用 char s[128]; 表示就够了  可是这个结构体的声明是我无权改变的，我只负责将里面的数据存入数据库……所以我说是在一个黑暗的角落……

user: user-2
content: typedef struct Dev {      int  ID;      int  Type;      union  UVAL      {             char s[128];             double d;             long   l;      }uVal; }DevInfo;  Type记录当前枚举的类型  或者 在你这个情况中,不需要使用枚举,都使用 char s[128]; 表示就够了

user: user-3
content: 引用 1 楼 zhao4zhong1 的回复:全部存为varchar类型。  使用sprintf函数将 double转为char long也转为char 可是我并不知道需不需要转，也不知道该怎么转，我只是直接使用联合体的字符串去存。  DevInfo di;   di.uVal.s ...// 我直接使用的是 s 字段，但是不知道啥时候该转，也不知道该怎么转。

user: user-4
content: 全部存为varchar类型。  使用sprintf函数将 double转为char long也转为char
user-0 提问: 通过JNI将JAVA对象映射为C语言的结构体，然后这个结构体作为参数传给下层C语言的问题，这个请大家帮忙看看我写的为什么不行啊。

回复:
user: user-1
content: 请问楼主解决了吗？我最近也遇到了类似的问题，userInfo.name = temName;这么赋值不行，那么userInfo.nLeft=temLeft;那么整型赋值行不行啊？

user: user-2
content: 不直接赋值的。使用 (env)->GetStringLength(jstr );，获取一下长度，或者知道长度直接定义一个char数组，然后使用(char*)env->GetStringUTFChars(jstr,0);  获取

user: user-3
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。

user: user-0
content: 哎。。。。。。

user: user-4
content: 引用 3 楼 lgmsyy 的回复:[quote=引用 2 楼 user-4 的回复:] userInfo.name = temName;//但是这么赋值好像不行 java的String对象存储了字符对象"hello"，不想c语言的char*，只存储了一个指针，这样当然不行。 LZ要做的是提取String对象的内容，然后在JNI中分配一段同样大小的内存，然后存储该字符串。  有点糊涂，能具体说明下吗，现在我就是对细节不清楚。[/quote] Prompt.java: class Prompt { 	// native method that prints a prompt and reads a line 	private native String getLine(String prompt); 	public static void main(String args[]) { 		Prompt p = new Prompt(); 		String input = p.getLine("Type a line: "); 		System.out.println("User typed: " + input); 	} 	static { 		System.loadLibrary("Prompt"); 	} }  JNI文件代码示例： XXX.c JNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt) { 	/* assume the prompt string and user input has less than 128 characters */ 	char outbuf[128], inbuf[128]; 	/* 下面的2句提取从Java那边传递过来的字符串到outbuf */ 	int len = (*env)->GetStringLength(env, prompt); 	(*env)->GetStringUTFRegion(env, prompt, 0, len, outbuf); 	printf("%s", outbuf); 	scanf("%s", inbuf); 	return (*env)->NewStringUTF(env, inbuf); }  到网上搜索 JNI Programmer’s Guide and Specification 文档，有详细的阐述。 以前做过几个java结合JNI的案子，这份资料帮助很大，呵呵。

user: user-0
content: 引用 2 楼 user-4 的回复:userInfo.name = temName;//但是这么赋值好像不行 java的String对象存储了字符对象"hello"，不想c语言的char*，只存储了一个指针，这样当然不行。 LZ要做的是提取String对象的内容，然后在JNI中分配一段同样大小的内存，然后存储该字符串。  有点糊涂，能具体说明下吗，现在我就是对细节不清楚。

user: user-4
content: userInfo.name = temName;//但是这么赋值好像不行 java的String对象存储了字符对象"hello"，不想c语言的char*，只存储了一个指针，这样当然不行。 LZ要做的是提取String对象的内容，然后在JNI中分配一段同样大小的内存，然后存储该字符串。

user: user-0
content: 有人帮忙吗？？？
user-0 提问: 一个和宏#if相关的问题。

回复:
user: user-1
content: 楼主你得理解运行时和编译的两个不同概念。。

user: user-2
content: 引用 9 楼 dbzhang800 的回复:看来你不清楚　-o 是做什么用的。  gcc -E test.c 会默认生成一个 .i 的文件，即 test.i  但是你已经通过-o 告诉它，这个生成的文件叫 test,而不是默认名字 test.i 达人啊。

user: user-3
content: 看来你不清楚　-o 是做什么用的。  gcc -E test.c 会默认生成一个 .i 的文件，即 test.i  但是你已经通过-o 告诉它，这个生成的文件叫 test,而不是默认名字 test.i

user: user-0
content: 我是想用gcc -o test test.c 这个命令行来生成一个test程序， 但是现在的编译错误是： gg.c:18:32: error: token "{" is not valid in preprocessor expressions  然后刚才zhao4zhong1 说，可以加一个 -E的选项，然后看一下 .i 的内部的错误 但是我想用这个命令行来编译时： gcc -o test test.c -ep -p -E 还是提示有错误，也没有  .i 文件生成。

user: user-3
content: 引用 5 楼 jelllove 的回复:我用这个命令编译了一下 [code=c]gcc -o test test.c -ep -p -E/code]  但是没有看到有一个 .i 的文件生成，是我的命令行有问题？ 你不是用 -o 指定生成的文件叫 test 了么？

user: user-3
content: 引用 3 楼 jelllove 的回复:那就是说，我编译时的判断条件中，不能出现strstr这样的函数？ 不止是strstr这样的函数，而是你里面的所有的哪些以分号结束的运行时的语句都不能出现。

user: user-0
content: 我用这个命令编译了一下 [code=c]gcc -o test test.c -ep -p -E/code]  但是没有看到有一个 .i 的文件生成，是我的命令行有问题？

user: user-2
content: 编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E

user: user-0
content: 那就是说，我编译时的判断条件中，不能出现strstr这样的函数？

user: user-4
content: 宏在编译前执行，源代码编译为程序，程序运行时执行strstr函数 所谓宏函数只是便于初学者理解的说法，宏和函数是完全不同的两个概念
user-0 提问: 一个题目的bug找不到

回复:
user: user-1
content: 你输入的是 18,11？？

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-3
content: 输入完成后，把ab的值都打印出来看看！是否正确！

user: user-4
content: 不是楼主的输入问题，就是编译器的问题，我这里正常运行，结果正确
user-0 提问: 语句这样，我把语句改成那样可以吗？

回复:
user: user-1
content: for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }

user: user-2
content: 引用 1 楼 u012586257 的回复:不是不行，是和原语句不等价 原程序中c=='\n' c==EOF 都会退出循环的，你修改后就不会退出了  同意，修改前后代码所表达的意思是不一样的；修改后，循环要执行 lim -1次，而修改前，循环不一定能到lim -1次，你按下回车键后，循环就结束了！

user: user-0
content: 感谢~顿时有种柳暗花明的感觉~

user: user-3
content: for(i = 0; i < lim -1 ; ++i) {   c=getchar();   if ((c == '\n' || c == EOF)   {      break;   }   s[i] = c; }

user: user-4
content: 不是不行，是和原语句不等价 原程序中c=='\n' c==EOF 都会退出循环的，你修改后就不会退出了
user-0 提问: union联合体数组指针，怎么和数组一样用？

回复:
user: user-1
content: #include <stdio.h> union U {     unsigned _int64 uni;     unsigned char   pos[8]; } gene[3]; void function(U *pp) {     pp[1].uni = 0x0706050403020100ui64; } void main() {     function(gene);     printf("0x%I64xui64\n",gene[1].uni);     printf("%02x %02x %02x %02x %02x %02x %02x %02x\n",         gene[1].pos[0],         gene[1].pos[1],         gene[1].pos[2],         gene[1].pos[3],         gene[1].pos[4],         gene[1].pos[5],         gene[1].pos[6],         gene[1].pos[7]); } //0x706050403020100ui64 //00 01 02 03 04 05 06 07 //

user: user-1
content: 0x0706050403020100 和 0x0706050403020100i64 和 0x0706050403020100ui64 不是一回事！

user: user-2
content: union 根struct  enum等关键字是一样的,   你能使用struct *p   这样定义一个变量吗, 显然是不正确的.  typedef union {  unsigned _int64 uni;  unsigned char pos[8]; } MyInt64;  MyInt64 gene[3];  void function(MyInt64*pp) {*(pp+1) = 0x0706050403020100;}     void main() {function(gene);}

user: user-3
content: 觉得你应该先声明一个union比如tGene，然后声明数组 tGene gene[3], 函数说明用 function(tGene *p), 赋值用  p[1].uni=0x0706050403020100;

user: user-4
content: 建议直接用int array[8];这样就简化了分段。 把超过32位的数值用两个或多个数组中的int来表示；
user-0 提问: 数据结构设计

回复:
user: user-1
content: 用map，Address当key，速度应该很快

user: user-2
content: 通常≤10000不必考虑效率。

user: user-0
content: 就是效率低着

user: user-3
content: 遍历一下也没什么的。  引用 楼主 u014162415 的回复:一个用户ID下有15个地址Address，每个地址都是唯一的值，不重复。 有500个用户，也就有7500个地址Address,需求是：给个地址Address，能快速查找到用户ID。 也就是下面结构。 用户ID1：Address1 = 15             Address2 = 2000           Address3 = 200000050           .           . 	  Address15= 0xFFFFFFFE 用户ID2：Address16 = 99           Address17 =10000000           Address18 = 634345345           .           . 	  Address30 =324532453451 . . 用户ID500：Address7486 = 4654634           Address7487 =3664356346           Address7488=3425646326           .           . 	  Address7500=2 因为Address值的范围是0~0XFFFFFFFF,把Address作为数组下标，太耗内存。 把用户ID作为数组小标，Address[15]作为值可以，但是每次根据Address取用户ID，都要遍历数组。 大家有不用遍历，好的建议吗？
user-0 提问: 顺序栈和链栈

回复:
user: user-0
content: 是我们自己OJ上的题错了。我自己的代码没问题，谢谢大家。

user: user-1
content: 我觉得就这个题而言，顺序栈要好些吧，起码是一次性malloc，而链栈却要malloc MaxElements多次

user: user-2
content: while条件有问题吧，getchar会吃掉第一个字符，然后回车前有多余空格的话，会继续读下行，那么不是死循环就是最后n值没读到还是原来未初始的垃圾值，貌似改成简单全部scanf读入即可...  while(scanf("%d",&x))!=EOF)     Push(x,S);  int n = TopandPop(S); ...

user: user-0
content: 目前现在这样超时 怎么改？

user: user-3
user-0 提问: 关于用C语言进行的开发

回复:
user: user-1
content: 引用 11 楼 RJGCSS 的回复:[quote=引用 7 楼 DUAN521414 的回复:] 做电信方面后台开发，一般都是前台JAVA后台C，LINUX还是更亲向于C的，C工作要求较其他高点，但是也没事，努力就好，搞C在语言里还是很赚钱的   做C开发薪资待遇方面怎么样 [/quote]  引用 11 楼 RJGCSS 的回复:[quote=引用 7 楼 DUAN521414 的回复:] 做电信方面后台开发，一般都是前台JAVA后台C，LINUX还是更亲向于C的，C工作要求较其他高点，但是也没事，努力就好，搞C在语言里还是很赚钱的   做C开发薪资待遇方面怎么样 [/quote]待遇在语言里还算是高的吧，如果你用C做的是技术不是皮毛，在沈阳这种城市四年以上经验6K基本随便跳，可以要到8K，平均的，当然也有个别过万的，如果去北京这种城市从6K到6W不等吧，看个人能力。

user: user-2
content: 《Unix环境高级编程》《Unix网络编程》这就是了，界面GNOME下GTK，KDE下Qt 如果往OS走，解析内核，搞搞嵌入式

user: user-3
content: 引用 楼主 RJGCSS 的回复:请问用C在Linux环境下进行应用层的开发多吗？ 现在Linux环境下的C程序员大都做什么？？ 应届生找C程序员的工作好找吗？？  我即将毕业找工作，希望各位点建议。  想真正的搞计算机就搞C底层，想当名攻城师就去搞上层，不过在我看来是缘木求鱼。

user: user-4
content: 我学了两三年的纯C。如今开始全面转面向对象。倒不是觉得C不够好，技多不压身。而且学会C语言再转其他语言，真的很容易。 C这种面向过程的语言，他只是在程序中有结构和体系，但是他的代码是没有结构的，所有函数都是平等的。面向对象就不一样了，他连代码都有结构，我想这也是面向对象现在更火的原因吧。

user: user-5
content: 混饭吃而已，学什么已经不重要了。

user: user-6
content: 上面有人提到金融、电信行业用C来开发后台程序，以前是这样，但随着互联网金融、现代通信业务的兴起，业务模式的升级，而且硬件性能的提高，用C写的程序很难升级，早晚会被面向对象编程模式替代，就是说C这方面已经没有优势了。

user: user-6
content: 引用 楼主 RJGCSS 的回复:请问用C在Linux环境下进行应用层的开发多吗？ 现在Linux环境下的C程序员大都做什么？？ 应届生找C程序员的工作好找吗？？  我即将毕业找工作，希望各位点建议。工作的话，要看你的基础与兴趣，而不只是纯粹看钱，做哪方面都有钱多钱少的，看你的水平。如果你的数据结构，操作系统基础不错，喜欢中下层的开发，C是不错的选择。C是面向过程的开发，运行效率高，不适合用来开发大的系统（操作系统除外）。用C来写软件还是很有技术含量的。

user: user-7
content: 《Linux C编程一站式学习》

user: user-0
content: 引用 7 楼 DUAN521414 的回复:做电信方面后台开发，一般都是前台JAVA后台C，LINUX还是更亲向于C的，C工作要求较其他高点，但是也没事，努力就好，搞C在语言里还是很赚钱的   做C开发薪资待遇方面怎么样

user: user-8
content: 发现已经很长时间没用Ｃ了。

user: user-9
content: 我在国企用Linux开发，基本上就是写一些后台程序

user: user-10
content: 新手学习学习

user: user-11
content: 学习下，占楼。

user: user-12
content: 大型程序用C的不多。Linux下只有GNU-Gnome-Gtk一系抱着C不放。即便如此，它们也出了C++的binding库，以及自己的高级语言。

user: user-1
content: 做电信方面后台开发，一般都是前台JAVA后台C，LINUX还是更亲向于C的，C工作要求较其他高点，但是也没事，努力就好，搞C在语言里还是很赚钱的

user: user-13
content: 现在基于linux/unix下的c语言开发，国内的主要领域大部分是金融和电信行业的开发。

user: user-0
content: 引用 1 楼 user-14 的回复:c主要用在嵌入式开发上了，效率高，linux下c++开发比较多，主要在服务端。   我是学软件工程的，请问您一下， 就您看来应届生找这两个方向的哪一个薪资会高一些。 虽然这个话题有点俗， 但是对于现在的社会， 这也是很现实的问题。 谢谢

user: user-14
content: c主要用在嵌入式开发上了，效率高，linux下c++开发比较多，主要在服务端。
user-0 提问: 内联汇编的一道简单的问题

回复:
user: user-0
content: 受教了~~  thank you!

user: user-1
content: 查了下，是IBM Enterprise Systems Architecture/390芯片的指令。 可参考链接： http://www-947.ibm.com/support/entry/portal/search_results?sn=spe&q=ESA/390%20Principles%20of%20Operation&filter=language:en 下载手册：ESA/390 Principles of Operation (SA22-7201-08)   STORE CPU ADDRESS STAP D(B) [S] ┌────────────────┬────┬────────────┐ │ 'B212' │ B │ D │ └────────────────┴────┴────────────┘  16 2 31 The 16-bit unsigned binary integer by which this CPU is identified in a multiprocessing configuration is stored at the halfword location designated by the second-operand address. Special Conditions The operand must be designated on a halfword boundary; otherwise, a specification exception is recognized. Condition Code: The code remains unchanged. Program Exceptions:  Access (store, operand 2)  Privileged operation  Specification
user-0 提问: 网络设置，收发包

回复:
user: user-0
content: 现有一个DHCP服务器程序    eth1(lan)                           eth2(wan)<----------------xp(将eth2与xp配置在同一个vm net。 例如vm net2)       |                                          | ----------------------------------------------------- 在xp里启动自动获取ip地址。查看，正常分配到DHCP地址池里的一个有效地址。   现有一个加、去VLAN程序，在eth3收到的数据包加上一层vlan 在eth4收到的数据包加去掉一层vlan      eth3(lan)                 eth4(wan)        |                                 | ---------------------------------------------   现在想dhcp服务器发offer包的时候给它加上一层vlan，然后用一台xp的wireshark去抓取这个数据包。验证是否加上了一层vlan。 现在这个网络拓扑图要怎么画，在虚拟机里应该怎么连接。 请大家帮忙解决！！！！！！！！

user: user-0
content: 引用 8 楼 xihu1364 的回复:用NAT  3个系统 xp1 xp2 linux 你到底想怎么连？  xp1连接linux  网卡1 xp2连接linux  网卡2  然后让xp1 ->linux 网卡1 ->linux 网卡2->xp2   是这样子么？  这样xp1怎么能跟xp2通信呢？因为不在一个网段  除非在linux弄个中转...   在linux上将网卡1和网卡2桥接不知道是否可以...  你没有看我的配置吗，XP1  XP2  同一个网段，同一个VM NET。这时就是通的，用NAT肯定是不通的。  我是要xp  与 linux的dma网卡连通。

user: user-1
content: 用NAT  3个系统 xp1 xp2 linux 你到底想怎么连？  xp1连接linux  网卡1 xp2连接linux  网卡2  然后让xp1 ->linux 网卡1 ->linux 网卡2->xp2   是这样子么？  这样xp1怎么能跟xp2通信呢？因为不在一个网段  除非在linux弄个中转...   在linux上将网卡1和网卡2桥接不知道是否可以...

user: user-2
content: 都是虚拟机的话 不知道数据包是不是走的网卡 也不知道你用的什么软件抓包 ping通是最基本的吧 个人意见

user: user-3
content: 引用 3 楼 zhao4zhong1 的回复:VM配置不熟. 我的意思是说我VM配置不熟，爱莫能助； 不是说你VM配置不熟，需要进一步熟悉。

user: user-0
content: 现做了这样的实验 第一台XP  配置 ip:192.168.30.120 第二台XP  配置 ip:192.168.30.130 linux的eth3(DMA口)      配置 ip:192.168.30.140 以上全在vm net2下 结果 两台xp与eth3都ping不通。   现增加一个eth6(非DMA口)  配置 ip:192.168.30.110 也在vm net2下 此时两台xp与eth3、eth6都是互通的。这是为什么？

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:VM配置不熟.先行谢过。。回帖了！！

user: user-0
content: 在虚拟网络编辑器里添加vm net2 这里只能设置为模式的host模式吗？ 默认vm net1是桥接  vm net1 是host  vm net8是NAT。

user: user-3
content: VM配置不熟.

user: user-0
content: 没人回！！！！！
user-0 提问: 宏_INTSIZEOF(n)实现看不懂，求分析。

回复:
user: user-0
content: 引用 5 楼 vichare 的回复:[quote=引用 4 楼 caiwei_cs 的回复:] [quote=引用 3 楼 vichare 的回复:] 首先，sizeof(int)肯定是2的次方数，比如32位是4，64位是8  ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )  的意思就是，如果sizeof(n)是sizeof(int)的倍数，则保持不变，否则返回最小的，大于sizeof(n)的，sizeof(int)的倍数。 比如，如果sizeof(int)是4，那么sizeof(n)是1-4的时候返回4，5-8的时候返回8，以此类推  谢谢了，我算了一下，虽然不知道为什么数学上能够实现这个功能，但是确实可以。[/quote] 首先sizeof(int)写成2进制是1后面若干个0，假设是n个0 sizeof(int) - 1 就是n个1， 取非再和前面的数取与就是清除掉前面那个数的后面n比特。 如果sizeof(n) 后面n比特都是0，那么加sizeof(int)-1不进位，相当于加上再清除掉。 如果sizeof(n) 后面n比特至少有1位是1，那么加了之后会往前进1，相当于sizeof(n)  右移n位，加1，再补充上n个0。[/quote]  万分感谢。！！！

user: user-1
content: 引用 4 楼 caiwei_cs 的回复:[quote=引用 3 楼 vichare 的回复:] 首先，sizeof(int)肯定是2的次方数，比如32位是4，64位是8  ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )  的意思就是，如果sizeof(n)是sizeof(int)的倍数，则保持不变，否则返回最小的，大于sizeof(n)的，sizeof(int)的倍数。 比如，如果sizeof(int)是4，那么sizeof(n)是1-4的时候返回4，5-8的时候返回8，以此类推  谢谢了，我算了一下，虽然不知道为什么数学上能够实现这个功能，但是确实可以。[/quote] 首先sizeof(int)写成2进制是1后面若干个0，假设是n个0 sizeof(int) - 1 就是n个1， 取非再和前面的数取与就是清除掉前面那个数的后面n比特。 如果sizeof(n) 后面n比特都是0，那么加sizeof(int)-1不进位，相当于加上再清除掉。 如果sizeof(n) 后面n比特至少有1位是1，那么加了之后会往前进1，相当于sizeof(n)  右移n位，加1，再补充上n个0。

user: user-0
content: 引用 3 楼 vichare 的回复:首先，sizeof(int)肯定是2的次方数，比如32位是4，64位是8  ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )  的意思就是，如果sizeof(n)是sizeof(int)的倍数，则保持不变，否则返回最小的，大于sizeof(n)的，sizeof(int)的倍数。 比如，如果sizeof(int)是4，那么sizeof(n)是1-4的时候返回4，5-8的时候返回8，以此类推  谢谢了，我算了一下，虽然不知道为什么数学上能够实现这个功能，但是确实可以。

user: user-1
content: 首先，sizeof(int)肯定是2的次方数，比如32位是4，64位是8  ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )  的意思就是，如果sizeof(n)是sizeof(int)的倍数，则保持不变，否则返回最小的，大于sizeof(n)的，sizeof(int)的倍数。 比如，如果sizeof(int)是4，那么sizeof(n)是1-4的时候返回4，5-8的时候返回8，以此类推

user: user-0
content: 引用 1 楼 user-2 的回复:没细看，应该是基于int的大小进行取整，为了对齐吧。 不过，因为64位系统的出现，这个代码会是有疑问的。 是的，有这个意思，不过不明白为什么。  “这里涉及到内存对齐（alignment）问题，内存对齐跟具体使用的硬件平台有密切关系，比如大家熟知的32位x86平台规定所有的变量地址必须是4的倍数(sizeof(int) = 4)。va机制中用宏_INTSIZEOF(n)来解决这个问题，没有这些宏，va的可移植性无从谈起。”

user: user-2
content: 没细看，应该是基于int的大小进行取整，为了对齐吧。 不过，因为64位系统的出现，这个代码会是有疑问的。
user-0 提问: 关于double和float的关系和区别的问题

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  int main() { 	double  sum = 0; 	double  * pd; 	int i, n; 	 	printf("Please input the number of the exploin:"); 	scanf("%d", &n); 	 	if (n <= 0) 	{ 		printf("error:the number should be bigger than 0!"); 		//getch(); 		exit(1); 	} 	 	pd = (double *)calloc(n, sizeof(double)); 	 	if ( !pd ) 	{ 		printf("error:创建失败!"); 		//getch(); 		exit(1); 	} 	 	for (i=0; i<n; i++) 	{ 		printf("第%d个员工的工资:", i+1); 		//	 scanf("%1f",&pd[i]); 		scanf("%lf", &pd[i]);////////////////////这里的%f改为%lf 	} 	 	printf("\n员工工资表\n"); 	printf("编号\t工资\n"); 	 	for (i=0; i<n; i++) 	{ 		printf("%d\t%lf\n", i+1, pd[i]);//////////////////////////这里的%f改为%lf 		sum += pd[i]; 	} 	 	printf("\n工资总额%f\t平均工资%f\n", sum, sum/n); 	 	return 0; } 这样改了就行了

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-3
content: 引用 8 楼 u013594535 的回复:[quote=引用 5 楼 mujiok2003 的回复:] [quote=引用 4 楼 mujiok2003 的回复:] scanf("%f",&pd[i]); %f--- float* %lf---double* 要匹配，这个问题人在问。 [/quote] 可是 这个地方我改成1f了，输出结果还是不对啊[/quote] 不是1f,是lf

user: user-2
content: http://bbs.csdn.net/topics/390676437

user: user-0
content: 引用 5 楼 mujiok2003 的回复:[quote=引用 4 楼 mujiok2003 的回复:] scanf("%f",&pd[i]); %f--- float* %lf---double* 要匹配，这个问题人在问。 [/quote] 可是 这个地方我改成1f了，输出结果还是不对啊

user: user-4
content: 楼上动作够快的。

user: user-4
content: 明显是scanf    %lf    么。

user: user-3
content: 引用 4 楼 mujiok2003 的回复:scanf("%f",&pd[i]); %f--- float* %lf---double* 要匹配，这个问题人在问。

user: user-3
content: scanf("%f",&pd[i]); %f--- float* %lf---double*

user: user-5
content: 应该是楼主没有把该改的地方都改掉，所以出现误差。 一般来说，float型数据在运算时会转换为double型计算，如果你的其中某个过程还是float，那么精度会被截取，然后转换double时用0补上精度计算，就会出现误差。 不知道楼主的具体测试结果，所以只能这样推测。试试下面的代码。  #include <STDIO.H> #include <STDLIB.H>  int main() {    double  sum=0;    double  *pd;    int i,n;     printf("Please input the number of the exploin:");    scanf("%d",&n);     if (n<=0)    {       printf("error:the number should be bigger than 0!");       //getch();       exit(1);    }     pd=(double *)calloc(n,sizeof(double));     if (!pd)    {       printf("error:创建失败!");       //getch();       exit(1);    }     for (i=0;i<n;i++)    {       printf("第%d个员工的工资:",i+1);       //	 scanf("%1f",&pd[i]);       scanf("%f",&pd[i]);    }     printf("\n员工工资表\n");    printf("编号\t工资\n");     for (i=0;i<n;i++)    {       printf("%d\t%f\n",i+1,pd[i]);       sum+=pd[i];    }     printf("\n工资总额%f\t平均工资%f\n",sum,sum/n);     return 0; }

user: user-6
content: float改成double是不会有问题的，你测试结果是什么呢？

user: user-7
content: 浮点数打印？  有请 赵老师的大作：    年终散分＋展示浮点数格式C代码 http://bbs.csdn.net/topics/390676437
user-0 提问: 【swu】新手求问！拜托了！

回复:
user: user-1
content: 嗯，C语言这样好像不行啊！或许有些编译器可以吧！个人不推荐这样使用数组

user: user-2
content: 根据C语言的规范，在数组定义中使用变量作为维度是不符合语法的。但是，某些编译器，比如gcc，确实可以支持这种做法；然而，某些则不可以。因此，不应使用这种特性。

user: user-3
content: //在堆中开辟一个4×5的二维int数组 #include <stdio.h> #include <malloc.h> int **p; int i,j; void main() {     p=(int **)malloc(4*sizeof(int *));     if (NULL==p) return;     for (i=0;i<4;i++) {         p[i]=(int *)malloc(5*sizeof(int));         if (NULL==p[i]) return;     }     for (i=0;i<4;i++) {         for (j=0;j<5;j++) {             p[i][j]=i*5+j;         }     }     for (i=0;i<4;i++) {         for (j=0;j<5;j++) {             printf(" %2d",p[i][j]);         }         printf("\n");     }     for (i=0;i<4;i++) {         free(p[i]);     }     free(p); } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19

user: user-0
content: 引用 6 楼 u012586257 的回复:[quote=引用 4 楼 user-5 的回复:] [quote=引用 3 楼 u014016447 的回复:] [quote=引用 1 楼 user-5 的回复:] 程序在编译的时候，就需要给数组分配内存 你对p的赋值操作是在程序启动之后，所以编译时数组长度未知  那我要怎样编写程序才可以解决这样的问题哎？[/quote] 万分抱歉，我上面的说法是错的，请无视。 你程序中错误之处在于，定义二维数组g[][p]时，没有指定第一维的大小。根据后面的代码，第一维的小大是3. 所以你把g[][p]改成g[3][p]，应该就可以了。  之前我说的用p来指定数组第二维的大小，为什么这种方法也可以，我也不是很明白。希望哪位能解释下。[/quote] 我认为改成g[3][p]也不行，不知道p大小不可能静态分配内存。 这里大概只能动态分配内存再转换成数组指针访问吧[/quote]      我从外面输入了一个数值给P呀！   如果我直接把p写成4就可以，为什么从外面赋值给p，再用p定义该二维数组的长度就不可以了呢？

user: user-0
content: 引用 5 楼 u012421456 的回复:可以把main函数里边的前三行去掉，然后把数组中的p改为一个数值  我就是想从外面输入一个数来定义二维数组的长度哎！

user: user-4
content: 引用 4 楼 user-5 的回复:[quote=引用 3 楼 u014016447 的回复:] [quote=引用 1 楼 user-5 的回复:] 程序在编译的时候，就需要给数组分配内存 你对p的赋值操作是在程序启动之后，所以编译时数组长度未知  那我要怎样编写程序才可以解决这样的问题哎？[/quote] 万分抱歉，我上面的说法是错的，请无视。 你程序中错误之处在于，定义二维数组g[][p]时，没有指定第一维的大小。根据后面的代码，第一维的小大是3. 所以你把g[][p]改成g[3][p]，应该就可以了。  之前我说的用p来指定数组第二维的大小，为什么这种方法也可以，我也不是很明白。希望哪位能解释下。[/quote] 我认为改成g[3][p]也不行，不知道p大小不可能静态分配内存。 这里大概只能动态分配内存再转换成数组指针访问吧

user: user-1
content: 可以把main函数里边的前三行去掉，然后把数组中的p改为一个数值

user: user-5
content: 引用 3 楼 u014016447 的回复:[quote=引用 1 楼 user-5 的回复:] 程序在编译的时候，就需要给数组分配内存 你对p的赋值操作是在程序启动之后，所以编译时数组长度未知  那我要怎样编写程序才可以解决这样的问题哎？[/quote] 万分抱歉，我上面的说法是错的，请无视。 你程序中错误之处在于，定义二维数组g[][p]时，没有指定第一维的大小。根据后面的代码，第一维的小大是3. 所以你把g[][p]改成g[3][p]，应该就可以了。  之前我说的用p来指定数组第二维的大小，为什么这种方法也可以，我也不是很明白。希望哪位能解释下。

user: user-0
content: 引用 1 楼 user-5 的回复:程序在编译的时候，就需要给数组分配内存 你对p的赋值操作是在程序启动之后，所以编译时数组长度未知  那我要怎样编写程序才可以解决这样的问题哎？

user: user-0
content: 那我要怎样编写程序才可以解决这样的问题哎？

user: user-5
content: 程序在编译的时候，就需要给数组分配内存 你对p的赋值操作是在程序启动之后，所以编译时数组长度未知
user-0 提问: 关于文件读入然后写的大小改变问题，回复的马上有对象！

回复:
user: user-1
content: 因为你写文件以后没有close文件，因此写的内容在内存缓冲中，没有真正写入到文件中。

user: user-2
content: 仅供参考#include <sys\stat.h> #include <io.h> #include <fcntl.h> #include <share.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <string.h> #define MAX_CLU_BYTES 65536 FILE *fo; int fh; __int64 offs,offs1; __int64 rvi64; int rv,wrv; unsigned char buf[MAX_CLU_BYTES]; char ofn[_MAX_PATH]; char offstr[80]; void strcpybutcomma(char *t,char *s) {     char c;      while (1) {         c = *s++;         if (','!=c) *t++ = c;         if (0==c) break;     } } void main(int argc,char **argv) {     if (argc<3) {         printf("Copy File Tail.\n");         printf("Usage:\n");         printf("    cft filename.ext offset_begin[-offset_end]\n");         printf("Copy filename.ext offset_begin[-offset_end] to offset_begin[-offset_end]-filename.ext\n");         printf("Note: Byte at offset_end is NOT included.\n");         printf("Example:\n");         printf("    cft abc.rar 12345\n");         printf("Copy abc.rar offset 12345-end to 12345-abc.rar\n");         printf("    cft abc.rar 123-12345\n");         printf("Copy abc.rar offset 123-12345 to 123-12345-abc.rar\n");         printf("    cft abc.rar 0xAB-0xCD\n");         printf("Copy abc.rar offset 0xAB-0xCD to 0xAB-0xCD-abc.rar\n");         return;     }     strcpybutcomma(offstr,argv[2]);     rv=sscanf(offstr,"%I64i-%I64i",&offs,&offs1);     if (rv==0) {         printf("offset %s is not number\n",argv[2]);         return;     }     fh=_sopen(argv[1],_O_BINARY|_O_RDONLY|_O_RANDOM,_SH_DENYWR);     if (fh==-1) {         printf("_sopen %s errno=%d\n",argv[1],errno);         return;     }     if (rv==1) {         offs1=_filelengthi64(fh);         if (offs1==-1i64) {             printf("%I64=_filelengthi64 errno=%d\n",offs1,errno);             _close(fh);             return;         }     } else {//rv==2         if (offs1<offs) {             printf("%s offset_begin>offset_end error\n",argv[2]);             _close(fh);             return;         }     }     rvi64=_lseeki64(fh,offs,SEEK_SET);     if (rvi64!=offs) {         printf("%I64u=_lseeki64 %I64u errno=%d\n",rvi64,offs,errno);         _close(fh);         return;     }     sprintf(ofn,"%s-",offstr);     strcat(ofn,argv[1]);     fo=fopen(ofn,"wb");     if (fo==NULL) {         _close(fh);         printf("fopen %s error\n",ofn);         return;     }     cprintf("\n%I64u\r",offs);     while (1) {         rv=_read(fh,buf,(unsigned int)__min(offs1-offs,MAX_CLU_BYTES));         if (rv==0) break;//         if (rv<0) {             fclose(fo);             _close(fh);             printf("_read %s offset %I64u error\n",argv[1],offs);             return;         }         wrv=fwrite(buf,1,rv,fo);         if (wrv!=rv) {             fclose(fo);             _close(fh);             printf("fwrite %s error\n",ofn);             return;         } else {             offs+=rv;             cprintf("%I64u\r",offs);             if (offs>=offs1) break;//         }     }     fclose(fo);     _close(fh);     printf("Copy %s offset %s to %s OK.\n",argv[1],argv[2],ofn); }
user-0 提问: sprintf 的问题

回复:
user: user-1
content: 引用 6 楼 niceteamwork 的回复:[quote=引用 4 楼 user-3 的回复:] 你的字符指针szsql指向了一个常量字符串""；所以对它进行操作是不可以的，如果定义成字符数组是可以的 哦，我定义成 char sql[512]后，结果是没问题了，但是调试动态链接库的控制台引用程序的黑框框一闪而过，这是为啥[/quote] 在cmd窗口中运行。

user: user-0
content: 引用 4 楼 user-3 的回复:你的字符指针szsql指向了一个常量字符串""；所以对它进行操作是不可以的，如果定义成字符数组是可以的 哦，我定义成 char sql[512]后，结果是没问题了，但是调试动态链接库的控制台引用程序的黑框框一闪而过，这是为啥

user: user-2
content: char * szsql = ""; 这样的定义方法，szsql指针指向的是只读存储区。再用sprintf往只读存储区写的时候，肯定会报segment fault。 定义局部的字符数组，是在栈上分配的空间，可以自由的进行读写

user: user-3
content: 你的字符指针szsql指向了一个常量字符串""；所以对它进行操作是不可以的，如果定义成字符数组是可以的

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:char * szsql = ""; 应改为 char szsql[512]; 为啥，赵老师？

user: user-0
content: 这是错误的图片，我看了sprintf，貌似是这么用的，就是不知道为什么错了。

user: user-1
content: char * szsql = ""; 应改为 char szsql[512];
user-0 提问: 现在学c语言还需要深入的学吗，还是只为了学其他编程工具打基础。

回复:
user: user-1
content: 不客气

user: user-0
content: 引用 13 楼 u012421456 的回复:嗯，个人是这么认为的，虽然有很多人说学了C学其他高级语言就容易上手，事实也是如此，但C非常不好学啊！所以我认为如果不想在C方面发展，看了谭浩强的C语言就可以了，当然，如果想深入就要再多看些书了恩恩  谢谢你的建议

user: user-1
content: 嗯，个人是这么认为的，虽然有很多人说学了C学其他高级语言就容易上手，事实也是如此，但C非常不好学啊！所以我认为如果不想在C方面发展，看了谭浩强的C语言就可以了，当然，如果想深入就要再多看些书了

user: user-0
content: 引用 11 楼 u012421456 的回复:[quote=引用 楼主 u013720580 的回复:] 现在学c语言还需要深入的学吗，还是只为了学其他编程工具打基础。 如果想深入的学习c语言请大神们介绍几本书。 是深入还是仅仅为学习其他打基础要看lz想咋样，想往哪儿块发展 关于书籍，这样的问题已经见过好几次了，我就发俩地址吧，这两个说的都不错，lz可以看看——http://bbs.csdn.net/topics/390638386 ——http://blog.csdn.net/thefutureisour/article/details/7598775[/quote]意思就是说我要是为了学其他编程工具打基础就不用在c上花太多时间了吧

user: user-0
content: 引用 6 楼 yzkdj 的回复:[quote=引用 楼主 u013720580 的回复:] 现在学c语言还需要深入的学吗，还是只为了学其他编程工具打基础。 如果想深入的学习c语言请大神们介绍几本书。  最好看《C和指针》，由浅入深地讲，C PRIMER PLUS虽然讲的很详细，但都是只讲浅层次。 如果节省时间的话，建议看《C和指针》-->《C陷阱与缺陷》-->《C专家编程》[/quote]现在学c还需要深入的学吗，还是为学其他的打基础

user: user-1
content: 引用 楼主 u013720580 的回复:现在学c语言还需要深入的学吗，还是只为了学其他编程工具打基础。 如果想深入的学习c语言请大神们介绍几本书。 是深入还是仅仅为学习其他打基础要看lz想咋样，想往哪儿块发展 关于书籍，这样的问题已经见过好几次了，我就发俩地址吧，这两个说的都不错，lz可以看看——http://bbs.csdn.net/topics/390638386 ——http://blog.csdn.net/thefutureisour/article/details/7598775

user: user-2
content: 学习Python，配合C在Linux下开发，很爽很有前途！

user: user-3
content: 学python

user: user-4
content: 直接动手做些小程序吧，实现一些功能，学起来更有成就感。

user: user-5
content: 引用 楼主 u013720580 的回复:现在学c语言还需要深入的学吗，还是只为了学其他编程工具打基础。 如果想深入的学习c语言请大神们介绍几本书。  最好看《C和指针》，由浅入深地讲，C PRIMER PLUS虽然讲的很详细，但都是只讲浅层次。 如果节省时间的话，建议看《C和指针》-->《C陷阱与缺陷》-->《C专家编程》

user: user-6
content: 很久也在纠结这个问题。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:[quote=引用 2 楼 u013720580 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm  《C Primer Plus中文版》那是什么，学c语言的吗 [/quote] 看了就知道。[/quote]哦哦，谢了

user: user-7
content: 引用 2 楼 u013720580 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm  《C Primer Plus中文版》那是什么，学c语言的吗 [/quote] 看了就知道。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm  《C Primer Plus中文版》那是什么，学c语言的吗

user: user-7
content: 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm  《C Primer Plus中文版》
user-0 提问: note: expected ‘char’ but argument is of type ‘ch怎么回事呢

回复:
user: user-1
content: char *lgm="i love china!"; 改为 char lgm[30]="i love china!"; 再试试？

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:C怎么用Java VM运行？  因为我用到JNI

user: user-1
content: C怎么用Java VM运行？

user: user-0
content: 引用 楼主 lgmsyy 的回复:char *lgm="i love china!";//我想以字符串作为传输传递给testInit函数，提示我错误 imghandle = testInitTHFaceID(lgm,frMode);  ---------------- 函数如下 int testInit(char *Path,int mode){   printf("%s\n",Path);	   return 1; } ------------- note: expected ‘char’ but argument is of type ‘ch 我应该怎么更改呢。  刚才说错了，加上也不行，编译没问题，执行的时候通过不了 报错如下： # An unexpected error has been detected by HotSpot Virtual Machine: # #  SIGSEGV (0xb) at pc=0xb76de821, pid=8129, tid=3076957888 # # Java VM: Java HotSpot(TM) Client VM (1.5.0_22-b03 mixed mode, sharing) # Problematic frame: # C  [libc.so.6+0x73821] # # An error report file with more information is saved as hs_err_pid8129.log # # If you would like to submit a bug report, please visit: #   http://java.sun.com/webapps/bugreport/crash.jsp # 已放弃

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:int testInit(const char *Path,int mode){ ?  const去掉也不行啊

user: user-1
content: int testInit(const char *Path,int mode){ ?