Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: malloc(size_t size)的物理内存分配问题

回复:
user: user-0
content: 结贴。5楼的兄弟回答的最中肯 分给你。

user: user-0
content: 引用 4 楼 N_sev7 的回复:[quote=引用 3 楼 u012425973 的回复:] 我就想研究操作系统底层，写了这个测试，段页式的内存管理方式，应该是会分配4k的整数倍物理空间， 您看我的那个运行结果，p1,p2,p3虚拟地址都是相差了16个字节空间，实际的结构就是4个成员指针，存储都是物理内存的地址，我是想看看malloc中的size参数影响的物理内存实际的变化。 比如说我写malloc(1000) malloc(5) 这些变化  malloc()申请分配堆内存的时候，是根据系统空闲内存空间碎片中选择一块跟你申请的内存大小差不多的内存块给你，在保护模式下你想看真的物理地址就需要 段、叶、逻辑地址、实地址之间的关系转换，所以即使逻辑地址上只相差16字节，但是实地址上相差多少就的自己算了 《个人理解，纯属虚构》[/quote]  = =！自己算一下和实际中跑一下看看能是一样的理解么。。 我接着跟再深入进去看看吧。。好多东西没学扎实，本来想偷懒问问。

user: user-1
content: 引用 3 楼 u012425973 的回复:我就想研究操作系统底层，写了这个测试，段页式的内存管理方式，应该是会分配4k的整数倍物理空间， 您看我的那个运行结果，p1,p2,p3虚拟地址都是相差了16个字节空间，实际的结构就是4个成员指针，存储都是物理内存的地址，我是想看看malloc中的size参数影响的物理内存实际的变化。 比如说我写malloc(1000) malloc(5) 这些变化  malloc()申请分配堆内存的时候，是根据系统空闲内存空间碎片中选择一块跟你申请的内存大小差不多的内存块给你，在保护模式下你想看真的物理地址就需要 段、叶、逻辑地址、实地址之间的关系转换，所以即使逻辑地址上只相差16字节，但是实地址上相差多少就的自己算了 《个人理解，纯属虚构》

user: user-0
content: 我就想研究操作系统底层，写了这个测试，段页式的内存管理方式，应该是会分配4k的整数倍物理空间， 您看我的那个运行结果，p1,p2,p3虚拟地址都是相差了16个字节空间，实际的结构就是4个成员指针，存储都是物理内存的地址，我是想看看malloc中的size参数影响的物理内存实际的变化。 比如说我写malloc(1000) malloc(5) 这些变化

user: user-2
content: 只能看到内存的逻辑地址，物理地址是看不到的，在应用层面也是没有意义的。  引用 楼主 u012425973 的回复: #include <stdio.h> #include <unistd.h> #include <stdlib.h>  main() { 	char *p1 = malloc(0); 	short *p2 = malloc(4); 	int *p3 = malloc(8);  	printf("p1=%p\n", p1); 	printf("++p1=%p\n", ++p1); 	printf("++p1=%p\n", ++p1); 	printf("++p1=%p\n", ++p1); 	printf("++p1=%p\n", ++p1); 	printf("++p1=%p\n", ++p1); 	printf("p2=%p\n", p2); 	printf("++p2=%p\n", ++p2); 	printf("++p2=%p\n", ++p2); 	printf("p3=%p\n", p3); 	printf("++p3=%p\n", ++p3); 	printf("++p3=%p\n", ++p3);  	printf("pid = %d\n", getpid()); 	while(1); }    下面在linux下做了测试。有一些疑问求解惑  malloc分配的指针类型影响偏移，p1，p2,p3虚拟地址因为链式存储结构4个成员的原因，所以3个首地址彼此相差了16个字节空间。就linux分配的虚拟内存来说 也看不出size的实际意义 很想知道实际映射的物理内存是什么样的？ 怎么看物理内存的具体情况呢？ 我想知道参数size的分配不同的值 做相应的操作 物理内存会有何变化？

user: user-3
content: malloc()的参数指定了在内存中划分给你多大的内存空间 不管你有没有得到，你都可以使用指针访问任意的内存位置，但如果你试图写这个位置，那么下一次你读取的时候未必就还是你写的数据，即没划分给你的内存，不保证只有你能够修改 malloc(0)在某些编译环境下会直接失败  物理内存的管理涉及操作系统底层的操作，你需要学习计算机原理等底层知识，而不是编程语言 做测试是一种很直接很不靠谱的学习方法，没有足够的理论指引你，一个现象可以让你猜出一百种奇谈怪论，更不用提“可重复性”和“语言标准”等等
user-0 提问: microsoft visual studio 2010调试

回复:
user: user-0
content: 二楼不好意思，刚结帖，没看到你的回复，不好意思没给发你！

user: user-0
content: 好吧，谢谢！我已经知道，感谢你的恢复！其实那个跟监视一维数组一样，数组名+“，”+长度就行

user: user-1
content: 将数组变量添加到监视里面。

user: user-2
content: 看不到就一个个打印吧。  引用 楼主 jianben123 的回复:亲们，microsoft visual studio 2010 怎么调试数组，其中怎样监视二维数组的值
user-0 提问: 数据结构  顺序表和链表

回复:
user: user-1
content: 效率问题很复杂，你最好做下相应的测试，自己体会下。 当然还要考虑样本的情况，比如已排序的、刚好在开始位置附近找到该节点什么的。可以分为平均情况，最坏情况等等。  每种东西都有自己的特点，就比如元素数量未知的情况，链表就要优于线性表。线性表容易查找，但操作也相当不方便。链表可能会查找麻烦，但操作却方便很多。数据的样本不同，需要的操作不同，最后需要的容器也会不同，不能因为你说两者都差不多就不用另外一个吧。  比如我有N个元素，但N是多少我不知道，我难道事先分配1000000个空间？不现实吧。但我只有10个元素，而且只要简单的一些操作，可能不会有删除等操作，那我用链表不是麻烦了很多？  总之考虑如何选择一个容器、算法，要结合实际情况，样本特例等等，最后得出一个合适的结论。不会因为多数情况这个容器、算法没有优势就不去考虑，说不定你的样本几乎全是另一个容器的特例也不一定。

user: user-2
content: lz 看清楚了，对于已知下标号的插入，数组在寻找上是快，但大量的实际操作是已知元素的值，此时数组在寻找上毫无优势可言  对于不同的要求，选择不同的数据结构，没有谁一定比谁好

user: user-3
content: 效率不是这么说说感觉的！ 其实写写程序才知道其中的各种条件的考虑判断！

user: user-4
content: LZ可以写个程序跑跑，然后对其profile。

user: user-5
content: 可能周末了，大神们都周末娱乐区了！！！ 顺序表能根据下表直接定位到要删除的元素，然而删除后要将此元素后面的所有元素一个一个前移，这就很费时间， 然而链表虽然没有顺序表查找那么快速，但是一旦查找到，只需要将需要删除的节点free掉就OK了，只需要将此节点的next指针给其前一个节点就OK了 查找只需要比较，移动数据需要的步骤就多了 《个人理解，纯属虚构》

user: user-0
content: 就这么沉了吗~~~~~

user: user-0
content: 自己顶顶，，
user-0 提问: C语言手动输入字符数组 获取不正确

回复:
user: user-0
content: 哦，对哦，我傻了

user: user-1
content: 这个问题其实可以不用改！ 你在输入的时候直接输入25个字符就可以，不用换行输入， 它会自动输出5,5的矩阵。

user: user-2
content: 引用 5 楼 AnYidan 的回复:scanf("%c", &a[i][j]); scanf(" %c", &a[i][j]);  嗯，也推荐这样改，scanf还是很强大的

user: user-3
content: #include<stdio.h> #define NUM 5 int main() {    int i,j;    char a[NUM ][NUM ];    for( i = 0; i < NUM; i++)       for( j = 0; j < NUM; j++)       {          scanf("%c", &a[i][j]);          getchar();        }  for( i = 0; i < NUM; i++)   {       for( j = 0; j < NUM; j++)            printf("%c", a[i][j]);       printf("\n");   } return 0; } 试试，吃掉了回车符

user: user-4
content: 回车也是字符，所以它也会占用一个字符空间。

user: user-5
content: scanf("%c", &a[i][j]); scanf(" %c", &a[i][j]);

user: user-6
content: #include<stdio.h> #define NUM 5 int main() { 	int i,j; 	char a[NUM ][NUM ]; 	for( i = 0; i < NUM; i++) 	{ 		for( j = 0; j < NUM; j++) 		{ 			scanf("%c", &a[i][j]); 			if ( '\n' == a[i][j]) 			{ 				j--; 			} 		} 	}  	for( i = 0; i < NUM; i++) 	{ 		for( j = 0; j < NUM; j++) 			printf("%c", a[i][j]); 		printf("\n"); 	} 	//system("pause"); 	return 0; }   附上代码,考虑考虑

user: user-6
content: 获取值之后，增加验证。 如果是'\n',不填值，并把j--以保证下一次循环获得的值还会赋值到这个地方

user: user-0
content: 我就是不知道怎么处理这个，因为多数情况下都是因为换行符才出的问题

