Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: while(!feof(fp))死循环

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

user: user-2
content: 学习了。。。。。。。。。。

user: user-0
content: 引用 1 楼 user-4 的回复:每次循环都fseek到同一个位置了吧   谢谢，这里的确写错了，改成fseek(fp1, 8, SEEK_CUR)就可以跳出 不过fseek(fp1, 8, SEEK_CUR)；这一句放在for循环之后就又死循环了 兄弟知道是什么原因吗？  int main() { 	FILE *fp1 = NULL; 	FILE *fp2 = NULL;     char buf[40];     int i = 0;  fp1 = fopen(F_PATH1,"rb"); fp2 = fopen(F_PATH2,"wb");  if(NULL == fp1 || NULL == fp2) { 	return -1; } 	while(!feof(fp1)) 	{ 		//	fseek(fp1, 8, SEEK_CUR); 			for(i=0; i<1638; i++) 			{ 				fread(buf, sizeof(buf), 1, fp1); 				fwrite(buf, sizeof(buf), 1, fp2);	 			} 			fseek(fp1, 8, SEEK_CUR);  	} fclose(fp1); fclose(fp2);  return 0; }

user: user-3
content: 去掉for循环，当feof返回非0时，退出，文件也也复制完了。

user: user-3
content: fread(buf, 40, 1, fp1) 改为fread(buf, sizeof(buf), 1, fp1）

user: user-3
content: i小于1638是干啥的

user: user-4
content: 每次循环都fseek到同一个位置了吧
user-0 提问: 关于C Primer Plus 上泛型的疑问

回复:
user: user-1
content: 引用 4 楼 kinolukaslana 的回复:[quote=引用 2 楼 user-2 的回复:] vc只有在文件名.c的时候才用c编译。cpp就用c++编译。你这_Generic是c11的东西，不是c++的东西。 而且vc是不是支持c11我还不确定。毕竟vc全称叫vc++。换个gcc啥的学c(11)吧 C++不是完美兼容C的吗？[/quote]  C++并不是所有C的内容都有的，甚至有些都完全不同  如C99中的变长数组，C++也是不支持的

user: user-0
content: 引用 2 楼 user-2 的回复:vc只有在文件名.c的时候才用c编译。cpp就用c++编译。你这_Generic是c11的东西，不是c++的东西。 而且vc是不是支持c11我还不确定。毕竟vc全称叫vc++。换个gcc啥的学c(11)吧 C++不是完美兼容C的吗？

user: user-0
content: 引用 2 楼 user-2 的回复:vc只有在文件名.c的时候才用c编译。cpp就用c++编译。你这_Generic是c11的东西，不是c++的东西。 而且vc是不是支持c11我还不确定。毕竟vc全称叫vc++。换个gcc啥的学c(11)吧 我在VS测试的时候是以.cpp为后缀的（应为要借用引用）

user: user-2
content: vc只有在文件名.c的时候才用c编译。cpp就用c++编译。你这_Generic是c11的东西，不是c++的东西。 而且vc是不是支持c11我还不确定。毕竟vc全称叫vc++。换个gcc啥的学c(11)吧

user: user-0
content: 顺带把整段代码贴上吧！ //  generic.c  -- defining generic macros  #include <stdio.h> #include <math.h> #define RAD_TO_DEG (180/(4 * atanl(1)))  // generic square root function #define SQRT(X) _Generic((X),\     long double: sqrtl, \     default: sqrt, \     float: sqrtf)(X)  // generic sine function, angle in degrees #define SIN(X) _Generic((X),\ long double: sinl((X)/RAD_TO_DEG),\ default:     sin((X)/RAD_TO_DEG),\ float:       sinf((X)/RAD_TO_DEG)\ )  int main(void) {     float x = 45.0f;     double xx = 45.0;     long double xxx =45.0L;          long double y = SQRT(x);     long double yy= SQRT(xx);     long double yyy = SQRT(xxx);     printf("%.17Lf\n", y);   // matches float     printf("%.17Lf\n", yy);  // matches default     printf("%.17Lf\n", yyy); // matches long double     int i = 45;     yy = SQRT(i);            // matches default     printf("%.17Lf\n", yy);     yyy= SIN(xxx);           // matches long double     printf("%.17Lf\n", yyy);          return 0; }

user: user-0
content: 引用 7 楼 paschen 的回复:VS对C99都不全支持那么请问有办法更换VS的默认编译器吗？没有的话我去用code blocks 应为我尝试了一些C99和C11在msys2上是完全没有问题的

user: user-1
content: VS对C99都不全支持

user: user-0
content: 引用 5 楼 paschen 的回复:[quote=引用 4 楼 kinolukaslana 的回复:] [quote=引用 2 楼 user-2 的回复:] vc只有在文件名.c的时候才用c编译。cpp就用c++编译。你这_Generic是c11的东西，不是c++的东西。 而且vc是不是支持c11我还不确定。毕竟vc全称叫vc++。换个gcc啥的学c(11)吧 C++不是完美兼容C的吗？[/quote]  C++并不是所有C的内容都有的，甚至有些都完全不同  如C99中的变长数组，C++也是不支持的[/quote]  这个我知道，我在C4DROID上面测试过的，那么有没有更换VS默认编译器的方法呢？
user-0 提问: undefined reference to 'WinMain'

回复:
user: user-1
content: 这个不是一个完整的程序，自定义函数htoi没有被调用；在一个程序里，需要有一个main函数，这个函数是整个程序的入口，即main是执行入口～

user: user-2
content: 没有入口函数，main（控制台程序）或者winmain（windows程序）
user-0 提问: 这种嵌套循环要怎么看,可以最快的解读出来程序的内容

回复:
user: user-1
content: 好的格式，已经每层循环是要干什么的，起始和终结条件，就很容易解读了  #include<stdio.h> int main(void) { 	char lets[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 	char letter;  	printf("please Enter a letter (for example: E ):\n"); 	scanf("%c",&letter);  	int out_i, in_i_black, in_i_up, in_i_down; 	for (out_i = 0; lets[out_i] <= letter; out_i++) { 		for (in_i_black = 0; in_i_black < (letter - lets[out_i]); in_i_black++) { 			putchar(' '); 		} 		for (in_i_up = 0; in_i_up < out_i; in_i_up++) { 			putchar(lets[in_i_up]); 		} 		for (in_i_down = out_i; in_i_down >= 0; in_i_down--) { 			putchar(lets[in_i_down]); 		} 		putchar('\n'); 	}  	getchar(); 	getchar(); 	return 0; }

user: user-2
content: 最好的办法：不要抱着头空想，单步跟踪程序运行，观察每一步程序执行流程及变量变化情况
user-0 提问: ubuntu下fwrite存数据，再fread读取时出现乱码

回复:
user: user-1
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-2
content: 读是getline，写是fwrite，getline是对ASCII字符（文本字符）的读，而fwrite是二进制的写，格式不一样。很有可能会出现乱码； fread和fwrite是成对出现的，建议成对使用，怎么写的就怎么读，相反一样。
user-0 提问: 二叉树小白 求教导啊！！来大神 已经看了好久了

回复:
user: user-0
content: 引用 3楼user-1 的回复:void NRPreOrder(BiTree bt) { 	Seqstack *S; 	BiTree t=bt; 	S=Init_Seqstack(); 	if(!t) 		printf("the tree is empty"); 	else 	{ 		while(t||!Empty_Seqstack(S)) 		{ 			while(t) 			{ 				printf("%c \n",t->data); 				Push_Seqstack(S,*t);  				t=t->lchild; 			} 			BiTNode temp = {0}; 			Pop_Seqstack(S,&temp); 			t=temp.rchild; 		} 	} }   Pop_Seqstack是对第二个参数进行读写的，对指针读写之前先考虑指针指向的空间是不是你分配的是否可用。麻烦。不太理解。。

user: user-1
content: void NRPreOrder(BiTree bt) { 	Seqstack *S; 	BiTree t=bt; 	S=Init_Seqstack(); 	if(!t) 		printf("the tree is empty"); 	else 	{ 		while(t||!Empty_Seqstack(S)) 		{ 			while(t) 			{ 				printf("%c \n",t->data); 				Push_Seqstack(S,*t);  				t=t->lchild; 			} 			BiTNode temp = {0}; 			Pop_Seqstack(S,&temp); 			t=temp.rchild; 		} 	} }   Pop_Seqstack是对第二个参数进行读写的，对指针读写之前先考虑指针指向的空间是不是你分配的是否可用。

user: user-1
content: BiTree *bt;  InsertL(bt); 这里面就会运行错误吧。bt是一个指针，没有指向可操作的内存区域。 修改成下面的方式： BiTree bt = NULL;  InsertL(&bt);

user: user-0
content: 调试了一下 出栈那里非法内存访问
user-0 提问: 关于c排序的优化...求大神解答

回复:
user: user-1
content: 想了一下根本不需要建数组c，只需要一个int c记录你取了多少次就行，

user: user-1
content: 引用 4 楼 qq_36752486 的回复:[quote=引用 3 楼 xg436的回复:]第一 拿你举的例子 1  5 7 9                                 2 4 6 8 10                                 第一位自然是1.2比较，但第二位只需要比较1.2里面被挑剩下的那个（2）和挑走的的列的下一个（5）， 第二  你排序的时候采用的是不断插入，这样当然很耗时间 比如你第一次插入就要把后面的9999个数字全部移动一遍 正确的方法是取得第一个数字 插入c[0]，取得第二个插入c[1]， 但是数据变化很多，很难将正确的顺序顺利赋值[/quote] 不太明白你说的数据变化是什么 你的代码我也没仔细看  但是你有后移操作应该是后移后插入 这个很费时间 我的意思是比如你比较a[L1]和b[L2],取小数存进c[0]，然后看你取得是a还是b，把相应L加一，然后重复比较，存值，加一， 注意一下超过R没有 重复k次 取c[k-1] 完了

user: user-2
content: 总之你百度一下归并排序的原理，特别是合并那个步骤，搞清楚以后你自然知道这题怎么做了。  学而不思则罔，思而不学则殆。这句送你最合适。

user: user-2
content: 引用 楼主 qq_36752486 的回复:我也想过将两列数字从头比较，但是这样情况很多。不好写代码。 例如  1  5 7 9          2 4 6 8 10         可以比较1,2确认第一位，确认第二位时将2和4,5比较... 引用 4 楼 qq_36752486 的回复:但是数据变化很多，很难将正确的顺序顺利赋值  也是醉了。。 确认第二位时比4干嘛？4是2后面的元素，因此4肯定是大于2的，所以你只需要比较2和5就好了。 总之你每次比较两列数字各列的第一个就行了，然后把小的那个拿走，这就是思路。

user: user-0
content: 引用 3 楼 xg436的回复:第一 拿你举的例子 1  5 7 9                                 2 4 6 8 10                                 第一位自然是1.2比较，但第二位只需要比较1.2里面被挑剩下的那个（2）和挑走的的列的下一个（5）， 第二  你排序的时候采用的是不断插入，这样当然很耗时间 比如你第一次插入就要把后面的9999个数字全部移动一遍 正确的方法是取得第一个数字 插入c[0]，取得第二个插入c[1]， 但是数据变化很多，很难将正确的顺序顺利赋值

user: user-1
content: 第一 拿你举的例子 1  5 7 9                                 2 4 6 8 10                                 第一位自然是1.2比较，但第二位只需要比较1.2里面被挑剩下的那个（2）和挑走的的列的下一个（5）， 第二  你排序的时候采用的是不断插入，这样当然很耗时间 比如你第一次插入就要把后面的9999个数字全部移动一遍 正确的方法是取得第一个数字 插入c[0]，取得第二个插入c[1]，

user: user-2
content: 这难道不就是归并排序的合并过程原理？ 都给你排好序了你再去排一次不超时就怪了。。

user: user-0
content: 。。。。。。。。。。
user-0 提问: 关于结构体不声明不定义的情况

回复:
user: user-1
content: struct no_define *p  这不就是定义了一个匿名的结构体的指针了吗

user: user-2
content: 这是一个没有元素的结构体，定义指针是可以，因为指针变量的长度是固定的，都是4个字节（32位系统）；但是定义结构体变量就不行了，因为内存不知道应该给它分配多大空间。
user-0 提问: 为什么会出这种问题？

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

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  struct StuGrade {     char name[32];     int score; };   int main(void) {     FILE* fp1;     FILE* fp2;     FILE* fp3;      struct StuGrade stu1[100];     struct StuGrade stu2[100];     int index1 = 0, index2 = 0;     int i, j;      fp1 = fopen("ab1.txt", "r");     fp2 = fopen("ab2.txt", "r");     fp3 = fopen("db3.txt", "w");      while(!feof(fp1))     {         fscanf(fp1, "%s %d\n", stu1[index1].name, &stu1[index1].score);         index1++;     }     fclose(fp1);      while(!feof(fp2))     {         fscanf(fp2,"%s %d\n",stu2[index2].name, &stu2[index2].score);         index2++;     }     fclose(fp2);       for(i=0;i<index1;i++)     {         for(j=0;j<index2;j++)         {             if(strcmp(stu1[i].name, stu2[j].name) == 0)             {                 fprintf(fp3,"%s %d %d %f\n",                         stu1[i].name,                         stu1[i].score,                         stu2[j].score,                         (stu1[i].score+stu2[j].score)*0.5);             }         }     }     fclose(fp3);     return 0; } 2个问题： 1. 给野指针赋值，name是一个野指针，建议动态申请或者直接定义成一个字符数组； 2. 读文件时，score需要前面加&，因为是往该地址里写数据。

user: user-3
content: struct StuGrade {     char* name;     int score; }; 你的结构体只定义指针，都没有所指，自然没有办法读入，除非你在读之前先初始化，或者简单点 声明改成 struct StuGrade {     char  name[10];     int score; }; ---------------------------------------------------------------- fscanf(fp1,"%s %d\n",stu1[index1].name,stu1[index1].score); 此外你的fscanf参数也不对啊,后面两个参数应该是地址，所以应该写成 fscanf(fp1,"%s %d\n",stu1[index1].name,&stu1[index1].score); 第一个没改是因为本身就已经是字符串指针了

user: user-0
user-0 提问: 觉得自己编的没错呀

回复:
user: user-0
content: 谢谢爸爸们，第一次问问题这么快回帖，爱你们哦，

user: user-1
content: i没有初始化，并且每次循环没有i++

user: user-2
content: 1.i未赋初值，系统会给一个不确定的值。因此会造成后续一系列问题。 2.while(while(str[i]!='\n'){......}，因为前述原因，该循环体中，i值是系统随机给的值，str[i]取的是哪个，鬼晓得？这是是无法实现你设想的目的的。由于i的值是随机的，就意味着你的程序很有可能永远都无法跳出该循环体结束运行。

user: user-3
content: #include <stdio.h> main() {     char str[50];     int i = 0;     int a = 0, n = 0, e = 0;      gets(str);     while(str[i] != '\0'){         if((str[i]>='A'&&str[i]<='Z') || (str[i]>='a'&&str[i]<='z'))             a++;         else if(str[i]>='0'&&str[i]<='9')             n++;         else             e++;         i++;     }     printf("%d,%d,%d", a, n, e); } 问题： 1, 变量i没有初始化，默认是一个随机值很容易导致数组str越界，导致段错误； 2. i没有在循环++,循环不能继续进行，也不能计算后面的字符； 3. gets不会将回车符加到缓存str里，所以，判断'\n'是不能让循环退出的，故需要改成'\0' 建议：不要使用gets，因为它不知道缓存大小，容易导致越界；建议使用fgets

user: user-4
content: 因为你分配空间分配小了，char str[50],如果输入的是1000个字符呢？

user: user-0
content: fgets函数不是跟文件一起用吗?用的少，不会用，仅限于见过。

user: user-5
content: 为什么你要定义一个一维数组的char类型来统计
user-0 提问: 求助！从文件中读取链表总是在头和尾出现两个乱码的信息怎么回事？

回复:
user: user-1
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？  不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

user: user-2
content: 读取的时候，你的头节点是一个哨兵，并没有将文件里的数据赋值给哨兵。所以，你在输出时，头节点的数据是随机值。写入的时候也将头节点写入文件，头节点的数据是随机值，所以文件里的数据就是随机值。

user: user-0
content: 来人啊啊，。。。。。。

user: user-0
content: 没人吗....

user: user-0
content: 第一次发帖好紧张~
user-0 提问: 如何做出栈的合法性，有大神解答吗

回复:
user: user-1

user: user-2
content: 用一个辅助栈，按照数据进栈的顺序模拟数据压入，和出栈数据进行比较  bool IsPopOrder(vector<int> pushV,vector<int> popV) {         stack<int> temp;         vector<int>::const_iterator itPush = pushV.begin();         vector<int>::const_iterator itPop = popV.begin();          for(;itPop!=popV.end();++itPop){             if(!temp.empty() && temp.top()==*itPop){                 temp.pop();                 continue;             }             for(;itPush != pushV.end(); ++itPush){                 if(*itPush == *itPop){                     break;                 }                 else{                     temp.push(*itPush);                 }             }             if(itPush == pushV.end())                 return false;             ++itPush;         }         return true;     }
user-0 提问: scanf和strcpy使用不安全？这个是怎么个意思？=_=

回复:
user: user-1
content: 因为scanf strcpy这些并不知道数组大小，所以有可能造成越界访问的问题呗

user: user-2
content: scanf和strcpy不安全主要是：比如，  char buf[10]; scanf("%s", buf);  若输入的字符串，字符个数小于等于9，最后一个要给'\0',那么就是正常的，但是你不能保证别人知道这个缓存的大小，如果自己输入的字符个数大于9，那么这个缓存就溢出了。  char buf[10]; fgets(buf, 10, stdin);  fgets相对是安全的，因为它最大可以容纳9个有效字符，最后一个是'\0'，即使你输入了超过9个字符的输入，它也会将字符串截断，前9个放入缓存里，后面的丢掉；但是有一个小问题，就是若输入的字符小于9，在'\0'之前会有'\n'，因为它将回车符会放入缓存； strcpy不安全：是因为若dest的缓存不足够容纳src的数据，就会导致dest溢出(越界)； char *strcpy(char *dest, const char *src); strncpy会相对安全，因为：第三个参数，可以根据dest的长度来确定要拷贝多少个字节。 char *strncpy(char *dest, const char *src, size_t n);

user: user-3
content: https://msdn.microsoft.com/zh-cn/library/w40768et(v=vs.140).aspx

user: user-4
content: 这个不用管，vs自己实现了很多安全版本的c标准函数，比如strcpy_s，测试程序无所谓，能编译成功就行
user-0 提问: 新人请教，联合问题

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #include <stdlib.h> char buf[17]; union U {   unsigned short int aa;   struct {     unsigned int bb:7;//(bit 0-6)     unsigned int cc:6;//(bit 7-12)     unsigned int dd:3;//(bit 13-15)   }; } u; void main() {                 //bbbbbbbbbbbbbbbb                 //iiiiiiiiiiiiiiii                 //tttttttttttttttt                 //111111                 //5432109876543210                 //::::::::::::::::     u.aa=0xE07F;//1110000001111111     printf("bb==%d,cc==%d,dd==%d\n",u.bb,u.cc,u.dd);     u.bb=0x41;     u.cc=0x21;//dddccccccbbbbbbb     u.dd=5;   //1011000011000001     printf("aa==0x%04X==%016s(2)\n",u.aa,itoa(u.aa,buf,2)); } //bb==127,cc==0,dd==7 //aa==0xB0C1==1011000011000001(2)

user: user-2
content: 楼上正解

user: user-3
content: 这个例子应该是演示联合与位域的用法与含义的， 红色部分先初始化一个位域结构体变量，再分别用位域与联合的概念去打印各个字段。show_settings打印结构体变量，show_settings1用位与的方法检测与打印union作为一个short值时的相关比特的值，两个函数的作用基本等效
user-0 提问: 求教大神 小弟做的一个算法 关于归类

回复:
user: user-1
content: 你的描述已经将算法说的很明显了。 定义一个二维数组，一行存放一类的数据（相同的值），通过遍历已经排号序的数组，将相同的数据放到统一行里即可。 类似这样的： #include <stdio.h> #include <string.h>   int main(void) {     int digit_list[] = { 1, 1, 1, 2, 2, 2, 2, 3, 3，4 };     int family[10][10];     int idx, i = 0, j = 0;     int len, first;       memset(family, -1, sizeof(family));      first = digit_list[0];     len = sizeof(digit_list) / sizeof(digit_list[0]);     for (idx = 0; idx < len; idx++) {         if (digit_list[idx] == first) {             family[i][j++] = digit_list[idx];         } else {             first = digit_list[idx];             i++;             j = 0;             family[i][j++] = digit_list[idx];         }     }     /*     for (i = 0; i < len; i++)         printf("%d ", digit_list[i]);     putchar(10);     */     for (i = 0; i < 10; i++) {         if (family[i][0] < 0)             break;         for (j = 0; j < 10; j++) {             if (family[i][j] >= 0)                 printf("%d ", family[i][j]);         }         putchar(10);     }     return 0; } 二维数组的行数和列数都要和一维数组相同，保证两个极限情况，都是一类或都是不同的类。

user: user-2
content: 这一个排序就可以了吧？
user-0 提问: 贪吃蛇 只能在隔离沙箱中运行

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

user: user-2
content: 如果程序有内存越界漏洞，360会限制它在沙箱中运行。  Link是个指针类型，所以sizeof(Link)只是指针的大小……

user: user-3
content: 把360卸了，或者给360交保护费
user-0 提问: 帮忙看看vs问题还是程序本身有问题

回复:
user: user-1
content: 引用 4 楼 vnvlyp 的回复:[quote=引用 3 楼 paschen 的回复:] main()  改成：  int main()  或者  void main  C++中不能省略函数返回值类型  void main这种怕是不太好吧？  http://www.stroustrup.com/bs_faq2.html#void-main 见Stroustrup给的解释 [/quote]  按标准是确实要用int，但楼主说了IDE是VS，void也支持

user: user-2
content: Even if your compiler accepts "void main()" avoid it, or risk being considered ignorant by C and C++ programmers.

user: user-3
content: 引用 3 楼 paschen 的回复:main()  改成：  int main()  或者  void main  C++中不能省略函数返回值类型  void main这种怕是不太好吧？  http://www.stroustrup.com/bs_faq2.html#void-main 见Stroustrup给的解释

user: user-1
content: main()  改成：  int main()  或者  void main  C++中不能省略函数返回值类型

user: user-4
content: #include<stdio.h> #define LOWER 0 #define UPPER 300 #define STEP 20 int main() { int fahr; for (fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP) printf("%3d %6.1f\n", fahr, (5.0 / 9.0)*(fahr - 32)); return 0; } 应该是编译器的问题，试一下这种形式是否可以

user: user-5
content: int main
user-0 提问: 分割文本的问题。字符串怎么分割阿

回复:
user: user-1
content: 参考这里的StringTool::SplitStr2List

user: user-2
content: 引用 2 楼 aaadddzxc 的回复:[quote=引用 1 楼 zilaishuichina 的回复:] 参考这里的StringTool::SplitStr2List  有C语言版本的莫，为什么strtok不行？[/quote] 要看你怎么用的，建议把你的代码贴出来。

user: user-0
content: 引用 1 楼 zilaishuichina 的回复:参考这里的StringTool::SplitStr2List  有C语言版本的莫，为什么strtok不行？
user-0 提问: 为什么会连续输出两个提示信息？

回复:
user: user-1
content: 引用 8 楼 coverlo 的回复:[quote=引用 2 楼 jianwen0529 的回复:] scanf("%c", &answer); //遗留了回车键 fflush(stdin); //刷新输入流 我用的是dev c++ 好像不能用，我查了一下说是在vc6.0下才能用fflush[/quote] 这是标准库的函数，可以用的

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:scanf在输入%c之后再次这样要求输入时就会出现这个问题；因为上次输入时，除了输入字符同时也输入了回车符，该回车符在输入缓存里存在，下次再要求输入%c时，回车符匹配输入了，所以有两次打印；在scanf后面加一句：getchar()即可。 scanf("%c", &answer);  getchar(); 试着用你的方法改了一下，成功了，谢谢

user: user-0
content: 引用 2 楼 jianwen0529 的回复:scanf("%c", &answer); //遗留了回车键 fflush(stdin); //刷新输入流 我用的是dev c++ 好像不能用，我查了一下说是在vc6.0下才能用fflush

user: user-0
content: 引用 1 楼 user-6 的回复:因为你输入的回车也是字符  scanf里的空格表示跳过空字符 scanf("%c ", &answer);改了可以用，谢谢

user: user-2
content: 产生原因：在输入y的时候按下了回车键，回车键也是一个输入字符，其值为‘\n’，因此，此时相当于有两个字符的输入，一个是'y'另外一个是'\n'； 解决方法：可以使用getchar()函数判断输入的字符是否是'\n'，函数getchar()用于从标准输入控制台读取字符，代码修改如下 	char answer = 0; 	for(;;) 	{ 		printf("Do you want to enter more(y/n)"); 		if( getchar()=='\n' ) 		{		 			scanf("%c", &answer); 			if( tolower(answer) == 'n' ) 				break; 		} 	} 	return 0;

user: user-3
content: 每次输入后还会在缓冲区中留下换行符\n，下一次循环时会被接收  可以scanf后面加一个getchar()接收了换行符

user: user-4
content: 一次scanf读进来两个字符，一个y，一个回车，所以会循环两次，输出就是两次，但是回车没有屏显 解决方法楼上说的很清楚了

user: user-5
content: scanf在输入%c之后再次这样要求输入时就会出现这个问题；因为上次输入时，除了输入字符同时也输入了回车符，该回车符在输入缓存里存在，下次再要求输入%c时，回车符匹配输入了，所以有两次打印；在scanf后面加一句：getchar()即可。 scanf("%c", &answer);  getchar();

user: user-1
content: scanf("%c", &answer); //遗留了回车键 fflush(stdin); //刷新输入流

user: user-6
content: 因为你输入的回车也是字符  scanf里的空格表示跳过空字符 scanf("%c ", &answer);
user-0 提问: C语言用指针实现strindex（s,t）函数，该函数返回字符串t在字符串s中的位置

回复:
user: user-0
content: 这个是getline函数  #include <stdio.h> #include<string.h>  void getline(char *s,int lim) {     int c,i;     for(i=0;(((c=getchar())!=EOF) && (c!='\n'));++i){         if(i<lim-2){            *s = c;            s++;         }     }     if(c=='\n'){         *s=c; 		s++;     }     *s='\0'; }

user: user-1
content: #include<stdio.h>  /*返回t在s中的位置*/ int strindex(char *s,char *t) {     char *b = s;     char *p,*r;      for(; *s !='\0'; s++){         for(p = s, r = t; *r && *p == *r; p++, r++)             ;         if(r > t && *r=='\0')             return s - b;     }     return -1; }   int main(void) {     char *str = "helloworld";     char *sub_str = "ld";      printf("pos = %d\n", strindex(str, sub_str));      return 0; } 没有什么问题，返回负值，你要看这个负值是不是-1，若字串在主串里，那么返回的不可能是赋值，因为s  - b不会得负值，除非没有找到字串； 如果是返回-1，并且你认为是在主串里，那么可以发一下你的测试用例。

user: user-2
content: 你怎么调用的，代码贴一下。 这个貌似没问题啊

user: user-2
content: 你这个getline是哪个getline啊。。

user: user-0
content: 已经解决了 因为我调用的是getline函数，s和t的结尾都是以“\n\0”结尾的，所以在判断是否到达结尾的时候应该用\n来判断，而不是\0, 谢谢了！

user: user-0
content: main() { 	char s[MAX],t[MAX]; 	getline(s,MAX); 	getline(t,MAX); 	printf("位置为：%d\n",strindex(s,t)); } 这个是main函数调用的
user-0 提问: 关于C中参数定义的问题

回复:
user: user-1
content: 引用 4 楼 qq_22043605 的回复:还是想问一下2L和3L的老师，在产品说明书中D2K_Register_Card的具体解释是“Initializes the hardware and software states of an DAQ-2000 data acquisition card. Register_Card must be called before any other D2K-DASK library functions can be called for that card.”大概就只是说明了这个函数必须最先调用。但是 这个函数的具体运算我应该怎么去看呢？因为要根据例程修改相关参数配置采集卡，因此不知道该如何操作。对此十分困惑。 人家就是封装起来了不想给你开源，你只要知道这个函数的功能，用法就ok了，没有必要深究里面的过程。这就和你买了个空调，人告诉你怎么用，至于到底怎么实现的，人不会告诉你的，也没必要告诉你。你要真都搞明白了，不都可以抢他饭碗了

user: user-2
content: 来学习学习

user: user-3
content: I16是基本类型做了typedef得到的。I16 card = -1, err, card_num, i, card_type=0; 这个定义和 int card = -1, err, card_num, i, card_type=0; 作用是一样的，类型不一样，但都是定义多个同类型的变量； 语法如果不很明白，建议还是多写多练；对于看惯了int, short,float， char这些类型的，I16只是这些类型做了一个typedef; 对于函数调用，根据函数声明，将对应参数传入，若有返回值，通过判断返回值来定函数执行状况； 对于，只有函数声明没有定义，不很好理解函数的具体如何实现，但要了解它的大体功能吧；这个时候就只能看接口文档了。

user: user-4
content: I16 card = -1, err, card_num, i, card_type=0; 这里有好几个变量card, err, card_num, i, card_type，什么叫给同一个变量赋值多个？  然后你那个函数调用应该就是 I16 __stdcall D2K_Register_Card (U16 CardType, U16 card_num); 这个版本  if((card = D2K_Register_Card(card_type, card_num))<0) 其中的 card_type, card_num有符号数隐式转换为无符号数

user: user-0
content: 引用 1 楼 user-4 的回复:I16 card = -1, err, card_num, i, card_type=0; 这里有好几个变量card, err, card_num, i, card_type，什么叫给同一个变量赋值多个？  然后你那个函数调用应该就是 I16 __stdcall D2K_Register_Card (U16 CardType, U16 card_num); 这个版本  if((card = D2K_Register_Card(card_type, card_num))<0) 其中的 card_type, card_num有符号数隐式转换为无符号数 引用 1 楼 user-4 的回复:I16 card = -1, err, card_num, i, card_type=0; 这里有好几个变量card, err, card_num, i, card_type，什么叫给同一个变量赋值多个？  然后你那个函数调用应该就是 I16 __stdcall D2K_Register_Card (U16 CardType, U16 card_num); 这个版本  if((card = D2K_Register_Card(card_type, card_num))<0) 其中的 card_type, card_num有符号数隐式转换为无符号数  想请问下第一句代码I16 card = -1, err, card_num, i, card_type=0; 是否就相当于”int card=-1; int err; int card_num; int i; int card_type; ”

user: user-0
content: 还是想问一下2L和3L的老师，在产品说明书中D2K_Register_Card的具体解释是“Initializes the hardware and software states of an DAQ-2000 data acquisition card. Register_Card must be called before any other D2K-DASK library functions can be called for that card.”大概就只是说明了这个函数必须最先调用。但是 这个函数的具体运算我应该怎么去看呢？因为要根据例程修改相关参数配置采集卡，因此不知道该如何操作。对此十分困惑。
user-0 提问: 类型变量的取值范围求解答

回复:
user: user-1
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  仅供参考：#include <stdio.h> unsigned short int ui;   signed short int si; int main() { 	ui=(unsigned short int)0x8000u; 	si=(  signed short int)0x8000; 	printf("ui=%u\n",ui); 	printf("si=%d\n",si); 	ui=ui>>1; 	si=si>>1; 	printf("ui=%u\n",ui); 	printf("si=%d\n",si);  	printf("--------------\n"); 	ui=(unsigned short int)0x8000u; 	si=(  signed short int)0x8000; 	printf("ui=%u\n",ui); 	printf("si=%d\n",si); 	ui=((  signed short	int)ui)>>1; 	si=((unsigned short	int)si)>>1; 	printf("ui=%u\n",ui); 	printf("si=%d\n",si);  	return 0; } //ui=32768 //si=-32768 //ui=16384 //si=-16384 //-------------- //ui=32768 //si=-32768 //ui=49152 //si=16384

user: user-0
content: 引用 6 楼 user-2 的回复:[quote=引用 5 楼 caine12345 的回复:] [quote=引用 2 楼 user-2 的回复:] 为什么要将0的二进制取反的结果转换为unsigned char类型，并且还要算术右移一位？这样做的目的是什么？ 因为整数常量默认类型是int,所以要转成unsigned char.右移一位是把符号位空出。  为什么两个代码前面一个有负号一个没有呢？ 因为求最小值所以有负号，最大值所以没有  我这里想问的是既然是求的signed char，为啥要从int转换成unsigned char呢，不是很理解[/quote] 因为需要逻辑右移，如果是转成有符号，就是算术右移，算术右移最高位还是添1,这样等于没移[/quote]  谢谢了，这回了解了，可是书上的代码编译出来是错误结果啊。。。

user: user-2
content: 引用 5 楼 caine12345 的回复:[quote=引用 2 楼 user-2 的回复:] 为什么要将0的二进制取反的结果转换为unsigned char类型，并且还要算术右移一位？这样做的目的是什么？ 因为整数常量默认类型是int,所以要转成unsigned char.右移一位是把符号位空出。  为什么两个代码前面一个有负号一个没有呢？ 因为求最小值所以有负号，最大值所以没有  我这里想问的是既然是求的signed char，为啥要从int转换成unsigned char呢，不是很理解[/quote] 因为需要逻辑右移，如果是转成有符号，就是算术右移，算术右移最高位还是添1,这样等于没移

user: user-0
content: 引用 2 楼 user-2 的回复:为什么要将0的二进制取反的结果转换为unsigned char类型，并且还要算术右移一位？这样做的目的是什么？ 因为整数常量默认类型是int,所以要转成unsigned char.右移一位是把符号位空出。  为什么两个代码前面一个有负号一个没有呢？ 因为求最小值所以有负号，最大值所以没有  我这里想问的是既然是求的signed char，为啥要从int转换成unsigned char呢，不是很理解

user: user-2
content: 最大是0111 1111.最小是1000 0000(-128)

user: user-0
content: 引用 1 楼 user-2 的回复:char类型的最大最小值可以从limits.h中的宏SCHAR_MIN, SCHAR_MAX获得。  这个知道，谢谢了，想用其他办法得出结果

user: user-2
content: 为什么要将0的二进制取反的结果转换为unsigned char类型，并且还要算术右移一位？这样做的目的是什么？ 因为整数常量默认类型是int,所以要转成unsigned char.右移一位是把符号位空出。  为什么两个代码前面一个有负号一个没有呢？ 因为求最小值所以有负号，最大值所以没有

user: user-2
content: char类型的最大最小值可以从limits.h中的宏SCHAR_MIN, SCHAR_MAX获得。
user-0 提问: 输入数据后没有输出结果

回复:
user: user-1
content: if(m>n) { m=t; m=n; n=t; }t没有值，不能赋给m； for(a=m+1;m<a<n;a++) 这个表示也是错的，m<a<n错了，可以写成m<a&&a<n; 其他的不知道你的程序要干什么，不知道怎么改了，

user: user-0
content: 谢谢啦大神为什么现在又输出一堆零呢  #include<stdio.h> #include<math.h> int main()  { 	int m,n,a,t,g,s,b,q,w; 	w=0; 	scanf("%d %d",&m,&n); 	if(m>n) 		{ 		m=t; 		m=n; 		n=t; 	}  	for(a=m+1;m<a<n;a++) 		{ 		do{ 		w++; 		a/=10; 		}while(a>10);	 		q=a/1000; 		b=a/100; 		s=a/10; 		g=a%10; 		if(pow(g+s+b+q,w)==a) 			printf("%d\n",a); 			}  	return 0;   }

user: user-2
content: if(m > n) {         t = m;   /*这句应该这样*/         m = n;         n = t;     }  这个程序看不出来你要做什么。 x,w都没初始化，也没输入值； 定义那么多变量，也看不出这些变量要做什么。 建议：把程序贴出来的同时，把你的程序需求说一下，这样，即使看不懂代码的意思，也可以通过需求来判断程序的问题；

user: user-3
content: 另外如果m和n相差1的话for(a=m+1;m<a<n;a++) 是进不去的，这样q也没初始化  最后if(pow(g+s+b+q,w)==a) printf("%d\n",a);你可以加个else来打印一些错误提示

user: user-3
content: 错误蛮多的，w和x都没初始化 你的do{ w++; x/=10; }while(x>10); 怎么可能跑得起来
user-0 提问: #define  A(...)   B  表示什么意思呀？

回复:
user: user-0
content: 引用 3 楼 jianwen0529 的回复:可变长度的参数  empty的定义为 “#define  empty           ” 那么是不是test(%d,%d,%d\n,C,D,E)输出的是空值？

user: user-1
content: 可变长度的参数

user: user-2
content: 变长参数的宏？？

user: user-3
content: 宏定义，在程序里B代替A；
user-0 提问: 求各位大佬指教，c代码错误为：*前丢失；

回复:
user: user-1
content: 查一下能不能获得Engine 的定义吧

user: user-2
content: 如果报错的是这行：Engine *eng; 那就说明你的Engine类型没有被识别出来，贴一下你的engine.h

user: user-3
content: Engine没有这个东西，你看看你包含的那个头文件是不是有这个类型，或者拼写有没有错误
user-0 提问: 关于统计字符串内容的问题

回复:
user: user-1
content: #include<stdio.h> #include<ctype.h> int main() {     int ch;     int alpha = 0, num = 0, el = 0;      puts("请输入一行字符");     while ((ch = getchar()) != '\n') {         if(isalpha(ch))             alpha++;         else if(isdigit(ch))             num++;         else             el++;      }     printf("字母%d,数字%d,其他%d\n", alpha, num, el);      return 0; } 1. while判断需要加一个括号： while ((ch = getchar()) != '\n') 2. 判断字符是什么，要用if .. else if ... else，如果第二个else不加，比如输入的是'a'会在判断不是数字，那么近视其他了。所以，需要加else if ... 3. 建议用局部变量，如果没有需要，建议不用全局变量；从数据安全和代码维护角度上考虑。
user-0 提问: 从N个数中取M个数有多少种取法递归写法！！！

回复:
user: user-1
content: 从4个里面取三个--> 	f(4, 3, 0, "", 0);

user: user-1
content: /** 	 * 先判断个数是否相等，在判断是否超出值范围 	 *  	 * @param n 	 *            从n个数中取m个数 	 * @param m 	 * @param count 	 *            已经取了几个数(进行了多少层循环) 	 * @param s 	 *            累加的字符串(结果) 	 * @param init 	 *            每次循环的初始值 	 */ 	public static void f(int n, int m, int count, String s, int init) {  		if (count == m) { 			System.out.println(s); 			return; 		} 		if (init >= n) { 			// System.out.println("init>=n"); 			return; 		}  		for (int a = init; a < n; a++) { 			// System.out.println("a="+a); 			f(n, m, count + 1, s + a + " ", a + 1); 			// System.out.println("end"); 		} 	}

user: user-0
content: 引用 1 楼 u014414940 的回复: int totalNum(int a,int b) { 	if(b==0) 		return 1; 	else if(b==1) 		return a; 	else 		return a*totalNum(a-1,b-1)/b; }  具体对a,b的详细控制没有写（本代码中默认a和b都是正整数，切a>=b），直接调用该方法，传入两个参数即可,望采纳。兄弟，能解释下为什么其他情况return a*totalNum(a-1,b-1)/b;这个呢？

user: user-0
content: 引用 2 楼 vnvlyp 的回复:[quote=引用 楼主 zzf1510711060 的回复:] 不用递归的话用几层循环就解决了 就解决了？ 不就是N排M么？又是多层循环，又是递归的，你逗我呢？[/quote]那请大神来一发代码，让我学习一下呗！

user: user-2
content: 引用 楼主 zzf1510711060 的回复:不用递归的话用几层循环就解决了 就解决了？ 不就是N排M么？又是多层循环，又是递归的，你逗我呢？

user: user-3
content: int totalNum(int a,int b) { 	if(b==0) 		return 1; 	else if(b==1) 		return a; 	else 		return a*totalNum(a-1,b-1)/b; }  具体对a,b的详细控制没有写（本代码中默认a和b都是正整数，切a>=b），直接调用该方法，传入两个参数即可,望采纳。
user-0 提问: exe不能执行的问题，求高手分析！！！

回复:
user: user-1
content: 引用 楼主 u011609112 的回复:软件：g21.exe，是一个ADI 的dsp的编译工具。 问题：g21.exe放于c根目录下，在windows 7 命令行下执行命令g21，提示如图2。  可以确认，该工具以前应该是可以运行的，因为一些原因编译环境现在已不得而知，看有什么办法能让g21.exe 执行起来 。    你重新安装一下吧，可能是和程序相关的环境变量除了问题，然后程序中用了相对路径，最后Game Over了

user: user-2
content: 这个是什么可执行程序？ 有源码吗？但从现象来看，应该是程序里路径不对，程序里是不是使用了相对路径？

user: user-0
content: g21       文件地址：http://pan.baidu.com/s/1eR4oixs     密码：7tbh

user: user-0
content: 与该程序配套的一些其他链接工具等，在命令行下均能执行，能看到参数信息，就g21这个怎么都不行。
user-0 提问: C primer plus上的问题

回复:
user: user-1
content: 书上的意思应该是，后面可以加空格，前面不可以。但是他的第二个输入例子应该不对，我试了一下，逗号后面加多少空格都没事

user: user-1
content: 楼上说的对，输入的时候要严格按照scanf里的格式输入

user: user-0
content: 谢谢各位，看来还是书错了

user: user-2
content: 如果想识别88 ， 1这样的格式，需要在代码中的逗号前加一个空格如：  scanf("%d , %d",&n,&m);

user: user-3
content: 输入时，去掉第一个数据后面的空格，输入第一个数据后直接加逗号，然后输入第二个数据； scanf是格式化输入，所以必须按照格式输入； 遇到这样的问题，建议将输入的数据输出到终端，查看输入的数据是否有问题，从输出的数据也可以反推输入匹配了什么数据。

user: user-4
content: 原文应为 scanf("%d , %d",&n,&m); 注意，逗号前有一空格 否则，第一个数输入后必须随后输入逗号，中间不能有其他任何东西
user-0 提问: 二分法求根

回复:
user: user-1
content: 我觉得使用符合精度的根就可以了 1 如果求出的根不是准确值，即是因为精度到了while退出的，那么这个根已经符合精度，严格说，只要符合精度的这个区间的所有值都能作为函数的最后的解，不必纠结于在这个区间的左边还是右边还是中间 2 如果求出的根是确定值，即你已经求出了准确的值，输出就好了，如果再求中值，输出的结果必然是错误的，而且是不符合精度的值。

user: user-2
content: printf("root=%f\n",(a+b)/2)的值会更精确些，但你这个似乎函数应该有点问题

user: user-3
content: #include <stdio.h> #include <math.h>  #define MIN_DIFF    (1e-5) #define FZERO       (1e-6)  int main(void) {     float a, prev, cur;     int i;      printf("Please input a number: ");     scanf("%f", &a);      if (fabsf(a) <= FZERO) {         printf("%f sqrt is %.5f\n", a, 0.0);         return 0;     }     prev = 1.0;     cur = (prev + a / prev) / 2;     for (i = 0; fabsf(cur - prev) >= MIN_DIFF; i++) {         prev = cur;         cur = (prev + a / prev) / 2;     }      printf("%.2f sqrt is %.5f\n", a, cur);     return 0; } 迭代法求平方根
user-0 提问: 求解答，为什么这个程序是数组复制，我觉得是数组检测啊

回复:
user: user-1
content: 问这种问题丝毫没有意思，拿到电脑上运行一下就知道了，程序不是看出来的，是编出来的。

user: user-2
content: *s=*t 这不是复制是什么？
user-0 提问: #ifndef… 似乎并不能完全阻止重定义，该怎么办？

回复:
user: user-0
content: 引用 4 楼 cfjtaishan 的回复:头文件里重定义的限制是以#endif结束的，你定义的结构体在#endif之外  啊……这样我就搞明白了……非常感谢各位

user: user-0
content: 引用 2 楼 user-3 的回复:#endif  写到每个文件的最后 没想到居然这样简单啊……  的确如此，不存在问题了。  不过，不都是没有对应的__TEST_H__和__DATA_STRUCT_H__么？为啥贴到后面就可以了？…………    额……这样的话不还是读取了两次data_struct.h么？……

user: user-1
content: 头文件里重定义的限制是以#endif结束的，你定义的结构体在#endif之外

user: user-2
content: 预处理是简单的替换，仔细检查替换后的main之前的内容

user: user-3
content: #endif  写到每个文件的最后

user: user-0
content: 我这个main写的有毛病…… return T_struct(); 这样应该更像话一些……
user-0 提问: 初学c语言，请大神讲解

回复:
user: user-1
content: 你这句代码是你自己写的吗

user: user-2
content: if(a[i] - 'o'>=n && a[i] <'A' || a[i] - 'A' + 10 >=n) 这句不是很好理解，建议，有&&，||同事存在时，再加一层括号，比如 if((a[i] - 'o'>=n && a[i] <'A') || a[i] - 'A' + 10 >=n) 或 if(a[i] - 'o'>=n && (a[i] <'A' || a[i] - 'A' + 10 >=n))  这样会好理解一些，如果不加括号，从左向右，总之不是很好理解； 这个应该是判断字符间距，即a[i]是一个ASCII字符，a[i] - 'o' 之间的间距是否大于等于n，如果是十六进制的标识，这个不是'o'而应该是'0'，个人猜测；后面同理分析。
user-0 提问: 求指点！数据结构C语言版单链表的建立，程序每次运行到输入完甚至还没输完结点值的时候就弹出停止工作=-=vc++6.0，求帮忙！

回复:
user: user-1
content: 建议注意自己的代码风格～注释应该少加，通过函数名和变量名来理解代码的逻辑

user: user-1
content: #include<stdio.h> #include<stdlib.h> /************************************/ /* 链表实现的头文件，文件名slnklist.h */ /************************************/  typedef int datatype; typedef struct link_node {     int info;     struct link_node *next; }node;  node *creatlink(node *head, int n) {     node *p, *q;     int i;      p = head;     for(i = 0; i < n; i++) {         q = (node*)malloc(sizeof(node));/*分配空间*/         printf("\n请输入链表的结点值：");         scanf("%d", &q->info);/*这个地方是需要加&，因为是要地址*/         if(!head) { /*这个地方需要传入的head是初始化为NULL，所以在main里要初始化*/             q->next = head;             head = q;             p = head;    /*这句是需要的，不然下面else的p和head连不上*/         }         else         {             q->next = NULL;             p->next = q;             p = q;         }     }     return head; }  void print_link(node *head) {     node *pcur = head;      while (pcur) {         printf("%d\t", pcur->info);         pcur = pcur->next;     }     putchar(10); }  int main() {     node *head = NULL; /* must initialize */     int n;      printf("请输入链表的结点个数：");     scanf("%d", &n);     head = creatlink(head, n);     printf("-----------------\n");     print_link(head); /*输出功能建议使用自定义函数，这样代码可读性增加，并且好维护*/     /*     for(i=0;i<n;i++)     {         if(head)         {             printf("%d",head->info);             head = head->next;         }     }*/     return 0; }

user: user-2
content: ①main函数里的node *head改成 node *head=new node； 指针在用之前记得要初始化。 ②creatlink函数中的：scanf("%d",q->info); 改成scanf("%d",&(q->info)); scanf要有取址符号，不然运行的时候会报错。  #include<stdio.h> #include<stdlib.h> /************************************/ /* 链表实现的头文件，文件名slnklist.h */ /************************************/ typedef int datatype;  typedef struct link_node  {    int info;    struct link_node *next;  }node;  node *creatlink(node *head,int n)  {    node *q;   node *p=head;int i;    for(i=0;i<n;i++)    {         q=(node*)malloc(sizeof(node));/*分配空间*/         printf("\n请输入链表的结点值：");         scanf("%d",&(q->info));/*设置新结点*/ 		printf("%d",q->info);         if(!head)         {/* 插入的结点作为单链表的第一个结点*/             q->next=head;               head=q;          }          else           {             p->next=q;             q->next=NULL;             p=q;          }    }    return head;  }   void main()  {        node *head=new node 		;     int n,i;     printf("请输入链表的结点个数：");     scanf("%d",&n);        creatlink(head,n);     printf("-----------------");     for(i=0;i<n;i++)     {         if(head)         {             printf("%d",head->info);             head=head->next;         }     }     }
user-0 提问: 新手求教，C语言程序问题，急！！

回复:
user: user-1
content: 百度搜相关关键字。

user: user-2
content: 我曹早就忘记什么是不可约多项式什么是本原元了~

user: user-3
content: 牛，看这专业名词，吓的我连回帖都颤抖

user: user-4
content: 这个概念不理解，算法更不用提了。 如果这两样都不能做到理解，编程又从何谈起？！
user-0 提问: 2N皇后问题

回复:
user: user-1
content: http://blog.csdn.net/hackbuteer1/article/details/6657109

user: user-1
content: 论坛里有讲这个问题的文章 http://blog.csdn.net/s2013122867/article/details/50310405 http://blog.csdn.net/acm_jl/article/details/50824339
user-0 提问: 关于if else 语句

回复:
user: user-0
content: 我试过了，输入A，提示大写，如果else只和最后一个if配对，那么不应该提示符号吗

user: user-1
content: 在保证没有语法错误的情况下，只要你逻辑没问题，结果没错就可以。

user: user-2
content: else与最近得if配对，剩下的两个if就是单纯的判断了

user: user-3
content: 你可以试试看啊
user-0 提问: 求大神帮忙？想用c语言做个录音程序，查询网络资料说调用winmm.lib库就可以搞定，可是编译的时候总是说找不到 winmm.lib库，纠结了很久，无解。

回复:
user: user-1
content: 参考： C语言（C++）Win32控制台下播放声音 http://blog.163.com/tab_98/blog/static/1192409720164156552991/
user-0 提问: 弦截法求根

回复:
user: user-1
content: 两张图分别是输入输入-1 1和输入-10 -1的的结果，散列数分别是计算次数，x，和x1-x2。从第一张图可以看出，x从0的左侧无限趋近于0，这时x1=x=(-0)，-0表示0的左极限，所以|x1-x2|=(+1)，所以一直不能跳出循环，直到x=(+0)才结束。当输入-10 -1 时，x一直等于-2的左极限，所以|x1-x2|=(+8)，同样不能结束循环。建议你把收敛条件换成fun(X)与0的差值或者两次计算前后x的差值试试。
user-0 提问: 我的程序总是出现这个问题···求大神们帮忙看看~program stopped at 0x401413

回复:
user: user-1
content: 你sort中的数组可能没有初始就去执行a[sort[i]]='Z';，导致访问违规

user: user-2
content: int sort(char a[],int g,int h)    16 {            15     int i, j;    14     int sort[h];    13     char min = a[0];    12              11     for(i=0;i<h;i++)    10     {         9     |   for(j=1;j<h;j++)      8     |   {     7     |   |   if(min>a[j])      6     |   |   {     5     |   |   |   min=a[j];     4     |   |   |   sort[i]=j;     3     |   |   }                 2                               1     |   }                   40      |   printf("sort[i] = %d\n", sort[i]);   /*这是一个很大的数据（随机数），导致数组越界*/                                                                                                                                                               1     |   a[sort[i]]='Z';       2     }                         3                               4     for(i=0;i<h;i++)          5     {                         6     |   for(j=0;j<g;j++)      7     |   |   printf("%c ",a[sort[i]*(j+1)]);     8     |   printf("\n");         9     }                        10                              11     return 0;                12 }

user: user-3
content: 你的h是个变量，变量是不能用来定义数组的大小的。

user: user-4
content: sort函数里，sort[h]没初始化吧，如果条件不成立，你下面那个赋值语句不会执行

user: user-0
user-0 提问: 【C】关于二维函数和指针的问题

回复:
user: user-1
content: scanf_s需要的是地址  scanf_s("%lf", ar1[i][c]);  改成：  scanf_s("%lf", &ar1[i][c]);

user: user-2
content: #include<stdio.h>  #define tess 3 #define sandes 5  void skk(double ar1[][sandes]);  int main(void) {     double zaza[tess][sandes];     skk(zaza);      return 0; }  void skk(double ar1[][sandes]) {     int i, c;     printf("请输入十五个double类型的数值:\n");     for (i = 0; i < tess; i++)     {         for (c = 0; c < sandes; c++)         {             scanf_s("%lf", &ar1[i][c]);             printf("ar1[%d][%d]=%lf\n", i, c, ar1[i][c]);         }     }  } scanf_s少一个&; C语言不支持变长数组，建议先定义一个较大的数组，然后逐步使用数组里的元素；比如，先定以一个20个元素的长度，然后使用里面的10个，15个，20个等元素，
user-0 提问: 纯C模拟C++类面向对象技术,新手求指点一二

回复:
user: user-1
content: 只能手动把函数指针赋值给add指针才能用

user: user-2
content: 引用 4 楼 qq_18599547 的回复:[quote=引用 3 楼 u010165006 的回复:] 为什么不直接C++呢？ 不喜欢C++,其他的功能[/quote]  可以用带类的C

user: user-3
content: 不喜欢C++,其他的功能  不用不就行了吗

user: user-4
content: C++为了解决这个问题，特意在类对象中引入了隐含的this指针。 原本就是C没有的东西，不自己手动加入指针，怎么实现的了。

user: user-0
content: 引用 3 楼 u010165006 的回复:为什么不直接C++呢？ 不喜欢C++,其他的功能

user: user-5
content: c模拟c++肯定不能完全参照c++的语法，所以咯，你的那个写法顶多是模拟c++的虚函数表。。。。你可以自己模拟c++语法，不过为了好看易懂，你可能需要用一堆宏，而且，面向对象是OO的概念，c++只是OOP的一种实现，不是必须得和c++一样才叫OO

user: user-6
content: 那你得要有类似工厂或者构造函数的东西才行啊  #include <stdio.h>  typedef struct sMyClass { 	int (*add)(int, int); } MyClass;  int my_class_add(int x, int y) { 	return x + y; }   MyClass create_my_class() { 	MyClass m; 	m.add = my_class_add; 	return m; }   int main() { 	MyClass m = create_my_class(); 	printf("%d\n", m.add(1, 5)); }

user: user-2
content: 为什么不直接C++呢？
user-0 提问: 新手！我这有个C的代码  算法描述和设计特点怎么写？顺便帮忙看下代码对不对

回复:
user: user-1
content: #include <stdio.h>  int main (void) {     int a[15]={2,4,6,8,10,12,14,16,18,20,22,24,26,28,30};     int min, max, mid, n;//max为数列长度，a[2]作为第一个数组元素      printf("请输入要查找的数：\n");     scanf("%d", &n);      min = 0;     max = sizeof(a)/sizeof(a[0]);      while (min <=  max) {         mid = (min + max) / 2;         if(n > a[mid])             min = mid + 1;         else if(n < a[mid])                 max = mid - 1;         else {             printf("输入的数在数列的%d位\n", mid);             break;         }     }     if (min > max)         printf("Not in list!\n");      return 0; } 上一个有点问题；用这个吧～

user: user-1
content: #include <stdio.h>  int main (void) {     int a[15]={2,4,6,8,10,12,14,16,18,20,22,24,26,28,30};     int min, max, mid, n;      printf("请输入要查找的数：\n");     scanf("%d", &n);      min = 0;     max = sizeof(a)/sizeof(a[0]);      while (min <=  max) {         mid = (min + max) / 2;         if(n > a[mid])             min = mid + 1;         else if(n < a[mid])                 max = mid - 1;         else             printf("输入的数在数列的%d位", mid);         printf("mid = %d, min = %d, max = %d\n", mid, min, max);     }     if (min > max)         printf("Not in list!\n");      return 0; } 二分查找法，max不是30，而是sizeof(a)/sizeof(a[0]);
user-0 提问: 加法问题

回复:
user: user-1
content: int c; c = a*10+b;

user: user-2
content: 引用 1 楼 paschen 的回复:int c; c = a*10+b; 我就佩服你

user: user-3
content: void Connect(int nAvalue, int nBvalue) { 	char cA[8] = {0}; 	char cB[4] = {0};  	itoa(nAvalue, cA, 10); 	itoa(nBvalue, cB, 10); 	strcat(cA, cB);//这个时候cA就是你要的值         printf("%s",cA); }

user: user-4
content: 用strcat函数链接

user: user-5
content: 字符串连接。。。。。

user: user-6
content: 可以考虑用字符串。
user-0 提问: c代码实现：当算法运行到第30s，自动退出。

回复:
user: user-1
content: 好久没逛论坛了

user: user-2
content: 需要优化算法，一楼正解

user: user-3
content: 新开一个线程计时....

user: user-4
content: 要是一个小程序，可以用信号。主要alarm不能嵌套。 signal(SIGALRM,exit); alarm（30） you_func()； alarm（0）； 用sigset， sigaction 都行。

user: user-5
content: 运行时间受到计算机性能，任务调度等等方面，再说你又不是在单任务或者实时系统来运行的 所以你限制在30s内完成，一是提高算法的性能，二是用另外一个线程做计时器（而且也受到调度的问题）过了30s就结束  不是实时系统，出了提高算法的性能，其他就别想太多
user-0 提问: c语言实现：当程序A运行到第30s，自动跳出

回复:
user: user-1
content: 新开一个线程计时....

user: user-2
content: 定义一个timer,然后在算法里定义一个flag,timer是30s后判断flag是否变化来判断算法是否执行完毕；   也可以定义一个秒数递增的timer,然后每隔一秒查询一下flag，如果到30s还没有flag变化，则算法超时。
user-0 提问: 求助，想输出三元组全部成员，但是后两个输出的是地址

回复:
user: user-1
content: InitTriplet(&T);//初始化三元组 其实并没有初始化 InitTriplet 函数中直接对 T->x 操作就行 你却对 T 重新赋值了
user-0 提问: C语言 凑算式 控制精度问题

回复:
user: user-1
content: 这不是全排列的问题？

user: user-0
content: 引用 3 楼 zdj0925 的回复:这个可以转换成多阶行列式吗？ 具体该怎么写呢？我总觉得我这样写太麻烦了，而且是在比赛中，肯定时间有限。请问你有什么比较简便的方法吗？

user: user-0
content: 引用 2 楼 user-3 的回复:[quote=引用 1 楼 user-3的回复:]乘以1.0的作用是将其转换为double形，你删掉1.0对每个数使用强制类型转换也可以。5*1.0你可以写成（double）5。原因，1/2按整形计算结果为0，4/3按整形结果为1，所以这样和你算得会不一致，1*1.0/2因为1.0的存在，该算式中的其他数字被强制类型转换为double，最后结果为0.5。 因为不同类型数不能直接计算，利用这个隐式调用了强制类型转换[/quote] 明白啦，非常感谢O(∩_∩)O

user: user-2
content: 这个可以转换成多阶行列式吗？

user: user-3
content: 引用 1 楼 user-3的回复:乘以1.0的作用是将其转换为double形，你删掉1.0对每个数使用强制类型转换也可以。5*1.0你可以写成（double）5。原因，1/2按整形计算结果为0，4/3按整形结果为1，所以这样和你算得会不一致，1*1.0/2因为1.0的存在，该算式中的其他数字被强制类型转换为double，最后结果为0.5。 因为不同类型数不能直接计算，利用这个隐式调用了强制类型转换

user: user-3
content: 乘以1.0的作用是将其转换为double形，你删掉1.0对每个数使用强制类型转换也可以。5*1.0你可以写成（double）5。原因，1/2按整形计算结果为0，4/3按整形结果为1，所以这样和你算得会不一致，1*1.0/2因为1.0的存在，该算式中的其他数字被强制类型转换为double，最后结果为0.5。
user-0 提问: 请各位大佬帮忙解决一道题！

回复:
user: user-1
content: 挺有意思的题目！我是个C语言初学者，研究了一上午，貌似有点头绪了，等我我试试啊

user: user-2
content: 假设一共有n行，从最中间那个数开始累加，那么最后一个数应该是sum=(n-1)*(n+1)/2+n-1。然后从外到内输出，每个数等于对应位置处sum的个位数。在指定位置出输出数字的函数可以百度到。第一行输出n个数，接下来每一行和一列各输出的数的个数是有规律的，自己查一查。

user: user-3
content: 鬼知道你们1-3 week cover了什么C feature 作业自己做。

user: user-0
content: 自顶一下
user-0 提问: 编译问题

回复:
user: user-1
content: 如果各个源文件中均要用到某一个头文件，那各个源文件都包含这个头文件就行  只不过头文件中要加上相关代码防止重复包含时多次编译：  #ifndef _HEADERNAME_H #define _HEADERNAME_H  ...//(头文件内容)  #endif

user: user-2
content: 在a.h 中加 [code=c] #ifnedf  __aaaaa__  //每个文件要去不同的名字 #define __aaaaa__ //a.h 的内容 #endif  [code]  b.h，c.h 同理 都加入在c.h 或.c文件中include  就行。不需要太纠结这个。

user: user-3
content: C.h需要放到C.c中，由于C.c中有main函数，所以A.h, B.h,C.h 都要放进来；  B.c需要包含B.h;C.c中是否需要B.h，要看C.c中是否调用B.c的函数；

user: user-4
content: 你用到哪个头文件的东西就包含哪个头文件 除了互相包含的情况，以及头文件中不要随意包含一些定义的头文件。其他的没什么需要考虑的。
user-0 提问: 如何为malloc申请的字串赋值？

回复:
user: user-0
content: 感谢各位前辈的耐心解答，我终于都理解了，非常感谢！

user: user-1
content: 引用为啥a的地址改了？为什么不是原先malloc申请的地址了？  malloc申请到一个地址赋值给a，之后的a = "hello"; 使a指向了常量区的字符串，也就是又改变了a指向的地址  引用如何在malloc申请的那个地址里保存“hello”？  a = "hello";  改成：  strcpy(a, "hello");

user: user-1
content: 1、free函数的返回值是void，而不是void*  http://en.cppreference.com/w/c/memory/free  2、void*可以表示任意类型的指针，任意类型指针均可隐式转换为void*  3、void参数表示不需要传入参数

user: user-2
content: malloc返回的是void *，该类型void *转换成其他基本类型，比如int *， char *等等都是自动转换的。

user: user-2
content: 指针变量a里存放的是地址，malloc返回的是在堆上申请的空间的首地址，放在指针变量a里。 a = "hello"；这句是将hello字符串的首地址放在了指针变量里，就是将之前的存放的堆上的地址覆盖了。 可以通过打印这两个地址（%p）来验证； 字符串赋值可以考虑strcpy，strncpy或者memcpy； strncpy(a, "hello", strlen("hello")+1); 这句是将字符串“hello”拷贝到堆上申请的空间里。

user: user-3
content: 【尚存疑问】1、这个操作返回空，将返回空的函数作为指针函数有什么意义？ 返回空就是不需要返回值。  【尚存疑问】2、void *p是什么概念？不是已经void了么？将*p指为void如何符合之后写入的参数？…… 用void *作为形参类型是为了通用。任意类型的指针可以隐式的转成void *类型。  【尚存疑问】3、void如何使用该参数？ 将malloc返回值地址填入即可

user: user-3
content: 【尚存疑问】为啥a的地址改了？为什么不是原先malloc申请的地址了？ -- a的地址没改变，而是a的值改变了。  【尚存疑问】如何在malloc申请的那个地址里保存“hello”？  －－－ memcpy
user-0 提问: 为啥free(a)之后该地址还可用？

回复:
user: user-0
content: 引用 7 楼 cfjtaishan 的回复:[quote=引用 6 楼 Lamuna 的回复:] [quote=引用 5 楼 cfjtaishan 的回复:] a = (char *)malloc(10*sizeof(char));     a = "hello";     b = a; a在堆上申请了10个字节的空间，这10个字节的首地址放到指针变量a里。然后又将a变量的地址改变为”hello"的地址。那么原来在堆上申请的空间就找不到了，这样会造成内存泄漏； 后面的free(a)，由于a指向的地址已经不是堆上（malloc申请的）的，所以free(a)；是没有意义的；同样也是b，b指向了a就是b和a都指向了“hello"（只读数据段），都不是堆上的空间，free是没有意义的；malloc申请的空间无法释放；  啊……很抱歉，我已经结贴了，手太快了……没想到问题会有这么多后续进展……我想问问，为啥a的地址改了？不是malloc申请的位置了么？那如何在malloc申请的那个地址里保存“hello”？  …………我重发一帖提问吧……[/quote] 因为a又指向了hello，原来在堆上（malloc)申请的空间的首地址放在a里，后来用”hello"的地址给覆盖了。所以，a已经不指向堆上申请的地址了[/quote]  已新开帖在这里： http://bbs.csdn.net/topics/392139027  麻烦您抽空解答一下，我的确有点懵……如何把“hello”放到malloc申请到的空间里？

user: user-1
content: 引用 6 楼 Lamuna 的回复:[quote=引用 5 楼 cfjtaishan 的回复:] a = (char *)malloc(10*sizeof(char));     a = "hello";     b = a; a在堆上申请了10个字节的空间，这10个字节的首地址放到指针变量a里。然后又将a变量的地址改变为”hello"的地址。那么原来在堆上申请的空间就找不到了，这样会造成内存泄漏； 后面的free(a)，由于a指向的地址已经不是堆上（malloc申请的）的，所以free(a)；是没有意义的；同样也是b，b指向了a就是b和a都指向了“hello"（只读数据段），都不是堆上的空间，free是没有意义的；malloc申请的空间无法释放；  啊……很抱歉，我已经结贴了，手太快了……没想到问题会有这么多后续进展……我想问问，为啥a的地址改了？不是malloc申请的位置了么？那如何在malloc申请的那个地址里保存“hello”？  …………我重发一帖提问吧……[/quote] 因为a又指向了hello，原来在堆上（malloc)申请的空间的首地址放在a里，后来用”hello"的地址给覆盖了。所以，a已经不指向堆上申请的地址了

user: user-0
content: 引用 5 楼 cfjtaishan 的回复:a = (char *)malloc(10*sizeof(char));     a = "hello";     b = a; a在堆上申请了10个字节的空间，这10个字节的首地址放到指针变量a里。然后又将a变量的地址改变为”hello"的地址。那么原来在堆上申请的空间就找不到了，这样会造成内存泄漏； 后面的free(a)，由于a指向的地址已经不是堆上（malloc申请的）的，所以free(a)；是没有意义的；同样也是b，b指向了a就是b和a都指向了“hello"（只读数据段），都不是堆上的空间，free是没有意义的；malloc申请的空间无法释放；  啊……很抱歉，我已经结贴了，手太快了……没想到问题会有这么多后续进展……我想问问，为啥a的地址改了？不是malloc申请的位置了么？那如何在malloc申请的那个地址里保存“hello”？  …………我重发一帖提问吧……

user: user-1
content: a = (char *)malloc(10*sizeof(char));     a = "hello";     b = a; a在堆上申请了10个字节的空间，这10个字节的首地址放到指针变量a里。然后又将a变量的地址改变为”hello"的地址。那么原来在堆上申请的空间就找不到了，这样会造成内存泄漏； 后面的free(a)，由于a指向的地址已经不是堆上（malloc申请的）的，所以free(a)；是没有意义的；同样也是b，b指向了a就是b和a都指向了“hello"（只读数据段），都不是堆上的空间，free是没有意义的；malloc申请的空间无法释放；

user: user-0
content: 引用 3 楼 Dobzhansky 的回复:地址还在， 房子不是你的了， 你住一晚试试。 另外，字符串指针赋值，没你这么干的。  额……这样会很尴尬么？……这块内容是不是要等我学会字符串部分才明白自己的幼稚？……=_=……

user: user-2
content: 地址还在， 房子不是你的了， 你住一晚试试。 另外，字符串指针赋值，没你这么干的。

user: user-3
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-3
content: 为啥租客把钥匙还给房东了，用其它钥匙还能进屋住？  malloc和free 相当于 借和还； 不相当于 创建和销毁。
user-0 提问: VC6.0

回复:
user: user-1
content: FileTool.exe 替换打开和添加到项目中 Visual C++ 的新功能 http://support.microsoft.com/kb/241396/zh-cn  或者  换个别的输入法。

user: user-2
content: 我们学校刚开始学习C语言时就是用的vc啊

user: user-3
content: 转行吧，你不适合编程，现在还用vc6这么古老的软件！

user: user-4
content: 卸载重装吧兄弟
user-0 提问: c语言结构体指针与函数的问题

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h>  typedef struct ClassInfo{     int nClassNO;     char szClassName[20];     int nStudentNumber; }CLASSINFO;  typedef struct ClassInfoInFile{     CLASSINFO Class;     int nStudentInfoOffset;     char carrPreserved[512]; }CLASSINFOINFILE;  typedef struct StudentInfo{     char szID[9];     char szName[21];     double darrScores[3]; }STUDENTINFO;  typedef struct ClassScore {     STUDENTINFO *pStudents;     int nCount; } CLASSSCORE;  int readtext(FILE *fp, CLASSINFOINFILE *classinfohead, CLASSSCORE *classscore) {     STUDENTINFO *m;      fscanf(fp,"%d%s%d", &classinfohead->Class.nClassNO, (*classinfohead).Class.szClassName, &(classinfohead->Class.nStudentNumber));     classinfohead->nStudentInfoOffset = 544;     classscore->nCount = 0;      m = classscore->pStudents;     while(fscanf(fp, "%s %s %lf %lf %lf\n", m->szID, m->szName,                     &m->darrScores[0], &m->darrScores[1], &m->darrScores[2]) == 5) {         m++;         classscore->nCount++;     }      return (*(classscore)).nCount;  } int main() {     FILE *fp;     CLASSINFOINFILE *Class, Class1;     CLASSSCORE *Stu, Stu1;      if(!(fp=fopen("DataForLab3.txt", "r+"))) {         printf("open error!\n");         exit(-1);     }     Class = &Class1;     STUDENTINFO Stu2[20];     Stu1.pStudents = Stu2;     Stu = &Stu1;     readtext(fp, &Class1, &Stu1);      return 0; }  以上是我改过的，你可以尝试一下； 对于你读文件的方式我感觉还是会有问题，主要看你的文件内容的格式了。 程序编译有很多警告和错误；指针和变量运用的还不是很熟；
user-0 提问: 关于C语言中数组大小的一个问题

回复:
user: user-1
content: char data[15]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};  改成：  char data[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};  里面是有16个元素

user: user-2
content: 你改成char[15]照理说会出现编译错误，因为你初始化的时候超过了数组边界