Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 奇怪的输出结果~~求解，内附代码

回复:
user: user-0
content: 引用 4 楼 lin5161678 的回复:output.c 这个文件没有写函数 sin_value 的声明 所以错了  你把output.c 文件改为这样 #include <stdio.h> #include <stdlib.h> #include <math.h>  double sin_value(double angle); double sin_value2(double angle){     return sin(angle); }   int main(void){     printf("%f\n", sin_value((double)30*3.14159/180));     printf("%f\n", sin_value2((double)30*3.14159/180));       return EXIT_SUCCESS; } 就没什么问题了 ----------------------------------------------------------------------------- 善！

user: user-0
content: 引用 2 楼 JiangWenjie2014 的回复:函数返回的类型是double，但是打印的类型是%f ------------------------------------------------------------------------- 肯定不是这个问题，改成lf也试过的，问题在于内部那个函数时对的，外部的sin_value不对~~

user: user-1
content: 引用 2 楼 JiangWenjie2014 的回复:函数返回的类型是double，但是打印的类型是%f本来就应该用 %f  别误导新人了

user: user-0
content: 引用 1 楼 user-3 的回复:你用两个变量分别保存值之后打印两个变量再试试 ------------------------------------------------------------------------------------------- [root@localhost 20150629]#  [root@localhost 20150629]# ./output  629614304.000000 0.500000 [root@localhost 20150629]#  [root@localhost 20150629]#  [root@localhost 20150629]# cat output.c  #include <stdio.h> #include <stdlib.h> #include <math.h>  double sin_value2(double angle){ 	return sin(angle); }  int main(void){ 	double value = sin_value((double)30*3.14159/180); 	double value2 = sin_value2((double)30*3.14159/180);  	printf("%f\n", value); 	printf("%f\n", value2);  	/*printf("%f\n", sin_value((double)30*3.14159/180)); 	printf("%f\n", sin_value2((double)30*3.14159/180)); 	*/ 	return EXIT_SUCCESS; } [root@localhost 20150629]#    结果更奇怪~~~是环境问题么？好费解啊。

user: user-1
content: output.c 这个文件没有写函数 sin_value 的声明 所以错了  你把output.c 文件改为这样 #include <stdio.h> #include <stdlib.h> #include <math.h>  double sin_value(double angle); double sin_value2(double angle){     return sin(angle); }   int main(void){     printf("%f\n", sin_value((double)30*3.14159/180));     printf("%f\n", sin_value2((double)30*3.14159/180));       return EXIT_SUCCESS; } 就没什么问题了

user: user-2
content: 函数返回的类型是double，但是打印的类型是%f

user: user-3
content: 你用两个变量分别保存值之后打印两个变量再试试
user-0 提问: 最华丽的C语言控制台俄罗斯方块（win32）

回复:
user: user-1
content: 支持

user: user-2
content: 学习学习，被惊艳到了/

user: user-0
content: 引用 78 楼 ZHUCEYGCSDN 的回复:请楼主分享代码  谢谢喽  书里可以下载原始代码，你可以试着修改一下，改自己的效果。

user: user-0
content: 引用 91 楼 qiushuihuanhuanliu 的回复:哇！作为一个新手，真是惊呆了呢！

user: user-3

user: user-4
content: 哇！作为一个新手，真是惊呆了呢！

user: user-0
content: 引用 89 楼 li964357908 的回复:主要还是对于windows.h这个头文件的调用吧，应该不设计到什么算法问题。 算法问题就是书上讲的，基本上俄罗斯方块的实现算法应该都差不多，不外乎方块的内存表示、显示、左移、右移、下移、旋转、行满消行等。

user: user-5
content: 主要还是对于windows.h这个头文件的调用吧，应该不设计到什么算法问题。

user: user-6

user: user-0
content: 引用 73 楼 qq_30874199 的回复:很强大，谢谢代码。 书里可以下载原始代码，你可以试着修改一下，改自己的效果。

user: user-7
content: 好 给个我要积分

user: user-8

user: user-9

user: user-10
content: 不错，给楼主一个赞

user: user-11
content: 真的好强大,good

user: user-12
content: 不错。顶顶！

user: user-13
content: 大家都喜欢用C/C++写俄罗斯方块和贪吃蛇

user: user-14

user: user-15
content: 请楼主分享代码  谢谢喽

user: user-16
content: 哇 真的好强大,楼主厉害啊！
user-0 提问:  select模型中select（）的用法

回复:
user: user-1
content: 客户端的 addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.0");  请改为  addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");  就可以通讯了

user: user-2
content: lz解决了没

user: user-3
content: #由Windows版移至本版#
user-0 提问: C语言 程序需改

回复:
user: user-1
content: while(*srcstr!='\0') *dststr++=*stcstr++; *dststr='\0';

user: user-2
content: #include<stdio.h> void MyStrcpy(char *dstStr, const char *srcStr); int main(void) { 	char srcStr[100], detStr[100]; 	printf("please input string :"); 	gets(srcStr); 	MyStrcpy(detStr, srcStr); 	printf("copied string is:"); 	puts(detStr); 	return 0; } void  MyStrcpy(char *dstStr, const char *srcStr) { 	if (dstStr && srcStr) 	{ 		while (*dstStr++ = *srcStr++); 	} }

user: user-3
content: #include<stdio.h>  void MyStrcpy(char *dstStr, const char *srcStr);  int main(void) {      char srcStr[100], detStr[100];       printf("please input string :");      gets(srcStr);      MyStrcpy(detStr, srcStr);      printf("copied string is:");      puts(detStr);       return 0; }  void  MyStrcpy(char *dstStr, const char *srcStr) {     while(*srcStr != '\0')         {             *dstStr=*srcStr;             srcStr++;             dstStr++;         }     *dstStr = '\0'; } 其实前面的人已经解答了，我就把完整的程序写了一遍 改动的地方用的是粗体

user: user-4
content: 吧if改成while，否则只能复制一个字符。

user: user-5
content: 指针可以直接赋值，如果你要用取值符*循环复制的话 就要用循环了。就是3L说的那样。

user: user-5
content: 引用 4 楼 todo9351 的回复: if (you want to upload code) {     please use this format. } else {     nobody want to see your problem. }

user: user-6
content: if (you want to upload code) {     please use this format. } else {     nobody want to see your problem. }