user: user-6
content: 你忽略了换行符'\n'
user-0 提问: 指针

回复:
user: user-1
content: 一维数组a[i]==*(a+i) 二维数组a[i][j]==*(*(a+i)+j) 记住这个公式就可以了，则 *（*a+1）==a[0][1]==2

user: user-2
content: 引用 7 楼 A812185083 的回复:应该是4 首先 {1，2，3，4，5，6，7，8，9} 应该是int a[3][3] a是指针的指针，a取值指向第一个数组的首部 等于指向1 ，然后加1 就指向第一个数组的第二个数，取第二个数的值则是2 *(*(a+1)) 这个是4

user: user-3
content: 引用 9 楼 maoshuoqiong 的回复:[quote=引用 8 楼 luoyz520 的回复:] *a得到数组的第一个元素1,所以*（*a+1）= *（1 + 1） = *2；获取存储在内存地址为2的值。可以试试会不会报错。。  *a是一个int*类型指针![/quote]多谢指点。*a相当于指向a[0][0]，那么*a + 1 就该是指向a[0][1],所以*(*a + 1) == 2.这样是吧？

user: user-4
content: 引用 8 楼 luoyz520 的回复:*a得到数组的第一个元素1,所以*（*a+1）= *（1 + 1） = *2；获取存储在内存地址为2的值。可以试试会不会报错。。  *a是一个int*类型指针!

user: user-3
content: *a得到数组的第一个元素1,所以*（*a+1）= *（1 + 1） = *2；获取存储在内存地址为2的值。可以试试会不会报错。。

user: user-5
content: 应该是4 首先 {1，2，3，4，5，6，7，8，9} 应该是int a[3][3] a是指针的指针，a取值指向第一个数组的首部 等于指向1 ，然后加1 就指向第一个数组的第二个数，取第二个数的值则是2

user: user-6
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语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “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-4
content: *（*a+1） 一、首先算括号内*a+1 :     这里可以将a看成是一个int**类型的指针,那么*a 就是一个int*型指针.*a+1 右移一个int位,得到指向元素2的地址。 二、*a+1是指向元素2的指针，再进行*解析，所以*(*a+1)的值应该是2  我是这么理解的，不知道对不对

user: user-7
content: 多看书，逐步调试程序分析

user: user-2
content: 不太会 但是应该是2 二维数组是又N个一维数组组成的

user: user-8
content: 1 2 3 4 5 6 7 8 9 *（*(a + 0) + 0）= 1； *（*(a + 0) + 1）= 2； *（*(a + 0) + 2）= 3；  *（*(a + 1) + 0）= 4； *（*(a + 1) + 1）= 5； *（*(a + 1) + 2）= 6；  *（*(a + 2) + 0）= 7； *（*(a + 2) + 1）= 8； *（*(a + 2) + 2）= 9；

user: user-9
content: 好好看看自己的课本！！！只能这么说
user-0 提问: unsigned int 转 16进制

回复:
user: user-1
content: 教你正统的，你不用，人家跟你忽悠你倒是用上了  	char *filePath = "/data/local/tmp"; 	int l1 = strlen(filePath); 	int l = 8 + l1;  	char *buffer = (char *)malloc(sizeof(char) * l); //	memset(buffer, 0, l);多此一举  	memcpy(buffer, "SEND", 4); 	memcpy(buffer+4,l1,4); 	memcpy(buffer + 8, filePath, l1);  	for(int i=0; i<1; i++) 		printf("%02X  ", buffer[i]);

user: user-1
content: 上面的代码达不到“SEND+4位长度+文件名称”的效果，应该怎么改？  红色那个怎么理解？是4位还是4字节？

user: user-0
content: char *filePath = "/data/local/tmp"; 	int l1 = strlen(filePath); 	int l = 8 + l1;  	char *buffer = (char *)malloc(sizeof(char) * l); 	memset(buffer, 0, l);  	memcpy(buffer, "SEND", 4); 	 	buffer[4] = l1 & 0xff; 	buffer[5] = (l1 >> 8) & 0xff; 	buffer[6] = (l1 >> 16) & 0xff; 	buffer[7] = (l1 >> 24) & 0xff;  	memcpy(buffer + 8, filePath, l1);  	for(int i=0; i<12; i++) 		printf("%02X  ", buffer[i]);   上面的代码达不到“SEND+4位长度+文件名称”的效果，应该怎么改？

user: user-0
content: 如果文件长度是13的话，现在只是传输了  SEND0D， 后面的内容就没了，会不会是因为00后就当做字符串的结束？

user: user-2
content: 引用 楼主 zzmei 的回复:int i = 13; char *c = (char *)malloc(sizeof(char) * 4);  如何把i转成16进制并存储在c里，不足4位的补上00，如果i = 13打印出来后就是 0D 00 00 00  计算机中的任何数据都以二进制的形式存储，十六进制因以与二进制转换方便，书写容易而在计算机书籍中得以大量使用

user: user-0
content: 怎样构造这样的指令：       SEND+4位的文件名长度+文件名称  char *cmd = "SEND"; char *file_name = "C:/a.txt"; char *c = ..................

user: user-3
content: 引用 5 楼 max_min_ 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] int i = 13; char *c; c = (char *)malloc(sizeof(char) * 4); assert(c); memcpy((void *)c,(void *)&i,4); printf("%02X %02X %02X %02X\n",  (unsigned char)c[0],  (unsigned char)c[1],  (unsigned char)c[2],  (unsigned char)c[3]); //... free(c);  大小端问题呢？[/quote] 认为跨平台的代码一定比不跨平台的代码好，就象认为双性恋一定比异性恋好一样！  ——此话非本人原创

user: user-4
content: 引用 4 楼 zhao4zhong1 的回复:int i = 13; char *c; c = (char *)malloc(sizeof(char) * 4); assert(c); memcpy((void *)c,(void *)&i,4); printf("%02X %02X %02X %02X\n",  (unsigned char)c[0],  (unsigned char)c[1],  (unsigned char)c[2],  (unsigned char)c[3]); //... free(c);  大小端问题呢？

user: user-3
content: int i = 13; char *c; c = (char *)malloc(sizeof(char) * 4); assert(c); memcpy((void *)c,(void *)&i,4); printf("%02X %02X %02X %02X\n",  (unsigned char)c[0],  (unsigned char)c[1],  (unsigned char)c[2],  (unsigned char)c[3]); //... free(c);

user: user-5
content: 或者这样：  c[0] = i & 0xff; c[1] = (i >> 8) & 0xff; c[2] = (i >> 16) & 0xff; c[3] = (i >> 24) & 0xff;   引用 楼主 zzmei 的回复:int i = 13; char *c = (char *)malloc(sizeof(char) * 4);  如何把i转成16进制并存储在c里，不足4位的补上00，如果i = 13打印出来后就是 0D 00 00 00

user: user-1
content: 或者： *(int*)c=i;

user: user-1
content: LX你这个算是什么要求啊？  memcpy(c,&i,4)即可
user-0 提问: 用C语言读取文件指定的数据，并将数据存入bin文件中

回复:
user: user-0
content: 问题自己已解决！！

user: user-1
content: 这不是表达式求值么？

user: user-0
content: 跪求高手指点啊！

user: user-0
content: 引用 2 楼 turingo 的回复:文本和文件操作用Python脚本最为合适。  [quote=引用 楼主 tanqiyingk 的回复:] 现有.inc文件A、B、C如图所示： A.inc  B_cat	 equ	0x0000 B_dog	 equ	0x0001 B_tiger	 equ	0x0002 B_sleep	 equ	0x0003 B_Bird02	 equ	0x0004  B.inc  W_train	            equ	0x0000 W_bus200            equ	0x0001 W_CAR               equ	0x0002 W_Plane3000         equ	0x0003  C.inc  M_guitar	    equ	0x0000 M_piano             equ	0x0001 M_Saxophone         equ	0x0002 M_VIOLIN            equ	0x0003  另外有TXT文件如图 equation.txt  equ_0001 = B_tiger+W_train+200+M_Saxophone+M_VIOLIN+FFH  现在要把equation.txt文件中的等式 通过inc文件里对应的内容把数据存放入一个bin文件中 其中B_ W_ M_ 要存放一个Byte表示类型。 分别用01 02 03 表示 纯数字200用04表示类型  最后的FF用一个byte存放 例如：B_tiger  B_ 表示类型 用一个byte 存为01 表示，再根据inc文件中B_tiger等于0x0002  用2两个Byte表示，存为 00 02   那么 equ_0001 = B_tiger+W_train+200+M_Saxophone+M_VIOLIN+FFH  数据存储应该为：01 00 02 02 00 00 04 00 C8 03 00 02 03 00 03 FF  注：inc文件中的内容是改变的，equation.txt文件的内容也是改变的 希望通过这个工具来得到自己想要的数据存放入BIN文件中。 希望懂的帮忙下，最好事附上源代码。谢谢！！！！[/quote]Python不了解，刚接触的C，之前用汇编

