Question: 关于“静态变量不能跨函数使用”的一个疑问

这涉及c语言的变量存储类别，看看这个资料，很有用http://blog.csdn.net/libing403/article/details/72934528

http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

输出是正确的，但是不能保证总是正确的。变量i空间已经被释放了，在对i引用其内存单元的值已经没有意义。对变量i定义前加static就可以将i的内存空间申请在数据段，改变了i的生命周期。这样就可以正常引用了。

推荐程正冲老师的《C语言深度解剖》，真正的一劳永逸！

1、你的 i 不是静态变量，是一个局部变量，在栈上分配空间。  2、函数结束后，函数中的变量就销毁了，你指针指向的内容也就是无效的了。  3、结果只是看似正确，那是因为那片内存还没有被操作系统再次分配。

是不是代码少打了static

以上“但是”的太蛋疼，请忽略。。  建议看一下C Primer Plus 第12章的存储类，可以对静态和作用域有一个比较清晰的认识，然后你会发现你上面的论证没有什么意义，局部变量对外是不可见的，除非传递指针，并且局部变量默认是auto自动类型，也就是执行函数时分配内存，执行完后释放内存。 而静态的局部变量虽然可以在程序运行期间一直存在，但他依然是对外不可见的(指针传递除外)，而且要使用关键字static来声明，不然默认的就是auto自动类型。

建议看一下C Primer Plus 第12章的存储类，可以对静态和作用域有一个比较清晰的认识，然后你会发现你上面的论证没有什么意义，局部变量对外是不可见的，除非传递指针，但是局部变量默认是auto自动类型，也就是执行函数时分配内存，执行完后释放内存。 而静态的局部变量虽然可以在程序运行期间一直存在，但他依然是对外不可见的(指针传递除外)，但是要使用关键字static来声明，不然默认的就是auto自动类型。

你这个例子本身就不对题  “静态变量不能跨函数使用” 这句话也是有问题 确切的说“局部静态变量不能跨函数使用”，就算是这样子，我认为如此表述对新人也是很难令人理解的  说白了就是作用域的问题，跟普通局部变量的作用域一样 不同的是当第一次遇到该定义之后创建这个静态变量并且一直到程序结束都存在，假如第二次遇到就不会再继续创建了  总结：虽然局部静态变量在创建后一直存在，但是却只能在它的作用域中可用

1、你的 i 不是静态变量，只不过是一个局部变量  2、函数结束后，函数中的变量就销毁了，你指针指向的地址也就是无效的了  3、结果只是看似正确，那是因为那片内存还没有被覆盖


Question: 输入不超过６０个字符组成的英文文字,要求只对Ａ到Ｚ的字母重新排列，其它字符保持原来的状态

1.调用input,sort1,sort2传参的时候str不需要& 2.input函数里getchar(str[i]);又是啥？

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。


Question: “C的左值用是指用于标志一个特定的数据对象的名称或表达式” - 能否举个表达式的例子？

左值右值就是用来描述表达式的。  x // 这是一个表达式 *x // 这也是一个表达式

左值是引用某个对象的表达式，就是可以放在赋值左边的东西，如：*(p+1)=7, 没有名字的变量（*(p+1)表达式一定是一个类型的对象）被赋值了，但左值并不一定能被赋值，因为左值可以引用某个常量。 所有的引用都是左值。  右值是表达式的值（不是引用），可以放在赋值右面。  所有的左值都可以是右值，反之不成立  int i, j, *p;  i = 7; // Correct. A variable name, i, is an l-value.  7 = i; // ERROR. A constant, 7, is an r-value.  j * 4 = 7; // ERROR. The expression j * 4 yields an r-value.  *p = i; // A dereferenced pointer is an l-value.  const int ci = 7; // Declare a const variable.  ci = 9; // ERROR. ci is a nonmodifiable l-value

When a function's return type is lvalue reference, the function call expression becomes an lvalue expression:    #include <iostream> #include <string>   char& char_number(std::string& s, std::size_t n) {     return s.at(n); // string::at() returns a reference to char }   int main() {     std::string str = "Test";     char_number(str, 1) = 'a'; // the function call is lvalue, can be assigned to     std::cout << str << '\n'; }  http://en.cppreference.com/w/cpp/language/reference

引用 1 楼 adlay 的回复:比如 int *x = new int; *x 就是一个表达式,  可以赋值 *x = 10, *x 就是左值 请问*x叫什么表达式？取地址内容表达式？  3楼那个复制错了

引用 1 楼 adlay 的回复:比如 int *x = new int; *x 就是一个表达式,  可以赋值 *x = 10, *x 就是左值 C的左值用是指用于标志一个特定的数据对象的名称或表达式，能否举个表达式的例子？

请问*x叫什么表达式？取地址内容表达式？


Question: C语言的一个小错误，大神帮忙看看

楼主这个小程序，函数的入参没必要那么复杂。学生个数直接传递就可，学生信息的结构体用 指向结构体的指针就可以（仅一层），不用传递指向结构体指针的指针。 下面简单修改了下，仅供参考。  /*     日期：2017年1月1日     目的：学生信息管理系统      总结: 总结一下前面所学的知识  */   # include <stdio.h> # include <malloc.h>   struct student {     char name[100];        //姓名      int age;            //年龄     float score;        //成绩  };       void input(int , struct student *); void output(int , struct student *);   int main(void) {     int len;     struct student * only;     printf ("请输入学生个数：");     scanf ("%d", &len);           only = (struct student *)malloc(len * sizeof(struct student));           input(len,only);     output(len,only);     return 0; }   void input(int carry, struct student * bbq)                    //输入函数  {     printf("请输入学生个人信息：\n");     int i;     for (i=0; i< carry; ++i)     {         printf("学生姓名：");         scanf("%s", bbq[i].name);         printf("学生年龄：");         scanf("%d", &bbq[i].age);         printf("学生成绩：");         scanf("%f", &bbq[i].score);     } }   void output(int zeff, struct student * bbc)                    //输出函数  {     int i;      for (i=0; i<zeff; ++i)     {         //printf("系统已根据数据排列出学生情况,优秀在上\n");          printf("学生姓名：%s\n", bbc[i].name);         printf("学生年龄: %d\n", bbc[i].age);           //  printf("学生年龄: %d", *bbc[i].age);             printf("学生成绩：%f\n", bbc[i].score);     }       }

int * only;  改成：  struct student * only;   printf("学生姓名：%s\n", &bbc[i]->name);  改成：  printf("学生姓名：%s\n", bbc[i]->name);   printf("学生成绩：%d\n", bbc[i]->score);  改成  printf("学生成绩：%f\n", bbc[i]->score);

void input(int  carry, struct student * bbq)                    //输入函数  {     printf("请输入学生个人信息：\n");     int i;     for (i=0; i<carry; ++i)     {         printf("学生姓名：");         scanf("%s", bbq[i]->name);         printf("学生姓名：");         scanf("%s", bbq[i]->name);         printf("学生年龄：");         scanf("%d", &bbq[i]->age);         printf("学生成绩：");         scanf("%d", &bbq[i]->score);     } }  output input(len,only); output(len,only);  按照这样子改

大神可以具体一点吗，我是初学者，不懂啊

把参数的指针都去掉一层


Question: 路径中包含空格，什么情况下不需要用双引号括起来？

引用 2 楼 jianwen0529 的回复:环境问题啊 你system其实执行的是cmd命令吧 那你在控制台窗口输入有空格的必须用引号包含起来 但是c++中有需要一个字符串参数，所以再包一层引号最后多一个反斜杠吧  system("\"C:\\Users\\Public\\Music\\Sample Music\\1.mp3\"");  也就是cmd执行的是"C:\\Users\\Public\\Music\\Sample Music\\1.mp3\" 外层引号是函数参数指定字符串的需要这一句字符串，如果没有空格那完全就不需要了对吧

在不需要的情况下多输入了也是不行的，可能在某些场合是可以的，但是不是通用的。

凡是不需要用半角双引号括住的地方，你多括了，也不会有问题。我觉得。

adlay 所说的其实只是常见的规律，但实际上并不完全是这样。支持多个参数的命令行参数字符串，大多都是需要引号的。只传一个路径进去而不是需要参数的那种也不见得就一定不需要引号。某些特例还是需要自己去查阅资料的。

环境问题啊 你system其实执行的是cmd命令吧 那你在控制台窗口输入有空格的必须用引号包含起来 但是c++中有需要一个字符串参数，所以再包一层引号  system("\"C:\\Users\\Public\\Music\\Sample Music\\1.mp3\"");  也就是cmd执行的是"C:\\Users\\Public\\Music\\Sample Music\\1.mp3\"这一句字符串，如果没有空格那完全就不需要了对吧 外层引号是函数参数指定字符串的需要

只接受单个文件路径的无需引号, 如果是 程序+参数 的形式就需要, 因为程序和参数以及参数之间都是用空格来分割的, 路径中有空格就歧义了


Question: 求大神帮忙写一道c语言的题

引用 4 楼 Linglong_svip的回复:有谁能写出代码来，非常感谢，跪求 自己尝试去写下。。别人帮你写你永远都学不会。。

有谁能写出代码来，非常感谢，跪求

编程是解决问题的，不是用什么结构的。 选择什么算法和方式都是为了解决问题。  你这问题选择struct来存储自然是可以的

是这个思想，但是代码不会写啊

结构里面定义四个成绩和一个平均分，然后主函数里面分配大小为5的结构数组。


Question: 为什么打印不出来？？？急！！！！

你这个代码太长了。 你如果用管理员登录的话，然后添加功能它调用的是fun1，这里仅仅只是scanf到student了，并没有保存到文件。 你再重新打开软件用普通学生登录查看？

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

#define N 50  struct info {  char id[10];  char name[10];  int banji;  char zhuanye[10];  int math;  int chinese;  int english;  int computer;  float ave; }student[N]; int len;  char a[] = "123456", b[] =  "654321", c[] = "13579", d[] = "123456"; int login(int n) {     char e[20], f[20];     printf("\t**************welcome***************\n");     printf("\t***********学生成绩管理系统************\n");     printf("\t**************************************\n");       printf("请输入账号：");       gets(e);       printf("请输入密码：");       gets(f);     printf("请选择身份：");     printf("1-管理员,");     printf("2-学生:");     scanf("%d", &n);     fflush(stdin);     switch(n)     {  case 2:       while(strcmp(e, a) != 0)   {    printf("用户名不存在！\n");           printf("请输入账号：");           gets(e);           printf("请输入密码：");           gets(f);   }       while(strcmp(f, b) != 0)   {           printf("密码错误，请重新输入！\n");           printf("请输入密码：");           gets(f);   }       break;     case 1:      while(strcmp(e, c) != 0)  {           printf("用户名不存在！\n");           printf("请输入账号：");           gets(e);           printf("请输入密码：");           gets(f);  }      while(strcmp(f, d) != 0)      {           printf("密码错误，请重新输入！\n");           printf("请输入密码：");           gets(f);      }      break;  }  return n; } void home() {  printf("\t**************welcome***************\n");     printf("\t***********学生成绩管理系统************\n");     printf("\t**************************************\n"); } void function1() {  char ch[10];  char n[10];  int i, j;        void read();  read();     system("cls"); 	  printf("请输入自己的学号和要查询的课程\n");     scanf("%s %s", n, ch);  for (i=0; i<len; i++)  {   if (strcmp (n, student[i].id) == 0)   {    if(strcmp (ch, "math") == 0)    {     printf("%d\n", student[i].math);     break;    }    if(strcmp (ch, "chinese") == 0)    {     printf("%d\n", student[i].chinese);     break;    }    if(strcmp (ch, "computer") == 0)    {     printf("%d\n", student[i].computer);     break;    }    if(strcmp (ch, "english") == 0)    {     printf("%d\n", student[i].english);     break;    }   }  }           } void function2() {  void read();   char n[10];  int i;  system("cls");  read();    printf("请输入自己的学号\n");  scanf("%s", n);    for (i=0; i<len; i++)  {   if (strcmp(n, student[i].id) == 0)   { 	      printf(" math：%d chinese:%d english:%d computer:%d\n", student[i].math, student[i].chinese,     student[i].english, student[i].computer);      break;   }  }     } void function3() {     } void function0() {  exit(0); }   void fun1() {  int i;    system("cls");   printf("请输入要添加的个数：");    scanf("%d", &len);   printf("请依次输入学生的学号，姓名，班级，专业，4门课的成绩:\n");    for (i=0; i<len; i++)  {   scanf("%s%s%d%s%d%d%d%d",student[i].id, student[i].name, &student[i].banji, student[i].zhuanye, &student[i].math, &student[i].chinese,     &student[i].english, &student[i].computer);  }  printf("输入成功！\n"); }  void fun2() { 	int a; 	void f1();     void f2(); 	void f3(); 	void f4();  	printf("请输入查询要求："); 	printf("1-专业");     printf("2-班级"); 	printf("3-学号"); 	printf("4-课程"); 	scanf("%d", &a);  	switch(a) 	{ 	case 1:f1();break; 	case 2:f2();break; 	case 3:f3();break; 	case 4:f4();break; 	} 	 	 } //按专业查询 void f1() { 	char a[10];     int i; 	 	printf("请输入要查询的专业："); 	scanf("%d", a); 	 	for(i=0; i<len; i++) 	{ 		if(strcmp(a, student[i].zhuanye) == 0) 		printf("id:%s name:%s math：%d chinese:%d english:%d computer:%d\n",student[i].id, student[i].name, student[i].math, student[i].chinese,     student[i].english, student[i].computer); 	}  }  //按班级查询 void f2() { 	char a;     int i; 	 	printf("请输入要查询的班级："); 	scanf("%d", &a); 	 	for(i=0; i<len; i++) 	{ 		if(a == student[i].banji) 		printf("id:%s name:%s math：%d chinese:%d english:%d computer:%d\n",student[i].id, student[i].name, student[i].math, student[i].chinese,     student[i].english, student[i].computer); 	} }  //按学号查询 void f3() { 	char a[10];     int i, len;  	printf("请输入要查询的学号：");     scanf("%s", a);  	for(i=0; i<len; i++) 	{ 		if(strcmp(a, student[i].id)==0) 		{ 			printf("id:%s name:%s math：%d chinese:%d english:%d computer:%d\n",student[i].id, student[i].name, student[i].math, student[i].chinese,     student[i].english, student[i].computer); 		} 	} } //按指定课程查询  void f4() {     int i; 	char ch[10];  	printf("请输入要查询的课程：");     scanf("%s", ch);  	for (i=0; i<len; i++)  {    if(strcmp (ch, "math") == 0)    {     printf("%s %d\n", student[i].name, student[i].math);    }    if(strcmp (ch, "chinese") == 0)    {     printf("%s %d\n", student[i].name, student[i].chinese);    }    if(strcmp (ch, "computer") == 0)    {     printf("%s %d\n", student[i].name, student[i].computer);    }    if(strcmp (ch, "english") == 0)    {     printf("%s %d\n", student[i].name, student[i].english);    }   } }  //升序 /*void paixu1() { 	int i, j;  	for(i=0; i<len-1; i++) 	{ 		for (j=0; j<len-i-1; j++) 		{ 			if (student[i].) 		} 	} }*/  void fun3() {  char s[10];  int i, j;  char n[10], x;  system("cls");  printf("请输入要删除的学生的学号：");  scanf("%s", s);  for (i=0; i<len; i++)  {   if (strcmp(s, student[i].id) == 0)   {       printf("%s", student[i].id);       break;   }  }  printf("是否删除该学生成绩：y\n ");  scanf("%c", &x);  if(x=='y')  {   for(j=i; j<len; j++)   {    student[j] = student[j+1];     }   len = len - 1;   printf("删除成功。\n");  }   } void fun4() {  char s[10];  int i, j;  system("cls");  printf("请输入要修改的学生的学号：");  scanf("%s", s);  for (i=0; i<len; i++)  {   if (strcmp(s, student[i].id) == 0)   {    printf("id: %s name: %s banji : %d zhuanye: %s math：%d chinese:%d english:%d computer:%d\n", student[i].id, student[i].name,     student[i].banji, student[i].zhuanye, student[i].math, student[i].chinese,                student[i].english, student[i].computer);          printf("请重新输入该学生的相关信息：\n");    {     scanf("%s%s%d%s%d%d%d%d",student[i].id, student[i].name, &student[i].banji, student[i].zhuanye,      &student[i].math, &student[i].chinese, &student[i].english, &student[i].computer);    }    break;   }  }       } void fun5() { 	exit(0); } void fun6() {  FILE *fp1, *fp2;     int i, j;     system("cls");  if ((fp1 = fopen("data.txt", "wb"))==NULL)  {   printf("error");   exit(1);  }  for (i=0; i<len; i++)  {   fwrite(&student[i], sizeof(struct info), 1, fp1);  }    fclose(fp1);  fp2 = fopen("len.txt", "w");  fprintf(fp2, "%d", len);  fclose(fp2);  printf("保存成功\n");     } void fun0() { 	exit(0); }  void read() { 	FILE *fp1, *fp2; 	int i; 	if ((fp1 = fopen("data.txt", "rb"))==NULL)  {   printf("error");   exit(1);  }  for (i=0; i<len; i++)  {   fread(&student[i], sizeof(struct info), 1, fp1);  }  fclose(fp1);    fp2 = fopen("len.txt", "r");  fscanf(fp2, "%d", &len);  fclose(fp2);  }      void exe3() { begin:  int a, n, b, c;  char y;      a = login(n);      system("cls");      home();   while(1)   { 	  switch(a) 	  {          case 2:              printf("1-查询某门课程的得分\n");              printf("2-查询全部课程的得分\n");              printf("3-修改密码\n");              printf("0-退出");              scanf("%d", &b); 			 getchar();          switch(b) 		 {         case 1: function1(); break;         case 2: function2(); break;         case 3: function3(); break;         case 0: function0(); break; 		 }          break;          case 1:              printf("1-添加\n");              printf("2-查询\n");              printf("3-删除\n");              printf("4-修改\n");              printf("5-浏览\n");              printf("6-存盘\n");              printf("0-退出\n");              scanf("%d", &c); 			 getchar();          switch(c) 		 {          case 1: fun1(); break;          case 2: fun2(); break;          case 3: fun3(); break;          case 4: fun4(); break;          case 5: fun5(); break;          case 6: fun6(); break;          case 0: fun0(); break; 		 }          break;   	  }   } }  这是改了哈的，就是那个全局变量len，在我关了程序重新运行时，len有没有值了，可是存了文件的啊。