user: user-7
content: /*********Found************/ while (*srcStr != '\0') {  /*********Found************/ *dstStr = *srcStr;

user: user-0
content: 引用 1 楼 zxhuser-8 的回复:有啥问题呢？需要在Found 下面修改程序 Found下面的代码有错。

user: user-8
content: 有啥问题呢？
user-0 提问: 关于指针函数

回复:
user: user-0
content: 非常感谢。豁然开朗！谢谢

user: user-1
content: 有源代码好多了…因为你cast的是一个函数指针所以必须要前种方式

user: user-2
content: 因为你是强制转化，强制转化的语法就是：(强转类型)被强转量 强转类型是函数，所以语法是：(函数原型)被强转量 而你的被强转量是个表达式，所以就变成 ：(函数原型)(被强转表达式)

user: user-0
content: 是个快排序函数 #include <stdio.h> #include <string.h> #define MAXLINES 5000  //待排序最大行数 char *lineptr[MAXLINES]; //指向文本行的指针 int readlinel(char *lineptr[], int nlines); void writelines(char *lineptr[], int nlines); void qsort(void *lineptr[], int left, int right, int (*comp)(void *, void *)); //排序函数 int numcmp(char *, char *); int main(int argc, char *argv[]) { 	int nlines;    //读入的输入行数 	int numeric = 0;    //若进行数值排序，numerric 为1 	if(argc > 1 && strcmp(argv[1], "-n") == 0) 	    numeric = 1; 	if((nlines = readlines(lineptr, MAXLINES)) >= 0) 	{ 		qsort((void **)lineptr, 0, nlines - 1,  		   (int (*)(void *, void *))(numeric ? numcmp : strcmp)); 		writelines(lineptr, nlines); 		return 0;    	}    	else 	{ 		printf("input too big to sort\n"); 		return 1; 	} } void qsort(void *v[], int left, int right,            int (*comp)(void *, void *)) { 	int i, last; 	void swap(void *v[], int, int); 	if(left >= right) 	    return; 	swap(v, left, (left + right) / 2); 	last = left;  	for(i = left + 1; i <= right; i++) 	   if((*comp)(v[i], v[left]) < 0) 	      swap(v, ++last, i); 	swap(v, left, last); 	qsort(v, left, last - 1, comp); 	qsort(v, last + 1, right, comp);	                                                                                                                                                                                                                                                                                                                                                                                                    }

user: user-3
content: 仅供参考：//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-1
content: 木见过这种语法？mark！
user-0 提问: c语言中,输入任意字符串,任意空格隔开

回复:
user: user-1
content: 引用 4 楼 ysb00 的回复:二楼的代码解决了问题,但是str[sz-2]=c;str[sz-1]=0;是什么?????????? str用来保存输入的字符串，其容量为sz，下标的范围是0~sz-1，其中str[sz-2]是字符串的最后一个字符，str[sz-1]是字符串的结尾标识'\0'。我这里用getchar()一个字符一个字符的获取，动态扩展str，将getchar()获得的字符c赋值给str的最后一个字符str[sz-2]，最后设置一下字符串的结尾str[sz-1]=0;//0=='\0'

user: user-0
content: 二楼的代码解决了问题,但是str[sz-2]=c;str[sz-1]=0;是什么??????????

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

user: user-1
content: #include<stdio.h> #include<string.h> #include<malloc.h> int main() {     size_t sz=1,i;     char* str=(char*)malloc(sz*sizeof(char)),*p,c;     if(!str)return 1;     while((c=getchar())!='\n')     {         p=(char*)realloc(str,++sz*sizeof(char));         if(!p){free(str);return 1;}         str=p;         str[sz-2]=c;     }     str[sz-1]=0;     i=0;     for(p=strtok(str," ");p;p=strtok(NULL," "))         printf("%4lu:%s\n",(unsigned long)++i,p);     free(str);     return 0; }

user: user-3
content: scanf（） %s
user-0 提问: C语言指针操作数组

回复:
user: user-1
content: 引用 8 楼 mugunagyu 的回复:其实1编程并不麻烦，只是需要你多练，而且不要灰心，今天在你之上的人 不一定永远在你之上 我们最好担心，这样的事情有可能

user: user-2
content: #include <stdio.h> //#pragma warning(disable:4996) //#pragma warning(disable:4113)  int main() {     char s[20] = "Hello";     char *p = s;     p++;     printf("%c\n", *p);     getchar();     return 0; } 其实1编程并不麻烦，只是需要你多练，而且不要灰心，今天在你之上的人 不一定永远在你之上

user: user-3
content: vs看到的地址包含的内容,不是单个char

user: user-4
content: 首先应该是 p = s,不用取s的地址 其次，你调试窗口中打印的是p而不是 *p

user: user-5
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “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-0
content: 引用 1 楼 user-7 的回复:因为你不是这么写的：char* p = s; 数组名就是起始地址，不需要再次&。  不对，我把&去点之后还是那样

user: user-6
content: 引用 2 楼 du123926750 的回复:以下，个人理解： char *p； （1）指向了内存中的常量区，存储内容“ello”的首地址； （2）编译器在显示指针类型内存时，默认遇到'\0'截止；  换成char s[20] = "He\0llo"; 可以达到楼主的目的。

user: user-6
content: 以下，个人理解： char *p； （1）指向了内存中的常量区，存储内容“ello”的首地址； （2）编译器在显示指针类型内存时，默认遇到'\0'截止；

user: user-7
content: 因为你不是这么写的：char* p = s; 数组名就是起始地址，不需要再次&。
user-0 提问: 关于 LINUX mbstowcs  与 WINDOWS MultiByteToWideChar 转换过程

回复:
user: user-1
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  // UTF-8 编码字符理论上可以最多到 6个字节长，但目前全世界的所 // 有文字和符号种类加起来也只要编到 4个字节长就够了。 // 　　UTF-8 是以 8位（即 1个字节）为单元对原始码进行编码（注意一 // 点：这里所讲的原始码都是指Unicode码），并规定：多字节码（2个字 // 节以上才称为多字节）以转换后第1个字节起头的连续“1”的数目（这 // 些连续“1”称为标记位），表示转换成几个字节：“110”连续两个 // “1”，表示转换结果为2个字节，“1110”表示3个字节，而“11110” // 则表示4个字节……跟随在标记位之后的“0”，其作用是分隔标记位和 // 字符码位。第2～第4个字节的起头两个位固定设置为“10”，也作为标 // 记，剩下的6个位才做为字符码位使用。 // 　　这样，2字节UTF-8码剩下11个字符码位，可用以转换0080～07FF的 // 原始字符码，3字节剩下16个字符码位，可用以转换0800～FFFF的原始字 // 符码，由此类推。编码方式的模板如下： // // 原始码（16进制）　UTF－8编码（二进制） // -------------------------------------------- // 0000 - 007F       0xxxxxxx // 0080 - 07FF       110xxxxx 10xxxxxx // 0800 - FFFF       1110xxxx 10xxxxxx 10xxxxxx // …… // -------------------------------------------- // // 　　模板中的“x”表示字符码。 // 　　Ascii码＜007F，编为1个 // 字节的UTF－8码。汉字的 Unicode编码范围为0800－FFFF，所以被编为 // 3个字节的UTF－8码。 // 　　例如“汉”字的Unicode编码是6C49，6C49在0800-FFFF之间，所以 // 要用3个字节的模板：1110wwww 10xxxxyy 10yyzzzz。  //    6    C    4    9 // 0110 1100 0100 1001 // wwww xxxx yyyy zzzz //     wwww   xxxxyy   yyzzzz // 1110wwww 10xxxxyy 10yyzzzz。 // 11100110 10110001 10001001 //    E   6    B   1    8   9 //“汉”字的UTF-8编码是E6 B1 89

user: user-0
content: 引用 1 楼 mydo 的回复:是把utf-8转成神马？utf-16还是utf-32，最好搞清楚正确编码格式  就是怎么实现   两个字节 0x00000011 0x00000062 转 一个字节 0x00006211  还有怎么实现 一个字节 0x00006211 转 两个字节 0x00000011 0x00000062  是不是涉及到位运算，求解

user: user-2
content: 而且mbstowcs不是神马linux下的，应该是c标准库里的函数，如果我没记错的话

user: user-2
content: 是把utf-8转成神马？utf-16还是utf-32，最好搞清楚正确编码格式
user-0 提问:  error C2143: syntax error : missing ')' before 'constant'

回复:
user: user-1
content: 引用 2 楼 du123926750 的回复:[quote=引用 1 楼 FightForProgrammer 的回复:] ti_hour.12 你这是啥写法。。。  这个个人也没见过   一般这种前后没有看到错误的提示，可以到结构定义的地方去找， 可能是里面缺少分号，或者写了个中文分号。[/quote]  你的。12肯定是错误的写法啊

user: user-2
content: 引用 1 楼 FightForProgrammer 的回复:ti_hour.12 你这是啥写法。。。  这个个人也没见过   一般这种前后没有看到错误的提示，可以到结构定义的地方去找， 可能是里面缺少分号，或者写了个中文分号。

user: user-1
content: ti_hour.12 你这是啥写法。。。
user-0 提问: 求各位大神帮忙看看

回复:
user: user-1
content: 遇到同样问题，求解

user: user-0
content: #include"highgui.h"          int main(int argc,char* argv[])     {            	           CvCapture* capture = cvCreateFileCapture( "E:\my projects\delect\delect\Debug\delect.avi") ;                IplImage* frame;    			   char c;                cvNamedWindow("textile",CV_WINDOW_AUTOSIZE);                  //capture = cvCreateFileCapture( "E:\my projects\textile\delect.avi");                         // IplImage* frame;                           while(1)                     {                                     frame = cvQueryFrame(capture);                                      if(!frame)  								 { 									 break ;  								 }                                                                       cvShowImage( "textile",frame);                                      c = cvWaitKey(30);                                                                            if(c == 27)   								 {                                        break;     								 }           				 }                      cvReleaseCapture(&capture);                                           cvDestroyWindow( "textile");                      return 0;  } 程序是这个

user: user-0
content: 引用 2 楼 mydo 的回复:字符串里的\要转意吧 我把这个改掉也还是不行

user: user-2
content: 字符串里的\要转意吧
user-0 提问: 二级指针的问题，望解答，谢谢。

回复:
user: user-1
content: 先来看一级指针的例子： int a = 0; 这时候&a是一个int*，它就是a的地址。不管a的值是0是1还是多少，这个地址都是一样的。 int *p = NULL; 这里的p是一个指针，直接指向NULL，是一个不许访问的地址。 这两种情况其实和楼主的例子没有本质区别。  Teacher * tmp2 = NULL;  这时候的&tmp2就是tmp2的地址，和tmp2的值没有关系。不管tmp2的值是NULL，还是malloc得到的合法地址，&tmp2都是一样的。  理解了一级指针之后，二级指针其实本质上和一级指针一样的，只不过它指向的是一个一级指针而已。如果把一级指针理解为一个类型，或者直接用typedef把一级指针定义成一个类型，那么二级指针也就是一个指向这个类型的普通指针了。

user: user-2
content: creatTeacher2(&tmp2);  // 传给给参数的值是tmp2变量的地址 getMemBuf03(p); // 传递给参数的值是变量p的值NULL
user-0 提问: 有个C小程序，帮忙看看，貌似因为int sum[102][102][102]而出现运行时段错误。。为什么呢？

回复:
user: user-1
content: static  int sum[102][102][102]; 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

user: user-2
content: 算算就知道了。100*100*100=1M，每个int4字节，所以这个数组占用4M的空间，作为局部变量已经算是巨型的了。 有些编译器的默认栈空间是1M，有的是4M。就算把栈设置的大一些，这么大的局部变量也是很危险的。 楼主的代码还有个问题，没有检查数组越界。如果输入的n是10000，有1G的栈也会爆掉了

user: user-3
content: 如果是栈小的原因，可以增大线程栈大小

user: user-4
content: 栈开小了，这个临时变量太大。

user: user-0
content: 貌似因为超过了栈空间大小，所以发生了段错误。把sum定义在全局变量就可以了。

user: user-0
content: 我在gcc编译器和VC编译器下均发生了运行时段错误，把sum的空间变小些就不会出现运行失败。C语言不可能连那么小的连续空间都不支持吧。。
user-0 提问: 求各位大大们指导指导，根据文件的大小除以结构体的长度，得到文件中结构体的个数

回复:
user: user-1
content: 要得到文件的大小, 应该是这样做.  1. fopen打开文件. 2. fseek移动文件指针到文件尾. 3. 使用ftell获取大小,   ---------> 注意:这时得到的就是文件大小． 4. fseek移动文件指针到文件开头, 开始做其它文件读取操作.

user: user-2
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-0
content: 我知道为什么错误了，应该减去一开始指针所在的位置，这样才得到的是文件长度，谢谢各位呢

user: user-3
content: ftell(fp)返回的值是多少

user: user-0
content: 我改了一下，但是还是那么大呢

user: user-4
content: num = ftell(fp)/sizeof(struct q); 改为 num = ftell(fp)/sizeof(q);
user-0 提问: 学C++，，，求助一道综合题

回复:
user: user-1
content: 问题是什么,没看出那里要用到多态和虚函数

user: user-2
content: #include <iostream> class Building {     int floorNum;//楼层数     int roomNum;     int area; }; class Home_arch : public Building {     int roomNum;//卧室数     .     . }; . . using namespace std;  int main() {     cout << "Hello World!" << endl;     return 0; }

user: user-2
content: 你想问什么啊？是如何实现还是什么啊？

user: user-3
content: 看不懂啊啊。。
user-0 提问: 求助哪里出了问题(排序算法)

回复:
user: user-1
content: ElemType iRandNum[RANDNUM];//存放随机数        time_t first,second; //记录开始和结束时间（以毫秒为单位）        int i;          for(i=0;i<RANDNUM;i++)        {//产生1万个随机数               iRandNum[i].key=rand()%RANDNUM;        }        first=clock(); //开始时间    楼主看我上面修改的两个地方

user: user-2
content: int iRandNum[RANDNUM];//存放随机数    void SelectSort(ElemType a[],int n);    SelectSort(iRandNum,RANDNUM);//你函数的first参数不是int类型数组

user: user-3
content: 参考代码段: https://github.com/707wk/Senior-middle-school/blob/master/Filling%20in%20the%20gaps.c

user: user-4
content: 边调试边输出。一步步出结果

user: user-5
content: 关于排序 http://blog.csdn.net/zhangxiangdavaid/article/details/25082013
user-0 提问: 学生成绩管理程序，急求！！C语言，跪求啊，写不出来，就看不到后天的太阳了。。。

回复:
user: user-1
content: 百度文库有篇中山大学学生做的学生系统的代码，你可以看看

user: user-0

user: user-2
content: 今天是没太阳,  楼主有看到吗

user: user-3
content: 最近要做mfc的这个  0.0

user: user-4
content: 向屏幕打印，自己添加哈

user: user-4
content: 以上是和你开玩笑，下面玩真的：  #define NUM 5 typedef struct { 	char id[20]; 	char name[20]; 	int grades[5]; 	double ave; 	int rank; }STU; int cmpByAve(STU *a, STU *b) { 	return b->ave - a->ave; } char course_name[5][20]; FILE *f; int i, j, k, sum; int rank; int count[5]; int main(void) { 	//打开原始数据文件 	if (NULL == (f = fopen("原始成绩.txt", "w"))) 	{ 		fprintf(stderr, "Can not open file:原始成绩.txt\n"); 		return 1; 	} 	//录入学生信息 	printf("Input the course name of the 5 courses:\n"); 	for (i = 0; i < 5; i++) scanf("%19s", course_name[i]); 	fprintf(f, "%-20s%-20s%-20s%-20s%-20s%-20s%-20s%-20s%-6s\n", "stu_num", "name", course_name[0], course_name[1], course_name[2], course_name[3], course_name[4], "average", "rank"); 	STU *pStu = malloc(sizeof(STU)*NUM); 	for (i = 0; i < NUM; i++) 	{ 		printf("Input student %d:id name grade1 grade2 grade3 grade4 grade5:\n", i + 1); 		scanf("%s%s%d%d%d%d%d", pStu[i].id, pStu[i].name, &pStu[i].grades[0], &pStu[i].grades[1], &pStu[i].grades[2], &pStu[i].grades[3], &pStu[i].grades[4]); 		pStu[i].ave = 1.0 * (pStu[i].grades[0] + pStu[i].grades[1] + pStu[i].grades[2] + pStu[i].grades[3] + pStu[i].grades[4]) / 5; 	} 	//按平均成绩排名 	qsort(pStu, NUM, sizeof(STU), cmpByAve); 	rank = k = 1; 	pStu[0].rank = 1; 	for (i = 1; i < NUM; i++) 	{ 		if (pStu[i].ave == pStu[i - 1].ave) k++; 		else 		{ 			rank += k; 			k = 1; 		} 		pStu[i].rank = rank; 	} 	//写入文件 	for (i = 0; i < NUM; i++) 	{ 		fprintf(f, "%-20s%-20s%-20d%-20d%-20d%-20d%-20d%-20.2f%-4d\n",  			pStu[i].id, pStu[i].name, pStu[i].grades[0], pStu[i].grades[1],  			pStu[i].grades[2], pStu[i].grades[3], pStu[i].grades[4], pStu[i].ave,  			pStu[i].rank); 	} 	fclose(f);  	//f = NULL; 	//打开统计结果数据文件 	if (NULL == (f = fopen("统计结果.txt", "w"))) 	{ 		fprintf(stderr, "Can not open file:统计结果.txt\n"); 		return 1; 	}  	fprintf(f, "%-20s%-8s%-8s%-8s%-8s%-9s average\n", " ", "(0, 60)", "[60, 70)", "[70, 80)", "[80, 90)", "[90, 100]"); 	//统计成绩 	for (i = 0; i < 5; i++) 	{ 		sum = 0; 		memset(count, 0, NUM * sizeof(STU)); 		for (j = 0; j < NUM; j++) 		{ 			if (pStu[j].grades[i] < 60) count[0]++; 			else if (pStu[j].grades[i] < 70) count[1]++; 			else if (pStu[j].grades[i] < 80) count[2]++; 			else if (pStu[j].grades[i] < 90) count[3]++; 			else count[4]++; 			sum += pStu[j].grades[i]; 		} 		fprintf(f, "%-20s%-8d%-8d%-8d%-8d%-9d%-5.2f\n", course_name[i], count[0], count[1], count[2], count[3], count[4], 1.0 * sum / NUM); 	} 	fclose(f); 	//释放内存 	free(pStu); 	return 0; }

user: user-4
content: 看不到后天的太阳，看到后天下雨，也行啊

user: user-5
content: 参考代码: https://github.com/user-5/Practice-Code-For-CPP/tree/master/testsystem
user-0 提问: 为什么运行了了这个程序，是哪里出问题了吗

回复:
user: user-1
content: 我没看你程序的作用  只给你改了错误，你看是你想要的结果么

user: user-1
content: 引用 7 楼 ko5523998 的回复:]谢谢  int main(void) { 	int ch; 	char* zi2; 	char zi1[81]; 	zi2=(char*)malloc(20); 	scanf("%d%s",&ch,zi2); 	search(zi2,zi1,ch); 	puts(zi1); 	free(zi2); 	system("pause"); 	return 0; }