user: user-2
content: 文本和文件操作用Python脚本最为合适。  引用 楼主 tanqiyingk 的回复:现有.inc文件A、B、C如图所示： A.inc  B_cat	 equ	0x0000 B_dog	 equ	0x0001 B_tiger	 equ	0x0002 B_sleep	 equ	0x0003 B_Bird02	 equ	0x0004  B.inc  W_train	            equ	0x0000 W_bus200            equ	0x0001 W_CAR               equ	0x0002 W_Plane3000         equ	0x0003  C.inc  M_guitar	    equ	0x0000 M_piano             equ	0x0001 M_Saxophone         equ	0x0002 M_VIOLIN            equ	0x0003  另外有TXT文件如图 equation.txt  equ_0001 = B_tiger+W_train+200+M_Saxophone+M_VIOLIN+FFH  现在要把equation.txt文件中的等式 通过inc文件里对应的内容把数据存放入一个bin文件中 其中B_ W_ M_ 要存放一个Byte表示类型。 分别用01 02 03 表示 纯数字200用04表示类型  最后的FF用一个byte存放 例如：B_tiger  B_ 表示类型 用一个byte 存为01 表示，再根据inc文件中B_tiger等于0x0002  用2两个Byte表示，存为 00 02   那么 equ_0001 = B_tiger+W_train+200+M_Saxophone+M_VIOLIN+FFH  数据存储应该为：01 00 02 02 00 00 04 00 C8 03 00 02 03 00 03 FF  注：inc文件中的内容是改变的，equation.txt文件的内容也是改变的 希望通过这个工具来得到自己想要的数据存放入BIN文件中。 希望懂的帮忙下，最好事附上源代码。谢谢！！！！

user: user-0
content: 现在一头雾水中，不知道该怎么做好。
user-0 提问: 帮忙看下这个是什么C语法

回复:
user: user-0
content: 引用 1 楼 hnwyllmm 的回复:这个是以前的C代码标准，楼主要是看很多Linux的源码，这种风格比较多惭愧，一直都没能有机会看什么源码，今天瞄了两个开源的，全是这种，吓到了。不是新的就好，

user: user-1
content: 是很特殊，开眼了

user: user-2
content: 这个是以前的C代码标准，楼主要是看很多Linux的源码，这种风格比较多
user-0 提问: runtime error  请各位大神帮忙

回复:
user: user-0
content: #include<stdio.h> #include<string.h> #define max 1000 int main(){      int a[max],b[max],ans[max],i,j,k,len_a,len_b;     char A[max],B[max];     while(scanf("%s %s",A,B)!=EOF) {         memset(a,0,sizeof(a));       memset(b,0,sizeof(b));         memset(ans,0,sizeof(ans));         len_a=strlen(A);        len_b=strlen(B);         for(i=0;i<len_a;i++)          if(A[i]!=0)          break;         for(j=len_a-1,k=0;j>=i;j--,k++)            a[k]=A[j]-48;        for(i=0;i<len_b;i++)            if(B[i]!=0)               break;         for(j=len_b-1,k=0;j>=i;j--,k++)            b[k]=B[j]-48;         for(i=0;i<max-1;i++)            ans[i]=a[i]+b[i];        for(i=0;i<max-1;i++)            if(ans[i]>9)         {    ans[i+1]+=ans[i]/10;                   ans[i]%=10;   }         for(i=max-1;i>0;i--)            if(ans[i]!=0)           break;         for(;i>=0;i--)            printf("%d",ans[i]);         printf("\n"); }        return 0; } 为何这个算法在oj上秒过。。。差异在哪呢？

user: user-0
content: 引用 3 楼 AnYidan 的回复:最好有分析工具，先找出瓶颈 有什么样的分析工具? 分析什么的？一直都没用过哎。。

user: user-0
content: 引用 2 楼 N_sev7 的回复:换成位运算来做试试 怎样就是位运算？

user: user-1
content: 最好有分析工具，先找出瓶颈

user: user-2
content: 换成位运算来做试试

user: user-3
content: 大数运算用GMP库（http://blog.csdn.net/turingo/article/details/8249799）  引用 楼主 u010582475 的回复:这个程序 如何减短运行时间。。大数相加 相乘。 #include<stdio.h> #include<string.h> #define max 1000 int main()  { 	int result[max]; 	char ch1[max],ch2[max]; 	int i=0,tmp,len1,len2; 	memset(result,0,max); 	while(scanf("%s%s",ch1,ch2)!=EOF) 	{     len1=strlen(ch1);     len2=strlen(ch2);     int max_len=(len1>len2)?len1:len2;    	for( i=max_len-1;i>=0;i--) 	{ 	if(len1==0) 	{ 		tmp=ch2[len2-1]-'0'; 		len2--; 	} 	else if(len2==0) 	{ 		tmp=ch1[len1-1]-'0'; 		len1--; 	} 	else 	{ 	  tmp=(ch1[len1-1]-'0')+(ch2[len2-1]-'0');	 	   len1--; 	   len2--; 	}	 	   result[i]+=tmp; 	} 	result[max_len]='\0'; 	for( i=max_len-1;i>=0;i--) 	{ 		if(result[i]>9) 		{ 			tmp=result[i]; 			result[i]%=10; 			result[i-1]+=(tmp/10); 		} 	}         for(i=0;i<max_len;i++)         {           printf("%d",result[i]); 		} 		 printf("\n"); 		 	} 	    return 0; } //大数相乘 #include<stdio.h> #include<string.h> #define max 1000 int main()  { 	int result[max]; 	char ch1[max],ch2[max]; 	scanf("%s%s",ch1,ch2); 	int i=0,j=0,tmp,len1=strlen(ch1),len2=strlen(ch2); 	memset(result,0,100); 	for( i=1;i<=len1;i++) 	{ 		for( j=1;j<=len2;j++) 		{ 			tmp=(ch1[i-1]-'0')*(ch2[j-1]-'0'); 			result[i+j-1]+=tmp; 		} 	} 	result[len1+len2]='\0'; 	for( i=len1+len2-1;i>=0;i--) 	{ 		if(result[i]>9) 		{ 			tmp=result[i]; 			result[i]%=10; 			result[i-1]+=(tmp/10); 			 		} 	}         for(i=0;i<len1+len2;i++) 	     printf("%d",result[i]);              	return 0; }
user-0 提问: 菜鸟求指导 简单的C语言题目

回复:
user: user-0
content: 代码是我打的！ 题目是复制的。  请不要鄙视我

user: user-1
content: 你完全是复制的题目 还说简单的问题 都没有经过你大脑思考 直接复制 粘贴 复制 粘贴 推理出你这是对回答问题的人的不负责 正如别人问你如何把大象装冰箱 你什么都不知道 连最起码的打开冰箱门都没有去想 直接就对别人说 喂你知道如何把大象装冰箱吗
user-0 提问: 结构体的一些问题

回复:
user: user-1
content: 为了提高总线效率 编译器会使用内存对齐

user: user-2
content: 这里有内存字节对齐的！不是简单的字面的上的 参考看看 http://blog.csdn.net/hairetz/article/details/4084088

user: user-3
content: csdn 可有统计 ++， 字节对齐 的提问占有的百分比

user: user-4
content: #include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 // //A1.a 0 //A1.b 4 //A1.c 17 // //A2.a 0 //A2.b 4 //A2.c 18 // //A4.a 0 //A4.b 4 //A4.c 20 // //A8.a 0 //A8.b 4 //A8.c 24 // //A16.a 0 //A16.b 4 //A16.c 24 // //
user-0 提问: 输入数组元素个数多于数组个数时，多出的元素去哪儿了？这个程序输入abcdef,为什么输出的是 bc啊?b前面为什么是空着的啊

回复:
user: user-0
content: getchar()应该是吸收了回车字符，如果不用getchar()吸收，为什么那么就相当于我输入了abc还有一个回车字符，这样就超出了数组数，此时a数组里放的又是些什么元素呢？麻烦大神解释一下，感激不尽！感激不尽!

user: user-0
content: 我想问一下，如果我输入两个字符串，输入第一个时，如果我输入的字符数超出数组个数，那么超出的字符会去哪儿？

user: user-1
content: 试试  #include<stdio.h> int main() {int i;   char a[3] ={0},b[3] = {0};   gets(a);   getchar()   gets(b);   for(i=0;i<=2;i++)   {       printf("%c",a[i]);     printf("%c",b[i]);   }   return 0; }

user: user-2
content: 谁说输出的是bc了 你眼花了吧 分明是abc啊

user: user-3
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-4
content: X86 堆栈是向下生长的，最后分配的在低地址，先分配的在高地址。 随着不停的压栈，地址不停地减小。

user: user-4
content: 在没有对齐和乱序存储的，情况下按定义顺序存储自动变量：  函数堆栈中的数据如下： 堆栈传递的函数参数      --->  [    ] 函数返回地址现场信息    --->  [    ] 第一个自动变量          --->  [    ] 第二个自动变量          --->  [    ] 。。。。。。。。  第N个自动变量           --->  [    ]