打印不出来，肯定是程序跑到那一步中断了。楼主单步跟一下，就知道了，比如：我单步跟到 a = login(n); 就会提示 n 没有初始化。  将n初始化后就可以继续调试下一步了……

引用 3 楼 qq_37171619 的回复:为什么会跳过啊？求大神。 看了2天了，还是不知道为什么，总觉得那个len没有被赋值一样。

给你个建议，如果你不会单步调试，可以在每一小段语句后面加输出语句，然后自己试下相关值是否正确，如果值和自己预期值一样，就说明语句没问题，否则就说明这段语句出问题了。  不要指望别人帮你把错误找出来，很多时候出问题都是需要自己去解决的。

为什么会跳过啊？求大神。

我觉得是那个循环没执行，可是我给那个len赋了值得啊。

打印不出来，一般都是输出语句被跳过了（前提是你的程序没什么其他语句错误），楼主去检查下你的你的判断条件是否正确。  实在不行，建议楼主单步调试下。


Question: 求大神帮忙看一道c语言struct结构的错误

最后的输入语句有问题吧，结构体里的int型数组不应该这样输入


Question: 帮忙看看哪错了，加一本书会多一个空的结构体。。。。

可能是initb里的while多循环了一次。 对于feof()这个函数, 它是先读再判断是否到文件尾, 也就是说在它之前一定要读一次才能做出判断     `while(!feof(P))//这是对的 {     printf("%s",s);//打印出每行数据     fgets(s,sizeof(s),P);//读取下一行 }`     `while(!feof(P))//这是错的 {     fgets(s,sizeof(s),P);//读取下一行     printf("%s",s);//打印出每行数据 }`     */

不要使用 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;  //... } 类似的例子还可以举很多。

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。


Question: 函数作用域

C++标准草案n4296  3.3.5 Function scope [basic.funscope] 1 Labels (6.1) have function scope and may be used anywhere in the function in which they are declared. Only labels have function scope.

这翻译的太恶心了

你看的是哪个翻译的，我也在看这本书是云颠工作室翻译的，怎么没有读到你这页，在第几章

不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

神翻译

引用 2 楼 BInzzz 的回复:[quote=引用 1 楼 hijack00 的回复:] `函数作用域（function scope）仅用于goto 语句的标签`这句话说不通啊，能把原话贴出来吗   就是这句，没搞懂。谢谢啦！！  [/quote]  我以为你看的是英文的，本来是期望你把英文上下文贴出来的的。这句话翻译的读起来都拗口。上面提到的关于goto标签与函数作用域的问题我到现在都没遇到过，其实你不必过分纠结这句话。