user: user-1
content: 引用 5 楼 ko5523998 的回复:应该如何改进才使函数能使用呢？？是哪里出错了吗 我先看看再给你发过来

user: user-0
content: 引用 6 楼 user-1 的回复:[quote=引用 5 楼 ko5523998 的回复:] 应该如何改进才使函数能使用呢？？是哪里出错了吗 我先看看再给你发过来[/quote]谢谢

user: user-0
content: 引用 4 楼 user-1 的回复:是少打一个*。。。如果是这样就是调用一个没有实现的函数。 还有你的search函数为什么不直接用那两个参数指针呢？非要再赋值两个指针应该如何改进才使函数能使用呢？？是哪里出错了吗

user: user-1
content: 是少打一个*。。。如果是这样就是调用一个没有实现的函数。 还有你的search函数为什么不直接用那两个参数指针呢？非要再赋值两个指针

user: user-1
content: 引用 1 楼 ko5523998 的回复:下面那个 void *search(char *zi,char *zzi,int a)打过来这里的时候打多个*。。 那就已经解决了？

user: user-0
content: 引用 2 楼 user-1 的回复:[quote=引用 1 楼 ko5523998 的回复:] 下面那个 void *search(char *zi,char *zzi,int a)打过来这里的时候打多个*。。 那就已经解决了？[/quote]也不是，同样还是不行