user: user-4
content: 引用 3 楼 u012495471 的回复:我想问一下，如果我输入两个字符串，输入第一个时，如果我输入的字符数超出数组个数，那么超出的字符会去哪儿？ 如果编译器是正常的，按定义顺序存储变量的话；  函数内部，第一个变量的溢出，会覆盖调用函数时， 保存的，函数返回地址和调用函数前的现场信息，  这个现场信息，具体对于X86 32Bits 就是压入堆栈的EFLAGS。 如果还在继续溢出，会覆盖函数调用时，传递的函数参数---形参--继续溢出；  会覆盖调用函数的，那个函数的，堆栈帧里的数据 ----通常是局部自动变量，或者编译器安排的临时变量。  其他函数内部变量的溢出，会覆盖按照定义的逆序，依次覆盖对应的变量直到第一个变量，然后就和第一个变量相同了。

user: user-3
content: 其实电脑开机后物理内存的每个字节都是可读写的，区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-5
content: 数组b溢出时，将覆盖数组a的内容！！

user: user-5
content: 如果输入的字符数+1超过数组长度，则发生溢出。超出的字符会把a数组后面的内存覆盖掉。此函数会自动添加结束符('\0')；不包含最后的换行符。  参见：gets函数说明 最新的C标准（2011）已经删除了此函数。  引用 3 楼 u012495471 的回复:我想问一下，如果我输入两个字符串，输入第一个时，如果我输入的字符数超出数组个数，那么超出的字符会去哪儿？
user-0 提问: 空else语句的写法哪个是对的？有什么区别

回复:
user: user-0
content: 非常感谢大家

user: user-1
content: 个人的习惯，表示一种逻辑框架，只是当前没有实现

user: user-2
content: 推荐写法： else     NULL;

user: user-3
content: 都可以。 ;表示空语句 因为{}中可以插入0~任意多条语句，空语句也算一条语句。 所以 { } // 0条语句  {     ; //1条空语句 }  {     xxxx; //随便一条语句 }  {     ;     ;     ; } 随便几条语句（包括空语句）  都是合法的。  因此，;可以有，但是是多余的。 如果没有大括号，则不能省，比如 if (...) xxx; else ; 当然，这等价 if (...) xxx;

user: user-4
content: 引用 14 楼 pk297935908 的回复:方便代码的后续扩展，这种构架以防代码后续处理 如果这样，就像12楼那样比较好；  因为你的代码，不知道最后会写成啥样。 都放到大括号内，方便修改和调试。

user: user-5
content: 方便代码的后续扩展，这种构架以防代码后续处理

user: user-6
content: 没有区别的 分号再多都不会错

user: user-7
content: 没有区别可言

user: user-8
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-9
content: if { ... } else ;

user: user-10
content: //一般习惯这样 if (...) {     //没有的话就直接写个注释在这，说不定以后可能用上 } else {     //没有的话就直接写个注释在这，说不定以后可能用上 }

user: user-11
content: 都可以 但纠结这样的问题貌似没必要。。。。

user: user-4
content: 写个空 else 的目的是什么呢！！！！

user: user-12
content: 都不好，我的建议是，if/else要么都加大括号，要么都不加。  引用 楼主 CS_DN_Sniper 的回复: 写法1: if // 略 else {     // do nothing } 写法2： if // 略 else {     ;// do nothing }

user: user-13
content: 都对

user: user-14
content: 你可以上机操作下！

user: user-15
content: 都可以。 ;表示空语句 因为{}中可以插入0~任意多条语句，空语句也算一条语句。 所以 { } // 0条语句  {     ; //1条空语句 }  {     xxxx; //随便一条语句 }  {     ;     ;     ; } 随便几条语句（包括空语句）  都是合法的。  因此，;可以有，但是是多余的。 如果没有大括号，则不能省，比如 if (...) xxx; else ; 当然，这等价 if (...) xxx;

user: user-16
content: 没有区别！效果一样的！ 都不会执行什么！

user: user-17
content: 这两个有区别吗？
user-0 提问: C99里面没有fcloseall这个函数？

回复:
user: user-0
content: 这个问题没有人知道其他的么？？？？？？？

user: user-1
content: fclose, _fcloseall Closes a stream (fclose) or closes all open streams (_fcloseall).  int fclose( FILE *stream );  int _fcloseall( void );  Function Required Header Compatibility  fclose <stdio.h> ANSI, Win 95, Win NT  _fcloseall <stdio.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  fclose returns 0 if the stream is successfully closed. _fcloseall returns the total number of streams closed. Both functions return EOF to indicate an error.  Parameter  stream  Pointer to FILE structure  Remarks  The fclose function closes stream. _fcloseall closes all open streams except stdin, stdout, stderr (and, in MS-DOS®, _stdaux and _stdprn). It also closes and deletes any temporary files created by tmpfile. In both functions, all buffers associated with the stream are flushed prior to closing. System-allocated buffers are released when the stream is closed. Buffers assigned by the user with setbuf and setvbuf are not automatically released.  Example  /* FOPEN.C: This program opens files named "data"  * and "data2".It  uses fclose to close "data" and  * _fcloseall to close all remaining files.  */  #include <stdio.h>  FILE *stream, *stream2;  void main( void ) {    int numclosed;     /* Open for read (will fail if file "data" does not exist) */    if( (stream  = fopen( "data", "r" )) == NULL )       printf( "The file 'data' was not opened\n" );    else       printf( "The file 'data' was opened\n" );     /* Open for write */    if( (stream2 = fopen( "data2", "w+" )) == NULL )       printf( "The file 'data2' was not opened\n" );    else       printf( "The file 'data2' was opened\n" );     /* Close stream */    if( fclose( stream ) )       printf( "The file 'data' was not closed\n" );     /* All other files are closed: */    numclosed = _fcloseall( );    printf( "Number of files closed by _fcloseall: %u\n", numclosed ); }   Output  The file 'data' was opened The file 'data2' was opened Number of files closed by _fcloseall: 1     Stream I/O Routines  See Also   _close, _fdopen, fflush, fopen, freopen

user: user-1
content: FCLOSE Section: Linux Programmer's Manual (3 ) Updated: 1998-04-10  --------------------------------------------------------------------------------    NAME fcloseall - close all open streams    SYNOPSIS #define _GNU_SOURCE  #include <stdio.h>   int fcloseall(void);     DESCRIPTION The fcloseall function dissociates all open streams from its underlying file or set of functions. Any buffered output data is written first, using fflush(3). Note that the standard streams (stdin, stdout and stderr) are also closed.    RETURN VALUE This function always returns 0.    SEE ALSO close(2), fclose(3), fflush(3), fopen(3), setbuf(3)    CONFORMING TO The fcloseall function is a GNU extension.  --------------------------------------------------------------------------------
user-0 提问: 关于贝塞尔曲线的一个概念性问题

回复:
user: user-1
content: 导数与二阶导数

user: user-1
content: http://blog.csdn.net/pizi0475

user: user-0
content: 为什么图2是错的？我的问题就是不知道如何回答 求大神点拨

user: user-0
content: 求助！！！！

user: user-0
content: 引用 3 楼 turingo 的回复:参考http://www.jcwcn.com/article-32008-1.html  [quote=引用 楼主 lion1899 的回复:]  期望达到的效果  错误的效果  认为正确的效果  问：图1和图3为什么正确？ 求理论支持！  本人刚涉及到贝塞尔曲线控制点算法的研究，虽然已经能算出让曲线平滑的算法，但是，不知道所谓的正确的概念。 求高手解答！拜谢！[/quote]  感谢您的回复，但是这篇帖子里没有我所需要的概念性问题。 我想问的是：          开放性的（由多条线段组成）贝塞尔曲线，当控制点满足什么样的条件时，可以认为是合理的控制点，是正确的控制点，再次感谢回复！

user: user-2
content: 参考http://www.jcwcn.com/article-32008-1.html  引用 楼主 lion1899 的回复: 期望达到的效果  错误的效果  认为正确的效果  问：图1和图3为什么正确？ 求理论支持！  本人刚涉及到贝塞尔曲线控制点算法的研究，虽然已经能算出让曲线平滑的算法，但是，不知道所谓的正确的概念。 求高手解答！拜谢！

user: user-0
content: 求大神点拨~~

user: user-0
content: 图1为两条曲线

user: user-0
content: 引用 9 楼 zhao4zhong1 的回复:[贝塞尔曲线(Bezier Curves) 2d实现] http://blog.csdn.net/pizi0475/article/details/12883403 嗯 看到了  先表示感谢！对于控制点的算法，我阅读了相关的文章，已经有了一套算法，图3就是，但是我的BOSS问了我一个问题，也是一个质疑，图2错了么？图2也对吧，怎么判定图3一定是对的呢？ 这个问题难倒我了，我的疑问主要就在这里了。 怎么才算是判定图3中的曲线是合理的唯一的一条曲线呢？

user: user-1
content: [贝塞尔曲线(Bezier Curves) 2d实现] http://blog.csdn.net/pizi0475/article/details/12883403

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:http://blog.csdn.net/pizi0475 谢谢！！
user-0 提问: ->求讲解

回复:
user: user-0
content: 引用 3 楼 max_min_ 的回复:NVIC指针的成员变量Enable[0]的值赋值为0x00040000 后面的错了吧！是不是源码阿？ 后面那个搞错了，不好意思。。。