上下文相关，函数作用域应该是特指某类情况下。这句话写得如此晦涩还不如扔了 看后面的解释 就是说不管goto的标签声明在函数的哪里，在函数的任何地方都可以goto  例如下列函数 void func { //代码 //代码  goto Label;  //代码  Label:  int i = 10; }

引用 1 楼 hijack00 的回复:`函数作用域（function scope）仅用于goto 语句的标签`这句话说不通啊，能把原话贴出来吗   就是这句，没搞懂。谢谢啦！！


Question: 关于特殊字符串的读取。

去看看这几个函数open read close

尝试创建一个二维指针数组，然后用指针指向你想要读取的位置。

引用 3 楼 qq_37171619 的回复:[quote=引用 1 楼 user-2 的回复:] 尝试创建一个二维指针数组，然后用指针指向你想要读取的位置。 能说的详细点吗？[/quote] 比如说你有一串{{askdjaf}{aslfkckvm}{fvrhvdu}}这样的三行字符数组，你在开始的时候就应该设置一个2重循环来读写他的行和列，然后将你输入的值依次放在数组里面，然后通过行和列来查找你要读取的字符，然后从这里开始依次往下读取。

引用 1 楼 user-2 的回复:尝试创建一个二维指针数组，然后用指针指向你想要读取的位置。 能说的详细点吗？


Question: 关于文件的读写，急。

二进制写入，一个int就是四个字节的内存存入文件中。直接打开文本查看的时候，一般是两个字节一个汉字显示，所以出现乱码很正常。

再说一句，我读写的文件的时候，也读不出来。 void function2() {   void read();  read();     int i;  char n[10];     system("cls");  printf("请输入自己的学号\n");     scanf("%s", n);  for (i=0; i<len; i++)  {   if (strcmp(n, student[i].id) == 0)   {    printf("math：%d chinese:%d english:%d computer:%d\n", student[i].math, student[i].chinese,      student[i].english, student[i].computer);   }  } ｝

我感觉给你的一样啊，就是不能打印出来。  引用 6 楼 Potato_Lyy 的回复:楼主的代码是对的，打开文件查看是乱码是因为fwrite函数本身就是以二进制数据进行存储，想要查看所存储的数据可以使用fread函数。 我想问，为什读了文件后打印不出来？

#include <stdio.h>  #define N 1  struct info {  char id[10];  char name[10];  int banji;  char zhuanye[10];  int math;  int chinese;  int english;  int computer;  float ave; }student[N] = {"1", "li", 1, "hehe", 100, 100 ,100, 100, 100};  void write() {         FILE *fp = fopen("data.txt", "wb");         int i,len;         if(fp == NULL)         {                 printf("error\n");                 exit(-1);         }         for (i=0; i<N; i++)         {                 len = fwrite(&student[i], sizeof(struct info), 1, fp);         }         printf("save ok! len = %d\n",len);         fclose(fp); }  void read() {         FILE *fp;          int i;         if ((fp = fopen("data.txt", "rb"))==NULL)         {                 printf("error");                 exit(-1);         }         for (i=0; i<N; i++)         {                 fread(&student[i], sizeof(struct info), 1, fp);         }          printf("name = %s banji = %d zhunaye = %s nath = %d chinese = %d english = %d conputer = %d ave = %lf\n", student[0].name, student[0].banji, student[0].zhuanye,student[0].math, student[0].chinese, student[0].english, student[0].computer, student[0].ave);         fclose(fp); }    int main() {         write();         read();          return 0; }    我的这个是可以读写的，你的应该是哪里大意了 可以把对应数组的下标和值打印出来看看是不是你想要的值，查看文件是可以看的，并不是乱码的

可是我为什读文件后，打印不出来各科的成绩。

你把数组放大一点吧一个汉字2字节也就是8位，你最多就存一个字，而且你后面如果输入数据过大的话，也不应该用int要用long long int


Question: 这个程序哪里有问题，求指教！！！！！！！！！！！！！

上面忘记加括号了QAQ

int list(struct node **h) { *h=(struct node*)malloc(sizeof(struct node)); *h->date=9; *h->next=null; } list(&p);

#include<stdio.h> #include<stdlib.h>  struct node { 	int data; 	struct node *next; };  void list(struct node *h) { 	h->data = 9; 	h->next = NULL; 	return; }  int main() { 	struct node n, *p = &n; 	list(p); 	printf("%d", p->data); 	return 0; }

#include<stdio.h> #include<stdlib.h>  #define null 0  struct node { 	int data; 	struct node *next; };  int list(struct node *h) { 	h->data = 9; 	h->next = null; 	return 0; }  int main() { 	struct node n, *p = &n; 	list(p); 	printf("%d", p->data); 	return 0; }

你的那个 p 并不是指向分配的内存的首地址。  #include<stdio.h> #include<stdlib.h> #define null 0 struct node { int date; struct node *next; }; struct node * list(void) { struct node *h; h=(struct node*)malloc(sizeof(struct node)); h->date=9; h->next=null; return h; } int main() { struct node *p; p=list(); printf("%d",p->date); }

引用 2 楼 q3733353520 的回复:把p传进去以后，h本身是和p是指向同一个地址。 但是执行malloc以后h的地址改变了，所以到最后,p还是指向之前的地址，而h才是指向的结构体的首地址。 #include <stdio.h> #include <stdlib.h> #define null 0  struct node  { 	int date; 	struct node* next; };  void list (struct node* h) { 	h->date = 9; 	h->next = NULL;  }  int main () { 	struct node* p; 	list(&p); 	printf ("%d",&p->date); 	 	free(p); 	return 0; }  参考此代码，可以正常实现list的函数功能，本人感觉define null 0是没必要的，NULL似乎也就是0 的意思。


Question: 怎么用c语言编写一个检测统计电脑上的软件使用频率的程序

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Management\ARPCache\* 不一定对，仅供参考。

引用 1 楼 zhao4zhong1 的回复:Windows的注册表里面本来就有电脑上软件使用频率信息。 请教赵老师，这些注册表信息应该在哪里获取

Windows的注册表里面本来就有电脑上软件使用频率信息。


Question: 这个n为什么不计数呢？假设n=0

没有上下文，谁知道你n是哪儿来的，还有不复制肯定就是没运行那语句

你不是直接把 j 的值赋值给 n 了吗？为什么计数？


Question: 请问c++里面全局变量是不是默认为静态的？

全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式， 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序， 当一个源程序由多个源文件组成时，非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域， 即只在定义该变量的源文件内有效， 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内，只能为该源文件内的函数公用，因此可以避免在其它源文件中引起错误。

我认为C语言的存储类很好的说明了这一点：  静态是指存储时期，就是何时加载，全局变量在C语言学习中指的是外部链接的静态，外部链接，顾名思义就是可供其他文件调用， 但是需要做引用声明。而上面所说的静态应该就是我们C语言中所说的具有内部链接的静态，意思就是只可在本文件中使用，易语言中叫程序集变量。  以上是C语言知识，没有学过C++，仅供参考。

说一下比较明显的区别，静态在程序被加载到内存中就创建了，而全局变量需要在调用了构造函数之后才会进行创建。希望能理解。

两者是不同的。

默认是external 参考http://stackoverflow.com/questions/4239834/global-variable-in-c-are-static-or-not

全局和静态可没有任何关系哟

不是  全局静态变量要加上static，只在本文件中使用

全局是全局，静态是静态


Question: 这个程序到底那里出错了

关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

你这个程序是不是没打完？？ 好多变量名，函数名都没定义。 还有，注意下格式，我都看到你有些括号都漏掉了

使用VS打开源文件，看智能提示。 修改完之后，编译，看错误信息。

先自己用断点调试一下吧，不过我估计你是不是下面没有创建无名数组就在开始写函数啦？


Question: C语言简单输入格式

好吧，虽说还是没懂，谢了

撸码的人不教学，教学的人不撸码。

scanf(“%c%c”,&c1,&c2); printf(“%c%c”,c1,c2);

我在VS下试过，虽然能正确读入，但是最终导致程序崩溃 出题人脑子有坑

引用 2 楼 qq_36790578 的回复:%4c怎么整的 %d，%s知道，这%4c怎么回事，用处在哪，输入一个字符不就完了， 意思一样啊，取四个字符作为一个输入 不过这样子读入char字符，难保发生什么不可预料的后果


Question: 求离散数学的答案

个人感觉还是国外的离散，写的比较好


Question: C语言理论题（初学）

这个题目确实不够严谨。  它的意思是int的长度是16位的，而long的长度是32位的。  y = ( x = 32767, x - 1 );  逗号表达式从左到右计算，x赋值为32767，然后x-1的值作为逗号表达式的结果并赋给y。  z = m = 0xFFFF  0xFFFF是16进制的表达方法，因此m的值就是65535。  而z是16位整型，其取值范围是[-32768,32767]，因此65535实际上就是-1，因为65535的原码与-1的补码相同。

这个题目根本就不对。它其实考你int类型的长度，是否存在上下溢，但是这个和你的机器的字长毫无关系，这个是编译器决定的。出题的人显然基础知识不过关。 第一个问题可以得到32766，因为逗号表达式从左往右求值，结果是最后一个表达式。所以x先等于32767，此时x-1=32766，作为表达式的值传给y，所以y也是32766。 这是问答上的人回我的 16微机这个不是指机器字长吗， 0xffff这种格式什么意思，还是不懂

16位上int型就是16位的,所以0xffff就是-1, 而long是32位的，0xffff是正数

还有就是这个地方问答怎么我提交了问题，显示别人回答了，我再去点就点不开了，感觉被删除了，

这个16微机了这些数据类型会有什么变化

题目有问题，没说是有符号整型


Question: Windows Socket实现通信聊天 ,WSAGetLastError报错10061.求助!

对端没有accept就直接closesocket了。

是阻塞的问题吗?

10061 由于目标机器积极拒绝，无法连接。


Question: 请帮忙看看这个代码哪里有问题，非常简单的利用asc码比较两个字符但是好多人说不出所以然

终于明白了，因为空格也是字符，也有asc值

两个%c之间加空格，那么你输入的两个字符之间也要加空格


百度搜相关关键字。


Question: 用链表 注册登录，存到文件。。。。。

连接链表部分不对，弄个cur指针记录最后一个结点的地址，然后cur->next = t;连接上新malloc的结点（尾插法）  people* initp() { 	people *head, *cur; 	head = (people*)malloc(sizeof(people)); 	head->next = NULL; 	cur = head; 	FILE *fp; 	fp = fopen("people.dat", "r"); 	while (!feof(fp)) 	{  		people *t; 		t = (people*)malloc(sizeof(people)); 		fread(t, sizeof(people), 1, fp); 		puts(t->name); 		if (feof(fp)) 			break;  		cur->next = t; 		cur = t;  	} 	t->next = NULL; 	fclose(fp);  	return head; }

t->next= NULL; // head->next; 这里有点问题 head->next=t;


Question: 关于Makefile代码运行

用nmake


Question: UVa1368 DNA序列 学过C语言的帮我看一下问题在哪里，怎么改好吗？

引用 3楼赵4老师 的回复:%c和%C不是一回事！改回来了…%C没有影响（虽然语法上是不对，不过可能我用的是cpp，c++有出入吧）…是语意错误

%c和%C不是一回事！

//Ps：自己测试过的中间数据，输入计算好像没有问题，可能在输出这一块，试过好多种方法了


Question: [Error] variable-sized object `a请问这个怎么解决，学C新手

直接使用malloc不是也可以吗，何必一定要写成a[b]的数组形式。 http://beyond316.blog.51cto.com/7367775/1229644/

一定要在windows上的话，可用Cygwin

Windows编译器完美支持gcc的推荐下

若你是vc，这实现不了！若是gcc，把初始化的那个(也就是 = {2})去掉即可

当然，gcc的话允许动态长度的数组，但是不能像a[n] = {0} 这样初始化

变量不能赋值给常量的，数组的长度也必须是静态的


Question: vs2012写入位置0xCCCCCCCC 时发生访问冲突.

你对输入的理解不太对啊，参数列表都没有对应上，你对照着改一下  printf ("需要添加一个学生信息吗(y/n)\n"); scanf ("%c",&Temp);  if (Temp == 'y' || Temp == 'Y') { 	printf ("准备接受学生信息...\n");  	printf ("请输入学生姓名\n"); 	scanf ("%s",Student1.name); 	printf ("请输入学生学号\n"); 	scanf ("%ld",&(Student1.Student_ID)); 	printf ("请输入学生性别\n"); 	scanf ("%s",Student1.sex); 	printf ("请输入学生年龄\n"); 	scanf ("%d",&(Student1.age)); 	printf ("请输入学生班级\n"); 	scanf ("%s",Student1.squad)  如果变量是一个数组，数组名就代表了首地址没所以不用加地址符&，其他的类型读取数据的变量前都要加&

在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

该过之后还是一样 的错误，估计错误不在于输入Temp的时候

scanf ("%s",&Temp); 改成 scanf ("%c",&Temp);


Question: user.txt中存放了120万余条用户编号(user_id)、密码(password)的记录。

仅供参考：#include <stdio.h> #include <stdlib.h> #include <time.h> unsigned long ulrand(void) {     return (      (((unsigned long)rand()<<24)&0xFF000000ul)     |(((unsigned long)rand()<<12)&0x00FFF000ul)     |(((unsigned long)rand()    )&0x00000FFFul)); } unsigned __int64 ullrand(void) {     return (      (((unsigned __int64)ulrand())<<32)     | ((unsigned __int64)ulrand())); } int i; unsigned long ul; unsigned __int64 ull; void main() {     srand(time(NULL));     for (i=0;i<10;i++) {         ul=ulrand();         printf("%010lu 0x%08x\n",ul,ul);     }     for (i=0;i<10;i++) {         ull=ullrand();         printf("%020I64u 0x%016I64x\n",ull,ull);     } } //3971076432 0xecb1d150 //2433428051 0x910b2a53 //1415415336 0x545d8628 //1312330759 0x4e389407 //1845758378 0x6e0409aa //0008069933 0x007b232d //4202720757 0xfa806df5 //2669855255 0x9f22c217 //0312068736 0x1299ca80 //2084555989 0x7c3fccd5 //03502077880857307931 0x3099e1472040ab1b //16884702393146816355 0xea52835e19b43763 //01877364819396611730 0x1a0dbd5b45f34e92 //07839440151924835771 0x6ccb4948756a05bb //09471412086917299176 0x8371371c820bfbe8 //04411255971577469925 0x3d37edef2f321be5 //13735846279546091130 0xbe9f876a65b7367a //04512980766520059820 0x3ea15418aa9927ac //15821377118299441610 0xdb90d2a9f1bb49ca //15512417228822200185 0xd7472d480398bf79

引用 楼主 nikew 的回复:读取user.txt，使用链表存放，使用顺序查找，随机生成2000个user_id（1～1,230,000之内的），再随机生成20个user_id（大于1,230,000的），输出查找所花总时间。  讲的不是很清楚。user.txt里面存储的是user_id？随机生成的user_id作为查找的关键字？


Question: 学完了C语言的全部语法，下一步应该看什么书？

《深入理解C指针》 《C语言点滴》 《C语言课程设计案例精编》 C语言程序开发范例宝典 C语言经典编程282例

对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）

C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817

先看别人的代码吧，既然基础语法都学会了，就没必要在花时间去看前4本的书，那些都是将基础语法写的很完整的书，但是后面的书只会基础语法也是根本看不懂的，所以不要认为书看得多就好。代码才是。

多做东西才行，不做东西，看再多书都不行

要动手敲代码，做项目


Question: C语言想问问指针的一个小问题

O(∩_∩)O谢谢帮忙，万分感谢！

有区别的 p = &i;    //将i的地址赋值于p *p = i;    //将i的值赋值于p指向的地址


Question: 关于随机数

随机必然有重复，所谓“不重复的随机”实际上是洗牌。洗牌算法参考下面： #include <stdio.h> #include <stdlib.h> #include <time.h> int d[6]; int i,n,a,b,t; int c,j; void main() {     srand(time(NULL));     printf("shuffle 0..n-1 demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=0;i<n;i++) d[i]=i;/* 填写0～n-1 */             for (i=n;i>0;i--) {/* 打乱0～n-1 */                 a=i-1;b=rand()%i;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=0;i<n;i++) printf("%d",d[i]);             printf("\n");         }     }     printf("shuffle 1..n demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=1;i<=n;i++) d[i]=i;/* 填写1～n */             for (i=n;i>1;i--) {/* 打乱1～n */                 a=i;b=rand()%i+1;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=1;i<=n;i++) printf("%d",d[i]);             printf("\n");         }     } }

可以这样 省去循环查找的事情，用一个int [33]的数组，初始化全0，每生成一个对应的数，先判断该index下的数是否为0，是说明还没有这个数字，将其置1，同时存入这个数

呵呵，你也可以将随机数最后一个字节清零，再加上数组33的 索引值嘛

#include<stdio.h> #include<time.h> #include<stdlib.h>   int main() { 	int s[33]={0}; 	int i,a,j,b,k,c,d; 	i=0,j=0,d=0; 	srand((unsigned)time(NULL)); 	while(j!=33) 	{ 		a=rand()%31; 		for(j=0;j<=i;j++) 		{ 			 			if((a!=s[j])&&(j==i)) 			{ 				s[i]=a; 			} 		} 		while(d!=3333) 		{ 			c=rand()%31; 			for(k=0;k<=i;k++) 			{ 				if(c==s[k]) 				{ 					d=9999; 					break; 				}else{ 					if(k==i) 					{ 						s[i]=c; 						d=3333; 					} 				} 			} 		} 		i++; 	} 	for(i=0;i<=32;i++) 	{ 		printf("%d\n",s[i]); 	} }

引用 4 楼 qq423399099 的回复:http://www.jb51.net/article/66365.htm 这个不错。 总结一下思路，就是数找个数组放好，然后随机取出来，取一个，数组少一个。 数组为空时也就计算结束了。 当然，这种问题即使使用Sinox操作系统也得自己慢慢探索。

[1,32] 都扔到数组里，然后 shuffle 一下数组，然后按顺序读就行了。


Question: 关于printf和char的问题

引用 1 楼 heyuhang112 的回复:因为你是个循环，，循环读入，然后输出每一个字符，当然你看到的就是一个字符串 scanf是要你按了回车后才开始一个一个的读的

因为你是个循环，，循环读入，然后输出每一个字符，当然你看到的就是一个字符串

引用 3 楼 FelixKYD 的回复:[quote=引用 2 楼 heyuhang112 的回复:] [quote=引用 1 楼 heyuhang112 的回复:] 因为你是个循环，，循环读入，然后输出每一个字符，当然你看到的就是一个字符串 scanf是要你按了回车后才开始一个一个的读的[/quote]  就是说，我输入字符串的时候，这些字符串都存在缓存里了，我按回车后，scanf从缓存中每次只读一个字符，赋值给i，然后马上打印，指导发现字符串中有“1”才停下，对吧？ [/quote] 对，就是这样！

单步一下就清楚了。 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

你的变量 i 会依次接收到 'a' ，输出'a'， 接收到's'， 输出's'............  最后i 中存的只是最后那个字符，但中间会依次接收到各个字符，并输出这个字符

引用 2 楼 heyuhang112 的回复:[quote=引用 1 楼 heyuhang112 的回复:] 因为你是个循环，，循环读入，然后输出每一个字符，当然你看到的就是一个字符串 scanf是要你按了回车后才开始一个一个的读的[/quote]  就是说，我输入字符串的时候，这些字符串都存在缓存里了，我按回车后，scanf从缓存中每次只读一个字符，赋值给i，然后马上打印，指导发现字符串中有“1”才停下，对吧？


Question: 关于fread用指针读入结构体文件问题

引用 1 楼 user-1的回复:pLogin=(struct People*)malloc(sizeof(struct People)); 这只申请了存一个结构体的空间 试试 pLogin = (struct People *)malloc(sizeof(struct People) * 2); 刚才试了，确实可以了，在学链表的时候不够深入，谢谢了


Question: 大神请看过来！使用Visual C++6.0运行程序时出现程序停止工作的提示，哪位大神知道咋回事？

我刚刚也发现了，很尬尴谢谢啦！

if(strcmp(string,str[2]<0)) 右括号位置错了


Question: 多组输入怎么一次性输入一次性输出

scanf("%d",&n); while(n--){ ......}  是这个意思吗？

使用命令重定向操作符可以使用重定向操作符将命令输入和输出数据流从默认位置重定 向到不同的位置。输入或输出数据流的位置即为句柄。  下表将列出可用的句柄。  句柄      句柄的数字代号 描述 STDIN     0              键盘输入 STDOUT    1              输出到命令提示符窗口 STDERR    2              错误输出到命令提示符窗口 UNDEFINED 3-9            这些句柄由应用程序单独定义，并且是各个工具特定的。  数字 0 到 9 代表前 10 个句柄。可以使用命令 Cmd.exe 运行程序并将该程序前 10 个 句柄中的任何一个重定向。要指定想使用的句柄，可在重定向操作符前面键入该句柄的 数字。如果未定义句柄，则默认的 < 重定向输入操作符是 0，而默认的 > 重定向输出 操作符是 1。键入 > 或 < 操作符之后，必须指定要读取或写入数据的位置。可以指定 文件名或另一个现有的句柄。  要指定重定向到现有句柄，请使用与 (&) 字符，后面接要重定向的句柄号 （例如 &句柄#）。例如，下面的命令可以将句柄 2（即 STDERR）重定向到 句柄 1（即 STDOUT）：  2>&1  下表列出了可用于将输入和输出数据流进行重定向的操作符。  重定向操作符 描述 > 将命令输出写入到文件或设备（例如打印机）中，而不是写在命令提示符窗口或句柄中。 < 从文件中而不是从键盘或句柄中读入命令输入。 >> 将命令输出添加到文件末尾而不删除文件中的信息。 >& 将一个句柄的输出写入到另一个句柄的输入中。 <& 从一个句柄读取输入并将其写入到另一个句柄输出中。 | 从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。  默认情况下，可以从键盘将命令输入（即 STDIN 句柄）发送到 Cmd.exe，然后由 Cmd.exe 将命令输出（即 STDOUT 句柄）发送到命令提示符窗口。  重定向输入 (<) 要将键盘输入重定向到文件或设备，请使用 < 操作符。例如，要从 File.txt 获取 sort 命令的输入，请键入：  sort<file.txt  File.txt 的内容将以字母顺序列表的方式显示在命令提示符窗口中。  < 操作符可以打开具有只读访问的指定文件名。所以，不能使用该操作符向文件中写入 信息。例如，如果以 <&2 启动程序，则所有试图读取句柄 0 的操作都将失败，因为句 柄 2 最初是以只写访问打开的。   注意  0 是 < 重定向输入操作符的默认句柄。 重定向输出 (>) 几乎所有的命令都将输出发送到命令提示符窗口。即使将输出发送到驱动器或打印机的 命令也会在命令提示符窗口显示消息和提示。  要将输出从命令提示符窗口重定向到文件或设备，请使用 > 操作符。可以在许多命令中 使用该操作符。例如，要将 dir 输出重定向到 Dirlist.txt，请键入：  dir>dirlist.txt  如果 Dirlist.txt 不存在，Cmd.exe 将创建该文件。如果 Dirlist.txt 存在，Cmd.exe 将使用 dir 命令的输出替换文件中的信息。  要运行 netsh routing dump 命令，然后将输出发送到 Route.cfg，请键入：  netsh routing dump>c:\route.cfg  > 操作符可以打开具有只写访问属性的指定文件。所以，不能使用该操作符读取文件。 例如，如果使用重定向 >&0 启动程序，则所有试图写入句柄 1 的操作都将失败，因为 句柄 0 最初是以只读访问打开的。   注意  1 是 > 重定向输出操作符的默认句柄。 复制句柄 重定向操作符 & 可以将输出或输入从一个指定句柄复制到另一个指定的句柄。例如， 要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt，请键入：  dir>c:\file.txt 2>&1  复制句柄时，可以复制该句柄原状态的所有特性。例如，如果一个句柄具有只写访问的 属性，则该句柄的所有副本都具有只写访问属性。不能将一个具有只读访问属性的句柄 复制到另一个具有只写访问属性的句柄。  使用 & 操作符重定向输入和副本 要将重定向输入操作符 (<) 与复制操作符 (&) 一起使用，指定的文件必须已经存在。 如果输入文件存在，Cmd.exe 将以只读方式打开该文件，然后将文件中包含的字符作为 输入发送到此命令（如同从键盘输入一样）。如果指定了句柄，Cmd.exe 将指定的句柄 复制到系统现有的句柄中。  例如，要以句柄 0 输入读取（即 STDIN）的方式打开 File.txt，请键入：  <file.txt  要打开 File.txt，并在内容排序后将输出发送到命令提示符窗口（即 STDOUT），请键入：  sort<file.txt  要查找 File.txt，然后将句柄 1（即 STDOUT）和句柄 2（即 STDERR）重定向到 Search.txt，请键入：  findfile file.txt>search.txt 2<&1  要以句柄 0 输入读取（即 STDIN）的方式复制用户定义句柄 3，请键入：  <&3  使用 & 操作符重定向输出和复制 如果将输出重定向到文件且指定了现有的文件名，Cmd.exe 将以只写方式打开文件并覆 盖该文件内容。如果指定了句柄，Cmd.exe 将文件复制到现有句柄中。  要将用户定义句柄 3 复制到句柄 1，请键入：  >&3  要将包括句柄 2（即 STDERR）的所有输出从 ipconfig 命令重定向到 句柄 1（即 STDOUT），然后将输出重定向到 Output.log，请键入：  ipconfig.exe>>output.log 2>&1  使用 >> 重定向操作符追加输出 要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息，请使用两个连续 的大于号（即 >>）。例如，下面的命令可以将由 dir 命令生成的目录列表追加到 Dirlist.txt 文件：  dir>>dirlist.txt  要将 netstat 命令的输出追加到 Tcpinfo.txt 的末尾，请键入：  netstat>>tcpinfo.txt  使用管道操作符 (|) 管道操作符 (|) 可以提取一个命令的输出（默认情况下是 STDOUT），然后将其导入另 一个命令的输入中（默认情况下是 STDIN）。例如，下面的命令将对目录分类：  dir | sort  在本例中，将同时启动两个命令，但随后 sort 命令会暂停，直到它接收到 dir 命令 的输出为止。sort 命令使用 dir 命令的输出作为输入，然后将输出发送到 句柄 1（即 STDOUT）。  合并带重定向操作符的命令 可以通过合并带有其他命令和文件名的筛选器命令创建自定义命令。例如，可以使用以 下命令存储包含“LOG”字符串的文件名:  dir /b | find "LOG" > loglist.txt  dir 命令的输出通过 find 筛选器命令发送。包含字符串 "LOG" 的文件名作为文件名 列表（例如，NetshConfig.log、Logdat.svd 和 Mylog.bat）存储在文件 Loglist.txt 中。  要在相同命令中使用多个筛选器，请使用管道 (|) 分隔筛选器。例如，下面的命令将 搜索 C 盘上的每个目录以查找包含 "LOG" 字符串的文件名，并且在命令提示符窗口中 每次显示一屏：  dir c:\ /s /b | find "LOG" | more  利用管道 (|) 可以将 Cmd.exe 导向为通过 find 筛选器命令发送 dir 命令输出。 find 命令只选择包含字符串 "LOG" 的文件名。more 命令可以显示由 find 命令选择 的文件名（在命令提示符窗口中每次显示一屏）。有关筛选器命令的详细信息，请参阅 使用筛选器。

引用 1 楼 user-3 的回复:#include<stdio.h> void main() { 	int i,a,n; printf("需要输入多少个数\n"); scanf("%d",&n); for(i=0;i<n;i++) {  printf("输入元素：\n");    scanf("%d",&a);    printf("输入元素：");    printf("%d\n",a);  } } 是这个意思吗？不知道，也许是的，，，，，我试试去，我的题目要求是输入好多字符串 应该也类似吧


Question: 怎么复制文件内容的同时输出进度百分比? 新手求助

int file_size(char* filename)   {       FILE *fp=fopen(filename,"r");       if(!fp) return -1;       fseek(fp,0L,SEEK_END);       int size=ftell(fp);       fclose(fp);              return size;   }    上述方法利用fseek移动一个文件的存取位置到文件的末尾，然后利用ftell获得目前的文件访问位置。

这个简单，首先你可以用fseek和ftell得到文件的大小，之后按照你写的程序一个字节一个字节地复制，那么你可以定义一个变量用于计算你复制到第几个字节了，有大小和现在复制地字节数，显式个百分比就很容易了。


Question: 下面的代码有什么错啊？小吧求助

注意=和==优先级

LZ是不是想输入两文件名~然后一个字节一个字节copy并显示到另一个文件？  in=fopen(infile, "r"); 	if (in == NULL) 	{ 		printf("can not open the file!\n"); 		exit(0); 	} 	out=fopen(outfile, "w"); 	if (out== NULL) 	{ 		printf("can not open the file!\n"); 		exit(0); 	}

if(in=fopen(infile,"r")==NULL)  改成：  if((in=fopen(infile,"r"))==NULL)  同理把这句也改了：  if(out=fopen(outfile,"w")==NULL)


Question: 习语言数据库程序欣赏

英译汉

引用 8 楼 paschen 的回复:C语言的代码更有欣赏价值...  用英文写起来更简洁  if 和 如果， 我就觉得if看着舒服，打字也快...  整数类型 主函数()  和  int main() 肯定后面的有欣赏性吧

你这真算不上代码,  这3型文法就能处理的一点点小玩意, 用脚本写也就200行的事情,  值得你到处吹么,  无聊死了..

习惯问题，看书看文档习惯中文，看程序习惯英文，为什么不能反过来呢？

字太密集看起来会累。

辣眼睛！

引用 12 楼 paschen 的回复:[quote=引用 8 楼 paschen 的回复:] C语言的代码更有欣赏价值...  用英文写起来更简洁  if 和 如果， 我就觉得if看着舒服，打字也快...  整数类型 主函数()  和  int main() 肯定后面的有欣赏性吧[/quote]  都还好啊！ 程序主要的目的不是为了欣赏。

引用 2 楼 mLee79 的回复:看着头就晕,  这样发广告也没事.你意志力不好，看了一点代码就头晕，编程和你无缘，早日改行吧.

引用 8 楼 paschen 的回复:C语言的代码更有欣赏价值... 是哪里做的不好没了欣赏价值？

看着头就晕,  这样发广告也没事.

楼上这么多头晕的，看来熬夜多，睡眠少，体质下降的太厉害啦！怪不得说IT是高危行业，都不珍惜自己身体怎么行？

看着头就晕,  这样发广告也没事.

看着头就晕,  这样发广告也没事.

看着头就晕,  这样发广告也没事.

C语言的代码更有欣赏价值...

看着头就晕,  这样发广告也没事.


Question: 关于printf的转换说明修饰符lf和Lf有没有区别？

提醒：printf是开源的，参考其源代码C:\Program Files\Microsoft Visual Studio 1x.0\VC\crt\src\output.c

%lf和%f是相同的，对应double，Lf对应long double double和long double是不同的类型，但有时候存储方式是一样的。

%Lf 是对应long double  %lf是double  输出的时候你可能感觉不到不同，但输入(scanf)的时候就有明显区别

有区别。  ===============  但是 double 和 long double 有时候在内部表示上没有区别。


Question: 在Ubuntu x64系统下怎么编译出源程序的arm平台版本？

引用 1 楼 user-2 的回复:修改Makefile中的CC变量，或者敲make是指定其值 make CC=arm-linux-gnueabi-gcc 吗？

引用 2 楼 mLee79 的回复:./configure --host=arm-linux-gnueabi 我执行该命令时，报错：error: invalid option "--host=arm-linux-gnueabi"

./configure --host=arm-linux-gnueabi

修改Makefile中的CC变量，或者敲make是指定其值


Question: 上位機4字節16進制轉10進制浮點型-測試成功

下位机要使用32位吗？


Question: 这个程序哪里有问题吗？

for循环那里有问题

scanf("%d%s%c%s%d",&w[i].num,w[i].name,&w[i].sex,w[i].part,&w[i].phone);这样不行的 改成scanf("%d%s%*c%c%s%d", &w[i].num, w[i].name, &w[i].sex, w[i].part, &w[i].phone); 输入的时候分成五行来输入，比如： 1 zhang w houqin 9877 2 wang w jingli 9877  #include<string.h> #include<stdio.h> struct worker { 	int num; 	char name[10]; 	char sex; 	char part[10]; 	int phone; }; void main() { 	void change(struct worker s[]); 	struct worker w[5]; 	int i; 	printf("请输入五个职工的职工号码、姓名、性别、部门、电话：\n"); 	for (i = 0; i<5; i++) 	{ 		scanf("%d%s%*c%c%s%d", &w[i].num, w[i].name, &w[i].sex, w[i].part, &w[i].phone); 	} 	change(w); } void change(struct worker s[]) { 	int i; 	char b[10] = { "houqin" }; 	for (i = 0; i<5; i++) 	{ 		if (strcmp(s[i].part, b) == 0) 		{ 			s[i].phone = 9800; 			printf("职工号码：%d姓名：%s性别：%c部门：%s电话：%d\n", s[i].num, s[i].name, s[i].sex, s[i].part, s[i].phone); 		} 	} }

一般出现什么烫这种字，多半是取字符的时候，所在的内存为空，一直向后读取字符串直到遇到/0，就会一直读出烫字。  改成scanf("%d %s %c %s %d",&w[i].num,w[i].name,&w[i].sex,w[i].part,&w[i].phone);//加一空格 添加的时候 一行写5个 每个之间必须空一格


Question: 结构体赋值问题

用vs2010没有问题。

如果变量i和j是有效的，那可能是你编译器的问题，换下一个比较新的编译器，或者使用memcpy来进行复制

我这里VS2013可以的，楼主编译器可能真的比较老吧。 考虑用memcpy?

提示说是实体问题的话，可能是你的 i 和 j 哪里有问题，把 i 和 j 就改成常数试试

这种用法是可以的。。应该是你的编译太老了。。


Question: C语言字符串结尾可以用\n判断吗

引用 14 楼 qq_41555428 的回复:可以的，不接受反驳，直接上代码 #include <stdio.h> int fac(char ch) {     int sum=0;     ch=getchar();     while(ch!='\n')     {         sum++;         ch=getchar();     }     return sum; } int main() {     char ch;     printf("%d",fac(ch));     return 0; }我这个是计算字符串长度的

这样是不可以的

应该是不可以的，因为系统自动识别‘\0’作为字符串结束标志的，除了‘\0’,无其他结束标志了

一般不这样用，除非你的字符串比较特殊

引用 8 楼 shihengzhen101 的回复:字符串的结尾只能'是'\0','\n'是回车不能用来判断结束，一个字符串中可以有若干个回车 说错了，\n是换行

不可以，后面要加\0

你可以用任何一种分隔符作自己的业务处理。\0只是大多数字符串处理函数所认可的结束符。

不可以

不可以呀，/n是换行

引用 3 楼 CharlesSimonyi 的回复:当然可以，但是\n后面还是要有一个\0 而且\n你得自行添加 另外如果你的字符串需要换行\n怎么办 这不是自找麻烦。。

你的字符串中根本就不存在\n这个元素。

\n是回车。后面有字符串会显示在第二排


Question: 像这种编程语言中的二进制数如何转换

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

原码  补码  反码

如果你说的是某带符号整数的8位补码表示为10000001，那么答案是-127 因为是带符号数,所以最左边的1表示负数；然后除最左边一位外,全部取反,末位加1.故为-127

左侧第一个“1” 表示的是数字的符号 0为正数 1为负数  取反后 1*2^6＋1*2^5 1*2^4 1*2^3 1*2^2 1*2^1 1*2^0=127

有符号数一般是用补码表示的 如果没学过的话 建议你可以看看《深入理解计算机系统 》 的第二章 里面对这方面说的很详细


Question: 谁帮我看下这个程序怎么理解，

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

引用 1 楼 jianwen0529 的回复:while (i++<x){ // 进入时： i++ 返回的是 0，1，2......    if(i%2==0) // 但是此时你的 i 值已经变化了，是从 1 开始，i = 1，2，3......               putchar('-');    else               putchar('+');   }谢谢了，我懂了


Question: 堆数组指针释放报错

引用 6 楼 cutmelon 的回复:内存越界啊，假设你这是32位程序，TCHAR **a = (TCHAR**)malloc(sizeof(TCHAR*));这里其实相当于 TCHAR *a[4]; 然后你在RegEnum_Key里申请内存，data[i]这里的i必须超过4吧？ 测试的时候 确实是4个成员

引用 4 楼 qq423399099 的回复:二维数组一般这样：  int **a; int i; a = (int **)malloc(sizeof(int *)*5); for (i=0; i<5; i++)     a[i] = (int *)malloc(sizeof(int)*3);  你没看完代码  上面还有 - -  我的意思是 释放堆内存的问题. 我在main函数中初始化**a ,在RegEnum_Key函数中为成员分配的

引用 1 楼 qq423399099 的回复:你需要为每个指针也分配空间才行，类似这样：  for (ca = 0; ca < 4; ca++) 		a[ca] = (TCHAR*)malloc(sizeof(TCHAR) * 64);  难道在函数中动态分配的堆内存不在其他函数中释放? 不科学啊

引用 1 楼 qq423399099 的回复:你需要为每个指针也分配空间才行，类似这样：  for (ca = 0; ca < 4; ca++) 		a[ca] = (TCHAR*)malloc(sizeof(TCHAR) * 64);  函数内部已经循环分配了


Question: makefile编译的可执行文件跑起来有段错误

动态库与静态库混用了？！你编的动态度，用的系统的静态度？ 只是大致的揣测一下


Question: C单链表怎么加查询功能

你输入链表的地方其实就是不对的，scanf("%d,%s,%s",&p1->num,&p1->name,p1->jg);这样子写是不行的。 假设你输入"11,cc,dd",那么p1->num会被写入11，p1->name会被写入"cc,dd",而其实p1->jg根本没有写入东西 所以你应该改成scanf("%d%s%s",&p1->num,&p1->name,p1->jg);这样才行 输入的时候用空格分隔，比如:11 cc dd  # include "stdio.h" # include "malloc.h" #include "stdlib.h" #include <memory.h> #include <string.h> # define NULL 0 # define LEN sizeof(struct student)  struct student { 	int num; 	char name[40]; 	char jg[60]; 	struct student *next; }student;  int n; /* 新建链表 */  struct student *my_creat(void) { 	struct student *head = 0, *p1 = 0, *p2 = 0; 	n = 0; 	p1 = p2 = (struct student *)malloc(LEN);	//	开辟一个新单元 	memset(p1, 0, LEN); 	scanf("%d%s%s", &p1->num, &p1->name, p1->jg); 	head = NULL; 	while (p1->num != NULL)	//当输入的学号为0时,停止循环 	{ 		n = n + 1; 		if (n == 1) 			head = p1; 		else p2->next = p1; 		p2 = p1; 		p1 = (struct student *)malloc(LEN); 		memset(p1, 0, LEN); 		scanf("%d%s%s", &p1->num, &p1->name, p1->jg); 	} 	p2->next = NULL; 	return(head); } /* 输出链表 */  void print(struct student *head) { 	struct student *p1 = 0; 	printf("\n现在显示输入内容:\n", n); 	p1 = head; 	while (p1 != NULL) 	{ 		printf("%d,%s,%s\n", p1->num, p1->name, p1->jg); 		p1 = p1->next; 	} 	return; } /* 删除节点 */  struct student *del(struct student *head, int num) { 	struct student *p1 = 0, *p2 = 0; 	if (head == NULL) 	{ 		printf("\n 没有记录! \n"); 		goto end; 	} 	p1 = head; 	while (p1->num != num && p1->next != NULL) 	{ 		p2 = p1; 		p1 = p1->next; 	} 	if (p1->num == num)	//找到删除的学号 	{ 		if (p1 == head) head = p1->next; 		else p2->next = p1->next; 		n = n - 1; //节点数减1 		free(p1); 		printf("删除成功"); 	} 	else 		printf("%d号找不到!删除失败\n", num); end: 	return(head); } /* 查找 */ void search(struct student*head, char jg[20]) { 	struct student *p1; 	for (p1 = head; p1 != NULL; p1 = p1->next) 	{ 		if (strcmp(jg, p1->jg) == 0) 		{ 			printf("%ld\t%s\t\t%s\n", p1->num, p1->name, p1->jg); 		} 	} }  //主界面 void main() { 	struct student *head = 0, *stu = 0; 	int del_num/*,delet_num*/; 	int k = 1; 	char sjg[60]; 	while (k != 0) 	{ 		printf("***************************\n"); 		printf("* *\n"); 		printf("* * 学生籍贯管理系统 * *\n"); 		printf("* *\n"); 		printf("* 1 ............创建链表 *\n"); 		printf("* *\n"); 		printf("* 2 ............查找籍贯 *\n"); 		printf("* *\n"); 		printf("* 3 ............删除记录 *\n"); 		printf("* *\n"); 		printf("* 4 ............显示链表 *\n"); 		printf("* *\n"); 		printf("* 输入  1...4 *\n"); 		printf("* *\n"); 		printf("***************************\n"); 		scanf("%d", &k); 		switch (k) 		{ 		case 1: printf("按照(学号 姓名 籍贯)来输入学生数据(按0结束):\n"); 			head = my_creat();	//创建链表 			print(head);	//输出所有节点 			printf("\n");; break;  		case 2:	printf("请输入要查找学生的籍贯(按0结束):\n");	//节点查找 			fflush(stdin); 			gets(sjg); 			search(head,sjg); 			break;  		case 3: printf("\n请输入要删除学生的学号(按0结束):");	//链表删除 			scanf("%d", &del_num); 			while (del_num != NULL) 			{ 				head = del(head, del_num); 				print(head); 				printf("\n请输入要删除学生的学号(按0结束):"); 				scanf("%d", &del_num); 			} 			printf("\n");; break;  		case 4:	print(head);	//输出链表 			printf("\n");; break; 		} 	} }

引用 1 楼 qq423399099 的回复:1.遍历链表 2.strcmp比较输入的字符串和每个结点的jg成员是不是一样的，一样的话就输出 void search(struct student*head,char jg[20]) {    struct student *p1;    for(p1=head;p1!=NULL;p1=p1->next)    { if(strcmp(jg,p1->jg)==0)        {         printf("%ld\t%s\t\t%s\n",p1->num,p1->name,p1->jg);       }     } }   这样写可以吗，可运行了无法读取jg..

2L正解，给我上波分~


Question: 一个位移计算的题目，我很懵，请指教……

引用 10 楼 GKatHere 的回复:for(...)  //没括进去 { printf(...) sum... }  啊……我果然还是太粗心大意了……非常感谢！

for(...)  //没括进去 { printf(...) sum... }

引用 8 楼 sdghchj 的回复:[quote=引用 7 楼 Lamuna 的回复:] [quote=引用 3 楼 sdghchj 的回复:] 1<<0等于没有移动。 你的i是从0开始到15，1就移了15位，哪里移了16位？ 你的代码和输出结果不匹配，再检查检查  这样算的话……哦！也就是说最后其实就是 0000 0000 0000 0001左移了15位，也就是1000 0000 0000 0000…… 我明白了……  不过我还是没明白为什么 printf("sum is 0x%x(%d)",sum,sum); 循环过程中这句打印的都是sum is 0x0(0)？……[/quote] prinf("sum is : 0x%x(%d)\n",sum,sum);  说了printf都没打对。[/quote]  不好意思，这个是我打到帖子中之后才少打这个的，不然gcc早就报错了吧=_,=|||…… 目前程序状况是这样的：

引用 7 楼 Lamuna 的回复:[quote=引用 3 楼 sdghchj 的回复:] 1<<0等于没有移动。 你的i是从0开始到15，1就移了15位，哪里移了16位？ 你的代码和输出结果不匹配，再检查检查  这样算的话……哦！也就是说最后其实就是 0000 0000 0000 0001左移了15位，也就是1000 0000 0000 0000…… 我明白了……  不过我还是没明白为什么 printf("sum is 0x%x(%d)",sum,sum); 循环过程中这句打印的都是sum is 0x0(0)？……[/quote] prinf("sum is : 0x%x(%d)\n",sum,sum);  说了printf都没打对。

引用 3 楼 sdghchj 的回复:1<<0等于没有移动。 你的i是从0开始到15，1就移了15位，哪里移了16位？ 你的代码和输出结果不匹配，再检查检查  这样算的话……哦！也就是说最后其实就是 0000 0000 0000 0001左移了15位，也就是1000 0000 0000 0000…… 我明白了……  不过我还是没明白为什么 printf("sum is 0x%x(%d)",sum,sum); 循环过程中这句打印的都是sum is 0x0(0)？……

引用 1 楼 jianwen0529 的回复:sum = sum + 1U<<i;  相当于 sum = (sum + 1U)<<i;   sum += 1U<<i;  相当于 sum += (1U<<i);   我把代码改为原来的样子：  #include <stdio.h> int main(void){   int i = 0;  unsigned int sum = 0;  for(;i<16;i++){     prinf("sum is : 0x%x(%d)\n",sum,sum);     sum = sum + 1U << i;  } printf("***Final Result***\nsum is 0x%x(%d).",sum,sum);   return 0; }   打印结果没有发生变化……是我哪里写的不对么？  另外，sum = sum +1U << i 的话，不就是sum 先+1然后左移i个位置么？……那么一旦i自增到16，岂不是会全被补0了？ 毕竟只有16个位，不管是0000 0000 0000 0001 还是1111 1111 1111 1111 左移16次正好是0000 0000 0000 0000才对……  是我哪里理解的有问题吧？……

运算符优先级，1L已经说清楚了

printf关键字都没打对。

关于你 1U的疑问  U u 后缀表示这是一个 unsigned int 值   L 是loog 数据，f 是float数据 其中还有 ul，ull，ll 等后缀


Question: AC问题

除了一楼的情况。还要把float改成double，否则精度不一定够

输入错了把人家要求的是x1，y1，x2，y2，你输入的是x1，x2， y1， y2


Question: 二叉排序树的建立和检索运行不了

感谢，问题解决了

CreateSearchTree函数写的不对，需要为dic->element分配空间，同时下标应该从0开始到dic->n  int CreateSearchTree(PBinSearchTree ptree, SeqDictionary *dic) { 	int i; 	*ptree = NULL; 	printf("请输入元素个数:"); 	scanf("%d", &dic->n); 	dic->element = (DicElement *)malloc(sizeof(DicElement)* dic->n); 	printf("请依次输入二叉树元素:\n"); 	for (i = 0; i < dic->n; i++) 	{ 		scanf("%d", &dic->element[i].key); 	} 	for (i = 0; i<dic->n; i++) 	{ 		if (!insert(ptree, dic->element[i].key))return 0; 	} 	return 1; }


Question: error C2065: 'p1' : undeclared identifier这到底在哪没有定义

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

楼主好萌啊。。。

引用 2 楼 qq423399099 的回复:给你的代码就是有问题的啊，要么就是你题目理解有问题。 1.kaoshi函数里p1,wz,py这些都没有定义 2.main函数少个大括号 3.main函数里tm,m这些也都没定义  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！ main函数的括号忘记在帖子上写了，其他定义都加上了，但是底下这几个错误不知道怎么弄了 \main.c(55) : error C2223: left of '->next' must point to struct/union \main.c(59) : error C2223: left of '->next' must point to struct/union main.c(65) : error C2223: left of '->que' must point to struct/union \main.c(65) : error C2223: left of '->answer1' must point to struct/union \main.c(65) : error C2223: left of '->answer2' must point to struct/union \main.c(65) : error C2223: left of '->answer3' must point to struct/union \main.c(65) : error C2223: left of '->answer4' must point to struct/union \main.c(67) : error C2223: left of '->ture' must point to struct/union

引用 1 楼 60 的回复:p1 未定义。解决方法，在kaoshi的开始，增加p1的定义。 用char定义可以吗  下面那么多一大堆错误应该怎么改  跪求

p1 未定义。解决方法，在kaoshi的开始，增加p1的定义。

#include <stdio.h> #include <stdlib.h> #include <ctype.h> #define LEN sizeof(struct shuzu) struct shuzu { 	char que[100]; 	char answer1[100]; 	char answer2[100]; 	char answer3[100]; 	char answer4[100]; 	char ture; 	struct shuzu *next; }; struct shuzu *t; struct shuzu* p1 = NULL;  void kaoshi(int m) {         char ch,ft[5],p1; 		  		FILE *fp; 		int tq,i,n=0,jl,py; 		struct shuzu *t=NULL; 	if((fp=fopen("c:\\test.txt","r"))==NULL) //打开文件 	{ 		printf("请检查考试文件。\n"); 	    exit(0); 	}   	do 	{ 		tq=1;         ch=fgetc(fp);   //提取文件 		for(i=0;ch!='\0'&&ch!=-1;i++)    //循环判断回车符 		{ 			tq++; 			ch=fgetc(fp); 		} 		n++; 		if(n==m) 		{ 			if(p1=='\0') 			{ 				p1=(struct test *)malloc(LEN); 				t=p1; 				p1->next='\0'; 			} 			else 			{ 				p1->next=p1; 				p1=(struct test *)malloc(LEN); 				p1->next='\0'; 			} 			jl=ftell(fp);                       //记录位置 			fseek(fp,(jl-py-1),0);               //调整到行首 			fscanf(fp,"%s%s%s%s%s%s",&p1->que,&p1->answer1,&p1->answer2,&p1->answer3,&p1->answer4,&ft); 			fseek(fp,jl+1,0);                  //调整到行末 			p1->ture=ft[0]; 			break; 		} 	}while(!feof(fp));  		fclose(fp);  //关闭文件 } 	  	 void main() {        struct shuzu *p1; 	int i;   //  tm=kaoshi(-1);     for(i=0;i<51;i++) 	{     char answer[2]; 	int c=0,e=0,m=0; 	do 	{ 		m=rand(); 	} 	while(!(0<m&&m<=50)); 	kaoshi(m);     p1=t; 	printf("\n第%d题：\n",i+1); 	printf("%s\n%s\n",p1->que,p1->answer1,p1->answer2,p1->answer3,p1->answer4);     printf("请输入正确答案：");     scanf("%c",&answer);     while(1) 	{  	   fflush(stdin);//清空缓冲区        if((answer[0]>='a' && answer[0]<='d')||(answer[0]>='A' && answer[0]<='D')) 	   { 		   printf("OK!"); 		   break; 	   } 	  		printf("输入的选项错误，请重新输入:");      } 	 system("cls");//清屏      if(toupper(answer[0])==p1->ture) 	 { 		 c++; 	 } 	 else 	 { 		 e++; 	 } 	 p1=t; 	 do 	 { 		 t=p1->next; 		 free(p1); 		 p1=t; 	 } 	 while(p1!='\0'); 	 system("cls");//清屏 	 printf("*********************************************\n"); 	 printf("\n已完成测试！\n共做50道题:%d错误,%d正确。\n",e,c); 	 printf("*********************************************\n");  	} 	return 0; }   i\main.c(45) : warning C4047: '=' : 'char ' differs in levels of indirection from 'struct test *' \main.c(46) : warning C4047: '=' : 'struct shuzu *' differs in levels of indirection from 'char ' \main.c(47) : error C2223: left of '->next' must point to struct/union \main.c(51) : error C2223: left of '->next' must point to struct/union \main.c(52) : warning C4047: '=' : 'char ' differs in levels of indirection from 'struct test *' \main.c(53) : error C2223: left of '->next' must point to struct/union \main.c(57) : error C2223: left of '->que' must point to struct/union \main.c(57) : error C2223: left of '->answer1' must point to struct/union i\main.c(57) : error C2223: left of '->answer2' must point to struct/union \main.c(57) : error C2223: left of '->answer3' must point to struct/union \main.c(57) : error C2223: left of '->answer4' must point to struct/union \main.c(59) : error C2223: left of '->ture' must point to struct/union \main.c(123) : warning C4098: 'main' : 'void' function returning a value 执行 cl.exe 时出错.  exam_wangdeli.exe - 1 error(s), 0 warning(s)  这是修改过后的代码，但是还有错误  这个结构体指针真不知道怎么改了！！！！求大神！！！！拯救小白吧！！！！

引用 楼主 m0_37177612 的回复:跪求大神  一个考试系统   \main.c(51) : error C2065: 'p1' : undeclared identifier \main.c(53) : warning C4047: '=' : 'int ' differs in levels of indirection from 'struct test *' \main.c(54) : warning C4047: '=' : 'struct shuzu *' differs in levels of indirection from 'int ' \main.c(55) : error C2223: left of '->next' must point to struct/union \main.c(59) : error C2223: left of '->next' must point to struct/union \main.c(60) : warning C4047: '=' : 'int ' differs in levels of indirection from 'struct test *' \main.c(61) : error C2223: left of '->next' must point to struct/union \main.c(64) : error C2065: 'wz' : undeclared identifier \main.c(64) : error C2065: 'py' : undeclared identifier \main.c(65) : error C2146: syntax error : missing ';' before identifier 'fscanf' \main.c(65) : error C2223: left of '->que' must point to struct/union \main.c(65) : error C2223: left of '->answer1' must point to struct/union \main.c(65) : error C2223: left of '->answer2' must point to struct/union \main.c(65) : error C2223: left of '->answer3' must point to struct/union \main.c(65) : error C2223: left of '->answer4' must point to struct/union \main.c(67) : error C2223: left of '->ture' must point to struct/union \main.c(74) : error C2059: syntax error : '}' \main.c(105) : error C2143: syntax error : missing ';' before 'type' \main.c(106) : error C2143: syntax error : missing ';' before 'type' \main.c(107) : error C2065: 'tm' : undeclared identifier \main.c(114) : error C2063: 'i' : not a function \main.c(116) : warning C4047: '=' : 'int ' differs in levels of indirection from 'struct shuzu *' \main.c(117) : error C2065: 'a' : undeclared identifier \main.c(118) : error C2223: left of '->que' must point to struct/union \main.c(118) : error C2223: left of '->answer1' must point to struct/union \main.c(118) : error C2223: left of '->answer2' must point to struct/union \main.c(118) : error C2223: left of '->answer3' must point to struct/union \main.c(118) : error C2223: left of '->answer4' must point to struct/union \exam_wangdeli\main.c(120) : error C2065: 'answer' : undeclared identifier \main.c(133) : error C2109: subscript requires array or pointer type \main.c(133) : error C2223: left of '->ture' must point to struct/union \main.c(135) : error C2065: 'c' : undeclared identifier \main.c(139) : error C2065: 'e' : undeclared identifier \main.c(141) : error C2065: 'test' : undeclared identifier \main.c(144) : error C2223: left of '->next' must point to struct/union \main.c(145) : warning C4022: 'free' : pointer mismatch for actual parameter 1 \main.c(146) : warning C4047: '=' : 'int ' differs in levels of indirection from 'struct shuzu *' \main.c(148) : error C2065: 'null' : undeclared identifier 执行 cl.exe 时出错.  exam_wangdeli.exe - 1 error(s), 0 warning(s)  好多一样的错误，看着头都晕了，求大神讲解  p1没有定义怎么能用呢？ shuzu* p1 = NULL;  这个只能保证编译过，程序运行还是有问题。 因为内部逻辑不完整

引用 8 楼 xian_wwq 的回复:几个明显的错误：  使用了toupper(),增加头文件 <ctype.h>    struct shuzu {     char que[100];     char answer1[100];     char answer2[100];     char answer3[100];     char answer4[100];     char ture;     struct test *next; };  既然是链表， 应该是  struct shuzu* next;   if((answer>='a' && answer<='d')||(answer>='A' && answer<='D'))  改成  if((answer[0]>='a' && answer[0]<='d')||(answer[0]>='A' && answer[0]<='D'))   记录位置的 wz,py，肯定要记录相关数据，没有看到相关处理 万分感谢！！！！！  因为学校里刚开始学C语言，好多地方都不明白，那个这个问题应该怎么处理 main.c(55) : error C2223: left of '->next' must point to struct/union 试了好久不知道咋办。

引用 5楼小灸舞 的回复:给你的代码就是有问题的啊，要么就是你题目理解有问题。 1.kaoshi函数里p1,wz,py这些都没有定义  [quote=引用 4 楼 m0_37177612 的回复:] [quote=引用 2 楼 qq423399099 的回复:] 给你的代码就是有问题的啊，要么就是你题目理解有问题。 1.kaoshi函数里p1,wz,py这些都没有定义 2.main函数少个大括号 3.main函数里tm,m这些也都没定义  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！ main函数的括号忘记在帖子上写了，其他定义都加上了，但是底下这几个错误不知道怎么弄了 \main.c(55) : error C2223: left of '->next' must point to struct/union \main.c(59) : error C2223: left of '->next' must point to struct/union main.c(65) : error C2223: left of '->que' must point to struct/union \main.c(65) : error C2223: left of '->answer1' must point to struct/union \main.c(65) : error C2223: left of '->answer2' must point to struct/union \main.c(65) : error C2223: left of '->answer3' must point to struct/union \main.c(65) : error C2223: left of '->answer4' must point to struct/union \main.c(67) : error C2223: left of '->ture' must point to struct/union[/quote] 说明你这个结构体类型没有被识别出来[/quote]那应该怎么改呢。刚学c语言

引用 2 楼 qq423399099 的回复:给你的代码就是有问题的啊，要么就是你题目理解有问题。 1.kaoshi函数里p1,wz,py这些都没有定义 2.main函数少个大括号 3.main函数里tm,m这些也都没定义  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  你是赵老师的学生吗？ 赵老师终于有追随者了。

给你的代码就是有问题的啊，要么就是你题目理解有问题。 1.kaoshi函数里p1,wz,py这些都没有定义  引用 4 楼 m0_37177612 的回复:[quote=引用 2 楼 qq423399099 的回复:] 给你的代码就是有问题的啊，要么就是你题目理解有问题。 1.kaoshi函数里p1,wz,py这些都没有定义 2.main函数少个大括号 3.main函数里tm,m这些也都没定义  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！ main函数的括号忘记在帖子上写了，其他定义都加上了，但是底下这几个错误不知道怎么弄了 \main.c(55) : error C2223: left of '->next' must point to struct/union \main.c(59) : error C2223: left of '->next' must point to struct/union main.c(65) : error C2223: left of '->que' must point to struct/union \main.c(65) : error C2223: left of '->answer1' must point to struct/union \main.c(65) : error C2223: left of '->answer2' must point to struct/union \main.c(65) : error C2223: left of '->answer3' must point to struct/union \main.c(65) : error C2223: left of '->answer4' must point to struct/union \main.c(67) : error C2223: left of '->ture' must point to struct/union[/quote] 说明你这个结构体类型没有被识别出来


Question: 对于做的程序代码有些问题

可不可以还用randomize函数？因为这个函数是老师给的。

randomize和random改成用srand和rand  #include<stdio.h> #include<stdlib.h> #include<time.h> #include<conio.h> int main() { 	char c; 	int a[4], b[4], i, j, k; 	srand((unsigned)time(0)); 	for (i = 0; i<4; i++) 	{ 		a[i] = rand() % 10; 	} 	do 	{ 		for (j = 0; j<4; j++) 		{ 			scanf("%d", b[j]); 			while (i<4); 			{ 				if (i == j&&a[i] == b[j]) 				{ 					i++; 					j++; 					k++; 				} 				else 				{ 					i++; 					j++; 				} 			} 			printf("%d", k); 			scanf("%c", c = getch()); 		} 	} while ((c = getch()) != 27); 	return 0; }

引用 2 楼 qq_37177328 的回复:可不可以还用randomize函数？因为这个函数是老师给的。 如果老师给的函数代码，把函数直接加进来； 如果是lib，把头文件加进来


Question: 运行程序时出现停止运行

你这个程序问题很多啊

定义了char *p[6]以后，没有进行初始化赋值，这是很忌讳的。

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

崩溃问题主要表现在你没有对指针进行分配内存，改一点代码就可以了  char *p[6];//对其进行分配内存 //如下即可 char *p[6] = { new char[100], new char[100], new char[100], new char[100], new char[100], new char[100] };

楼主可以在for循环输入值的时候加上p[i]=(char*)malloc(sizeof(char));就可以了。其他的for循环问题还有p+n的问题楼上意见指出来了 #include<stdio.h> #include<stdlib.h> int main() { char *p[5]; int i,m,n; char q; for(i=0;i<5;i++) { 	printf("输入\n"); 	p[i]=(char*)malloc(sizeof(char)); scanf("%s\n",*(p+i)); getchar();      } for(m=1;m<5;m++) { for(n=0;n<5-m;n++) if(**(p+n)>**(p+n+1)) { 	printf("1");     q=**(p+n);     **(p+n)=**(p+n+1);     **(p+n+1)=q; 	 } } for(i=0;i<5;i++) printf("%s",*(p+i)); printf("\n"); return 0;  }

你这个程序很多问题。 char *p[6];是指针数组，你这样的写法只是申请了6个指针（但是指针指向的是未知区域，你要分配过空间才能scanf %s写入） 而且你的scanf和printf都是错误的。 写成这样才对： scanf("%s", *(p + i));//或者scanf("%s", p[i])); printf("%s", *(p + i));

你第二个循环里p+i这个i哪里来的，不应该是n？


Question: 为什么llu或lld输出小值的时候无法得到正确结果？

因为提供的参数和格式并不匹配。

printf("%ld\n",2L); printf("%lu\n",2UL); printf("%lld\n",2LL); printf("%llu\n",2ULL);

因为2、223这些字面量默认是int类型的，4字节。 而格式化lld和llu会用8个字节的数来格式化，以2为例，2本身只占4字节，在小端字节序时，格式化时用到了2所占的4字节以及2后面4字节，该高位4字节是未定义的伪随机数，结果就是一个很大的伪随机数，如果将该大数强制转成int型，会得到2.

%llu是C语言格式化字符的一种，用于格式化输入输出函数中，比如printf和scanf。 %llu对应的数据类型为unsigned long long，这是C语言用来表示整数的最大类型。 不过对于此类型，C规范中并没有明确规定，只是在C99中建议编译器支持比long更大的整型数据类型，由于各编译器实现方式不同，导致unsigned long long 和对应的有符号类型long long并不是所有的编译器都支持。 "%lld"和"%llu"是linux下gcc/g++用于long long int类型(64 bits)输入输出的格式符。


Question: 该怎么输入

帮顶帮顶帮顶

引用 1楼w_linux 的回复:用while就可以来限制能具体一点吗

用while就可以来限制


Question: C语言大神快来1000以内的完数，简单题水得不是那么厉害，但是小白我还是不会改代码

我自己结贴算了，始终相信，各有缘法，能投机取巧也是不错，只要你会，正规代码反而没有什么意思因为纠结太久，但是放假整理时会附上，我就说下投机取巧的吧，自己百度题目范围内所有完数，然后根据每个完数范围直接输出，，，

引用 12 楼 pkuzhx 的回复:[quote=引用 9 楼 zuoside__lord 的回复:] [quote=引用 8 楼 pkuzhx 的回复:] sum没有清零吧，其他没留意。 debug程序是基本技能。 不懂就问也是学习的过程，闭门造车也许一辈子都造不出来，[/quote] 也要自己先想办法解决吧？你一有一点小问题，自己都懒得去debug，就指着别人帮你，这叫要奶瓶。[/quote]0

引用 9 楼 zuoside__lord 的回复:[quote=引用 8 楼 pkuzhx 的回复:] sum没有清零吧，其他没留意。 debug程序是基本技能。 不懂就问也是学习的过程，闭门造车也许一辈子都造不出来，[/quote] 也要自己先想办法解决吧？你一有一点小问题，自己都懒得去debug，就指着别人帮你，这叫要奶瓶。

引用 10 楼 cutmelon的回复:穷举的话这题不难吧。。。1000之内也就3个数而已#include <stdio.h> #include <math.h>  bool Judge(int value) { 	int sum=1; 	int l=(int)sqrt(value); 	for (int i=2;i<=l;i++) 	{ 		if (value%i==0) 		{ 			sum+=i; 			sum+=value/i; 		} 	}  	return value==sum; }  void startJudge(int n) { 	bool found=false; 	for (int i=2;i<=n;i++) 		if (Judge(i)) 		{ 			printf("%d ",i); 			found=true; 		}  	if (found) 		printf("\n"); 	else 		printf("none\n"); }  int main() { 	int sum; 	scanf("%d",&sum); 	if (sum<=0) 	{ 		printf("Are you kidding me?\n"); 		return -1; 	} 	int *n=new int[sum]; 	for (int i=0;i<sum;i++) 	{ 		scanf("%d",n+i); 		if (n[i]<=0) 		{ 			printf("Are you kidding me?\n"); 			delete[] n; 			return -1; 		} 	}  	for (int i=0;i<sum;i++) 		startJudge(n[i]);  	delete[] n;  	return 0; } 我试试去，AC才是王道

引用 8 楼 pkuzhx 的回复:sum没有清零吧，其他没留意。 debug程序是基本技能。 不懂就问也是学习的过程，闭门造车也许一辈子都造不出来，

sum没有清零吧，其他没留意。 debug程序是基本技能。

引用 6 楼 hornsey2012的回复:你的程序改了下 你把循序多写了一遍  #include<stdio.h> int main() {     int n,i,sum,j,k,m;     scanf("%d",&j);     for(k=2; k<=j; k++)     { 	    sum=1;         for(m=2; m<k; m++)         { 	         if(k%m==0)                  sum = m+sum;         }         if(sum==m)         {             printf("%d ",sum);         } 		else         {             printf("none\n");         }     } } 我们要多组输入，，，你修改后的代码满足不了，而且它会输入好多none,我们只能输出一次

看看我这个  #include <stdio.h>  /*  * Judge whether the value is a wanshu, yes return 1, no return 0  */ int Judge(int value) {         int i;         int len = value/2;         int sum = 0;          if( value <= 1)                 return 0;         else                 sum = 1;          for(i=2; i <= len; i++)         {                 if(value%i == 0)                         sum += i;         }          if(sum == value)                 return 1;         else                 return 0; }  int main(int argc,char *argv[]) {         int i,n;          printf("Please input a num in 1-1000:");          scanf("%d",&n);          for(i = 1; i<=n; i++)         {                 if(Judge(i) == 1)                         printf("%d\n",i);                 else                         printf("none\n");         }          return 0; }

引用 2 楼 nalw2012 的回复:楼主你把自己的话重新捋一遍吧！越看越迷糊！就是说我代码有错的，请帮忙修改，但是我又不知道哪里错了

引用 1 楼 user-4 的回复:根本就不懂楼主你在说啥。。。。 引用 1 楼 user-4 的回复:根本就不懂楼主你在说啥。。。。，最简单的理解 就是我代码有错的就，请帮忙修改

楼主你把自己的话重新捋一遍吧！越看越迷糊！

根本就不懂楼主你在说啥。。。。


Question: 请教一下把两个字符串连在一起的原理或者算法是什么

引用 1 楼 hdt 的回复:大致，开一个两个字符串长度的内存 把第一个串copy到0处，第二个串copy到第一个串长度处 虽然你这太高级了，不过我已经连起来了，谢谢了


Question: 数组循环赋值，太快？

LZ试试memcpy，把指针和length设置好就可以了。 PS：LZ每次取的是64字节不是位，还有你的4个数组总长4096，也存完你的8KB，loop循环1024个人不能理解。

循环里咋全是a，a，a，a

引用 2 楼 LonelyRoamer 的回复:循环里咋全是a，a，a，a写错了

写错了，不是全a，是想a，b，c，d四个数组赋值。

帮顶帮顶帮顶

个人感觉memcpy更快


Question: 新产品研制工序序列,,,急需，，帮个忙，，

引用 1 楼 user-1的回复:搜有向图邻接表存储 谢谢，，弄好了已经，

搜有向图邻接表存储


Question: C语言求拯救

冒泡排序！  int fun(int s[], int *x) { 	int r = 0; 	*x = 0; 	for (int i = 9; i >= 0; i--) 	{ 		for (int j = 0; j < i; j++) 		{ 			if (s[j] < s[j + 1]) 			{ 				std::swap(s[j], s[j + 1]); 			} 		}  		if (s[i] < 60) 		{ 			(*x)++; 		} 		else if (s[i] >= 90) 		{ 			r++; 		} 	}  	return r; }

int fun(int s[],int *x) { 	int i,j; 	int t; 	*x = 0; 	for(i = 0;i < 10 - 1;++i)//10个人 	{ 		for(j = i + 1;j < 10;++j) 		{ 			if(s[i] < s[j]) 			{ 				t = s[i]; 				s[i] = s[j]; 				s[j] = t; 			} 		} 	} 	for(i = 0;i < 10 - 1;++i) 	{ 		if(s[i] < 60) 		{ 			*x += 1; 		} 	} 	return 10 - *x; }


Question: 关于locale.h库

引用 2 楼 ID870177103 的回复:[quote=引用 1 楼 shihengzhen101 的回复:] 应该是c语言的标准库，C语言，你是在那个平台用的这些函数，你的locale.h不是windows的吧 就是在windows上 _lock_locales在g++的头文件里就没有 _create_locale虽然有声明，但连接的时候会报错[/quote] 标准里没听说过这个函数，没准是Win32平台特有的

引用 1 楼 shihengzhen101 的回复:应该是c语言的标准库，C语言，你是在那个平台用的这些函数，你的locale.h不是windows的吧 就是在windows上 _lock_locales在g++的头文件里就没有 _create_locale虽然有声明，但连接的时候会报错


Question: c程序，求助！！！！急！！

引用 4 楼 cy1176058800 的回复:怎么加入参数？ 5楼说得很详细了

DOS年代运行程序都是输入命令行的，由常驻内存的command.com这个DOS下命令解释器（类似Linux下的sh、bash）解释执行 比如： edit  a1.txt dir  /a  /w edit.exe是外部命令，就是一个具体的程序名字，由command.com调用执行 dir是command.com的内部命令，直接执行它自身的部分代码 命令后面的就是命令的参数 如edit  a1.txt，argc==2, argv[0]=="edit", argv[1]=="a1.txt" 你也可以在命令行cmd（Win-R组合键，输入cmd运行）下运行你的程序，后面输入参数。  在Win7下假如你用VC，假如你的程序目录在D:\C\151023_t2，可执行文件在D:\C\151023_t2\Debug，你在资源管理器窗口里打开D:\C\151023_t2文件夹，按住Shift键然后右键点击Debug文件夹，出现右键菜单，选择【在此处打开命令窗口】，就出现一个黑色的命令行窗口，输入：dir【回车】可以看到 151023_t2.exe ，输入：151023_t2【回车】可以运行这个程序，输入：151023_t2  aa  bbb【回车】可以带参数运行这个程序，aa和bbb就是两个参数。

怎么加入参数？

那里执行命令行？@ipqtjmqj

明显是执行时参数不够嘛。。。

按住shift右击，在此处运行命令行


Question: 有一道不懂得题目，希望大神教教！

三年过去了，还是没人回复


Question: 求大神帮忙看看程序有没有错误，特别是save函数，输出不对（刚开始学文件）

你读的时候需要把文件指针重新移到开头，或者重新打开文件

引用 1 楼 paschen 的回复:你读的时候需要把文件指针重新移到开头，或者重新打开文件 读这个文件，只是想要检查文件里面的数据是不是对的，现在的主要问题是文件里面的数据都是乱码的  引用 2 楼 qq423399099 的回复:fwrite完先fclose将缓存中的数据写入到文件，然后重新fopen  #include<stdio.h> void input(struct Student *p); void save(struct Student *p); struct Student { 	int num; 	char name[20]; 	int score[3]; }; int main() { 	struct Student stu[5]; 	struct Student *p = stu; 	input(p); 	save(p); 	return 0; } void input(struct Student *p) { 	for (int i = 0; i<5; i++) 		scanf("%d %s %d %d %d", &(p + i)->num, (p + i)->name, &(p + i)->score[0], &(p + i)->score[1], &(p + i)->score[2]); } void save(struct Student *p) { 	FILE *fp; 	fp = fopen("D:\\stud.dat", "wb+"); 	for (int i = 0; i<5; i++) 		fwrite(p + i, sizeof(struct Student), 1, fp); 	fclose(fp); 	fp = fopen("D:\\stud.dat", "r"); 	for (int i = 0; i<5; i++) 	{ 		fread(p + i, sizeof(struct Student), 1, fp); 		printf("%d %s %d %d %d", (p + i)->num, (p + i)->name, (p + i)->score[0], (p + i)->score[1], (p + i)->score[2]); 	} 	fclose(fp); } 我明白了 ，是我打开文件的方式不对。。。

引用 2 楼 qq423399099 的回复:fwrite完先fclose将缓存中的数据写入到文件，然后重新fopen  #include<stdio.h> void input(struct Student *p); void save(struct Student *p); struct Student { 	int num; 	char name[20]; 	int score[3]; }; int main() { 	struct Student stu[5]; 	struct Student *p = stu; 	input(p); 	save(p); 	return 0; } void input(struct Student *p) { 	for (int i = 0; i<5; i++) 		scanf("%d %s %d %d %d", &(p + i)->num, (p + i)->name, &(p + i)->score[0], &(p + i)->score[1], &(p + i)->score[2]); } void save(struct Student *p) { 	FILE *fp; 	fp = fopen("D:\\stud.dat", "wb+"); 	for (int i = 0; i<5; i++) 		fwrite(p + i, sizeof(struct Student), 1, fp); 	fclose(fp); 	fp = fopen("D:\\stud.dat", "r"); 	for (int i = 0; i<5; i++) 	{ 		fread(p + i, sizeof(struct Student), 1, fp); 		printf("%d %s %d %d %d", (p + i)->num, (p + i)->name, (p + i)->score[0], (p + i)->score[1], (p + i)->score[2]); 	} 	fclose(fp); }  这样输出是没错了 ，但是文件里面的还是乱码呀

不是有函数是fwind吗


Question: C语言中数组参数传递，sizeof（数组名）的值

引用 7 楼 WQW217 的回复:老师说  要多看多用CSDN  学习C++老师说的对

老师说  要多看多用CSDN  学习C++

http://www.cnblogs.com/ymy124/archive/2012/03/05/2380048.html 有同样疑惑的可以看看这篇微博，觉得写得很清楚

引用 4 楼 shihengzhen101 的回复:[quote=引用 3 楼 ipqtjmqj 的回复:] [quote=引用 2 楼 suhann 的回复:] [quote=引用 1 楼 ipqtjmqj 的回复:] 隐式转换成指向数组第一个元素的指针了，  char s[]这种写法与char *s没有区别 请问什么情况下会隐式转换呢？ [/quote] 函数传参，函数返回值。 转换的原因为了节省复制时间[/quote]  也就是这些情况了吧[/quote]谢谢，懂了。

引用 3 楼 ipqtjmqj 的回复:[quote=引用 2 楼 suhann 的回复:] [quote=引用 1 楼 ipqtjmqj 的回复:] 隐式转换成指向数组第一个元素的指针了，  char s[]这种写法与char *s没有区别 请问什么情况下会隐式转换呢？ [/quote] 函数传参，函数返回值。 转换的原因为了节省复制时间[/quote]  也就是这些情况了吧

引用 2 楼 suhann 的回复:[quote=引用 1 楼 ipqtjmqj 的回复:] 隐式转换成指向数组第一个元素的指针了，  char s[]这种写法与char *s没有区别 请问什么情况下会隐式转换呢？ [/quote] 函数传参，函数返回值。 转换的原因为了节省复制时间

引用 1 楼 ipqtjmqj 的回复:隐式转换成指向数组第一个元素的指针了，  char s[]这种写法与char *s没有区别 请问什么情况下会隐式转换呢？

楼上正解，这是个很古老的问题了，之前好像也有人问到这方面的问题吧

数组作为函数参数与返回值时，会退化为指针，sizeof指针得到的是指针的大小（32位程序为4）


Question: 一点问题 ，求指导 ！！

四个数字应该不一样 ，为什么完全 一样 ，还是错了、   #include "stdafx.h" #include<conio.h> float*search(float(*p)[4]) { 	int i; 	float*pt; 	pt=*(p+1); 	for(i=0;i<4;i++) 	{ 		if(*(*p+i)<60) 			pt=*p; 	} return(pt); }  int _tmain(int argc, _TCHAR* argv[]) { 	float score[][4]={{60,75,82,91},{75,81,91,90},{51,65,78,84},{65,72,78,72}}; 	float*p; 	int i,j; 	for(i=0;i<4;i++) 	{ 		p=search(score+i); 		if(p==*(score+i)) 		{     printf("The student NO.%d list:",i+1); 		for(j=0;j<4;j++) 			printf("%5.1f",*p); 		} 	}      _getch();   	return 0; }

加上头文件conio.h

#include<conio.h>  另建议使用：_getch();  代替 getch();

加上头文件#include<conio.h>就行了  #include "stdafx.h" #include<conio.h> float*search(float(*p)[4]) { 	int i; 	float*pt; 	pt = *(p + 1); 	for (i = 0; i<4; i++) 	{ 		if (*(*p + i)<60) 			pt = *p; 	} 	return(pt); }  int _tmain(int argc, _TCHAR* argv[]) { 	float score[][4] = { { 60, 75, 82, 91 }, { 75, 81, 91, 90 }, { 51, 65, 78, 84 }, { 65, 72, 78, 72 } }; 	float*p; 	int i, j; 	for (i = 0; i<4; i++) 	{ 		p = search(score + i); 		if (p == *(score + i)) 		{ 			printf("The student NO.%d list:", i + 1); 			for (j = 0; j<4; j++) 				printf("%5.1f", *p); 		} 	} 	getchar();   	return 0; }


Question: 这个怎么写，第一行是整数n，表示测试的数据组数，下面是n行含空格的字符串(仅由空格和英文字符组成）。

1.二维数组 2.循环n次 3.使用可以读入空格的函数，比如gets

int n, i; 	char s[20][100]; 	scanf("%d", &n); 	getchar(); 	for (i = 0; i < n; ++i) 	{ 		gets(s[i]); 	}

循环。先读取 n，然后循环直到 n 耗尽，每个循环里读取一组输入，然后处理之。


Question: 小白 求帮看程序哪里出了问题

stu class[5]={};

C++里使用结构体类型时不需要在类型名前面加struct，C语言是必须要加的。不过C++里加了应该也没问题的，至少Visual studio里可以编译通过。

不要叫class，换个名字就行了  class是保留字(关键字)


Question: VS 2015 写的第一个c语言控制台程序，运行完程序就自动退出！

最后getchar() 不要注释就可以了  或者用ctrl+F5启动程序

是正常的，可以忽略无法查找或打开 PDB 文件这些话。 要消掉参考：http://blog.163.com/qimo601@126/blog/static/1582209320143410125543/

程序没有暂停肯定自动运行结束了

加油，每个回个帖子是一种美德

没有getchar，自动退出当然是对的

编译器关了，重开在重新输入


Question: linux 信号处理函数问题请教

把指针搞成全局变量撒，想当成参数肯定是不行的。 程序都退出了，你这个进程使用的内存肯定是要回收的


Question: 杭电一直显示Presentation Error怎么改都不正确

二分查找法在我博客里有些可以参考一下

边界条件 输入输出格式 ……    关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

presentation error 意为输出格式错误，也就是你的输出没有按照输出要求进行格式化。一般是多了或者少了一些空格或者空行。 常见的PE错误应该有以下的几种情况： 每行输出之后有空行 每两行输出之间有空行 一行中，每个输出数字（或字符串，等）之间有空格 一行中，每个输出数字（或字符串，等）之后有空格


Question: 请教大神向指针形参传递数组名的正确方法

a又不是int *类型的，直接将a传过去当然会报错 http://www.cnblogs.com/CBDoctor/archive/2012/07/29/2614054.html

否则参数类型不匹配呗  a[N][N]作为参数传递会退化成为 int(*)[N] ，并不是你参数的int*  *a得到的是 int[]类型，作为参数传递会退化为int*，符合你参数类型

一维数组：  void fn(int *pArr,size_t n)//函数定义时指向数组元素的指针作为函数的形参 {    ....... } int a[] = {....}; fn(a);//调用时数组名作为函数实参  二维数组：  void foo(int (*pArr)[5],size_t n)//函数定义时指向数组元素(每个元素是一个长度为5的一维数组的指针作为函数的形参,[5]不能省！ {    ....... } int a[3][5] = {....};//可以认为数组a有三个元素，每个元素是一个长度为5的一维数组 foo(a);//调用时二维数组名作为函数实参  三维数组： [code=c] void fm(int (*pArr)[5][6],size_t n)//函数定义时指向数组元素(每个元素是一个长度为[5][6]的二维数组的指针作为函数的形参 {    ....... } int a[3][5][6] = {....};//可以认为数组a有三个元素，每个元素是一个长度为[5][6]的二维数组，每个二维数组中又含有一个长度为6的 //一维数组]，照此递归 fm(a);//调用时三维数组名作为函数实参 [/code n维数组： ...  ....

二维数组 对应 ”伪“二维指针，而a是一维指针，所以两个替换时会有编译错误


Question: 离散数据积分怎么写程序？

问题解决了么，我也在考虑这个，直接求和的话累积误差太大，该怎么消除？

大神详细指点一下吧

我用的是加速度传感器，每采集一个点都是一个加速度，我想把每个点都求出相对应的速度

前 n 项和除以采样率就可以了吧 ...

矩形法、梯形法、抛物线法，参见《计算方法》课本


Question: C语言读取txt文档中的ASCII码

电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  #pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <windows.h> wchar_t a2w[256]={ 0x0020,0x263a,0x263b,0x2665,0x2666,0x2663,0x2660,0x2022, 0x25d8,0x25cb,0x25d9,0x2642,0x2640,0x266a,0x266b,0x263c, 0x25ba,0x25c4,0x2195,0x203c,0x00b6,0x00a7,0x25ac,0x21a8, 0x2191,0x2193,0x2192,0x2190,0x221f,0x2194,0x25b2,0x25bc, 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, 0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f, 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, 0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f, 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, 0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f, 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, 0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f, 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, 0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f, 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, 0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x2302, 0x00c7,0x00fc,0x00e9,0x00e2,0x00e4,0x00e0,0x00e5,0x00e7, 0x00ea,0x00eb,0x00e8,0x00ef,0x00ee,0x00ec,0x00c4,0x00c5, 0x00e9,0x00e6,0x00c6,0x00f4,0x00f6,0x00f2,0x00fb,0x00f9, 0x00ff,0x00d6,0x00dc,0x00a2,0x00a3,0x00a5,0x20a7,0x0192, 0x00e1,0x00ed,0x00f3,0x00fa,0x00f1,0x00d1,0x00aa,0x00ba, 0x00bf,0x2310,0x00ac,0x00bd,0x00bc,0x00a1,0x00ab,0x00bb, 0x2591,0x2592,0x2593,0x2502,0x2524,0x2561,0x2562,0x2556, 0x2555,0x2563,0x2551,0x2557,0x255d,0x255c,0x255b,0x2510, 0x2514,0x2534,0x252c,0x251c,0x2500,0x253c,0x255e,0x255f, 0x255a,0x2554,0x2569,0x2566,0x2560,0x2550,0x256c,0x2567, 0x2568,0x2564,0x2565,0x2559,0x2558,0x2552,0x2553,0x256b, 0x256a,0x2518,0x250c,0x2588,0x2584,0x258c,0x2590,0x2580, 0x03b1,0x00df,0x0393,0x03c0,0x03a3,0x03c3,0x00b5,0x03c4, 0x03a6,0x0398,0x03a9,0x03b4,0x221e,0x03c6,0x03b5,0x2229, 0x2261,0x00b1,0x2265,0x2264,0x2320,0x2321,0x00f7,0x2248, 0x00b0,0x2219,0x00b7,0x221a,0x207f,0x00b2,0x25a0,0x00ff, }; extern "C" HWND WINAPI GetConsoleWindow(); void HideTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = FALSE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } void ShowTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = TRUE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } int main() {     HWND  hwnd;     HDC   hdc;     HFONT hfont;     wchar_t ws[256];     unsigned char s[256];     int i;       system("color F0");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hfont = CreateFont(16,  0, 0, 0, 0, 0, 0, 0, 0           , 0, 0, 0, 0, "Lucida Console");     SelectObject(hdc,hfont);     TextOutW(hdc,10,10,L"你好",2);     for (i=0;i<256;i++) s[i]=i;     for (i=0;i<256;i++) ws[i]=a2w[s[i]];     TextOutW(hdc,10, 40,ws    ,32);     TextOutW(hdc,10, 80,ws+ 32,32);     TextOutW(hdc,10,120,ws+ 64,32);     TextOutW(hdc,10,160,ws+ 96,32);     TextOutW(hdc,10,200,ws+128,32);     TextOutW(hdc,10,240,ws+160,32);     TextOutW(hdc,10,280,ws+192,32);     TextOutW(hdc,10,320,ws+224,32);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     getch();     system("color 07");     system("cls");     ShowTheCursor();     return 0; }

可是最后得出的数据就是这些，现在要讲这些数据读到txt，有没有什么办法

这些都不是ASCII。

也就是那些字符在txt文件的是以GBK编码储存的，无法作为ASCII码读取。

首先那些字符不是标准的ASCII码 ，而是扩展ASCII码的字符。在简体中文版操作系统里，文本文件默认是以GBK的编码保存的，GBK编码兼容ASCII码，但不兼容扩展的ASCII，图中那些字符在GBK编码里也存在，但编码跟扩展的ASCII,码完全不同。

这些字符不是asc2码，你可以参照asc2码表，里面没有这些字符

对照过，这些都是ascii码表里的字符，那应该怎么读取？


Question: 大神帮我看看我的程序哪里出了问题啊 啊

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

#include <stdio.h> #define  N     3				/* 学生人数 */ struct student { 	char id[15]; 	char name[15]; 	int chinese, math, english, total; } stu[N]; int main() {  	int i,j; 	struct student t; 	for (i = 0; i < N; i++) 	{ 		printf("id name chinese math english\n"); 		scanf("%s %s %d %d %d", stu[i].id, stu[i].name, &stu[i].chinese, &stu[i].math, 			  &stu[i].english); 	 	stu[i].total = stu[i].chinese + stu[i].math + stu[i].english; 	} 	 for (i = 0; i < N-1; i++) 	{ 		for (j=i+1;j<N;j++) 		if (stu[i].total >stu[j].total) 			{t=stu[i];stu[i]=stu[j];stu[j]=t;} 	}for (i=0;i<N;i++) 		printf("\n%s %s %d %d %d\n", stu[i].id, stu[i].name, stu[i].chinese, stu[i].math,stu[i].english); }      匆忙在你的基础上写的，你可以参考一下


Question: 课程设计，模拟c语言语法分析器

libclang 好像能干这事。

没人吗

完全都没有学过栈

用堆栈来做，网上搜索一下，就是括号匹配的用堆栈做的 完全能够解决你这个问题。

这种东西我觉得还是用js写最方便.  啥时候有空了我写个...

来位大神啊..

我才学c语言，很多都不懂。

flex bison  antlr

我只知道变离字符数组，用if判断，可是怎么读取整篇源程序到一个字符数组中。

求代码啊


Question: 以结构的方式把数据写入文件，但是结构中有结构指针，怎么办

把结构指针所指向的内容写到文件里才行，你直接写入一个地址是没用的（下次无法使用的）。


Question: 运行程序是停止工作

FILE *fp= fopen("lmx.txt","r+");    之后检查文件有没打开成功，若没成功就不要再往下执行，否则你在feof(fp)出错

该程序运行后会停止工作，求大神看看


Question: 求大神帮我看看我的程序哪里出了问题

struct student { 	char id[15]; 	char name[15]; 	int chinese, math, english, total; }; stu[N]  最后的分号应该放到stu[N]后面：  struct student { 	char id[15]; 	char name[15]; 	int chinese, math, english, total; } stu[N];   stu[i].total = stu[i].chinese + stu[i].math + stu[i].english  这句后面少了分号    if(stu[i].total>stu[max}.total)  这里应该是用中括号

stu[N]应该是： student stu[N];


Question: 【菜鸟】找了3个小时没发现哪出错了，虽然知道阅读代码很烦，但是恳请前辈们看看[数据结构]

才几个小时……过3天再来。

仅供参考： #include <stdio.h> #include <stdlib.h>  typedef struct node { 	int data; 	struct node *lchild,*rchild; }BItree,*BtNode;  typedef struct{ 	BtNode s[100]; 	int top; }Stack;  void creatree(BtNode &tree)        //递归建立二叉树  { 	char c; 	c=getchar(); 	if(c=='#') 		tree=NULL; 	else { 		tree=(BtNode)malloc(sizeof(BItree)); 		tree->data=c-'0'; 		creatree(tree->lchild); 		creatree(tree->rchild); 	} }//前序遍历： void Forder(BtNode root) { 	BtNode p; 	Stack store; 	store.top=0; 	store.s[store.top++]=root; 	while(store.top>0) 	{ 		p=store.s[--store.top]; 		printf("%3d",p->data); 		if(p->rchild) 			store.s[store.top++]=p->rchild; 		if(p->lchild) 			store.s[store.top++]=p->lchild; 	} }  //中序遍历： void Midorder(BtNode root) { 	BtNode p=root; 	Stack store;   //指针栈  	store.top=0;   //top表示下一个元素的位置  	store.s[store.top++]=root; 	while(p->lchild)   //如果有左孩子，左孩子进栈  	{ 		store.s[store.top++]=p->lchild; 		p=p->lchild; 	} 	while(store.top>0)   //栈不为空就继续访问  	{ 		p=store.s[--store.top];  //p指向栈顶元素  		printf("%3d",p->data); 		if(p->rchild) 		{ 			store.s[store.top++]=p->rchild;   //右孩子进栈  			p=p->rchild; 			while(p->lchild)    //如果有左孩子，左孩子进栈  			{ 				store.s[store.top++]=p->lchild; 				p=p->lchild; 			} 		} 	} }  //后序遍历： void Lorder(BtNode root) { 	BtNode p=NULL,cur=root;  //p为前一个访问的结点，cur为当前结点  	Stack store; 	store.top=0; 	store.s[store.top++]=root; 	while(store.top>0) 	{ 		cur=store.s[store.top-1]; 		if(cur->lchild==NULL&&cur->lchild==NULL||   //判断左右孩子是否不存在  			(p!=NULL&&(p==cur->lchild||p==cur->rchild)))  //判断左右孩子是否被访问过了 		{ 			printf("%3d",cur->data); 			store.top--;   //输出了结点的data后就在栈中把该结点去掉  			p=cur; 		}  		else { 			if(cur->rchild!=NULL)  //有右孩子就让右孩子入栈（先右再左）  				store.s[store.top++]=cur->rchild; 			if(cur->lchild!=NULL)   //有左孩子就让左孩子入栈  				store.s[store.top++]=cur->lchild; 		} 	} }   int main () { 	BtNode root; 	creatree(root); 	printf("\n"); 	printf("*****************************************\n"); 	printf("\n"); 	printf("前序非递归遍历为：");  	Forder(root); 	printf("\n\n"); 	printf("中序非递归遍历为：");  	Midorder(root); 	printf("\n\n"); 	printf("后序非递归遍历为：");  	Lorder(root); 	printf("\n\n"); 	return 0; }


Question: 关于+++这是什么

笔误

引用 1 楼 user-2 的回复:表示没看懂。。 说是数组初始化，声明那里数组没赋初值

说是数组初始化，我试了一下，什么也打印不出来

表示没看懂。。


Question: 关于排列组合的c语言题目 求大神帮我一下

#include<stdio.h> int Eating(int n){ 	if(n==1) return 1; 	if(n==2) return 2; 	int sum=0; 	sum+=Eating(n-1)+Eating(n-2); 	return sum; } int main(){ 	int n; 	scanf("%d",&n); 	printf("%d\n",Eating(n)); 	return 0; }

我用数学排列组合解决了，递推要怎么实现呐？ #include <stdio.h> int main () {    int i,n,s,b,t,q;  int zhan (int n,int m);    scanf ("%d",&n);    s=n/2;    t=0;    for (i=1;i<=s;i++)       { 	      b=n-i*2; 		  if (b!=0) 		  {q=zhan (b+i,i);	  			t=t+q;	} 		  else t+=1;   		  	  } printf ("%d\n",t+1); return 0; } int zhan (int n,int m) {    int a=1,b=1,i,c,j=m;            for (i=1;i<=j;i++) 	 { a*=m; m--;}      for (i=1;i<=j;i++) 	 { b*=n; n--;} 		  c=b/a;   return (c); }

递推式 f(n) = f(n - 1) + f(n - 2)


Question: 求解

fflush(stdout); 输出立马刷新下输出流


Question: x为什么不记数呢

引用 楼主 a149979032 的回复:我想输出每行最大值的坐标，可x为什么不计数呢？求大神给看看 for (i = 0; i < 4; i++) 	{ 		for (j = 0; j < 4; j++) 		{ 			if (a[i][max] < a[i][j + 1]) 			{ 				max = j + 1; 				x = i; 			} 		} 	}  改成这样  for (i = 0; i < 4; i++) { 	int max = 0; 	for (j = 1; j < 4; j++) 	{ 		if (a[i][j] > a[i][max]) 		{ 			max = j; 		} 	} 	printf("第%d行：最大数的坐标(%d,%d)", i, i, max); }

引用 2 楼 a149979032 的回复:[quote=引用 1 楼 user-3 的回复:] if (a[i][max] < a[i][j + 1])  改成：  if (a[i][j] > max)   max = j + 1;  改成：  max = a[i][j]; 只需要坐标就行，不求值[/quote] 那个x为什么不动啊

引用 1 楼 user-3 的回复:if (a[i][max] < a[i][j + 1])  改成：  if (a[i][j] > max)   max = j + 1;  改成：  max = a[i][j]; 只需要坐标就行，不求值


八成没有吧。

应该没有64位vc6.0，vc6的最后补丁sp6是2004年发布的，而ms的第一个64位windows，xp64，到2007年才出来。

没有纯 64 位的 Visual C++ ？！！

可以明确地告诉你：没有 64 位的 Visual C++ 6.0。 但是： (1) 32 位的 Visual C++ 6.0 可以运行在 64位的 Windows 上面。 (2) 尽管没有 64 位的 Visual C++，但是 32 位的 Visual C++ 可以编译 64 位的程序。

学习的话，32位或64位有区别吗？64位平台可以运行32位程序。  C与C++程序设计学习与实验系统 2013.3 可以不用建立项目（单文件），简单的试验代码甚至不用保存为文件，直接编译运行观察结果，比较方便。 只有几十M大小。  自带TC编译器和VC 6.0编译器（选项可设置），自带DOSBox运行TC生成的exe程序。


Question: 如何用栈来实现商品日期管理

楼上简直是在瞎扯，加不加空格效果都是一样的。 关键在于你输入完一组数据后就s.releaseddata++;了 你while循环结束后应该加一句s.releaseddata = s.bottom;  #include<stdio.h> #include<stdlib.h> #define SIZE 100 typedef struct released{ 	int year; 	int month; 	int day; }; typedef  struct sqstack{ 	struct released *releaseddata; 	struct released *bottom;  }sqstack; void main() { 	sqstack s; 	char ch; 	int k = 0;  	s.bottom = (struct released *)malloc(SIZE*sizeof(struct released)); 	s.releaseddata = s.bottom; 	do{ 		printf("输入商品日期（例如2000 1 1）\n"); 		scanf("%d %d %d", &(s.releaseddata->year), &(s.releaseddata->month), &(s.releaseddata->day)); 		s.releaseddata++; 		k++; 		fflush(stdin); 		printf("是否继续输入(y/n)\n"); 		ch = getchar(); 	} while (ch == 'y'); 	s.releaseddata = s.bottom; 	for (int i = 0; i<k; i++) 		printf("%d %d %d\n", s.releaseddata->year, s.releaseddata->month, s.releaseddata->day); }

scanf("%d %d %d",你这里改成scanf("%d%d%d",不要空格就可以了

为什么要用栈？？队列不是更好？？


Question: C语言播放背景的音乐的问题

仅供参考： http://blog.163.com/tab_98/blog/static/1192409720164156552991/


Question: 有关%s的输出

不是printf的问题，是scanf本身就是空格分割字符输入的。

scanf收到空格会结束，你用gets的话就可以接受空格，如果你用scanf输入不要有空格输入，gets就可以

引用 7 楼 include_xy 的回复:#include<stdio.h>  int main()  { char a[101];  int n;  printf("input a string:\n");  scanf("%s",a);  //a[0]=a[0]-32;  printf("%s",a); //遇到空格自动结束 return 0;  } 可以输出的呀你输入一串英文句子 例如 :i am a student. 输出的就是:I

看你文章内容 应该是"" 和“” 搞错了

引用 4 楼 qq_36502045 的回复:[quote=引用 2 楼 qq_36409192 的回复:] 谁告诉你不能用的，当然可以字符串输出啊并没有搞错 我把代码给你们你们可以试试 #include <stdio.h> int main() { char a[101]; int n; printf("input a string :\n"); scanf("%s",a); //a[0]=a[0]-32; printf("%s",a);//遇到空格自动结束  return 0; }  讲真的 ，我特别奇怪这一点，就是有关输出问题，当你从键盘上输入的时候，包括%c 以及puts()putchar（）都不可以输出空格[/quote] 正常啊   哪里有问题了？？

引用 1 楼 qq_37067803 的回复:看你文章内容 应该是"" 和“” 搞错了这倒没有，我打的只是顺手打的题目，并不是代码，所以有点小缺漏。

引用 2 楼 qq_36409192 的回复:谁告诉你不能用的，当然可以字符串输出啊并没有搞错 我把代码给你们你们可以试试 #include <stdio.h> int main() { char a[101]; int n; printf("input a string :\n"); scanf("%s",a); //a[0]=a[0]-32; printf("%s",a);//遇到空格自动结束  return 0; }  讲真的 ，我特别奇怪这一点，就是有关输出问题，当你从键盘上输入的时候，包括%c 以及puts()putchar（）都不可以输出空格

谁告诉你不能用的，当然可以字符串输出啊


Question: 疯狂编程

#include <iostream>  #define NUM 1000 //可显示的位数  void main() { 	char power[NUM]; 	memset(power, 0, NUM);//清空存储答案的数组值 	power[0] = 1; 	int cha = 0;//用于进位 	for (int i = 0; i < 100000; i++)//十万次方 	{ 		for (int j = 0; j < NUM; j++) 		{ 			power[j] *= 2;//每一位乘以2 			power[j] += cha;//进位 			if (power[j] >= 10) 			{ 				power[j] -= 10; 				cha = 1;//进位 			} 			else 				cha = 0; 			if (power[j] == 0 && cha == 0)//退出判断 				break; 		} 	} 	int len = 0; 	for (int i = NUM - 1; i >= 0; i--) 	{ 		if (power[i] != 0) 		{ 			len = i; 			break; 		} 	} 	std::cout << "2的十万次方："; 	for (int i = len; i >= 0; i--) 		std::cout <<(power[i] += '0');  	std::cout << std::endl; 	system("pause"); }

肯定溢出了，只是考一考脑子灵活性的话参考8楼

2的十万次方的二进制表示只有一个"1"，大概主要是进制转换的问题....楼主考虑一下把整个算式取对数或者使劲开平方再算，楼主数学好的话可以上数论变换

随手写的, 奇怪, 还是得差不多 30毫秒, 太慢了, 还是得用 gmp ..  不过 V8 的速度还真不错....  #include <stdio.h> #include <stdint.h> #include <time.h>  #ifdef _MSC_VER #pragma warning(disable: 4996) #endif  int j__mul(uint64_t* a, int L__a, uint64_t *b, int L__b, uint64_t *result) { 	int i, j, L__result = L__a + L__b; 	for (i = 0; i < L__result; ++i) 		result[i] = 0; 	for (i = 0; i < L__a; ++i) 	{ 		for (j = 0; j < L__b; ++j) 			result[i + j] += a[i] * b[j]; 	} 	for (i = 1; i < L__result; ++i) 	{ 		result[i]     += result[i - 1] / 10000; 		result[i - 1] %= 10000; 	} 	if (0 == result[L__result - 1]) 		--L__result; 	return L__result; }  void foobar() { 	char s__result[100000], *s__p = s__result; 	uint64_t buf[3][10240] = { 0 }, *result = buf[0], *a = buf[1], *t = buf[2], *tt; 	int L__result = 1, L__a = 1; 	long tick_start = clock(), tick_calc, tick_output; 	int  b = 100000, i;  	result[0] = 1; 	a[0] = 2;  	while (1 != b) { 		if (b & 1) { 			L__result = j__mul(result, L__result, a, L__a, t); 			tt = result; result = t;  t = tt; 		}  		L__a = j__mul(a, L__a, a, L__a, t); 		tt = a;  a = t; t = tt; 		b >>= 1; 	} 	L__result = j__mul(result, L__result, a, L__a, t); 	result = t;  	tick_calc = clock(); 	s__p += sprintf(s__p, "%d", (int)result[L__result - 1]); 	for (i = L__result - 2; i >= 0; --i) 		s__p += sprintf(s__p, "%04d", (int)result[i]); 	printf("%s\n", s__result); 	tick_output = clock(); 	 	printf("tick %ld, %ld\n", tick_calc - tick_start, tick_output - tick_start);	 }  int main() { 	int i; 	for (i = 0; i < 10; ++i) 	{ 		foobar(); 	} 	getchar(); 	return 0; }

试了下，　就是ｊｓ跑也就 １００来毫秒的事情，　Ｃ跑起来应该时间都很难测出来．  <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>Title</title> </head> <body>  <script language="javascript">     function j__mul(a, b) {         var result = [], i, j;         result.length = a.length + b.length;         for(i = result.length - 1; i >= 0; --i)             result[i] = 0;         for(i = a.length - 1; i >= 0; --i) {             for(j = b.length - 1; j >= 0; --j) {                 result[i+j] += a[i] * b[j];             }         }          for(i = 1; i < result.length; ++i) {             result[i]   += result[i-1] / 10000 | 0;             result[i-1] %= 10000;         }          if(0 == result[result.length-1])             --result.length;         return result;     }      function j__pow(i__a, b) {         var start = new Date().getMilliseconds();         var result = [1], s__result = "";         var a = [i__a], i;          if(b <= 0)             return 1;          while(1 != b) {             if(0 != (b&1))                 result = j__mul(result, a);              a = j__mul(a, a);             b >>= 1;         }          result = j__mul(result, a);         i = result.length - 1;          s__result += result[i];         while(--i >= 0) {             var s1 = "0000" + result[i];             s__result += s1.substring(s1.length - 4);         }         return (new Date().getMilliseconds() - start) + "  Len:" + s__result.length + "\n\n\n" + s__result;     }  </script> <button onclick="document.getElementById('result').innerText = j__pow(2, 100000)">2^100000</button> <textarea id="result" style="width: 100%; height: 600px;"></textarea>  </body> </html>

pow(2,N)  复杂度是　O(log(N)) 的，　不需要咋搞．

大数存储考虑用数组来存

引用 2 楼 GKatHere的回复:这不在次方的问题，在于数据长度的问题 那就用字符串存储吧..

这不在次方的问题，在于数据长度的问题

帮你移到了C语言版。

用long double能表示不？

2 的 十万次方是一个固定的数。

用数组来存储就可以了。  请参考以下代码： #include<stdio.h> int main() {     static int a[100000000]; //设置一个超大数组来存储乘积结果。     int n;//要求的n的阶乘     int jw;//用来表示进位     int i, j;//控制循环     int len = 1;//初始化数组长度为1     int temp;//过程变量     printf("请输入n：");     scanf("%d", &n);     a[1] = 1;     for (i = 2; i <= n; i++)//遍历。从1到n     {         jw = 0;         for (j = 1; j <= len; j++)//从数组的低位开始乘         {             temp = a[j] * i + jw;//变量存储结果             a[j] = temp % 10;//将变量最后一位放入数组。             jw = temp / 10;//表示除了最后一位需要进位的数             if (j >= len && jw != 0)                 len++;  //数组长度加一          }       }          printf("n! =");          for (i = len; i >= 1; i--)//逆序输出数组就是结果         printf("%d", a[i]);     printf("\n");     return 0; }


Question: 求助帮忙看下为什么错

帮结贴

改好了，不用了

#include <stdio.h> #include <conio.h> #include<stdlib.h> #include<malloc.h> //函数 void jiemian(void);//主界面 void gongneng(void);//功能的选择 int input(int a);//商品的入库 int output(void);//商品的出库   struct xinxi { 	char name[100]; 	int daima; 	char changjia[100]; 	char riqi[100]; 	int shuliang; 	double qian; 	int chuku; };  int main(void) { 	int a,i=0; 	 	jiemian(); 	gongneng(); 	do 	{ 		scanf("%d",&a); 	}while(a!=1&&a!=2&&a!=3&&a!=4&&a!=5&&a!=6&&a!=7);  	switch (a) 		{ 		case 1: 			input(i++); break;    //商品信息输入 		case 2: 			output(); break;/*//添加商品出库记录 		case 3:    			find(); break;//商品查询，按名称，按代码，按商品生产商（内部调用三个查询的函数find_1()，find_2()，find_3()） 		case 4:    			change(); break;//修改商品信息 		case 5:    			display(); break;//商品信息的盘点 		case 6:    			order();  break;//出库数量排序（内部调用升序函数shun，降序函数dao） 		case 7:     			save(); quit();  break;//保存信息函数，退出系统函数 		default:     			break;*/  		} 	 	return 0; }   void jiemian(void) { 	printf("\n\n\n\n\n\n\t                 ◆◆◆    ^ v ^   ◆◆◆   "); 	printf("\n\n\n\t\t\t  →  ※　欢迎使用　※   ←"); 	printf("\n\n\n\t\t  ★〓★〓★商品库存管理系统★〓★〓★"); 	printf("\n\n\n\t\t\t\t\t→◆作者：第一组"); 	printf("\n\n\t\t\t\t\t　　◎◎◎◎◎2016年12月24日\n"); 	printf("\n\n\n\t按回车键进入主菜单:");            /*界面*/ 	getchar(); 	system("cls"); }  void gongneng(void) { 	printf("\n"); 	printf("\t\t\t  ************\n"); 	printf("\t\t\t  *  主菜单  *\n");               /*主菜单*/ 	printf("\t\t\t  ************\n\n\n"); 	printf("\t        1 商品入库        2 商品出库\n\n\n\n"); 	printf("\t   3 查询商品     7 退出系统       4 修改商品\n\n\n\n"); 	printf("\t        5  日盘点          6 出库排序\n\n\n"); 	printf("\n\n"); 	printf("\t 请选择[1/2/3/4/5/6/7]: "); 		 	getchar(); 	system("cls"); /*清屏*/  }  int input(int a)//把商品的信息录入并存储  { 	struct xinxi * pArr; 	pArr = (struct xinxi *)malloc(100 * sizeof(struct xinxi));  	printf("请输入商品的名称："); 	scanf("%s",pArr[a].name); 	printf("请输入商品代码："); 	scanf("%d",&pArr[a].daima); 	printf("请输入商品生产厂家："); 	scanf("%s",pArr[a].changjia); 	printf("请输入商品生产日期："); 	scanf("%s",pArr[a].riqi); 	printf("请输入商品的数量："); 	scanf("%d",&pArr[a].shuliang); 	printf("请输入商品的价格："); 	scanf("%lf",&pArr[a].qian); 	printf("请输入商品出库："); 	scanf("%d",&pArr[a].chuku); 	return 0; }  void output(void) { 	int b,c,d,a; 	printf("请输入商品的代码："); 	c=scanf("%d",&b); 	if(c=1) 	{ 		for(d=0;d<100;d++)//利用for循环和下面的118行的代码，把输入的代码和以有的代码作比较  		{ 			if(b=pArr[d].daima) 			{ 				printf("请输入商品的出库数量："); 				scanf("%d",&a);//输入本次出库的数量  				if(a>pArr[d].shuliang) 				{ 					printf("你输入的出库数量以超过现有的库存量,现有的库存量为：%d",pArr[d].shuliang);  				} 				else 					pArr[d].name+=a;//将本此出库的数量加上原来已经出库的数量  					pArr[d].ruku-=pArr[d].chuku;//用以有库存减去出库数量  			} 			else 				printf("请输入正确的代码，检查步到你所输入的代码"); 		} 	} }

还没编完 ，但是我建立的动态结构体为什么在那个函数中不能运用


Question: 代码找错误

建议贴完整代码。 你左值有问题。

name  是const 指针吧，也就是 const char* 或 const wchar_t*


Question: 关于结构的初始化

引用 3 楼 user-3 的回复:你使用了一个嵌套的循环，当进入内循环后。 你的循环可能是一个死循环。 当你初始化 life 为真的时候。 这就是你初始化的原因。 当你没有初始化的时候，全局变量自动在编译的时候初始化为 0.谢谢你，对我帮助很大！

引用 4 楼 shanshenyuyou 的回复:初入论坛菜鸟怎么发程序像你们那样的 点击图标“<>”

初入论坛菜鸟怎么发程序像你们那样的

所以发上来看看大家意见

问题出在initsnake函数上，我把它注释后，就能运行了，不然的话还是卡在这个函数。


Question: shell命令的选项是不是有些不能合并啊

man sed man ls


Question: 各位大神前辈请看过来，新手有个关于“if”的问题

刚试了，真的是这样，非常感谢

if(0<num<=9)     place=1;   0<num为真返回1，1<=9也为真，执行place=1;   所以place=1。  改成：  if(0<num && num<=9)         place=1;


Question: c语言怎么把二进制流文件用fread读取到结构体，然后排序

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


Question: 下面的代码怎么改啊?真心不知道了

楼上正解，注意字符和字符数组的区别，占位符和类型的匹配

#include<stdio.h> void main() {     struct Student     {         int num;         char name[32]; // 存放字符串，改为字符数组         float score[3];     }student[5];      int i,j;     for(i=0;i<5;i++)     {         printf("please enter the number and name:\n");         scanf("%d %s",&student[i].num,&student[i].name);          for(j=0;j<3;j++)         {             printf("please enter the score[%d]:",j+1);             scanf("%f",&student[i].score[j]); // score是float型，改为%f         }     }     for(i=0;i<5;i++)     {         printf("%d %s\n",student[i].num,student[i].name);         for(j=0;j<3;j++)         {             printf("%f ",student[i].score[j]); // score是float型，改为%f         }         putchar('\n');     } }

现在有什么问题？


Question: 求助求助！！！急！！！

对了，谢谢！！@AnonymousRookie

int search(int array[],int m);函数中的n是传入数组的大小，没有初始化，最好作为函数参数进行传递   int search(int array[],int n, int m) {     int x=0,i;     for (i=0;i<n;i++) {         if (array[i]==m)              x++;     }     return x; }   printf("%d\n",search(a,5,y));

search函数中n没有赋值吧…


Question: 求助！，C语言编程，文件无法打开。

// GETCWD.C /* This program places the name of the current directory in the   * buffer array, then displays the name of the current directory   * on the screen. Specifying a length of _MAX_PATH leaves room   * for the longest legal path name.  */  #include <direct.h> #include <stdlib.h> #include <stdio.h>  void main( void ) {    char buffer[_MAX_PATH];     /* Get the current working directory: */    if( _getcwd( buffer, _MAX_PATH ) == NULL )       perror( "_getcwd error" );    else       printf( "%s\n", buffer ); }  /* CHGDIR.C: This program uses the _chdir function to verify  * that a given directory exists.  */  #include <direct.h> #include <stdio.h> #include <stdlib.h>  void main( int argc, char *argv[] ) {    if( _chdir( argv[1] )   )       printf( "Unable to locate the directory: %s\n", argv[1] );    else       system( "dir *.wri"); }

建立一个霍夫曼树，将输入的字符和对应的权值保存在“hfmtree.txt”中，在第二次打开的时候就直接调用，但是在运行的时候,以读的方式一直打不开“hfmtree.txt”。但是就在刚才又不知道为什么行了。。。

你要实现什么功能呀？？


Question: 如何读取指定目录中的最新文件

ReadDirectoryChangesW

参考MSDN98中的例子fwatch MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\FWATCH.DSP MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\FWATCH.C MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\MAKEFILE MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\FWATCH.INI MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\README.TXT  MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl

引用 1 楼 zhao4zhong1 的回复:ReadDirectoryChangesW 赵老师，这个怎么用？


Question: 递归求助：怎么用递归计算数组中数据的和，要用类似二分法从中间折半递归。。。

引用 5 楼 user-1的回复:[quote=引用 4 楼 zzf1510711060 的回复:] [quote=引用 3 楼 user-1 的回复:] int sum(int a[], int n) { 	if (n == 1) 		return a[0];  	int		mid = n / 2; 	int		lefts = sum(a, mid); 	int		rights = sum(a + mid, n - mid); 	return lefts + rights; } 这里的a+mid是原数组折半的意思吗？ [/quote]数组a元素中，下标从0到mid-1共mid个，是前一半；从mid到n-1共n-mid个，是后一半；分别求和，再相加[/quote] 懂了，谢谢！！！！！！！！

引用 4 楼 zzf1510711060 的回复:[quote=引用 3 楼 user-1 的回复:] int sum(int a[], int n) { 	if (n == 1) 		return a[0];  	int		mid = n / 2; 	int		lefts = sum(a, mid); 	int		rights = sum(a + mid, n - mid); 	return lefts + rights; } 这里的a+mid是原数组折半的意思吗？ [/quote]数组a元素中，下标从0到mid-1共mid个，是前一半；从mid到n-1共n-mid个，是后一半；分别求和，再相加

引用 3 楼 user-1 的回复:int sum(int a[], int n) { 	if (n == 1) 		return a[0];  	int		mid = n / 2; 	int		lefts = sum(a, mid); 	int		rights = sum(a + mid, n - mid); 	return lefts + rights; } 这里的a+mid是原数组折半的意思吗？


Question: Segmetation Fault是什么鬼

出现了Segmentation fault，基本上的原因是，非法的内存访问。 例如数组的越界，在循环操作时循环变量的控制问题，也有字符串拷贝时长度溢出，指针指向了非法的空间，还有就是申明一个指针，但却没有对其初始化，就直接引用，或者没有开辟内存空间就释放内存，所以要检查申请空间时间偶成功。。。

if(argc!=2){      printf("usage:a.out <descriptor#>");    }   return 1;


Question: 关于srand()函数的一个问题 求解

可以先产生一个随机数iNormalFood，比如范围（2~6），然后每产生一个正常食物，NormalFoodCount++，当NormalFoodCount达到iNormalFood，产生一个特殊食物，然后重新产生一个随机数iNormalFood。

没有学那么深噢...大一学生 有没有简单一点的方法？？？


Question: acm大佬快来，格式错误是什么鬼，还有为什么C语言多个空格少个空格答案差别那么大

没有人回复宝宝我自己回答吧，一个学长帮我修改了另一道题代码，错误一样格式错误。 代码如下：#include<stdio.h> #include<string.h> int main() {     char s[20] ;     int i,t,j;     scanf("%s",s);     int len=strlen(s);     for(j=0; j<len-1; j++)     {         {             for(i=0; i<len-1-j; i++)                 if(s[i]>s[i+1])                  {                     t=s[i];                     s[i]=s[i+1];                     s[i+1]=t;                 }         }     }     for(i=0; s[i]!='\0'; i++)         if(i==0) printf("%c",s[i]);         else printf(" %c",s[i]);  } acm输出后面可能不能有回车空格，遇见需要一个数字一个空格这样输出的先输出首位，然后其他的前面加空格，，，，，以上都是废话相信和我一样的小白看见代码就明白了


Question: free释放内存空间出错, 不知道什么原因, 求指点,谢谢

“多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

好的, 谢谢, 我改成申请时加1了     int *tz = (int *)calloc(n + 1, sizeof(int));

i <= n 改为 i<n

for (int i = 2; i <= n; i++)  --->  for (int i = 2; i < n; i++)  越界了，不是free的错

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h>  //斐波那契数列迭代法求解 int  tz2(int n) { 	int *tz = (int *)calloc(n, sizeof(int)); //定义一个数组有来存放每个月的兔子总数. 用的最大整数了 	tz[0] = 0; 	tz[1] = 1; 	printf("1月 免子数量为%d\n", tz[1]);  //打印1月总兔子数 	for (int i = 2; i <= n; i++) 	{ 		tz[i] = tz[i - 1] + tz[i - 2]; 		printf("%d月 免子数量为%d\n", i, tz[i]);  //打印总兔子数 	} 	free(tz);  //不知道为什么, 加上会出错?????? 	return 1; }   int main() { 	tz2(20); 	system("pause"); }  上面没有格式,重新发下代码, 求指点


Question: 归并排序递归部分

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

“给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

void mergearray(int a[], int first, int mid, int last, int temp[])   {       int i = first, j = mid + 1;       int m = mid,   n = last;       int k = 0;              while (i <= m && j <= n)       {           if (a[i] <= a[j])               temp[k++] = a[i++];           else               temp[k++] = a[j++];       }              while (i <= m)           temp[k++] = a[i++];              while (j <= n)           temp[k++] = a[j++];              for (i = 0; i < k; i++)           a[first + i] = temp[i];   }  这是合并部分


Question: gcc编译c文件怎么不用指定链接库啊

linux 链接动态的会去掉lib, 看看有没有 -lc 呢

能不能自己指定具体链接什么库啊，就好像vs有/NODEFAULTLIB

引用 1 楼 user-1 的回复:运行下 $ gcc -dumpspecs 看看  这是什么，不过grep libc没有啊，只找到另一个链接库

运行下 $ gcc -dumpspecs 看看


Question: 求大神帮忙看一下哪里错了，关于选择语句的编程题

哦，也就是说float型和int型作运算时，得数时float型

%.2d  改成  %.2f

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

%d 是替换为整数