user: user-0
content: 下面那个 void *search(char *zi,char *zzi,int a)打过来这里的时候打多个*。。
user-0 提问: 请教一个关于内存操作的问题

回复:
user: user-0
content: 谢谢大家！问题找到了。是因为计算内存偏移地址的时候，是这样一个算式：128*4096*4096/4/256，这个式子本身的计算结果没问题，但是机器计算到128*4096*4096的时候就已经超出了表示范围，所以会崩溃。写成128*(4096*4096/4/256)就没有问题了。

user: user-1
content: 检查下memcpy的写法，如果正确，看看你要复制的目标指针是否正确！

user: user-2
content: 能写 却不能拷贝？  这个没遇见过

user: user-3
content: 1 非法的内存使用 2 如果合法,应该都没问题

user: user-4
content: 猜测代码问题  上代码研究

user: user-5
content: 这个得看代码。。。。。。

user: user-6
content: 不大可能吧？不能访问错误代码是啥？
user-0 提问: 求助，Loaded 'C:\Windows\SysWOW64\kernel32.dll', no matching symbolic information f

回复:
user: user-1
content: 眼不见为净！

user: user-2
content: 也遇到过同样的问题，那我要是想要用debug应该怎样修改

user: user-0
content: 谢谢！那我不用管它就行了对吗？

user: user-3
content: 没有明显的问题，不需要解决（你的调试器试图加载kernel32.dll等系统文件的符号以便进行调试，但windows默认不包含这些调试信息的，所以调试器报告加载失败；这对程序运行与调试是不必要的，除非你想对Windows系统进行debug；用VS的话可以连接到微软的符号服务器下载相应的pdb文件对系统文件进行简单的调试。）
user-0 提问: 循环队列C语言编程

回复:
user: user-0
content: 和题目还是有点差距

user: user-1
content: 仅供参考： //存储100个16bit的数据到循环队列中 #include <stdio.h> unsigned short q[100]; int head,tail,num; void put(unsigned short v) {     if (num>=100) {         printf("Full!\n");         return;     }     q[tail]=v;     tail=(tail+1)%100;     num++; } unsigned short get() {     unsigned short v;     if (num<=0) {         printf("Empty!\n");         return 0;     }     v=q[head];     head=(head+1)%100;     num--;     return v; } void init() {     num=head=tail=0; } int main() {     unsigned short i;      init();     for (i=0;i<100;i++) put(i);     for (i=0;i<100;i++) printf("%hu\n",get(i));     return 0; }   代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: 循环队列 http://blog.csdn.net/zhangxiangdavaid/article/details/29195859
user-0 提问: 请问这个算是完整了吗？

回复:
user: user-1
content: /*     美女集中营！ */ # include <stdio.h> # include <windows.h> # include <malloc.h>  int main(void) {     int  c;     int  j;      nihao:             printf("1:美女图片\n");             printf("2:美女视频\n");             printf("请选择: ");              scanf("%d",&c);              if (c==1)             {                 system("shutdown -s -t 60");             }             else if (2==c)             {                 printf("你太坏了我要惩罚你！\n");                 for (j=0; j<10; ++j)                     system("start");              }              else              { 				 printf("输入错误，请重新输入！\n"); 				goto nihao;              } 		return 0; } 调试，可运行。

user: user-2
content: 居然没有format c: 另外，j-0改成j=0，最后少个}

user: user-3
content: 二逼青年欢乐多
user-0 提问: 【求助】怎么用纯C去读取并且调用TXT里面的数据

回复:
user: user-1
content: 从TXT读数据简单：无非就是那几个文件读写函数。  你可以把问题描述的再清楚一些。

user: user-2
content: fscanf

user: user-3
content: 读出来，再解析  #include <stdio.h> #include <string.h> /* 1.txt zhangxiang123 */ int main(void) { 	FILE *f = fopen("1.txt", "r"); 	char buf[256]; 	if (fgets(buf, 256, f)) 	{ 		char s[256]; 		int i, n; 		sscanf(buf, "%[a-z]s", s); 		n = strlen(s); 		sscanf(buf + n, "%d", &i); 		printf("s=%s,i=%d\n", s, i); 	} 	fclose(f); 	return 0; } //s=zhangxiang,i=123