user: user-1
content: NVIC... 这是 Arm Cortex 里面的东西 ~  GPIOB 那行比较奇怪 ~ 有贴错吗 ?

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

user: user-3
content: NVIC指针的成员变量Enable[0]的值赋值为0x00040000 后面的错了吧！是不是源码阿？

user: user-4
content: 0x00040000 是一个值啊

user: user-5
content: NVIC->Enable[0] = 0x00040000是把NVIC结构体的Enable[0]域的赋值为0x00040000 GPIOB=GPIOB-> 0x33333333，没有这样的写法  引用 楼主 skevil 的回复:NVIC->Enable[0] = 0x00040000  是把NVIC指向0x00040000这个地址吗？   GPIOB=GPIOB-> 0x33333333;  那么这个又是什么意思呢？

user: user-6
content: GPIO?lz说的是嵌入式里面的东西哦，不太懂

user: user-7
content: 第二个没看懂。。。
user-0 提问: 关于求字符串字符个数的问题

回复:
user: user-1
content: _mbslen  _mbstrlen

user: user-0
content: 引用 3 楼 lidayonglove 的回复:EXEC SQL include sqlca; EXEC SQL include oraca; EXEC SQL include clsdbbuf.h; EXEC SQL include clssysvar.h; #include "clspub.h" #include "eftp_pub.h" #include "cpcb_api.h" int main(int argc,char* argv[]) {  char toString[200]; memset(toString,  0,sizeof(toString)); strcpy(toString,   argv[1]); int b,en=0,ch=0,nu=0,ot=0,sp=0; int Count=0; //en 英文字母数，ch 中文字符数，nu 数字数量，ot 其他字符数量，sp 空格数量 trim(toString); for(b=0;b<strlen(toString);++b) {   if('\0'==toString[b]) break;//判断是否结束   if(toString[b]>='a'&&toString[b]<='z'||toString[b]>='A'&&toString[b]<='Z')//判断是否是字母    ++en;   else if(toString[b]>='0'&&toString[b]<='9')//判断是否是数字    ++nu;   else if(toString[b]==' ')    ++sp;   else if(toString[b]&0x80)   {    ++b;    ++ch;   }   else    ++ot; } Count=en+nu+sp+ch+ot;   printf("英文字符共%d个\n中文字符共%d个\n数字共%d个\n空格共%d个\n其他字符共%d个",en,ch,nu,sp,ot);//打印输出结果   printf("字符总个数为[%d]",Count); return 0; }   我这个代码为什碰到空格就结束了，就不计算了 下面是执行结果 /app/clear/src/tools/charCount>charCount 李大勇123asd 1 s 英文字符共3个 中文字符共3个 数字共3个 空格共0个 其他字符共0个字符总个数为[9]我已经找到原因了，碰到空格就算是下一个参数了

user: user-0
content: 引用 2 楼 turingo 的回复: int count(const char* str) { 	char* p = (char*)str; 	int c = 0;  	while(*p) 	{ 		if(*p & 0x80) 		{ 			c += 2; 			p += 2; 		} 		else 		{ 			c++; 			p++; 		} 	}  	return c; }  引用 楼主 lidayonglove 的回复:就是一个字符串，我需要统计出里面包含的字符个数，不是计算长度，也就是说一个汉字算一个、字母也算一个、数字也算一个，用什么方法你这个的确比我写的简单不少

user: user-0
content: EXEC SQL include sqlca; EXEC SQL include oraca; EXEC SQL include clsdbbuf.h; EXEC SQL include clssysvar.h; #include "clspub.h" #include "eftp_pub.h" #include "cpcb_api.h" int main(int argc,char* argv[]) {  char toString[200]; memset(toString,  0,sizeof(toString)); strcpy(toString,   argv[1]); int b,en=0,ch=0,nu=0,ot=0,sp=0; int Count=0; //en 英文字母数，ch 中文字符数，nu 数字数量，ot 其他字符数量，sp 空格数量 trim(toString); for(b=0;b<strlen(toString);++b) {   if('\0'==toString[b]) break;//判断是否结束   if(toString[b]>='a'&&toString[b]<='z'||toString[b]>='A'&&toString[b]<='Z')//判断是否是字母    ++en;   else if(toString[b]>='0'&&toString[b]<='9')//判断是否是数字    ++nu;   else if(toString[b]==' ')    ++sp;   else if(toString[b]&0x80)   {    ++b;    ++ch;   }   else    ++ot; } Count=en+nu+sp+ch+ot;   printf("英文字符共%d个\n中文字符共%d个\n数字共%d个\n空格共%d个\n其他字符共%d个",en,ch,nu,sp,ot);//打印输出结果   printf("字符总个数为[%d]",Count); return 0; }   我这个代码为什碰到空格就结束了，就不计算了 下面是执行结果 /app/clear/src/tools/charCount>charCount 李大勇123asd 1 s 英文字符共3个 中文字符共3个 数字共3个 空格共0个 其他字符共0个字符总个数为[9]

user: user-2
content: int count(const char* str) { 	char* p = (char*)str; 	int c = 0;  	while(*p) 	{ 		if(*p & 0x80) 		{ 			c += 2; 			p += 2; 		} 		else 		{ 			c++; 			p++; 		} 	}  	return c; }  引用 楼主 lidayonglove 的回复:就是一个字符串，我需要统计出里面包含的字符个数，不是计算长度，也就是说一个汉字算一个、字母也算一个、数字也算一个，用什么方法

user: user-3
content: strlen
user-0 提问: 有没关于c语言方面的书籍？

回复:
user: user-1
content: http://download.csdn.net/detail/max_min_/6333711

user: user-2
content: http://download.csdn.net/detail/max_min_/6333711 c和指针

user: user-3
content: 是我的话， 我会先提高自己对编程的兴趣 去载个C语言经典算法100例来玩

user: user-4
content: 引用 5 楼 Adol1111 的回复:《C Pirmer Plus》《c programing language》，入门绝对够了 ++ 这两本书是不错的，我比较推荐。关于读的先后顺序，我建议先看《C Prime Plus（第五版）》,看完了再看第二本吧。

user: user-5
content: 《C Primer Plus 》

user: user-6
content: 有很多，看你现在的水平了

user: user-7
content: 《C Pirmer Plus》《c programing language》，入门绝对够了

user: user-8
content: 引用 3 楼 neolyao 的回复:c programing language  ++

user: user-9
content: c programing language

user: user-10
content: 你是要干什么用的，只是为了上课学习的，还是为了真的想学习编程？

user: user-11
content: C语言课程设计案例精编，当当网有
user-0 提问: 关于链表输出

回复:
user: user-1
content: (*(*write).partition).device_index

user: user-0
content: 不是这个的原因，看看错误提示，应该是 缺少了什么东西，就算把输出语句写成函数形式，也会出这个错误。 给出个具体的写法，关键是 我不知道到底是哪里错了，要是有个具体的写法就好了

user: user-2
content: 不可以简单一点吗？ 写个输出struct MtdPartition的函数 在写个输出MtdWriteContext 的函数不就简单了么。

user: user-0
content: 错误从 (*write).(*partition).device_index开始有的，就是说打印输出第二个结构体的时候出的错误

user: user-3
content: 为什么要写成 (*write).stored  这样不是可以吗。。 write->stored

user: user-4
content: 指针直接用->操作符 结构体用引用.操作符 不要乱用，不然会出错

user: user-0
content: 5楼   这样 也不行 会提示  error: dereferencing pointer to incomplete type 错误
user-0 提问: const char** 转换问题

回复:
user: user-1
content: &是对于变量取地址，Str.c_str()返回的是一个值，不是一个变量。 你本来的代码是把值给了一个变量，取变量的地址。 你自己想想你现在的代码是个什么意思？

user: user-2
content: Str.c_str()本身就是一个地址值，所以不可以进行&操作。 pStr不一样，它是一个指针变量。

user: user-3
content: C++11右值引用→_→ 开玩笑的..不过你的确可以尝试下

user: user-4
content: Str.c_str()返回右值，实际上除非函数返回值是引用类型，否则函数返回的是右值类型。而取地址&需要左值

user: user-5
content: &用在变量前面是取地址，放在值前面是取啥？

user: user-6
content: Str.c_str() 返回一个地址 你可以对一个变量取址， 但是不能对一个常数取址
user-0 提问: for循环中加入scanf和printf出错，能帮忙看看不

回复:
user: user-0
content: 十楼说的对，按照他说的执行成功，输出没问题！

user: user-1
content: 楼主思路好不明确，仔细看看循环里的内容吧！

user: user-2
content: #include<stdio.h> #include<stdlib.h> #define N 100 #define M 10  void main() { 	int a[M][N] = {0}, b[M] = {0}, n = 0, m = 0;  	printf( "请输入存入数组的行数\n" ); 	scanf("%d",&n); 	printf( "请输入存入数组的列数\n" ); 	scanf("%d",&m); 	if( n > M || m > N ) 	{ 		return ; 	} 	 	for( int i = 0; i < n; i++ ) 	{ 		printf( "请输入a数组第%d行的系数\n", i ); 		for( int j = 0; j < m; j++ ) 		{ 			printf( "请输入a数组第%d列的系数", j ); 			scanf( "%d", &a[i][j] ); 		} 		printf( "请输入b数组第%d列的系数", i ); 		scanf( "%d", &b[i] ); 	} 	 	for( int i = 0; i < n; i++ ) 	{ 		printf( "请输入" ); 		for( int j = 0; j < m; j++ ) 		{ 			printf("%d  ", a[i][j] ); 		} 		printf( "%d\n", b[i] ); 	} 	system( "pause" ); 	return ; } 不知道这个是不是你要的

user: user-3
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

user: user-4
content: 这个你的循环体有问题

user: user-5
content: // 试试这样子呢 int a[M][N],i,p,q,n,m,j,b[M];  	printf("请输入存入数组的行数："); 	scanf("%d", &n);   	printf("请输入存入数组的列数："); 	scanf("%d", &m);  	for(i=0; i<n; i++) 	{ 		printf("请输入第%d行的A系数\n", i+1); 		for(j=0; j<m; j++) 			scanf("%d", &a[i][j]); 		printf("请输入第%d行的B系数：", i+1); 		scanf("%d", &b[i]); 	}  	printf("\n\n数组列出如下：\n"); 	for(i=0; i<n; i++) 	{ 		printf("A："); 		for(j=0; j<m; j++) 			printf("%d	", a[i][j]); 		printf("	B：%d\n", b[i]); 	}

user: user-6
content: 引用 5 楼 jianben123 的回复:谢谢大家的回复和帮忙，这个我是想在往两个数组中存放数据但是出现问题，谢谢你们的忙！ 一楼“使用scanf函数的时候注意I/O流中对于回车的处理，尤其在循环中”这个问题怎么避免？ 我那个按照四楼的说法改了下，但是输出是数据没放到数组中出错啦这是怎么回事  请输入存入数组的行数2 请输入存入数组的列数3 请输入第1的列系数1 22 21 请输入第1的B系数322 请输入第2的列系数1 2 2 请输入第2的B系数21 1  1  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -8 58993460  -858993460  -858993460  0  0  0  798  438759246  6619235  6422627  668 4772  6226030  3473462  7340137  7471221  6684769  0  7274596  6881367  3407921  7798830  20  7864435  7536732  0  6881397  88  26  50  7536735  50  6357070  68 81396  50  7143535  108  0  0  7798895  0  0  0  0  0  0  0  0  请按任意键继续. . .  getchar函数调用一次，吃掉每次输入时多余的一个回车符！

user: user-0
content: 谢谢大家的回复和帮忙，这个我是想在往两个数组中存放数据但是出现问题，谢谢你们的忙！ 一楼“使用scanf函数的时候注意I/O流中对于回车的处理，尤其在循环中”这个问题怎么避免？ 我那个按照四楼的说法改了下，但是输出是数据没放到数组中出错啦这是怎么回事  请输入存入数组的行数2 请输入存入数组的列数3 请输入第1的列系数1 22 21 请输入第1的B系数322 请输入第2的列系数1 2 2 请输入第2的B系数21 1  1  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -8 58993460  -858993460  -858993460  0  0  0  798  438759246  6619235  6422627  668 4772  6226030  3473462  7340137  7471221  6684769  0  7274596  6881367  3407921  7798830  20  7864435  7536732  0  6881397  88  26  50  7536735  50  6357070  68 81396  50  7143535  108  0  0  7798895  0  0  0  0  0  0  0  0  请按任意键继续. . .

user: user-7
content: for(j=0;j<m;i++) 这个for循环语句不妥，每次循环完成后j的值没有变化，所以这个循环是无限循环 后面应该是j++

user: user-8
content: 不知道搂住想干所么，第2个for用j来判断，为什么用i++?? 最后一个for 也是用j作判断，为所么用i++??  以后贴程序最好说一下干什么用的，别人知道干什么，逻辑感会更好，比较容易看出问题 有行号的最好把行号也贴出来，方便回复修改哪一行

user: user-9
content: 1. 插入源码 2. 指明错误

user: user-10
content: 使用scanf函数的时候注意I/O流中对于回车的处理，尤其在循环中
user-0 提问: 真的郁闷了，求教linux C语言strstr函数问题 

回复:
user: user-1
content: 引用 8 楼 lishi_1991 的回复:我擦，看出来了，一直都是mmcblk1p* 突然变了，惯性思维害死人！多谢各位提醒啊 以为我年纪大了，眼睛不好使了呢

user: user-1
content: "mmcblk0p" 你匹配的字符串 "mmcblk1p1"你标记的字符串 不明白为什么你说打印出来了"mmcblk0p"

user: user-0
content: 我擦，看出来了，一直都是mmcblk1p* 突然变了，惯性思维害死人！多谢各位提醒啊

user: user-0
content: 引用 5 楼 user-2 的回复:你的输出确实没看见 mmcblk0p 啊...画红线部分

user: user-1
content: 引用 4 楼 lishi_1991 的回复:[quote=引用 2 楼 N_sev7 的回复:] 你确定有"mmcblk0p1"？？？！！！ 目测没有，打印不出来是因为返回null有啊，read_buf最后不是打印出来了mmcblockp1[/quote]      ret=strstr(read_buf,"mmcblk0p");  /////仔细检查一下你匹配的字符串

user: user-2
content: 你的输出确实没看见 mmcblk0p 啊...

user: user-0
content: 引用 2 楼 N_sev7 的回复:你确定有"mmcblk0p1"？？？！！！ 目测没有，打印不出来是因为返回null有啊，read_buf最后不是打印出来了mmcblockp1

user: user-0
content: 再补充一下，如果一开始插了存储卡，执行结果是正常的，result = 1;但是printf("ret = %s\n",ret);还是不打印，拔下存储卡，会出现如下结果： 再插上存储卡就会出现上面执行的结果！ 各位求教，求指点迷津啊

user: user-1
content: 你确定有"mmcblk0p1"？？？！！！ 目测没有，打印不出来是因为返回null

user: user-0
content: 再贴上一条比较全的执行结果  最郁闷的是为什么连printf("ret = %s\n",ret);都不打印呢
user-0 提问: printf函数

回复:
user: user-0
content: 搞明白了 谢谢两位！