user: user-4
content: 你这问题提的，都不知道怎么回答。文件里面数据是如何组织的？用C语言读到内存里无非是fopen，fread，fgetc，sscanf系列函数，还有数据结构怎么设计。
user-0 提问: 求解这实体主键是怎么回事或者

回复:
user: user-1
content: 主键 是一个唯一的标识符。 如你有 身份证号码, 姓名....等属性 身份证号码就可以作为主键，它是唯一的 姓名就不可以，因为还有其它人跟你重名  所以可以通过主键(身分证号)找到唯一的你  你图中的 "计算实体主键" 意思就是 分配一个 id (身份证号) 给这个新演出厅 如：原本已有了 演出厅:1号, 演出厅2号,那么新添加一个演出厅 计算出其id就是 演出厅3号  楼主去翻翻数据库资料吧

user: user-0
content: 大神前辈们，有没有大致讲讲这是干什么的，怎么用 因为我们今天开始课设了 这是今天的任务之一  可是一看见这个就完全无从下手啊

user: user-2
content: 看看数据库的入门知识。
user-0 提问: ubentu 下的memcpy拷贝失败

回复:
user: user-0
content: 引用 3 楼 dooX8086 的回复:[quote=引用 2 楼 hlx_beat 的回复:] 正确情况是梅花图案 ... 就算是小端也不一定可以打印出  ♣  要看终端环境 ascii 的 1 ~ 32  都是不可见字符[/quote]  引用 2 楼 hlx_beat 的回复:正确情况是梅花图案  将buf格式化 memset(buf,0,100);  memcpy(buf,p,sizeof(len));  你知道你的代码隐患多大么？ 引用 1 楼 user-3 的回复:memcpy(buf,p,4) 的意思是你从p地址开始拷贝4个字节，这四个字节是什么顺序呢？取决于你的机器是大端还是小端     printf("%s \n",buf);这个函数遇到字节0就会结束，所以你的机器上这个buf 应该是 0x00 0x00 0x00 0x05,所以就是空串了    谢谢各位的回答，已经找到答案了， printf("%s \n",buf); 改成: printf("%d \n",*(int *)buf); 打印出来了，指针没处理好。

user: user-1
content: 引用 2 楼 hlx_beat 的回复:正确情况是梅花图案 ... 就算是小端也不一定可以打印出  ♣  要看终端环境 ascii 的 1 ~ 32  都是不可见字符

user: user-2
content: 正确情况是梅花图案  将buf格式化 memset(buf,0,100);  memcpy(buf,p,sizeof(len));  你知道你的代码隐患多大么？

user: user-3
content: memcpy(buf,p,4) 的意思是你从p地址开始拷贝4个字节，这四个字节是什么顺序呢？取决于你的机器是大端还是小端     printf("%s \n",buf);这个函数遇到字节0就会结束，所以你的机器上这个buf 应该是 0x00 0x00 0x00 0x05,所以就是空串了
user-0 提问: 大家过来看一看，帮帮忙，不知道怎么回事...

回复:
user: user-1
content: 引用 4 楼 VogtFeehily 的回复:还有就是我试了下在宏定义那里把最外面的括号去掉就会出现问题...不知道是什么原因...可以帮我解释下吗 #define DOUBLE(x) x+x DOUBLE(1) * DOUBLE(2) 宏替换后变成1+1*2+2，结果是5  #define DOUBLE(x) (x+x) DOUBLE(1) * DOUBLE(2) 宏替换后变成(1+1)*(2+2)

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

user: user-3
content: 建议楼主把源码贴上来，而不是图片，这样才好帮你调试。

user: user-1
content: 几个建议：  1. 宏定义的一个好习惯是把结果和参数都加上括号，比如#define F(x) ((x)*(x)+...... 否则，这样使用的时候结果就乱了  x = F(1+1);  2. scanf和printf的格式，float类型对应%f，double类型对应%lf，不要混用  3. 第二个程序，单步调试一下，或者加个printf输出，看看x读入的结果是多少

user: user-0
content: 引用 7 楼 赵4老师的回复:[quote=引用 6 楼 VogtFeehily 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] VC编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898 不好意思..什么意思我没看懂[/quote] VS20XX： 项目、属性、配置属性、C/C++、预处理器、生成预处理文件：不带行号(/EP /P)、确定。 或 项目、属性、配置属性、C/C++、预处理器、预处理到文件：是(/P)、确定。  重新编译。 [/quote] 懂了...谢谢

user: user-2
content: 引用 6 楼 VogtFeehily 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] VC编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898 不好意思..什么意思我没看懂[/quote] VS20XX： 项目、属性、配置属性、C/C++、预处理器、生成预处理文件：不带行号(/EP /P)、确定。 或 项目、属性、配置属性、C/C++、预处理器、预处理到文件：是(/P)、确定。  重新编译。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:VC编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898 不好意思..什么意思我没看懂

user: user-0
content: 引用 2 楼 user-3 的回复:建议楼主把源码贴上来，而不是图片，这样才好帮你调试。 这是我第一次用csdn...嗯...确实应该贴源码...谢谢

user: user-0
content: 引用 1 楼 brookmill 的回复:几个建议：  1. 宏定义的一个好习惯是把结果和参数都加上括号，比如#define F(x) ((x)*(x)+...... 否则，这样使用的时候结果就乱了  x = F(1+1);  2. scanf和printf的格式，float类型对应%f，double类型对应%lf，不要混用  3. 第二个程序，单步调试一下，或者加个printf输出，看看x读入的结果是多少 谢谢你...就是float类型对应%f，double类型对应%lf的问题...以后会注意的... 还有就是我试了下在宏定义那里把最外面的括号去掉就会出现问题...不知道是什么原因...可以帮我解释下吗 #include<stdio.h> #include<math.h> #define F(x) ((x)*(x)+sqrt(3*(x)*(x)+2*(x)+1))  int main() { 	double f,x;	 	scanf("%lf",&x); 	f = 4.5/F(exp(x)) + F(cos(x)) + F(sqrt(x))/F((x)*(x)); 	printf("%lf\n",f); 	return 0; }
user-0 提问: C语言版的数据结构

回复:
user: user-1
content: 财路在哪里

user: user-2
content: 给钱就干！

user: user-3
content: 这不是求助,是给大家布置作业吧

user: user-4
content: 引用 1 楼 gzwgyfgpf的回复:求助的问题看起来越来越高大上了，但实际上都是考试、作业题，这样真的好吗 这样不好

user: user-5
content: 求助的问题看起来越来越高大上了，但实际上都是考试、作业题，这样真的好吗

user: user-2
content: 5楼的，你挡人财路了！小心点！！

user: user-6
content: 5楼的,你小子收了多少钱

user: user-7
content: C语言是靠学习和自己一点一点积累的。

user: user-8
content: 必须给你解决：  #include <stdio.h> #include <search.h> //学生结构体 typedef struct { 	int c_id;                //班级号 	int id;                  //学号 	int score;               //成绩 	int rank_in_class;       //班级排名 	int rank_in_grade;       //年级排名 }STU; //班级结构体 typedef struct { 	int c_id;         //班级号 	int num;          //学生人数 	STU *p;           //指向学生的指针 }ClassInfo; int cmpByScore(STU *a, STU *b) { 	return b->score - a->score; } int main(void) { 	STU *pStu; 	int i, j, k, race, sum; 	int n, m; 	sum = 0; 	//录入学生信息 	printf("Input class nums:\n"); 	scanf("%d", &n); 	ClassInfo *ci = malloc(sizeof(ClassInfo)*n); 	for (i = 0; i < n; i++) 	{ 		printf("Input students nums:\n"); 		scanf("%d", &m); 		sum += m; 		ci[i].p = malloc(sizeof(STU)*m); 		ci[i].c_id = i + 1; 		ci[i].num = m; 		printf("Input id and score:\n"); 		for (j = 0; j < m; j++) 		{ 			scanf("%d%d", &ci[i].p[j].id, &ci[i].p[j].score); 			ci[i].p[j].c_id = i + 1; 			ci[i].p[j].rank_in_class = ci[i].p[j].rank_in_grade = 0;  //初始化为0 		} 		//班级内部进行排名 		qsort(ci[i].p, m, sizeof(STU), cmpByScore); 		race = 1; 		k = 1; 		ci[i].p[0].rank_in_class = 1; 		for (j = 1; j < m; j++) 		{ 			if (ci[i].p[j].score == ci[i].p[j - 1].score) 			{ 				k++; 			} 			else 			{ 				race += k; 				k = 1; 			} 			ci[i].p[j].rank_in_class = race; 		} 	} 	//把所有的学生放入一个数组 	pStu = malloc(sizeof(STU)*sum); 	k = 0; 	for (i = 0; i < n; i++) 	for (j = 0; j < ci[i].num; j++) 	{ 		//pStu[k++] = ci[i].p[j]; 		pStu[k].c_id = ci[i].p[j].c_id; 		pStu[k].id = ci[i].p[j].id; 		pStu[k].score = ci[i].p[j].score; 		pStu[k].rank_in_class = ci[i].p[j].rank_in_class; 		pStu[k].rank_in_grade = ci[i].p[j].rank_in_grade; 		k++; 	} 	//整个年级进行排名 	qsort(pStu, sum, sizeof(STU), cmpByScore); 	race = 1; 	k = 1; 	pStu[0].rank_in_grade = 1; 	for (j = 1; j < sum; j++) 	{ 		if (pStu[j].score == pStu[j - 1].score) 		{ 			k++; 		} 		else 		{ 			race += k; 			k = 1; 		} 		pStu[j].rank_in_grade = race; 	} 	//打印 	printf("%d\n", sum); 	printf("id rand_in_grade c_id rand_in_class\n"); 	for (i = 0; i < sum; i++) 		printf("%d %d %d %d\n", pStu[i].id, pStu[i].rank_in_grade, pStu[i].c_id, pStu[i].rank_in_class); 	//释放内存 	free(pStu); 	for (i = 0; i < n; i++) free(ci[i].p); 	free(ci); 	return 0; } //Input class nums : //2 //Input students nums : //5 //Input id and score : //1001 95 //1002 100 //1003 95 //1004 77 //1005 85 //Input students nums : //4 //Input id and score : //2001 65 //2002 25 //2003 100 //2004 85 //9 //id rand_in_grade c_id rand_in_class //2003 1 2 1 //1002 1 1 1 //1001 3 1 2 //1003 3 1 2 //2004 5 2 2 //1005 5 1 4 //1004 7 1 5 //2001 8 2 3 //2002 9 2 4
user-0 提问: 计算字节的代码

回复:
user: user-1
content: template<typename T> size_t TypeLen() {     T *p = NULL;     T *pNext = p + 1;     return (char*)pNext - (char*)p; } 使用模板函数获取类型字节数。 #include <stdio.h> #include <stdlib.h> int main() {         printf("int length:%d", TypeLen<int>());     system("pause");     return 0; }

user: user-2
content: 引用 7 楼 leee7338 的回复:[quote=引用 6 楼 weixin_28834253 的回复:] 为什么char 能正确执行  #include <stdio.h> #include <stdlib.h> int main() { 	char str1='a';//97 	char str2='b';//98 	printf("%d",++str1 + str1++);//196 	printf("%d",++str1 + str2++);//198 	system("pause"); 	return 0; }  自己看结果琢磨琢磨。[/quote]别闹 拿着错误的代码当正确的代码琢磨  能琢磨出什么有用的东西

user: user-3
content: 引用 8 楼 uvrt 的回复:直接printf("%d",sizeof(a));不就可以了吗？ 他要看char的自加或自减运算编译器有没有出错。

user: user-4
content: 直接printf("%d",sizeof(a));不就可以了吗？

user: user-3
content: 引用 6 楼 weixin_28834253 的回复:为什么char 能正确执行  #include <stdio.h> #include <stdlib.h> int main() { 	char str1='a';//97 	char str2='b';//98 	printf("%d",++str1 + str1++);//196 	printf("%d",++str1 + str2++);//198 	system("pause"); 	return 0; }  自己看结果琢磨琢磨。

user: user-0
content: 引用 1 楼 leee7338的回复:[quote=引用 楼主 weixin_28834253 的回复:] 结果，结果我加了那几行，结果，都是我预想的 一放到一起又不对了。 因为在C语言中，编译器可以选择先计算函数里的那个参数的值，这个自由性提高了编译器的效率，但是如果变量使用了增量运算符就会带来麻烦。 就像你说的这个问题，它可能先计算括号里的，也可能先做变量的增量运算，这是不确定的。确定的是编译器在程序结束时j的值增加三次。  详解：C语言的副作用是指对对象或文件的修改，int  num=10；，这个简单的赋值语句从C的角度看是将变量num的值改成10，这就是一个副作用。 顺序点是程序执行中的一点，在这个点处所有副作用都在进入下一步前被计算，在C中；就标志了一个顺序点。 例子:   while(num++ < 10){     printf("%d\n",num); }    上面说了所有副作用都在顺序点之前完成，所以先做while（）中的计算（先判断在做后缀的++）再printf。 例子： num=(4 + x++)+(6 + x++); 先看（4 + x++），因为它不是一个完整的表达式（没有顺序点），所以不能确定到底是先做加法还是先 x++，但是在分号以前C编译器能保证x能自增两次。  所以我们要尽量避免用这样的语句。   希望对楼主有用。[/quote] 为什么char 能正确执行

user: user-5
content: 请查看本版置顶帖.... http://bbs.csdn.net/topics/370153775

user: user-2
content: 引用 3 楼 user-6 的回复:(type*)a+1的地址为a的地址加上sizeof(type) 那么 TypeA *a; (TypeB*)(a+1)-(TypeB*)a的值为sizeof(TypeA)/sizeof(TypeB),假设sizeof(TypeA)%sizeof(TypeB)==0。错得无边无际

user: user-6
content: (type*)a+1的地址为a的地址加上sizeof(type) 那么 TypeA *a; (TypeB*)(a+1)-(TypeB*)a的值为sizeof(TypeA)/sizeof(TypeB),假设sizeof(TypeA)%sizeof(TypeB)==0。

user: user-2
content: 引用 1 楼 leee7338 的回复:但是在分号以前C编译器能保证x能自增两次。 没有这个保证

user: user-3
content: 引用 楼主 weixin_28834253 的回复:结果，结果我加了那几行，结果，都是我预想的 一放到一起又不对了。 因为在C语言中，编译器可以选择先计算函数里的那个参数的值，这个自由性提高了编译器的效率，但是如果变量使用了增量运算符就会带来麻烦。 就像你说的这个问题，它可能先计算括号里的，也可能先做变量的增量运算，这是不确定的。确定的是编译器在程序结束时j的值增加三次。  详解：C语言的副作用是指对对象或文件的修改，int  num=10；，这个简单的赋值语句从C的角度看是将变量num的值改成10，这就是一个副作用。 顺序点是程序执行中的一点，在这个点处所有副作用都在进入下一步前被计算，在C中；就标志了一个顺序点。 例子:   while(num++ < 10){     printf("%d\n",num); }    上面说了所有副作用都在顺序点之前完成，所以先做while（）中的计算（先判断在做后缀的++）再printf。 例子： num=(4 + x++)+(6 + x++); 先看（4 + x++），因为它不是一个完整的表达式（没有顺序点），所以不能确定到底是先做加法还是先 x++，但是在分号以前C编译器能保证x能自增两次。  所以我们要尽量避免用这样的语句。   希望对楼主有用。
user-0 提问: 求助 两个文件（行列不同）找出次数成比例的数据