user: user-1
content: 因为p指向一个字符串！p就标识字符串的首地址！ 加上printf函数是个格式化输出函数，%s，就是输出指针p指向的内容的！  int main() {     char *p = (char *)malloc(20);     memset(p, 0, 20); //防止出现乱码      strcpy(p,"hello");     printf("%s",p);  // p指向的存放在内存地址上的内容     printf("%p",p);  // p指向的内存地址 }

user: user-2
content: 因为你输出的格式是%s 要给成*p的话 输出格式改成%c
user-0 提问: 学习C语言和高数的方法

回复:
user: user-1
content: 苦命的孩子，呵呵！ 慢慢来，一切会好的！ 低调做事，抬头做人！

user: user-2
content: 引用 楼主 u012435086 的回复: [size=18px] 开学两个多月了，感觉C语言和高数好难啊，有什么方法可以传授一下吗？谢谢！[/size]s  C语言，需要勤奋练习的。 我刚上大学那会儿，基本上一个 hello world 都很费解：为什么 #include <stdio.h> .... 什么 printf 。。。 当时觉得好费解，几乎连老师和同学都笑话我不是学计算机的料，呵呵  我只是好奇和求知欲：为什么计算机（软件）可以做出这个效果？计算机是个什么东西？计算机是如何执行代码指令的？记得当时我每次下课都逮着教师、教授问一些“奇葩”的问题……  给楼主鼓励一下，勤奋练习，是很重要的

user: user-3
content: 引用 12 楼 zhao4zhong1 的回复:先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm 那100题是不是特别重要？为什么？ 我感觉比《C primer plus》后面的题目普遍要简单些！

user: user-4

user: user-5
content: 我也是大一，c语言就是多看书，工数把公式记熟，然后多！！做！！题！！

user: user-6
content: 用c语言实现夹逼准则。 用C语言编写一元多项式求解！  。。。

user: user-7
content: 引用 17 楼 u012207185 的回复:[quote=引用 12 楼 zhao4zhong1 的回复:] 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm 那100题是不是特别重要？为什么？ 我感觉比《C primer plus》后面的题目普遍要简单些！[/quote] 重要倒谈不上，先易后难练手用用。

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

user: user-8
content: 不要着急，也就一本课本，主要是花点时间，耐心，把基础概念理解了，不难的。

user: user-9
content: 听我的没错，唯一的途径就是：反复练习。  高数练习：吉米多维奇习题集； C语言练习：刚入门的话，把课后习题反复做三遍即可；提升阶段可以考虑做算法题。

user: user-10
content: 有些时候真的感觉是，书读百遍其义自见。我以前有的地方看不懂，然后我就把这个问题放到一边，过段时间再拿出来看一下，逐句揣摩，还不行就一直循环。当然在揣摩的过程中还应该多查阅资料，不管是网上的还是书本。然后在某个时刻，就顿悟了！

user: user-11
content: 大一先玩够再说

user: user-12
content: 多看看《C primer plus》把理论基础先打好

user: user-13
content: 高数多做题，一般的题目都有一定的解法，熟能生巧而已。对一般的专业，高数70分和90分意义差别不大。 但C语言不同，它是以后学习所有编程语言的基础，认真看书，多多上机，最好每道题都做了，不放过任何一个细节问题，打好基础。这样以后再学C++或Java的时候，把侧重点放在面向对象上，语言细节就轻松点了。

user: user-14
content: 努力学习，加大量的用心练习，自己去编写代码。

user: user-15
content: 别人的学习方法不一定适合你

user: user-16
content: 多跑跑机房，将书上的代码都敲一遍，将书一字一句的看完，要理解！！！多想想为什么神奇的代码能让电脑这个冷冰冰的东西按代码的制定去做一些事情，想多了就明白了     高数么，虽然我大学学的不好，但是除了一些地方特别难（现实工作中用到的可能性较小）之外，其他的都很简单，听老师讲讲，做做课后练习就可以踢球去了

user: user-17
content: 其实超级简单，多敲代码就好了，不会了来这问。

user: user-18
content: 高数上课时记笔记就不会分心，不管老师讲的是不是书上的题都往你本子上写，过段时间你就懂了

user: user-19
content: 高数，听听老师解题思路，学习下分析题目的思维  c语言，之前没有接触过的话，一下子可能有点难，慢慢来，学习新东西就是这样的！ 多看看书，上课认真听听老师讲的理论知识！课后多敲点例程！多看书，先把理论基础学好！
user-0 提问: 求教-逻辑运算

回复:
user: user-1
content: ls推荐的帖子，建议lz去看一下，关于lz的问题，lz首先要明白四点： （1）关于前缀++、--和后缀++、--的规则，lz去看一下ls两位推荐的帖子吧，肯定是好的 （2）在C/C++中，非0的整数是被认为是逻辑1的（即true）； （3）逻辑或运算||和逻辑与运算&&是有短路特性的，因为||、&&是左结合运算符，会先计算左边的值，如果左边的值可以确定这个逻辑表达式的结果的话，||、&&就不会继续在计算右边的值了，就是说，如果||左边的表达式逻辑上是1，则||不会再去管右边表达式的值，如果&&左边表达式逻辑上是0，则&&不会再去管右边表达式的值了； （4）&&和||的优先级是&&高于||的 所以：   int x,y,z;   x=y=z=6;   ++x&&++y&&++z;//第一个&&左边++x是7（逻辑1），继续计算右边的++y&&++z                 //第二个&&左边++y是7（逻辑1），继续计算++z，又是7（逻辑1）                 //所以最终逻辑表达式等效于1 && (1 && 1) = 1                 //x = y = z = 7   printf("x=%d\ty=%d\tz=%d\n",x,y,z); //========================================================= x=y=z=-8;   ++x||++y&&++z;//等效于-7(已经是逻辑1了) || anything I don't care as I'm determined to be 1                 //所以++y&&++z都没有执行，最终x = -7, y = z = -8   printf("x=%d\ty=%d\tz=%d\n",x,y,z); //========================================================= x=y=z=-3;   x++&&--y&&z--||--x;//等效于-2&&-4&&-3(已经是逻辑1了) || anything I don't care                       //所以x = -2, y = -4, z = -4   printf("x=%d\ty=%d\tz=%d\n",x,y,z);   再遇到类似的问题，lz不确定或者不懂的时候要学会设断点调试才行呢

user: user-2
content: 引用 2 楼 max_min_ 的回复:http://bbs.csdn.net/topics/370153775 参考这里！就不再纠结了！ 没必要讨论在C语言里原本并无意义的问题

user: user-3
content: http://bbs.csdn.net/topics/370153775 参考这里！就不再纠结了！

user: user-4
content: 哎。。。
user-0 提问: 关于getchar（）出现的位置 小白求解

回复:
user: user-1
content: 引用 7 楼 AnYidan 的回复:getchar()在 scanf() 后是为了取出输入缓存中的“enter" getchar()在 printf() 后是为了让console 停顿 方便观察输出 言简意赅

user: user-2
content: fread() 和 fwrite() 函数使用时注意：   The offset of a member within a structure can differ between compilers and systems, because of different alignment requirements. Indeed, some compilers have an option allowing structures to be packed tightly, to save space with a possible runtime performance penalty, or aligned accurately, to optimize runtime access of each member. This means that even on a single system, the binary layout of a structure can differ, depending on compiler options.  The binary formats used to store multibyte integers and floating-point values differ among machine architectures.

user: user-2
content: getchar()在 scanf() 后是为了取出输入缓存中的“enter" getchar()在 printf() 后是为了让console 停顿 方便观察输出

user: user-3
content: （1）printf后面写getchar()的作用 getchar()是读入输入流中的一个字符，至于lz说的printf之后的getchar()，应该是方便观察前面printf的输出吧，因为输入流中没有字符时，调用getchar()会造成等待输入，这样就可以起到system("pause")的作用了 （2）fread读入结构会有乱码 struct Data{     //... } a; 首先你要确定你的结构体是类似fwrite(&a, sizeof(Data), 1, fp)这样按字节写进去的，中间没有换行或者空格，这样才能通过fread(&a, sizeof(Data), 1, fp)还原回来

user: user-4
content: 比如在main函数的末尾会加1句getchar()来表示暂停，因为VS下调试窗口会一闪而过的。也可以换成system("pause") 但是如果之前有输入的话，最好用2句getchar()前者吸收回车符，后者表示等待。 位置放哪里都可以，一般只是单纯为了吸收多余的回车符而已。

user: user-5
content: 无代码无真相

user: user-6
content: 在printf后面是等待输入一个字符，或者是有时候这样做可以防止程序结束！ 在scanf后面是为了吃点缓冲区里的一个回车符！  记住一点：和位置没有没关系 getchar函数只是从输入流中取走一个字符而已，没有字符就等待！

user: user-7
content: 谁说一定要在printf后面 紧跟着getchar了 如果你不是读入字符 我认为没作用吧 fread乱码问题 我感觉应该与fwrite 配对使用 不要单独使用的好

user: user-8
content: getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符.getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.
user-0 提问: 笔试题目，正解何在？

回复:
user: user-1
content: 楼主面的是哪家公司啊？

user: user-2
content: 第一题可用DFA解析字符串。

user: user-3
content: 第一题可以用Shell脚本实现的不？可以就用sed,或awk或cut命令，很简单的 如果用C读入全部字符串，就以|为分割，分割字符串就行了 第二题就是封装结构体，实现结构体的相加减，也就是c＋＋里的重载，

user: user-4
content: 金融衍生品  有点业务知识的话，很简单。

user: user-5
content: 第一个的话，可以参考下Java的split，没什么难度，你可以看看这个 第二题应该还可以吧，第三题公式都基本告诉你了
user-0 提问: 哪位能讲讲这个程序

回复:
user: user-1
content: 你说的这个getop()函数,不是标准库中的函数,应该是《the c programming language》这本书中的一个例子当中的函数  这个局部变量看相对谁了 相对于在主函数main中的 它是局部变量  和char s[MAXOP]的s取值是否一样？？ atof(s)  01393669  lea         eax,[s]    lea 取s的地址 汇编语言 char acm[1024] ="tmd"; char *p = acm; 01393669  lea         eax,[acm]   0139366F  mov         dword ptr [p],eax   问题2    op(p); 01393675  mov         eax,dword ptr [p]   0139367B  push        eax   0139367C  call        op (013911F4h)   01393681  add         esp,4        op(acm); 001E3675  lea         eax,[acm]   001E367B  push        eax   001E367C  call        op (01E11F4h)   001E3681  add         esp,4    这里的s代表什么意思？ s代表一个变量名称 关联着一段内存空间

user: user-2
content: char s[MAXOP];  就是这个 - -

user: user-0
content: 引用 楼主 u010334406 的回复:getop和atof函数里的参数s是局部变量？和char s[MAXOP]的s取值是否一样？？这里的s代表什么意思？ 这些函数中S的意思是不是字符串的意思？
user-0 提问: 求解，一个关于c链表效率的问题

回复:
user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:不用if就效率高啦？我看未必。 //删除数据 int deleteData(linknode *linkhead,int pos) {     if (pos==0) return 1;     if (linkhead == null || linkhead->next == null) {         perror("链表为空\n");         return 0;     }     linknode *linklist = linkhead->next;     if (pos > 0) {         for (int count = 0;count != pos && linklist!=null; count++) linklist = linklist->next;     } else {//pos < 0         for (int count = 0;count != pos && linklist!=null; count--) linklist = linklist->prev;     } }   这种方法也不错，但是有一段重复的for代码看着略蛋疼 看来应该是最号的办法了吧

user: user-1
content: 不用if就效率高啦？我看未必。 //删除数据 int deleteData(linknode *linkhead,int pos) {     if (pos==0) return 1;     if (linkhead == null || linkhead->next == null) {         perror("链表为空\n");         return 0;     }     linknode *linklist = linkhead->next;     if (pos > 0) {         for (int count = 0;count != pos && linklist!=null; count++) linklist = linklist->next;     } else {//pos < 0         for (int count = 0;count != pos && linklist!=null; count--) linklist = linklist->prev;     } }

user: user-0
content: 引用 4 楼 zhl11a 的回复:[quote=引用 3 楼 N_sev7 的回复:] [quote=引用 2 楼 user-3 的回复:] [quote=引用 1 楼 N_sev7 的回复:]  (pos > 0)?(linklist = linklist->next):(linklist = linklist->prev); 如果这个就不算用if-else了，那是在太简单了吧... linklist = pos > 0 ? linklist->next : linklist->prev这样应该更简洁点。 我觉得用用if-else也没影响多少效率啊[/quote] 额，是简洁了一些，但是没什么区别，所有的执行步骤还都是一样的[/quote] 这个运算符效果不是还是和if else一样的么。。 其实我的意思是先在循环外面判断，可否拿一个变量存储prev或者next，然后用那个变量决定到底是prev还是next[/quote] 开头想了想是不是可以用宏替换代码，但是后来知道宏是在运行前决定的，在if里面用不了

user: user-0
content: 引用 3 楼 N_sev7 的回复:[quote=引用 2 楼 user-3 的回复:] [quote=引用 1 楼 N_sev7 的回复:]  (pos > 0)?(linklist = linklist->next):(linklist = linklist->prev); 如果这个就不算用if-else了，那是在太简单了吧... linklist = pos > 0 ? linklist->next : linklist->prev这样应该更简洁点。 我觉得用用if-else也没影响多少效率啊[/quote] 额，是简洁了一些，但是没什么区别，所有的执行步骤还都是一样的[/quote] 这个运算符效果不是还是和if else一样的么。。 其实我的意思是先在循环外面判断，可否拿一个变量存储prev或者next，然后用那个变量决定到底是prev还是next

user: user-2
content: 引用 2 楼 user-3 的回复:[quote=引用 1 楼 N_sev7 的回复:]  (pos > 0)?(linklist = linklist->next):(linklist = linklist->prev); 如果这个就不算用if-else了，那是在太简单了吧... linklist = pos > 0 ? linklist->next : linklist->prev这样应该更简洁点。 我觉得用用if-else也没影响多少效率啊[/quote] 额，是简洁了一些，但是没什么区别，所有的执行步骤还都是一样的

user: user-3
content: 引用 1 楼 N_sev7 的回复: (pos > 0)?(linklist = linklist->next):(linklist = linklist->prev); 如果这个就不算用if-else了，那是在太简单了吧... linklist = pos > 0 ? linklist->next : linklist->prev这样应该更简洁点。 我觉得用用if-else也没影响多少效率啊

user: user-2
content: (pos > 0)?(linklist = linklist->next):(linklist = linklist->prev);
user-0 提问: 用Eclipse写C语言的困惑

回复:
user: user-0
content: 引用 9 楼 zhao4zhong1 的回复: 引用 11 楼 u011779875 的回复: 非常感谢大家，菜鸟刚开始学习，有点不知所措

user: user-1
content: 引用 8 楼 yinan9 的回复:[quote=引用 7 楼 u011779875 的回复:] 你用这个Eclipse+MinGW 你是学java的吧哥  写c语言用gcc  还是换codeblocks吧 这个是免费的 好的 谢谢！ 随便问下，gcc是啥[/quote] GCC（GNU Compiler Collection，GNU编译器集合）是一套由GNU工程开发的支持多种编程语言的编译器。

user: user-2
content: 引用 2 楼 u011779875 的回复:printf("the number you entered is: %d",a);  这句话你加\n了吗  c语言的printf是行缓冲的 C的printf不一定是怎样缓冲的。缓冲模式和console相关。我估计可能是因为eclipse的控制台是行缓冲的。

user: user-3
content: 引用 6 楼 yinan9 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] 换VS20XX 这个貌似收费吧，我用公司的机器做一些实验的，担心会涉及license问题[/quote] 这个绝对免费： http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装

user: user-0
content: 引用 7 楼 u011779875 的回复:你用这个Eclipse+MinGW 你是学java的吧哥  写c语言用gcc  还是换codeblocks吧 这个是免费的 好的 谢谢！ 随便问下，gcc是啥

user: user-1
content: 你用这个Eclipse+MinGW 你是学java的吧哥  写c语言用gcc  还是换codeblocks吧 这个是免费的

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:换VS20XX 这个貌似收费吧，我用公司的机器做一些实验的，担心会涉及license问题

user: user-0
content: 引用 3 楼 u011779875 的回复:结尾加句话 printf("\n");试试看 谢谢回复！ 但是加了也没起作用啊，你可能没明白我的问题。 我的问题是，程序运行没有先打印第一句话，而是要我输入数字 等我输入之后，两个printf一起执行了

user: user-3
content: 换VS20XX

user: user-1
content: 结尾加句话 printf("\n");试试看

user: user-1
content: printf("the number you entered is: %d",a);  这句话你加\n了吗  c语言的printf是行缓冲的

user: user-0
content: 自己顶一下，求解释
user-0 提问: memcpy问题

回复:
user: user-1
content: memcpy 什么时候跟大小端有关系啦？不同大小端的处理器上不是还要重新编译，根本生成而二进制就不一样。你没用这个函数不说明你调用的库函数就不用这函数

user: user-1
content: 告诉楼主一个NB的方法。  连接器说找不到memcpy，你在.c文件里实现一个就行了。

user: user-2
content: 谁说编译不能单步？  偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

user: user-0
content: 引用 8 楼 AnYidan 的回复:先根据提示修改别的错误，如果仅此一条，用#if(0) ... #endif 逐步确定错误范围 实在不行只有这样了，呵呵

user: user-0
content: 引用 1 楼 u011779875 的回复:自己实现的memcpy1和memcpy2  是否调用了<stdlib.h>中的相关库函数 有的函数的实现是借助memcpy实现的  你注掉你写的memcpy1函数 看是否出现undefined refence to memcpy 如果不出现 说明你的实现借用了相关库函数 加上头文件即可 这个周我在调调，最近忙的没有顾得上这个事，谢谢大家啊

user: user-3
content: 编译器错误提示最直接的信息来源，“某某文件”，这是你自己忽视最直接的线索。

user: user-4
content: 先根据提示修改别的错误，如果仅此一条，用#if(0) ... #endif 逐步确定错误范围

user: user-5
content: 引用 6 楼 max_min_ 的回复:[quote=引用 5 楼 N_sev7 的回复:] [quote=引用 4 楼 max_min_ 的回复:] 单步吧！可能是其他地方调用了！或者是其他库函数引起调用的！ 怎么单步编译？求版主详解[/quote]  是哦！他编译还没过！我的！单步不了， 只有根据提示修改语法问题，或者先写简单的deme测试下， 不要是乌龙！[/quote] 额，差点吓死我和小伙伴，以为自己连编译阶段的单步都没用过...

user: user-6
content: 引用 5 楼 N_sev7 的回复:[quote=引用 4 楼 max_min_ 的回复:] 单步吧！可能是其他地方调用了！或者是其他库函数引起调用的！ 怎么单步编译？求版主详解[/quote]  是哦！他编译还没过！我的！单步不了， 只有根据提示修改语法问题，或者先写简单的deme测试下， 不要是乌龙！

user: user-5
content: 引用 4 楼 max_min_ 的回复:单步吧！可能是其他地方调用了！或者是其他库函数引起调用的！ 怎么单步编译？求版主详解

user: user-6
content: 单步吧！可能是其他地方调用了！或者是其他库函数引起调用的！

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

user: user-7
content: 引用 楼主 gongzhaoye 的回复:我用的cds编译环境，程序中我并没有用memcpy函数，而是自己编写的替代函数memcpy1和memcpy2，主要是为了防止大小端问题。但是编译后老是报出某某文件“undefined refence to memcpy”，我检查很多次压根没有memcpy函数，把头文件、memcpy1和2函数名改了也不行，这是为什么呢  看看obj文件，哪里使用了memcpy

user: user-8
content: 自己实现的memcpy1和memcpy2  是否调用了<stdlib.h>中的相关库函数 有的函数的实现是借助memcpy实现的  你注掉你写的memcpy1函数 看是否出现undefined refence to memcpy 如果不出现 说明你的实现借用了相关库函数 加上头文件即可
user-0 提问: 求大神指导下！关于链表的！

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

user: user-2
content: 林锐 高质量 C++& C 编程指南

user: user-3
content: La是一个指针的意思是，La作为一个变量，他的值是一个地址， 最初的地址是NULL，你现在要更改La的值，那么必须要把La的地址传递进去，无论La本身是什么变量。

user: user-3
content: 想要在在子函数中赋值，就必须要传址。 传值的结果就是调用initlist_Link(La)之后，La的值还是NULL。 你可以在initlist_Link  下面一行打印一下La。

user: user-4
content: void initlist_Link(Linklist &L)///设置成引用或者 void initlist_Link(Linklist *L)///设置成指向指针的指针