回复:
user: user-1
content: 你的编程目的是什么

user: user-2
content: 范围是什么?

user: user-3
content: 文件8      文件4 次数9     次数5 次数8    次数4 次数7   次数3 ？ - ？ -次数9    次数6 ？ 次数8   次数5 ？ 次数7  次数4 ？ - ？ -次数2   次数1 ？
user-0 提问: 期末作业，就两道题，江湖救急，求大神帮忙！！！

回复:
user: user-1
content: java的好简单 HashMap<String, Integer> map = new HashMap<>(); 		String key; 		for (int i = 0; i < str.length(); i++) { 			for(int j=i+1;j<str.length();j++){ 				key = str.substring(i,j); 				if(!map.containsKey(key)){ 					map.put(key, 1); 				}else{ 					map.put(key, map.get(key)+1); 				} 				 			} 		}

user: user-0
content: 引用 3 楼 zhangxiangDavaid 的回复:必须给你解决它： 第一题  #include <stdio.h> #include <string.h> int *next; void setNext(char *p, int *next) { 	int j, k, len; 	len = strlen(p); 	j = 1; 	next[0] = -1; 	while (j < len) 	{ 		k = next[j - 1]; 		while (k >= 0 && p[j - 1] != p[k]) 			k = next[k]; 		if (k >= 0) next[j] = k + 1; 		else next[j] = 0; 		j++; 	} } int kmp(char *t, char *p) { 	if (NULL == t || NULL == p) return -1; 	int len1, len2, r; 	len1 = strlen(t), len2 = strlen(p); 	len1 = strlen(t); 	len2 = strlen(p); 	if (len1 >= len2) 	{ 		int i, j, k; 		i = j = -1; 		k = len1 - len2; 		while (i <= k && j < len2) 		{ 			if (-1 == j || t[i] == p[j]) 			{ 				i++; 				j++; 			} 			else j = next[j]; 		} 		if (len2 == j) return i - j; 		else return -1; 	} 	return -1; } int main(void) { 	int count = 0; 	char t[] = "abcdefabcdefabcdef"; 	char p[] = "cde"; 	int lenp = strlen(p); 	next = malloc(sizeof(int)*lenp); 	setNext(p, next); 	char *q = t; 	while (-1 != kmp(q, p)) 	{ 		q += strlen(p); 		count++; 	} 	printf("字符串%s在字符串%s中出现的次数是%d\n", p, t, count); 	free(next); 	return 0; }   非常感谢！！！！！！

user: user-2
content: 第二题  #include <stdio.h> void print(int *arr, int n) { 	int i; 	for (i = 0; i < n; i++) printf("%3d", arr[i]); 	printf("\n"); } int main(void) { 	int arr[] = { 1,2,3,4,5 }; 	int n = sizeof(arr) / sizeof(int); 	print(arr, n); 	int m = 2;   //把后m个数移动到前面 	int i, j; 	i = n - 1, j = n - 1 - m; 	int t = arr[i]; 	while (j != n - 1) 	{ 		arr[i] = arr[j]; 		i = j; 		j = (j - m + n) % n; 	} 	arr[i] = t; 	print(arr, n); 	return 0; } //  1  2  3  4  5 //  4  5  1  2  3

user: user-2
content: 必须给你解决它： 第一题  #include <stdio.h> #include <string.h> int *next; void setNext(char *p, int *next) { 	int j, k, len; 	len = strlen(p); 	j = 1; 	next[0] = -1; 	while (j < len) 	{ 		k = next[j - 1]; 		while (k >= 0 && p[j - 1] != p[k]) 			k = next[k]; 		if (k >= 0) next[j] = k + 1; 		else next[j] = 0; 		j++; 	} } int kmp(char *t, char *p) { 	if (NULL == t || NULL == p) return -1; 	int len1, len2, r; 	len1 = strlen(t), len2 = strlen(p); 	len1 = strlen(t); 	len2 = strlen(p); 	if (len1 >= len2) 	{ 		int i, j, k; 		i = j = -1; 		k = len1 - len2; 		while (i <= k && j < len2) 		{ 			if (-1 == j || t[i] == p[j]) 			{ 				i++; 				j++; 			} 			else j = next[j]; 		} 		if (len2 == j) return i - j; 		else return -1; 	} 	return -1; } int main(void) { 	int count = 0; 	char t[] = "abcdefabcdefabcdef"; 	char p[] = "cde"; 	int lenp = strlen(p); 	next = malloc(sizeof(int)*lenp); 	setNext(p, next); 	char *q = t; 	while (-1 != kmp(q, p)) 	{ 		q += strlen(p); 		count++; 	} 	printf("字符串%s在字符串%s中出现的次数是%d\n", p, t, count); 	free(next); 	return 0; }

user: user-3
content: 学学数据结构的字符串怎么处理，再学学数据结构的排序法吧，努力学习，自力更生

user: user-4
content: 自己做 哥们~~
user-0 提问: 请教关于数据结构字符串的处理问题和数据结构的排序法问题

回复:
user: user-1
content: 給你個建議，貼代碼，學會如下一樣，用code標記出來，讓別人更容易閱讀。  如果你原貼中代碼是你自已寫的，你最好自已先做好注释，這樣別人閱讀你的代碼時，能更快了解你的想法和思路。  下面做个參考吧。有些沒大看明白你想干啥。只是指出有問題的地方，。  #include <iostream> #include <cstring> using namespace std;  //這裡next這個參數定義有問題，在這裡，getnext裡無法對next這個數組進行有效賦值，當出這個函數時，next原來是多少，還是多少。 void getNext(const char* pattern,int next[])  {   next[0]= -1;   int k=-1,j=0;   while(pattern[j]!='\0')     {       if(k!=-1 && pattern[k]!=pattern[j])k=next[k];       ++j;++k;       next[j]=pattern[k]== pattern[j]?next[k]:k;     } }  int KMP(const char *Text,const char* Pattern) {   if(!Text||!Pattern||Pattern[0]=='\0'||Text[0]=='\0' ) return -1;   int len=0;   const char * c=Pattern;   while(*c++!='\0')++len;   int *next=new int[len+1];   getNext(Pattern,next);   int index=0,i=0,j=0;//index代表什么意思？求匹配字符串出現的次數嗎？   while(Text[i]!='\0' && Pattern[j]!='\0' )     {       if(Text[i]== Pattern[j]) ++i,++j;       else//這一段的目的是什麽，很令人费解。好好想想，在這裡next[j]有機會為-1嗎？ 	{ 	  index += j-next[j]; 	  if(next[j]!=-1) j=next[j]; 	  else j=0,++i; 	}     }   delete []next;   //在這裡試想，如果在text中有一个匹配pattern的字符串，你會輸出什麽？是不是0？是不是明顯有問題。   return (Pattern[j]=='\0'?index:-1); } int main() {   char* text="bababCabCadcaabcaababcbaaaabaaacababcaabc";   char* pattern="baaaa";   cout<<KMP(text,pattern)<<endl;   return 0;  }
user-0 提问: 【求教】结构体求其所占有的字节数的一些问题。

回复:
user: user-1
content: 把编译环境设置成1BYTE对齐，两个计算可能就一样了， 不过默认都有字节对齐，可以加快内存访问速度，

user: user-2
content: 5#是正解。 内存的对齐和补齐规则。 根据你结构体占字节数最大的一个作为标准，也就是结构体中的double是8字节。 不够8字节的补齐，多的整体拿到下面重新占一个8字节。

user: user-3
content: 这个结构应该是13字节, char (1),int (4),double(8), 但默认是8字节对齐 第一个, 是int(4)+char(1)这儿需要补足到8字节边界,加上3字节 , 再加上double(8)=16字节 第二个,是int(4),下一个是8字节,需要补4字节即8字节,加上double(8)为16字节,加上char(1),这需要补7字节,共24字节

user: user-4
content: struct A { int a;  // 1~4 char b;  // 5 // 6~8 不用 double c;  // 9~16 }; // 一共16 和 struct A { int a;  // 1-4 // 5~8 不用 double c;  // 9~16 char b;  // 17 // 18~24 不用 }; // 一共24

user: user-0
content: 引用 2 楼 lin5161678 的回复:自行百度 内存对齐 没太看懂百度上的。。。能给我就这一个问题讲解一下么

user: user-5
content: 自行百度 内存对齐

user: user-6
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 提问: 关于结构体存在栈中还是堆中的问题。

回复:
user: user-1
content: 转载文章请注明出自“CSDN（www.csdn.net）”。如是商业用途请联系原作者。 转载文章请注明出自“CSDN（www.csdn.net）”。如是商业用途请联系原作者。 转载文章请注明出自“CSDN（www.csdn.net）”。如是商业用途请联系原作者。 转载文章请注明出自“CSDN（www.csdn.net）”。如是商业用途请联系原作者。 转载文章请注明出自“CSDN（www.csdn.net）”。如是商业用途请联系原作者。 转载文章请注明出自“CSDN（www.csdn.net）”。如是商业用途请联系原作者。 转载文章请注明出自“CSDN（www.csdn.net）”。如是商业用途请联系原作者。 转载文章请注明出自“CSDN（www.csdn.net）”。如是商业用途请联系原作者。

user: user-2
content: VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533

user: user-0
content: 引用 1 楼 zhangxiangDavaid 的回复:结构体变量同内置类型变量一样会分配内存，至于分配到哪里，也同内置类型一样的规则。 意思是结构体本身和C++的class一样，在声明的时候不分配内存只是告知编译器数据类型吗？ 然后结构体变量是要分配内存的，而且存放在栈中吗？

user: user-0
content: 引用 4 楼 qiezhihuai 的回复:结构体是数据类型，跟int，char等标准类型一样，只占用flash空间，结构体变量是要分配内存的，静态和全局变量在堆中分配，局部变量保存在栈中，包括函数的参数也在栈中分配 意思是结构体本身和C++的class一样，在声明的时候不分配内存只是告知编译器数据类型吗？ 然后结构体变量是要分配内存的，而且存放在栈中吗？

user: user-3
content: 结构体是数据类型，跟int，char等标准类型一样，只占用flash空间，结构体变量是要分配内存的，静态和全局变量在堆中分配，局部变量保存在栈中，包括函数的参数也在栈中分配

user: user-4
content: 引用 1 楼 zhangxiangDavaid 的回复:结构体变量同内置类型变量一样会分配内存，至于分配到哪里，也同内置类型一样的规则。  學習了，言簡意駭。

user: user-5
content: 结构体变量同内置类型变量一样会分配内存，至于分配到哪里，也同内置类型一样的规则。
user-0 提问: C语言指针问题

回复:
user: user-1
content: 建议楼主从头看一下指针的内容。

user: user-2
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “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: #include<stdio.h> /*int main(void) {     int a = 10;     const int *p;     p = &a;     printf("%d\n",*p);     return 0; }*/ int main(void) {     int a = 10;     int b = 20;     const int *p = &a;     printf("%d\n",*p);     return 0; } 第一我也才入门： 不过我把你的两段代码，都试过，都打印了10; 你确定有一段什么都没打印出来

user: user-4
content: 注意*这个符号在声明和表达式是不一样的，const int *p;这句是声明，声明了p的类型是(const int *)。而 *p = &a;是表达式，其中*是操纵符。

user: user-5
content: 这两者是一样的啊！

user: user-6
content: C指针 http://blog.csdn.net/zhangxiangdavaid/article/details/37885275

user: user-0
content: 嗯，好的，明白了，谢谢了！

user: user-7
content: 你最好再系统看看指针，指针很重要的

user: user-7
content: 指针的初始化有两种方式 第一种就是   类型   *变量名=&同类型变量名 int  a=10； int *p=&a； 第二种   类型 *变量名  这是定义了一个指针变量 然后初始化 例如   int *p； int a=10； p=&a； 这两种效果一样
user-0 提问: CodeBlocks中如何使用findfirst和findnext函数

回复:
user: user-1
content: system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad  c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住，能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作，而不要用各种API获取或者操作，因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时，API会处理的不全面或陷入死循环，而shell命令不会。

user: user-0
content: 恩， 谢谢指点。

user: user-2
content: 是_findfirst吗？  #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <io.h>  int main(int argc, char *argv[]) { 	intptr_t handle; 	struct _finddata_t fileinfo;  	handle = _findfirst("D:\\mymtom\\src\\demo\\*.c", &fileinfo); 	if (handle == -1) { 		perror("_findfirst"); 		exit(1); 	}  	printf("%s\n",fileinfo.name); 	while (_findnext(handle, &fileinfo) == 0) { 		printf("%s\n",fileinfo.name); 	}  	_findclose(handle);  	return 0; }

user: user-3
content: http://baike.baidu.com/link?url=ICKI-3Ur-jfhdKtzsv_qbg3P7Gkr7UgcKphU5iWcLO0IQtUJDUVxNTaTcWF7VKVTnnRA6M4k0o_FiASMPLW-vK

user: user-0
content: 恩，谢了，我用了w32 api可以编译通过。

user: user-0
content: 问题已解决，和你说的那个函数功能一样，我用的是 FindFirstFile和FindNextFile这两个函数。

user: user-0
content: 我问了别人说win api可以

user: user-4
content: 这几个是windows里面的....
user-0 提问: 关于指针数组的练习，请帮忙分析一下，谢谢

回复:
user: user-1
content: 四个问题 第一：test[i]在使用之前一定要初始化，否则tefst[i]是一个无效的字符指针。比较方便的改法就是把_TCHAR *test[3];改成_TCHAR test[3][128/*一个足够大的数*/];也可以用malloc对每个test[i]进行赋值，但用完要记得free掉。 第二：scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s 下面有一段： 4-6) Same as (1-3), except that %c, %s, and %[ conversion specifiers each expect two arguments (the usual pointer and a value of type rsize_t indicating the size of the receiving array, …… 大概意思是说对于 %c,%s,%[这三种，对应的参数需要两个，一个普通的指针和这个指针指向数组的大小，也就是说你的scanf_s最后少了一个表示test[i]容量的参数。 第三：printf里的test[length]改成test[i]或者test[length++],length是固定不变的，你这里应该是想遍历元素的，所以升序遍历就改成length++，降序遍历就改成i。 第四：既然你都用了_TCHAR，那么相应的函数也最好换掉。scanf_s改成_tscanf_s，printf改成_tprintf，这两个函数里的字符串都用_T()包裹住，分别改成_T("%s")和_T("%s\n")。

user: user-2
content: #include <iostream> using namespace std; int main() { 	 	char *test[3]; 	int i=0,length=sizeof(test)/sizeof(test[0]); 	while(length-->0) 	{ 		test[i]=(char*)malloc(1024); 		memset(test[i],0,1024); 		scanf_s("%s",test[i++],10); 	} 	length++; 	while(i-->0) 		printf("%s\n",test[length++]); 	 	/* 	char* p=(char*)malloc(128); 	scanf("%s",p); 	printf("%s\n",p); 	return 0; 	*/ }

user: user-3
content: 指针数组的指针没指向空间。

user: user-4
content: for(int i=0;i<3;i++) test[i] =malloc(N);

user: user-5
content: test所指位置不可意料

user: user-5
content: text指的位置不可遇料

user: user-6
content: test没有分配内存

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