Question: 我的最后一个定义函数为什么那个if总是为1啊  那个a不知道是不是指向了另外的地址啊

建议单步跟踪你程序运行，观察变量变化情况，很容易分析出原因

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

问题出在les函数里的这句： a+=(*(*p+i)+j); 注意，仔细分析这句代码； 是不是应该这样： a += *(*(p+i)+j); 前面都写对了，到这儿写错了。   代码中变量名定义建议做到见名知意： #include<stdio.h> #include<stdlib.h>  void ave(int (*p)[6],int n); void find(int (*p)[6]); void les(int (*p)[6]);  void print_all_info(int (*arr)[6], int size); int main() {     int a[4][6];     int i,j,n;     printf("请输入他们的学号和成绩：");     for(i=0;i<4;i++)     {         for(j=0;j<6;j++)             scanf("%d",&a[i][j]);     }     print_all_info(a, 4);     ave(a,1);     find(a);     les(a);     system("pause");      return 0; }  void print_all_info(int (*arr)[6], int size) {     int i, j;      for (i = 0; i < size; i++) {         for (j = 0; j < 6; j++)             printf("%d  ", arr[i][j]);         putchar(10);     }     putchar(10);  } void ave(int (*p)[6],int n) {     int b=0;     float t=0;     for(int i=0;i<4;i++)         b+=*(*(p+i)+n);     t=b/5;     printf("第一门的成绩为%.2f  \n",t); } void find(int (*p)[6]) {     int t=0;     for(int i=0;i<4;i++)     {for(int j=1;j<6;j++)         {if(*(*(p+i)+j)<60)             t++;         }         while(t>=2)         {             for(int j=0;j<6;j++)                 printf("%d ",*(*(p+i)+j));             putchar('\n');             t=0;         }     } } void les(int (*p)[6]) {     int sum = 0,cnt=0;     float ave = 0;     int i, j;      for(i=0;i<4;i++)     {         for(j=1;j<6;j++)         {             if(*(*(p+i)+j)>=85)             {                 cnt++;             }             sum += *(*(p+i)+j);         }         ave = sum/5;         if(cnt >= 5||(ave>=90))         {             printf("cnt = %d ", cnt);             printf("sum = %d ", sum);             printf("ave = %.2f \n", ave);             printf("这个学生是：%d \n",*(*(p+i)));         }         cnt = 0;         sum=0;     } }

输出为什么是这样

最后一个函数的作用是输出平均成绩在90分以上的学号或者是每门成绩在85分以上的学号


Question: 递归算法，C语言

for(j=0;j<N;j++) { scanf("%d",&A); }  我眼都看花了，才发现是这里的问题，应该是 for(j=0;j<N;j++) { scanf("%d",&A[j]); } 你的数组都没正确赋值，怎么可能找到最小值哪

单步跟踪程序运行，看是哪一步与你期望的值不一致，分析原因

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

希望你可以自己设置断点调试一下

没啥毛病啊,你再看看


Question: 写一个函数，用“气泡法”对输入的10个字符按由小到大顺序排序

嗯嗯，我已经改好了，谢谢你

你都没在主函数调用sort函数，它怎么给你排序，而且你这串代码还有其它的一些问题

&a[10] ？


Question: 遇到一个文件的读写问题，希望大家能帮我看一下，困惑了好久了。

明白了明白了

谢谢谢谢，ctrl+d,文本已经写入了。还有一个小小的问题，就算printf怎么是执行了两次 打印了两个input出来呀？

#include <stdio.h> #include <string.h> #include <errno.h>  int main() {     FILE *fp;     int ch;     fp = fopen("/home/ckw/linuxc/text.txt","w");     if (!fp) {         fprintf(stderr, "%s\n", strerror(errno));         return -1;     }     ch = getchar();     while(ch!=EOF)     {         fputc(ch, fp);         printf("input:\n");         ch = getchar();     }     fclose(fp);     return 0; } 1. 确认文件开始是否成功 2. 输入EOF停止循环；（Linux输入ctrl+D,Windows下输入ctrl+Z)

#include<stdio.h>  int main() {     FILE *fp;     int ch;     fp = fopen("/home/ckw/linuxc/text.txt","w");     if (NULL==fp) {         printf("open /home/ckw/linuxc/text.txt for w error!\n");         return 1;     }     ch = getchar();     while(ch!=EOF)     {         fputc(ch,fp);         fflush(fp);         printf("input:\n");         ch=getchar();     }     fclose(fp);     return 0; }


Question: 新人求助，大婶们可以帮忙看看这个LeetCode上的Runtime Error吗

递归层次太深了？注意递归的返回条件

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

引用 2 楼 c464580613 的回复:逻辑上有问题。 1.你的第二层循环，没有每次都把count清零 2. k=dfs? 我觉得是k+=dfs  runtime error好像没看出来。。谢谢，我再调试着看看。第二点由于我传过去的是加了1的k，所以用=没问题。

引用 1 楼 hefashion0190 的回复:这是完整的代码？这是leetcode里面我打进去的代码，main（）函数是题库自带并且没有显示，就没放进来。通过main（）传参数给maxAreaOfIsland(int** grid, int gridRowSize, int gridColSize) 来完成工作。

引用 8 楼 zhao4zhong1 的回复:“给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出  使用命令editbin.exe /STACK:16777216 xxx.exe可以将xxx.exe的默认堆栈大小1MB改为16MB多谢老师的帮助，以前不会用debugger，感觉调试很费劲。今天学会了这个技能后，调试代码舒畅多了！

这是完整的代码？


Question: 题目及代码如下，有测试点错误，求指出并修改一下代码，使之正确

//////////////////////////////////////////////////////////////////////////////// // 文件名： array_jose.c // 作者：   cfjtaishan // 版本：   1.0 // 日期：   2013-10-31 // 描述：   约瑟夫环, 数组实现； // 历史记录： /////////////////////////////////////////////////////////////////////////////// #include <stdio.h> #include <stdlib.h>  #define OUT_FLAG 7  /*初始化数组*/ int *init_arr(int *a, int len) { 	int i = 0;  	for(; i < len; i++) 		printf("%d ", a[i] = i+1); 	printf("\n");  	return a; }  /*约瑟夫环1*/ void print_out_order(int *a, int len) { 	/*      * num:队列中非0数字的个数      * mark:出列的标记数      * ret:最终剩下的数      * row:换行打印标记      */ 	int num = 0, row = 1, mark = 0, ret; 	int j;  	while(num != 1){ 		num = 0; 		for(j = 0; j < len; j++){ 			if(a[j] != 0){ 				num++; 				mark++; 				ret = a[j]; 			} 			if(mark == OUT_FLAG){ 				printf("%2d%c", a[j], !(row % 10) ? '\n' : ' '); 				a[j] = 0; 				mark = 0; 				row++; 			} 		} 	} 	printf("\n\n--------\"%d\" is the last one!\n", ret); }  /*约瑟夫环2*/ void print_out_order2(int *a, int len) { 	int i, count = 0, rem = len;  	for(i = 0; rem > 1; i++){ 		if(i > (len-1)) 			i = 0; 		if(a[i]){ 			count++; 			if(OUT_FLAG == count){ 				count = 0; 				printf("%d ", a[i]); 				a[i] = 0; 				rem--; 			} 		} 	} 	putchar('\n'); }  int main(void) { 	int len; 	printf("How many people in the queue?\n"); 	scanf("%d", &len);  	int *arr = (int *)malloc(sizeof(int) *len);     if (!arr) {         fprintf(stderr, "malloc error!\n");         return -1;     } 	init_arr(arr, len);  	printf("\nThe order of people quit queue is:\n"); 	print_out_order(arr, len); 	printf("---------proc 2-------------\n");  	int arr2[len]; 	init_arr(arr2, len);  	print_out_order2(arr2, len);      free(arr); 	return 0; } 参考一下吧

搜索“约瑟夫问题”


Question: C语言在选择排序（由大到小）出现-858993460

越界后就是随机数了

对，j赋值后还要进行自加运算，谢谢各位大神指导

k与j应该相等呀，为什么想x[j]，x[k]表示会出现不同的结果。

#include <stdio.h> #include <stdlib.h>  void sort(int x[], int n);  int main(int argc,char *argv[]) {     system("color f0");     int i, *p, a[10];     p = a;     printf("please enter 10 interger numbers:");     for (i = 0; i < 10; i++)         scanf("%d", p++);     p = a;     sort(p, 10);     for (p = a, i = 0; i < 10; i++)     {         printf("%d", *p);         p++;     }     printf("\n");     system("pause");     return 0; }  void sort(int x[], int n) {     int i, j, k, t;     for (i = 0; i < n - 1; i++)     {         k = i;         for (j = i + 1; j < n;j++)             if (x[j] > x[k])                 k = j;         if (k != i)         {             t = x[i];             x[i] = x[k];    /*只需将x[j]改成x[k]就好了*/             x[k] = t;         }     }     return; }   要交换的是i和k下标对应的值

你sort函数中，x[i] = x[j];这句的j已经越界，因为此时j是之前循环之后还加了1的变量，在你程序中为10，x[10]已经越界

第二个for循环少了"{}" #include <stdio.h> #include <stdlib.h>  void sort(int x[], int n); int main(int argc,char *argv[]) { 	system("color f0"); 	int i, *p, a[10]; 	p = a; 	printf("please enter 10 interger numbers:"); 	for (i = 0; i < 10; i++) 		scanf("%d",p++); 	p = a; 	sort(p, 10); 	for (p = a, i = 0; i < 10; i++) 	{ 		printf("%d", *p); 		p++; 	} 	printf("\n"); 	system("pause"); 	return 0; }  void sort(int x[], int n) { 	int i, j, k, t; 	for (i = 0; i < n - 1; i++) 	{ 		k = i; 		for (j = i + 1; j < n;j++) 		{ 			if (x[j]>x[k]) 				k = j; 			if (k != i) 			{ 				t = x[i]; 				x[i] = x[j]; 				x[k] = t; 			} 		} 	} 	return; }

自己设置断点调试一下吧


Question: 程序运行不出，只输出“please input the exression:”就停止工作，小白想问一下为什么？是中缀表达式求值的程序

引用 1楼user-1 的回复: 调试的时候，41号这里退出的好的，我知道哪里了，谢谢你

调试的时候，41号这里退出的


Question: 求助用C程序对给定文法进行递归下降分析问题

谢谢帮助，问题解决了

#include <stdio.h> #include<dos.h> #include<stdlib.h> #include<string.h> char v[50], u[50], d[200], e[10]; char ch; int n1, i1 = 0, flag = 1, n = 7; int S(); int M(); int T(); int N(); void input(); void input1(); void output();  //================================================ int main()                      /*递归分析*/ {     int f, p, j = 0;     char x;     d[0] = 'S';     d[1] = '=';     d[2] = ' ';     d[3] = '(';     d[4] = 'T';     d[5] = ')';     d[6] = '#';      printf("请输入字符串(长度<50,以#号结束）\n");     do {         scanf("%c", &ch);         v[j] = ch;         j++;     } while (ch != '#');      n1 = j;     ch = u[0] = v[0];     printf("文法\t分析串\t\t分析字符\t剩余串\n");     f = S();     if (f == 0)         return -1;     if (ch == '#') {         printf("accept\n");         p = 0;         x = d[p];         while (x != '#') {             printf("%c", x);             p = p + 1;             x = d[p];        /*输出推导式*/         }     } else {         printf("error\n");         printf("回车返回\n");         getchar();         getchar();         return -1;     }     printf("\n");     printf("回车返回\n");     getchar();     getchar(); }   //================================================ int S() {     int f;     if (ch == '(') {         u[i1] = ch;         printf("S->(T)\t");         e[0] = 'S';         e[1] = '=';         e[2] = ' ';         e[3] = '(';         e[4] = 'T';         e[5] = ')';         e[6] = '#';         output();         flag = 0;         input();         input1();         ch = v[++i1];         f = T();         if (f == 0)             return (0);         if (ch == ')') {             u[i1] = ch;             printf("S--(T)\t");             flag = 0;             input();             input1();             ch = v[++i1];         } else {             printf("error\n");             return (0);         }      }     if (ch == 'a') {         u[i1] = ch;         printf("S->aM\t");         e[0] = 'S';         e[1] = '=';         e[2] = ' ';         e[3] = 'a';         e[4] = 'M';         e[5] = '#';         output();         flag = 0;         input();         input1();         ch = v[++i1];         f = M();         if (f == 0)             return (0);         return (1);     } else {         printf("error\n");         return (0);     }     return (1); }  //================================================ int T() {     int f, t;     printf("T->SN\t");     e[0] = 'T';     e[1] = '=';     e[2] = ' ';     e[3] = 'S';     e[4] = 'N';     e[5] = '#';     output();     flag = 1;     input();     input1();     f = S();     if (f == 0)         return (0);     t = N();     if (t == 0)         return (0);     else         return (1); }  //================================================ int N() {     int f, t;     if (ch == 'b') {         u[i1] = ch;         printf("N->bSN\t");         e[0] = 'N';         e[1] = '=';         e[2] = ' ';         e[3] = 'b';         e[4] = 'S';         e[5] = 'N';         e[6] = '#';         output();         flag = 0;         input();         input1();         ch = v[++i1];         f = S();         if (f == 0)             return (0);         t = N();         if (t == 0)             return (0);         else             return (1);     }      printf("N->^\t");     e[0] = 'N';     e[1] = '=';     e[2] = ' ';     e[3] = '^';     e[4] = '#';     output();     flag = 1;     v[i1] = ch;     input();     input1();     return (1);  } //================================================   int  M() {     int f;     if (ch == '+') {         u[i1] = ch;         printf("M->+S\t");         e[0] = 'M';         e[1] = '=';         e[2] = ' ';         e[3] = '+';         e[4] = 'S';         e[5] = '#';         output();         flag = 0;         input();         input1();         ch = v[++i1];         f = S();         if (f == 0)             return (0);         return (1);     }     printf("M->^\t");     e[0] = 'M';     e[1] = '=';     e[2] = ' ';     e[3] = '^';     e[4] = '#';     output();     flag = 1;     input();     input1();     return (1); }  //================================================  void input() {     int j = 0;     for (; j <= i1 - flag; j++)         printf("%c", u[j]);               /*输出分析串*/      printf("\t\t");     printf("%c\t\t", ch);                 /*输出分析字符*/ }  //================================================ void input1() {     int j;     for (j = i1 + 1 - flag; j < n1; j++)         printf("%c", v[j]);                /*输出剩余字符*/      printf("\n"); }    //================================================ void output()                               /*推导式计算*/ {     int m, k, j, q;     int i = 0;     m = 0;     k = 0;     q = 0;     i = n;     d[n] = '=';     d[n + 1] = ' ';     d[n + 2] = '#';     n = n + 2;     i = n;     i = i - 2;     while (d[i] != ' ' && i != 0)         i = i - 1;     i = i + 1;     while (d[i] != e[0])         i = i + 1;     q = i;     m = q;     k = q;     while (d[m] != ' ')         m = m - 1;     m = m + 1;     while (m != q) {         d[n] = d[m];         m = m + 1;         n = n + 1;     }     d[n] = '#';     for (j = 3; e[j] != '#'; j++) {         d[n] = e[j];         n = n + 1;     }     k = k + 1;     while (d[k] != '=') {         d[n] = d[k];         n = n + 1;         k = k + 1;     }     d[n] = '#'; }   这样可以编译，

对文法使用了递归下降分析方法，手残打错了。。


Question: 求问一个差了好半天没解决的问题。。。

用算法模拟可以么，不用汇编

百度搜索加法器

自己设定变量模拟标志位 还是要用汇编写? 我感觉用c模拟一下就可以吧


Question: 新手求指教。

#include <stdio.h>   void Display(int n) {     int i;     if(n>0)         Display(n-1);     for(i=1;i<=n;i++)         printf("%d ", n);     printf("\n"); } int main(void) {     int n=4;     Display(n); }

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

把打印放到递归的下面

这样也可以 #include <stdio.h>  void Display(int n) {    int i;     if (n > 0) Display(n - 1);    else return;        for (i = 1; i <= n; i++)       printf("%d ",n);         printf("\n"); }  int main(void) {    int n = 4;    Display(n);    return 0; }

将Display提前即可 #include <stdio.h>  void Display(int n) {    int i;     if (n > 0) Display(n - 1);        for (i = 1; i <= n; i++)       printf("%d ",n);         if (n) printf("\n"); //防止n为0时输出换行 }  int main(void) {    int n = 4;    Display(n);    return 0; }

那for循环怎么用。 我们老师要求用递归

你一定要用递归么。。。可以用俩for循环额


Question: C语言新手 求大神带

引用 4 楼 cfjtaishan 的回复:#include<stdio.h> #include<math.h> #include<string.h>  int main() {     char kao[80], dst[80];     printf("请输入字符串\n");     //scanf("%s", kao);   /*去掉&,数组名即地址*/     fgets(kao, 80, stdin);     puts(kao);     int i, k = 0;     int len = strlen(kao);     for (i = 0; i < len; i++)     {         dst[k++] = kao[i];         if (kao[i] == '!')             dst[k++] = '!';              /*         if (kao[i] == '!')         { kao[i]='!!';}         else if (kao[i] == '.')         {kao[i] = '!';}         else if(kao[i] == '#')         {printf("%s\n",kao);break;}         */     }     dst[k] = 0;     puts(dst);     return 0; } 参考一下吧

额  我试过另一个数组 但是不知道是我的方法不对还是怎么了 有错误

找到! 再插入一个!就好了

直接复制到另一个数组里不就好了？


Question: 如何先序建立一个存储int元素的二叉树呢？

#include "head.h" typedef  int DataType;  typedef struct tree{ 	DataType num; 	struct tree *left_child; 	struct tree *right_child; }node;  node * init_tree(void) { 	node *root = (node *)malloc(sizeof(node)); 	(node *)memset(root, 0x00, sizeof(node)); 	 	root->left_child = NULL; 	root->right_child = NULL; 	 	return root; }  void insert_tree(node **root) { 	static node *last_node = NULL; 	 	if(*root != NULL){ 		fprintf(stderr, "%s\012", "Here is not empty !"); 		return; 	} 	node *rt = (node *)calloc(1, sizeof(node)); 	*root = rt; 	if(!last_node){ 		system("color 0C"); 		fprintf(stderr, "%s\012", "\"The data inserted into the root node .\""); 		Sleep(2000); 		system("color 0A"); 	} 	printf("Enter to insert data :"); 	while(scanf("%d", &rt->num) == 0){ 		fflush(stdin); 		fprintf(stderr, "%s", "Illegal input and input again :"); 	} 	rt->left_child = NULL; 	rt->right_child = NULL; 	 	system("color 0C"); 	fprintf(stderr, "%s", "\n\t-----------------------------------------\n"); 	fprintf(stderr, "%s\n", "\t1.insert left_child  2.insert right_child\n\ 	3.insert brother     0.end_insert"); 	fprintf(stderr, "%s", "\t-----------------------------------------\n\n"); 	Sleep(3000); 	system("color 0A"); 	int choose; 	lb: fprintf(stderr, "%s", "Please select a :"); 	while(scanf("%d", &choose) == 0){ 		fflush(stdin); 		fprintf(stderr, "%s", "Illegal input and input again :"); 	} 	if(choose > 3 || choose < 0){ 		fprintf(stderr, "%s", "There is no this option.\012"); 		goto lb; 	}	 	 	switch(choose){ 		case 1:{ 			last_node = rt; 			insert_tree(&rt->left_child); 		}break; 		 		case 2:{ 			last_node = rt; 			insert_tree(&rt->right_child); 		}break; 		 		case 3:{ 			if(last_node != NULL){ 				if(last_node->left_child != NULL && last_node->right_child != NULL) 					fprintf(stderr, "%s", "Have no place to insert .\012"); 				 				else if(last_node->left_child == NULL) 					insert_tree(&last_node->left_child); 				 				else 					insert_tree(&last_node->right_child); 			} 	 		}break; 		case 4:{ 			 		}break; 		 		case 0: 			return; 	} 	 }  void preorder(node **p) { 	if(*p == NULL) 		return; 	fprintf(stderr, "%d ",(*p)->num); 	preorder(&(*p)->left_child); 	preorder(&(*p)->right_child); 	 }  void inorder(node **p) { 	if(*p == NULL) 		return; 	inorder(&(*p)->left_child); 	fprintf(stderr, "%d ",(*p)->num); 	inorder(&(*p)->right_child); 	 }  void postorder(node **p) { 	if(*p == NULL) 		return; 	inorder(&(*p)->left_child); 	inorder(&(*p)->right_child); 	fprintf(stderr, "%d ",(*p)->num); 	 }  void show(node **root) { 	node *p = *root; 	char order; 	fflush(stdin); 	lb2:system("color 0C"); 	fprintf(stderr, "%s", "\n\t--------------------------------------\n"); 	fprintf(stderr, "%s", "\tb:PreOrder i:Inorder a:PostOrder e:end\012"); 	fprintf(stderr, "%s", "\t--------------------------------------\n\n"); 	Sleep(3000); 	system("color 0A"); 	fprintf(stderr, "%s", "Choose the way to traverse :"); 	while(scanf("%c", &order) != '\n'){ 		fflush(stdin); 		switch(order){ 			case 'b': 				fprintf(stderr, "%s", "For the former sequence traversal results:"); 				preorder(&p); 				fprintf(stderr, "%c", '\012'); 				goto lb2; 				break; 		 			case 'i': 				fprintf(stderr, "%s", "In order to traverse the results :"); 				inorder(&p); 				fprintf(stderr, "%c", '\012'); 				goto lb2; 				break; 		 			case 'a': 				fprintf(stderr, "%s", "After the sequence traversal results for: \ "); 				postorder(&p); 				fprintf(stderr, "%c", '\012'); 				goto lb2; 				break; 				 			case 'e': 				return; 				 			default:{ 				fprintf(stderr, "%s", "There is no this option.\012"); 				goto lb2; 			} 		} 		 	}  }  node * creat_tree(void) { 	node *root = init_tree(); 	insert_tree(&root->left_child); 	show(&root->left_child); 	 	return root; }   头文件，，主函数自己写


Question: 新人求助，一个读入多项式的问题

仅供参考：//链表实现一元多项式的加法减法乘法 #include <stdio.h> #include <stdlib.h> typedef struct node {     float coef;   //系数     int expn;     //指数     struct node *next; } PolyNode;      //多项式节点 polynomial node typedef PolyNode* Polynomial; Polynomial createPolynomial() {  //创建多项式     PolyNode *p, *q, *head = (PolyNode *)malloc(sizeof(PolyNode));   //头节点     head->next = NULL;     float coef;     int expn;     printf("输入该多项式每一项的系数和指数，每项一行，输入0 0结束！\n");     while (scanf("%f %d", &coef, &expn) && coef) {   // 默认，按指数递减排列         if (head->next) {             p = head;             while (p->next && expn < p->next->expn)                 p = p->next;             if (p->next) {                 if (expn == p->next->expn) { //有相同指数的直接把系数加到原多项式                     p->next->coef += coef;                     if (p->next->coef > -0.000001 && p->next->coef < 0.000001) { //若是相加后系数为0，则舍弃该节点                         q = p->next;                         p->next = q->next;                         free(q);                     }                 } else {                     q = (PolyNode*)malloc(sizeof(PolyNode));                     q->coef = coef;                     q->expn = expn;                     q->next = p->next;                     p->next = q;                 }             } else {                 p->next = (PolyNode*)malloc(sizeof(PolyNode));                 p = p->next;                 p->coef = coef;                 p->expn = expn;                 p->next = NULL;             }         } else {             head->next = (PolyNode*)malloc(sizeof(PolyNode));             head->next->coef = coef;             head->next->expn = expn;             head->next->next = NULL;         }     }     return head; } Polynomial multiply(Polynomial poly, float coef, int expn) {  //多项式与指定单项式相乘，该单项式为 coefx^expn     PolyNode *p, *q, *Poly = (PolyNode*)malloc(sizeof(PolyNode));     p = Poly;     q = poly->next;     while (q) {         p->next = (PolyNode*)malloc(sizeof(PolyNode));         p = p->next;         p->coef = (q->coef*coef);         p->expn = (q->expn + expn);         q = q->next;     }     p->next = NULL;     return Poly; } void add(Polynomial poly1, Polynomial poly2) {  //把 poly2 加到 poly1 上     PolyNode *p, *q, *r;     r = poly1;     p = poly1->next;  //指向第一个节点     q = poly2->next;     poly2->next = NULL;     while (p && q) {         if (p->expn > q->expn) {             r->next = p;             p = p->next;             r = r->next;         } else if (p->expn < q->expn) {             r->next = q;             q = q->next;             r = r->next;         } else {             PolyNode *t;             p->coef += q->coef;             if (!(p->coef > -0.000001 && p->coef < 0.000001)) //系数不为0             {                 r->next = p;                 r = r->next;                 p = p->next;             } else {                 t = p;                 p = p->next;                 free(t);             }             t = q;             q = q->next;             free(t);         }     }     if (p)         r->next = p;     if (q)         r->next = q; } Polynomial polySubtract(Polynomial poly1, Polynomial poly2) {  //多项式减法 poly1-poly2形成一个新的多项式     //把poly2的系数取相反数，形成一个新的多项式     Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode)); //构造头节点     PolyNode *p, *q;     p = poly;     q = poly2->next;     while (q) {         p->next = (PolyNode*)malloc(sizeof(PolyNode));         p = p->next;         p->coef = -(q->coef);  //系数取反         p->expn = q->expn;         q = q->next;     }     p->next = NULL;     add(poly, poly1);  //利用加法     return poly; } Polynomial polyAdd(Polynomial poly1, Polynomial poly2) { //多项式相加 poly1+poly2形成一个新的多项式     Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode));  //和多项式的头节点     poly->next = NULL;     PolyNode *p, *q, *r;     r = poly;     p = poly1->next;     q = poly2->next;     while (p&&q) {         if (p->expn > q->expn) {             r->next = (PolyNode*)malloc(sizeof(PolyNode));             r = r->next;             r->coef = p->coef;             r->expn = p->expn;             p = p->next;         } else if (p->expn < q->expn) {             r->next = (PolyNode*)malloc(sizeof(PolyNode));             r = r->next;             r->coef = q->coef;             r->expn = q->expn;             q = q->next;         } else {             float m = p->coef + q->coef;             if (!(m > -0.000001 && m < 0.000001)) {                 r->next = (PolyNode*)malloc(sizeof(PolyNode));                 r = r->next;                 r->coef = m;                 r->expn = p->expn;             }             q = q->next;             p = p->next;         }     }     while (p) {         r->next = (PolyNode*)malloc(sizeof(PolyNode));         r = r->next;         r->coef = p->coef;         r->expn = p->expn;         p = p->next;     }     while (q) {         r->next = (PolyNode*)malloc(sizeof(PolyNode));         r = r->next;         r->coef = q->coef;         r->expn = q->expn;         q = q->next;     }     r->next = NULL;     return poly; } Polynomial polyMultiply(Polynomial poly1, Polynomial poly2) {  //多项式相乘     Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode));  //创建多项式和的头节点     poly->next = NULL;     PolyNode *p;     p = poly2->next;     while (p) {         add(poly, multiply(poly1, p->coef, p->expn));         p = p->next;     }     return poly; } void printPoly(Polynomial poly) {  //打印多项式     if (poly && poly->next) {         PolyNode *p = poly->next;  //p指向第一个节点         while (p->next) {             printf("%gx^%d", p->coef, p->expn);             p = p->next;             if (p && (p->coef > 0))                 printf("+");         }         if (p->expn == 0)             printf("%g", p->coef);   //打印常数项         else             printf("%gx^%d", p->coef, p->expn);         printf("\n");     } } void freePoly(Polynomial poly) {  //释放内存     if (poly && poly->next) {         PolyNode *p, *q;         p = poly;         while (p) {             q = p->next;             free(p);             p = q;         }     }     poly = NULL; } int main() {     printf("用链表实现多项式的加减法\n");     Polynomial poly1, poly2, poly3;     printf("创建多项式一\n");     poly1 = createPolynomial();     printf("多项式一：\n");     printPoly(poly1);     printf("创建多项式二\n");     poly2 = createPolynomial();     printf("多项式二：\n");     printPoly(poly2);     printf("两多项式相加，和为：\n");     poly3 = polyAdd(poly1, poly2);     printPoly(poly3);     freePoly(poly3);     printf("两个多项式相乘，积为：\n");     poly3 = polyMultiply(poly1, poly2);     printPoly(poly3);     freePoly(poly3);     printf("两多项式相减，差为：\n");     poly3 = polySubtract(poly1, poly2);     printPoly(poly3);     freePoly(poly1);     freePoly(poly2);     freePoly(poly3);     system("pause");     return 0; }

#include <stdio.h> #include <stdlib.h>  struct polynomial{     int coef;     int expon;     struct polynomial* next; };  int main(void) {     int c,e,N;     scanf("%d", &N);    #if 1     struct polynomial *phead, *pcur, *pnew;      phead = (struct polynomial *)malloc(sizeof(struct polynomial));     if (!phead)         return -1;     scanf("%d %d", &c, &e);     phead->coef = c;     phead->expon = e;     phead->next = NULL;      pcur = phead;     while (--N) {         pnew = (struct polynomial *)malloc(sizeof(struct polynomial));         if (!pnew)             return -1;         scanf("%d %d", &c, &e);         pcur->coef = c;         pcur->expon = e;         pcur->next = pnew;         pcur = pnew;     } #else     struct polynomial* P1;     struct polynomial* P2;     struct polynomial* temp1;     struct polynomial* temp2;      P1 = (struct polynomial *)malloc(sizeof(struct polynomial));     if (!P1)         return -1;     P2 = (struct polynomial *)malloc(sizeof(struct polynomial));     if (!P2)         return -1;     temp1 = P1;     temp2 = P2;      while(N--)     {         scanf("%d %d", &c, &e);         P1->next=malloc(sizeof(struct polynomial));         P1->next->expon=e;         P1->next->coef=c;          if(N=0)         {             P1->next->next=NULL;             P1=temp1;         }         else             P1=P1->next;     } #endif } 参考一下吧； 建议将创建多项式的功能单独做成一个函数，然后在main函数里调用。

单步跟踪程序运行，观察分析原因


Question: 浮点数不考虑精度的情况下到底能表达多少位小数点？我读出了1022位

不考虑精度。。。那读它做什么

引用 4 楼 wqte45 的回复:[quote=引用 1 楼 ckc 的回复:] 能输出这么多位并不代表精度达到了这么多位 你输出一个1+1e-1000试下是不是有这么高的精度  能精确表示的浮点是没有那么多位的  比如 0.5 0.25  1.0   输多少后面都是0    因为其二进制能准确存放在内存中  现在讨论的是  打印出 不能准确用二进制表达的浮点小数  在内存中的完整表达 不考虑精度  就是8字节内存里的数据 有多少打印多少位[/quote] 你似乎没仔细看我的帖子。 我的意思是你试下处理类似1.000000000000000000000000000000000000000000000000000000000000000000000001这样的数据 看看能不能正常处理，甚至把这个数再加上0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001这样，看看能不能正常输出，如果可以，那就是精度确实够了，如果不行，那就只是输出了这么多位，实际精度达不到

引用 5 楼 那年那人的回复:[quote=引用 2 楼 paschen 的回复:] DBL_MIN和DBL_MAX只是double能表示的最小与最大浮点数，其次你输出看到的非0数字并不等于代表实际表示到了的位数，double通常能表示的有效位数大约是15位，因为double有52位用于存放尾数，加一个隐含位，共 53个二进制有效位位数，2^53次方有15个十进制位，超出这个范围后面的你看到的都是假的  我前提都说了  不说有效精度 有效精度是指有精确保障的位数， 浮点数本来就不是精确的， 既然能输出了这么多位  就证明在double的8字节内存里。存放的有数据  再次说明  不考虑什么有效无效  现在不是求有效精度 是说double最大能表达多少位  你说的15位那是可以准确表达 无失真的位数  后面的由于精度限制 可能就失真了。但只要有数值 就算是有  我的问题是不考虑精度  能表达的数字是多少位？ 反正是这个变量8字节里输出的  肯定不会输出到后面的字节     [/quote] 那取决于printf的具体实现，而不是double怎么存，你要研究可以单步跟踪到printf里一探究竟

浮点数格式 http://bbs.csdn.net/topics/390676437

引用 2 楼 paschen 的回复:DBL_MIN和DBL_MAX只是double能表示的最小与最大浮点数，其次你输出看到的非0数字并不等于代表实际表示到了的位数，double通常能表示的有效位数大约是15位，因为double有52位用于存放尾数，加一个隐含位，共 53个二进制有效位位数，2^53次方有15个十进制位，超出这个范围后面的你看到的都是假的  我前提都说了  不说有效精度 有效精度是指有精确保障的位数， 浮点数本来就不是精确的， 既然能输出了这么多位  就证明在double的8字节内存里。存放的有数据  再次说明  不考虑什么有效无效  现在不是求有效精度 是说double最大能表达多少位  你说的15位那是可以准确表达 无失真的位数  后面的由于精度限制 可能就失真了。但只要有数值 就算是有  我的问题是不考虑精度  能表达的数字是多少位？ 反正是这个变量8字节里输出的  肯定不会输出到后面的字节

引用 1 楼 ckc 的回复:能输出这么多位并不代表精度达到了这么多位 你输出一个1+1e-1000试下是不是有这么高的精度  能精确表示的浮点是没有那么多位的  比如 0.5 0.25  1.0   输多少后面都是0    因为其二进制能准确存放在内存中  现在讨论的是  打印出 不能准确用二进制表达的浮点小数  在内存中的完整表达 不考虑精度  就是8字节内存里的数据 有多少打印多少位


Question: 大神们可以帮我看看这个strcpy出了什么问题吗

非字符串还是用memcpy或结构体赋值吧

strcpy是对字符串进行拷贝的，第二个参数必须是字符串，即以'\0'结束的字符串； memcpy可以对任何数据进行拷贝；

出错了中断下来，分析原因，看是不是访问了无效指针等

字符数组等同于字符串

引用 2 楼 hzy_76 的回复:HuffmanCode HC到底是个什么结构，你要搞清楚。strcpy要求两个参数都是char *。那我cd[start]只是一个普通的数组怎么使用strcpy呢，那个……我的结构体定义在楼下

typedef struct { 	int weight; 	int Parent,Lchild,Rchild; }HTNode; typedef HTNode HuffmanTree[100];          typedef char *HuffmanCode[100]; 这是定义的结构体emmmm……

#include <stdio.h> #include <ctype.h> #include <string.h> #include <stdlib.h> #include <malloc.h> #include <windows.h> #define MaxValue 512 #define Maxbit  16  typedef struct { 	char chara; 	int weight; 	int flag; 	int parent; 	int leftchild; 	int rightchild; }haffnode;  typedef struct{ 	int bit[Maxbit]; 	int weight; 	int start; }haffcode;  int my_stdin(void) { 	lb1:fprintf(stderr, "%s", "input num :"); 	char str[1024]; 	fgets(str, 1024, stdin);  	int len = strlen(str); 	for(len-1; isspace(str[len-1]) && len >= 0; str[(len--)-1] = '\0') 		;  	char *p[1024]; 	int i = 0; 	int j = 0; 	while(str[i]){ 		while(isspace(str[i]) && str[i]) 			++i;  		p[j++] = &str[i++]; 		while(isalnum(str[i]) && str[i]) 			++i;  		str[i] = '\0'; 		++i;  	}  	if(j != 1){ 		fprintf(stderr, "%s\n", "Input error!"); 		fflush(stdin); 		goto lb1; 	}  	i = 0; 	int flag = 1; 	while(p[0][i]){ 		if(isdigit(p[0][i])) 			++i; 		else { 			flag = 0; 			break; 		}  	}  	if(flag == 0){ 		fprintf(stderr, "%s\n", "Input error!"); 		fflush(stdin); 		goto lb1; 	}  	int num = atoi(p[0]); 	return num;  }    void creat_hafftree(int n, haffnode *hafftree) { 	int i = 0; 	for(; i < 2*n-1; ++i){ 		if(i >= n) 			hafftree[i].weight = 0; 		hafftree[i].flag = 0; 		hafftree[i].parent = -1; 		hafftree[i].leftchild = -1; 		hafftree[i].rightchild = -1; 	}  	for(i = 0; i < n-1; ++i){ 		int m1 = MaxValue; 		int m2 = MaxValue; 		int x1 = 0; 		int x2 = 0; 		for(int j = 0; j < n+i; ++j){ 			if(hafftree[j].weight < m1 && hafftree[j].flag == 0){ 				m2 = m1; 				x2 = x1; 				m1 = hafftree[j].weight; 				x1 = j; 			} 			else if(hafftree[j].weight < m2 && hafftree[j].flag == 0){ 				m2 = hafftree[j].weight; 				x2 = j; 			} 		}  		hafftree[x1].parent = n+i; 		hafftree[x2].parent = n+i; 		hafftree[x1].flag = 1; 		hafftree[x2].flag = 1; 		hafftree[n+i].weight = hafftree[x1].weight + hafftree[x2].weight; 		hafftree[n+i].leftchild = x1; 		hafftree[n+i].rightchild = x2;  	}  	for(i = 0; i < 2*n-1; ++i){ 		printf("%d %2d %2d %2d %2d %2d  \n", i, hafftree[i].weight,\ 		hafftree[i].flag, hafftree[i].parent, hafftree[i].leftchild, hafftree[i].rightchild); 	}   	return ; }  void haff_code(int n, haffnode *hafftree, haffcode ** code) { 	int i= 0; 	for(; i < n; ++i){ 		code[i] = (haffcode *)malloc(sizeof(haffcode)); 		(haffcode *)memset(code[i], 0x00, sizeof(haffcode)); 		code[i]->weight = hafftree[i].weight; 		code[i]->start = n-1; 		int child = i; 		int parent = hafftree[child].parent;  		while(parent != -1){ 			if(hafftree[parent].leftchild == child) 				code[i]->bit[code[i]->start--] = 0; 			else 				code[i]->bit[code[i]->start--] = 1;  			child = parent; 			parent = hafftree[child].parent; 		}  	}   	return; }  int main(void) { 	system("cls"); 	fprintf(stderr, "%s\n", "To the number of coding."); 	system("color 04"); 	Sleep(1000); 	system("color 0A"); 	int n; 	n = my_stdin(); 	system("cls"); 	haffnode hafftree[2*n-1]; 	int i = 0; 	for(; i < n; ++i){ 		fprintf(stderr, "%s%d%s", "hafftree[", i, "].chara:"); 		fflush(stdin);  		hafftree[i].chara = getchar();  		fprintf(stderr, "%s%d%s\n", "hafftree[", i, "].weight."); 		system("color 04"); 		Sleep(1000); 		system("color 0A"); 		fflush(stdin);  		hafftree[i].weight = my_stdin();  	}  	creat_hafftree(n, hafftree); 	haffcode *code[n]; 	haff_code(n, hafftree, code);  	for(i = 0; i < n; ++i){ 		printf(" chara = %c  weight = %d  ", hafftree[i].chara, code[i]->weight); 		printf("code = "); 		int j; 		for(j = code[i]->start+1; j < n; ++j) 			printf("%d", code[i]->bit[j]); 		printf("\n"); 	}    	return 0; }


Question: 请问，两种结果为什么不一样？

scanf_s里输入double类型要用 %lf 格式， 而不是%f

得到的i值为32，为什么？

请问，如何让第一种输出我想要的第二中结果？

第一个for循环后变量i为清0，且定义double a[20]未初始化操作，数组内容不确定； 第二个注释掉for循环i从0开始，double a[20]={0.2,0.4,0.3，0.1}这样定义编译器已经将后续数组内容清0.


Question: 程序改成多个c文件的程序（求指教）

引用 2 楼 hongwenjun 的回复:小东西三个文件就够 myapp.h   myapp.c  和  main.c 把你的 main 函数，放  main.c 其他东西放 myapp.c    把结构体定义 和函数申明 放 myapp.h 2个 c 文件 include  myapp.h

结构体放在函数声明前,放在你这头文件里就行 如果要给结构体单独开个头文件,最好使用预编译头 不使用预编译头就要在头文件里包含头文件


Question: 51单片机实现电子琴功能为什么显示错误，求大神解答一下，我刚刚学单片机小萌新

详细怎么做？

循环的语法  do while  一般直接用while 方便

函数没有声明? 或者写到main前面


Question: 小白 关于链表合并问题  不知道为什一直显示不出最后一个字符

#include<stdio.h> #include<malloc.h> #include <stdlib.h>  typedef struct node {     char data;     struct node *next; }joseph;   #if 0 int creat1(joseph *h,int n) {     int i=1;     joseph *p1=h,*p2;     printf("请输入链表A:");     if(i==1)     {         scanf("%c",&h->data);         h->next=NULL;     }      for(i=1;i<=n;i++)     {         p2 = (joseph*)malloc(sizeof(joseph));         scanf("%c", &p2->data);         p1->next = p2;         p1 = p1->next;         p1->next = NULL;     }     return 0; } int creat2(joseph2 *l,int n) {     int i=1;     joseph2 *p1=l,*p2;     printf("请输入链表B:");     scanf("%c",&l->data);     l->next=NULL;     for(i=2;i<=n;i++)     {         p2 = (joseph2*)malloc(sizeof(joseph2));         scanf("%c",&p2->data);         p1->next=p2;         p1=p1->next;         p1->next=NULL;      }     return 0; } #endif  int create_link(joseph *h, int n) {     joseph *p, *q;     int i;      printf("请输入链表:\n" );     scanf("%c", &h->data);     h->next = NULL;     p = h;     for (i = 1; i < n; i++) {         q = (joseph *)malloc(sizeof(joseph));         if (!q)             exit(0);         scanf("%c", &q->data);         q->next = NULL;         p->next = q;         p = q;     }      return 0; }  /* int creat3(joseph *h,joseph2 *l) {     joseph3 *p1=h,*p2=l,*p3,*tmp1,*tmp2;     while(p1->next!=NULL&&p2->next!=NULL)     {         if(p1->data<p2->data)         {             p3=(joseph3*)malloc(sizeof(joseph3));             p3->data=p1->data;             printf("%c ",p3->data);             p3->next=NULL;             tmp1=p1;             p1=p1->next;             free(tmp1);         }         else if(p1->data>p2->data)         {             p3=(joseph3*)malloc(sizeof(joseph3));             p3->data=p2->data;             printf("%c ",p3->data);             p3->next=NULL;             tmp1=p2;             p2=p2->next;             free(tmp1);         }         if(p1->data==p2->data)         {             p3=(joseph3*)malloc(sizeof(joseph3));             p3->data=p1->data;             printf("%c ",p3->data);             p3->next=NULL;             tmp1=p1;             tmp2=p2;             p1=p1->next;             p2=p2->next;             free(tmp1);             free(tmp2);         }     }     if(p1->next!=NULL)     {         do         {             p3=(joseph3*)malloc(sizeof(joseph3));             p3->data=p1->data;             printf("%c ",p3->data);             p3->next=NULL;             tmp1=p1;             p1=p1->next;             free(tmp1);         }while(p1->next!=NULL);     }     else     {         while(p2->next!=NULL)         {             p3=(joseph3*)malloc(sizeof(joseph3));             p3->data=p2->data;             printf("%c ",p3->data);             p3->next=NULL;             tmp1=p2;             p2=p2->next;             free(tmp1);         }      }     return 0; } */  void merge_link(joseph *l1, joseph *l2, joseph **l3) {     joseph *p1, *p2, *p3, *pdel;     p1 = l1;     p2 = l2;      *l3 = (joseph *)malloc(sizeof(joseph));     if (!(*l3))         return;     p3 = *l3;      while (p1 && p2) {         if (p1->data > p2->data) {             p3->next = p2;             p3 = p2;             p2 = p2->next;         } else if (p1->data < p2->data) {             p3->next = p1;             p3 = p1;             p1 = p1->next;         } else {             p3->next = p1;             p3 = p1;             p1 = p1->next;             pdel = p2;             p2 = p2->next;             free(pdel);         }     }     while (p1) {         p3->next = p1;         p3 = p1;         p1 = p1->next;     }     while (p2) {         p3->next = p2;         p3 = p2;         p2 = p2->next;     }  } void print_link(joseph *h) {     joseph *p = h;     while (p) {         printf("%c", p->data);         p = p->next;     }     putchar(10); }  int main () {     int m, n;     printf("请输入两个链表长度：");     scanf("%d%d",&m, &n);     getchar();  /*for '\n'*/     joseph *h = (joseph*)malloc(sizeof(joseph));     if (!h)         return -1;     joseph *l = (joseph*)malloc(sizeof(joseph));     if (!l)         return -1;     /*     creat1(h, i);     creat2(l,j);     */     create_link(h, m);     print_link(h);     getchar();     create_link(l, n);     print_link(l);     joseph *l3 = NULL;     merge_link(h, l, &l3);     print_link(l3->next);     //creat3(h,l);     return 0; }  代码有太多冗余，另外注意scanf输入%c格式的数据时，注意回车会残留在输入缓存里，会被下一个%c接收；因此用getchar()吸收残留在输入缓存里的'\n'； 以上的代码作参考吧；

#include<stdio.h> #include<malloc.h>  typedef struct node {   char data;   struct node *next; }joseph1,joseph2,joseph3;  int creat1(joseph1 *h,int n) {   int i=1;   joseph1 *p1=h,*p2;   printf("请输入链表A:");   //删多余  if(i==1)   {     scanf("%c",&h->data);     h->next=NULL;   }    for(i=2;i<=n;i++)//改错for(i=1;i<=n;i++)   {     p2 = (joseph1*)malloc(sizeof(joseph1));     scanf("%c",&p2->data);     p1->next=p2;     p1=p1->next;     p1->next=NULL;	   }   return 0; } int creat2(joseph2 *l,int n) {   int i=1;   joseph2 *p1=l,*p2;   printf("请输入链表B:");   scanf("%c",&l->data);   l->next=NULL;   for(i=2;i<=n;i++)   {     p2 = (joseph2*)malloc(sizeof(joseph2));     scanf("%c",&p2->data);     p1->next=p2;     p1=p1->next;     p1->next=NULL;	    }   return 0; } int creat3(joseph1 *h,joseph2 *l) {   joseph3 *p1=h,*p2=l,*p3,*tmp1,*tmp2;   while(p1!=NULL&&p2!=NULL)//改错 while(p1->next!=NULL&&p2->next!=NULL)   {     if(p1->data<p2->data)     {       p3=(joseph3*)malloc(sizeof(joseph3));       p3->data=p1->data;       printf("%c ",p3->data);       p3->next=NULL;       tmp1=p1;	       p1=p1->next;       free(tmp1);     }     else if(p1->data>p2->data)     {       p3=(joseph3*)malloc(sizeof(joseph3));       p3->data=p2->data;       printf("%c ",p3->data);       p3->next=NULL;       tmp1=p2;	       p2=p2->next;       free(tmp1);     }     else if(p1->data==p2->data) //改错 if(p1->data==p2->data)     {       p3=(joseph3*)malloc(sizeof(joseph3));       p3->data=p1->data;       printf("%c ",p3->data);       p3->next=NULL;       tmp1=p1;       tmp2=p2;       p1=p1->next;	       p2=p2->next;       free(tmp1);       free(tmp2);     }   }   if(p1!=NULL) //改错 if(p1->next!=NULL)   {     do     {       p3=(joseph3*)malloc(sizeof(joseph3));       p3->data=p1->data;       printf("%c ",p3->data);       p3->next=NULL;       tmp1=p1;	       p1=p1->next;       free(tmp1);     }while(p1->next!=NULL);   }   else   {     while(p2!=NULL) //改错 while(p2->next!=NULL)     {       p3=(joseph3*)malloc(sizeof(joseph3));       p3->data=p2->data;       printf("%c ",p3->data);       p3->next=NULL;       tmp1=p2;	       p2=p2->next;       free(tmp1);     }    }   return 0;	 }	 int main () {   int i,j;   printf("请输入两个链表长度：");    scanf("%d %d",&i,&j);   joseph1 *h=(joseph1*)malloc(sizeof(joseph1));   joseph2 *l=(joseph2*)malloc(sizeof(joseph2));   getchar();//加，消除回车   creat1(h,i);//改，使i起作用 creat1(h,4);   getchar();//加，消除回车   creat2(l,j);//改，使j起作用creat2(l,8);   creat3(h,l);   printf("\n");//加，显示最后一个字符   return 0; }


Question: 请问一下这个问题。

#include<stdio.h>  static void print(const int *arr, int size); void block_exchange(int *arr, int n, int m);  int main() {     int num_list[20], n, m;     int i;      while (scanf("%d", &n) == 1 && (n < 10 || n > 20))         ;      printf("n = %d\n", n);     i = 0;     while (i < n)         scanf("%d", &num_list[i++]);     printf("i = %d\n", i);      printf("Num list: \n");     print(num_list, n);     printf("Please input a number:");     scanf("%d", &m);     block_exchange(num_list, n, m);     print(num_list, n);      return 0; }  void block_exchange(int *arr, int n, int m) {     if (m >= n / 2)         return;     int *pend, *pstart, *pdst;      pstart = arr;     pend = arr + m;     pdst = arr + n - m;     while (pstart < pend) {         int tmp = *pstart;         *pstart = *pdst;         *pdst = tmp;         pstart++;         pdst++;     } }  static void print(const int *arr, int size) {     int i;      for (i = 0; i < size; i++)         printf("%d  ", arr[i]);     putchar(10); }


Question: OOC实现多重继承

mLee79 ,你的程序在C99下编译不通过,intel0011,感谢分享,正在研究lw_oopc

C语言又没有继承

无聊的写一个， 大部分 C/C++ 编译器能兼容内存布局，  最好不要在接口里定义成员变量， 只留纯虚函数， 做接口继承 ....  $ for src in foobar.h foobar.c main.cpp; do echo ------ $src -------; cat $src; done;  gcc -w foobar.c main.cpp -o t -lstdc++; echo -------------------------------------- ;./t ------ foobar.h ------- #ifndef __INC__FOOBAR__H__ #define __INC__FOOBAR__H__  #include <inttypes.h>  #ifdef _MSC_VER #define FOOCALLTYPE             __fastcall #endif  #if !defined(FOOCALLTYPE) && defined(__i386__) #define FOOCALLTYPE             __attribute__((fastcall)) #endif /* FOOCALLTYPE */  #ifndef FOOCALLTYPE #define FOOCALLTYPE #endif /* FOOCALLTYPE */  #ifdef __cplusplus class A { public:         virtual int FOOCALLTYPE getA() const { return a; }         virtual int FOOCALLTYPE getB() const { return b; }         virtual void FOOCALLTYPE setAB(int a, int b) { this->a = a; this->b = b; } protected:         int a, b; }; class A2 : public A { public:         virtual void FOOCALLTYPE show() const = 0; }; class B { public:         virtual int FOOCALLTYPE getC() const { return c; }         virtual int FOOCALLTYPE getD() const { return d; }         virtual void FOOCALLTYPE setCD(int c, int d) { this->c = c; this->d = d; } protected:         int c, d; };  class AB : public A2, public B { public:         virtual void FOOCALLTYPE show() const {                 printf("class AB, %d %d %d %d\n", a, b, c, d);         } }; #else typedef struct A_t A; typedef struct A2_t A2; typedef struct B_t B; typedef struct AB_t AB; struct A_vtbl_t {         int (FOOCALLTYPE*getA)(const void* thiz);         int (FOOCALLTYPE*getB)(const void* thiz);         void (FOOCALLTYPE*setAB)(void* thiz, int a, int b); }; struct A2_vtbl_t {         struct A_vtbl_t base___;         void (FOOCALLTYPE*show)(const void* thiz); };  struct B_vtbl_t {         int (FOOCALLTYPE*getC)(const void* thiz);         int (FOOCALLTYPE*getD)(const void* thiz);         void (FOOCALLTYPE*setCD)(void* thiz, int c, int d); };  struct A_t {         const struct A_vtbl_t* vtbl;         int a, b; }; struct A2_t {         const struct A2_vtbl_t* vtbl;         int a, b; }; struct B_t {         const struct B_vtbl_t* vtbl;         int c, d; }; struct AB_t {         A2      cA;         B       cB; }; #endif  #ifdef __cplusplus extern "C" { #endif /* */  AB*  newAB(int a, int b, int c, int d); void freeAB(AB* o);  void test(const A* oA, const B* oB);  AB*  newABpp(int a, int b, int c, int d); void freeABpp(AB* o);    #ifdef __cplusplus }; #endif /* */  #endif /* __INC__FOOBAR__H__ */ ------ foobar.c ------- #include <stdio.h> #include <stdlib.h> #include <stddef.h> #include "foobar.h"  int FOOCALLTYPE fGetA(const A* thiz){   return thiz->a; } int FOOCALLTYPE fGetB(const A* thiz){   return thiz->b; } void FOOCALLTYPE setAB(A* thiz, int a, int b) { thiz->a = a; thiz->b = b; } void FOOCALLTYPE fShow(const A2* thiz) {         const AB* o = (const AB*)((uint8_t*)thiz - offsetof(AB, cA));         printf("fShow, %d %d %d %d\n", o->cA.a, o->cA.b, o->cB.c, o->cB.d); } int FOOCALLTYPE fGetC(const B* thiz){   return thiz->c; } int FOOCALLTYPE fGetD(const B* thiz){   return thiz->d; } void FOOCALLTYPE setCD(B* thiz, int c, int d) { thiz->c = c; thiz->d = d; }  const struct A2_vtbl_t vtblA = { {fGetA, fGetB, setAB}, fShow }; const struct B_vtbl_t vtblB = { fGetC, fGetD, setCD }; AB*  newAB(int a, int b, int c, int d) {         AB * o = (AB*)malloc(sizeof(AB));         o->cA.vtbl = &vtblA;         o->cB.vtbl = &vtblB;         o->cA.a = a;         o->cA.b = b;         o->cB.c = c;         o->cB.d = d;         return o; }  void freeAB(AB* o) {         free(o); }  void test(const A* oA, const B* oB) {         const AB* ab1 = (const AB*)((uint8_t*)oA - offsetof(AB, cA));         const AB* ab2 = (const AB*)((uint8_t*)oB - offsetof(AB, cB));          printf(" %d, %d, %d, %d\n", oA->vtbl->getA(oA), oA->vtbl->getB(oA), oB->vtbl->getC(oB), oB->vtbl->getD(oB));         printf(" AB1: %d, %d, %d, %d\n", ab1->cA.a, ab1->cA.b, ab1->cB.c, ab1->cB.d);         printf(" AB2: %d, %d, %d, %d\n", ab2->cA.a, ab2->cA.b, ab2->cB.c, ab2->cB.d); } ------ main.cpp ------- #include <stdio.h> #include "foobar.h"  AB*  newABpp(int a, int b, int c, int d) {         AB* o = new AB;          o->setAB(a, b);         o->setCD(c, d);         return o; } void freeABpp(AB* o) {         delete o; }  int main() {         AB* a1 = newAB(1,2,3,4), *a2 = newABpp(10, 20, 30, 40);          test(a1, a2);         test(a2, a1);          printf("%d %d %d %d\n", a1->getA(), a1->getB(), a1->getC(), a1->getD());         printf("%d %d %d %d\n", a2->getA(), a2->getB(), a2->getC(), a2->getD());          a1->show();         a2->show();          return 0; }  --------------------------------------  1, 2, 30, 40  AB1: 1, 2, 3, 4  AB2: 10, 20, 30, 40  10, 20, 3, 4  AB1: 10, 20, 30, 40  AB2: 1, 2, 3, 4 1 2 3 4 10 20 30 40 fShow, 1 2 3 4 class AB, 10 20 30 40

不是很理解你的意思，建议参考lw_oopc（国产)  JCOOP sooc OOOACSources OOC-Embeded cos-0.8

看了半天才反应过来。。。这个不是结构体么。。。。

用 offsetof 调整呗， 最好只弄 接口继承， 不然很难 ABI 兼容 ...


Question: 求大神帮小弟解惑，c中的字符数组放入顺序串之后，顺序串的data数据变为乱码

谢谢各位老铁答疑

在StrAssign函数内部这样写 for(i=0;a[i]!='\0';++i) {    s.data[i]=a[i]; } s.data[i]='\0'; s.length=i;

A2.data不是不对，是你打断点的位置决定的，你打的断点为StrAssign(A2,B)，这行代码还没有执行，所以结果导致A1与A2不同。 此外，s.length的长度没错，但是最后的‘\0’应该需要添加，出现“烫”应该是没有控制好结束符。

主要是A1.data没出错，但是A2.data就出乱码了

应该是缺少字符串结束标记'\0'，看一下循环输入后有没有加上这个标记。


Question: 数据结构（C语言版）n*n的稀疏矩阵A采用三元组表示，设计一个程序实现如下功能：

引用 1 楼 user-1的回复:CreatMat(A, a);与CreatMat(B, b);并没有起到任何作用，因为你的变量是按值传递的，函数中的形参只是实参的复制品，函数结束后实参并没有任何改变，你需要传递指针，如果是C++，可以按引用传递 全都改成指针吗 其实我不太懂这个，有时候程序里面要用“.”有时候又要用“–>”前面要用“*”定义，不知道为什么


Question: 如何得出此段运动的时间

引用 3 楼 arpnet99 的回复:连个说明不都没有，这些变量是什么意思呢？  公式：t = （（Vt-V0））/ a 正确、代码这么改就行、结贴吧

引用 3 楼 arpnet99 的回复:连个说明不都没有，这些变量是什么意思呢？  公式：t = （（Vt-V0））/ a 厉害了

这主要是数学问题，不知你程序里的变量表示什么，时间就是速度除以加速度或者位移除以速度，复杂的需要自己推导下

在该段程序开始是加 clock(),结束时加CLOCK()，用结束时间 - 开始时间   单位ms

没明白啥意思…

坐等！！！！！！！


Question: 求一个算法，矩阵

给你个c的 #include<stdio.h>  #define N 20  int main() { 	int i = 0, j = 0; 	int ary[N][N] = {0}; 	for (i = 0; i < N; i++) /*赋值*/ 	{ 		for (j = 0; j <= i + 1; j++) /*倒序*/ 		{ 			ary[i][j] = i - j + 1; 		}  		for (j = i + 1; j < N; j++)/*正序*/ 		{ 			ary[i][j] = j + 1; 		} 	}  	for (i = 0; i < N; i++) /*打印*/ 	{ 		printf("\n"); 		for (j = 0; j < N; j++) 		{ 			printf("%d ", ary[i][j]); 		} 	} 	getchar(); 	return 0; }

提示 第N行的，前N个数倒序。。。

#include "stdafx.h" #include <iostream> #include <string>  using namespace std;  int _tmain(int argc, _TCHAR* argv[]) { 	int n, add = 0; 	int a[20][20]; 	cout << "输入方阵边长："; 	cin >> n; 	for (int i = 0; i < n; i++) 	{ 		for (int j = 0; j<n; j++) 		{ 			if (i == 0) 				a[i][j] = j + 1; 			else 			if (i - j>= 0) 				a[i][j] = i- j + 1; 			else 				a[i][j] = j + 1; 		} 	}  	for (int i = 0; i < n; i++) 	{ 		for (int j = 0; j < n; j++) 			cout << " " << a[i][j] << "\t"; 		cout << endl; 	} 	//cout << "********************\n"; 	for (int i = 0; i < n; i++) 		cout << "***\t"; 	cout << "\n\n" << "反对角线数字：\n";  	for (int i = 0; i <n ; i++) 	{ 		cout << a[i][n - i - 1] << "\t"; 		add += a[i][n - i - 1]; 	} 	cout << "\n\n" << "反对角线数字和："; 	cout << add << "\n\n"; 	system("pause"); 	return 0; }


Question: 求大神帮忙看一下问题在哪里？

楼主的代码不是C语言的吧，很明显不符合C语言的语法；C++也不是 这是什么语法？

调试运行也是门最基本的IT技术


Question: 关于流缓冲区定位的问题。。。

提醒：fseek是开源的，参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\fseek.c

个人认为：fseek是修改FILE结构里的文件位置（地址偏移），而不是setvbuf设置的buf中的位置

去掉这一句试试看  /*此时buf内容为 'xxxx', 一切正常*/     fputs(buf, stdout);


Question: 求教c语言的编程问题

#include <stdio.h> #include <math.h>  int is_prime(int n);  int main(void) {     int x, i;     //int judge;     int sum = 0;     int n, m;      scanf("%d %d", &n, &m);      if (n == 1)         sum += 2;     i = 1;     x = 3;     while (1) {         if (is_prime(x)) {             if (i >= n && i <= m)                 sum += x;             else if (i > m)                 break;             i++;         }         x += 2;     }      printf("%d\n", sum);      system("pause");      return 0; }  int is_prime(int n) {     int len = sqrt(n), i;      for (i = 2; i < len + 1; i++)         if (n % i == 0)             break;      if (i >= len + 1)         return 1;      return 0; } 参考一下吧

初始化c = 0 n++逻辑错误  仅供参考  #include <stdio.h>  int main(void) {     int x, i;     int judge;     //int c = 1, sum = 0;     int c = 0, sum = 0;     int n, m;     x = 2;      scanf("%d %d", &n, &m);      if (0 < n && n <= m && m <= 200)     {         while (c <= 200)         {             judge = 1;             for (i = 2; i < x; i++)             {                 if (x % i == 0)                 {                     judge = 0;                 }                 break;             }             if (judge == 1)             {                 //if (c >= n && n <= m)                 if (c >= n && c <= m)                 {                     sum = sum + x;                     //n++;                 } 	        c++;              }             x++;         }     }     else     {         return 0;     }     printf("%d\n", sum);      system("pause");      return 0; }

if (c >= n && n <= m)                 {                     sum = sum + x;                     n++; //这里的n++是要干嘛                 }


Question: devc++出现的错误

#include<iostream> #include<vector> #define MAX 2 #include <limits> using namespace std;  int n = 3; const double dist[3][3]={0,1,2, 					     1,0,3, 					     2,3,0};   double shortestPath(vector<int>& path,vector<bool>& visited,double currentLength){ 	if(path.size() == n) 		return currentLength + dist[path[0]][path.back()]; 	double ret = 500; 	for(int next=0;next<n;next++){ 		if(visited[next]) 			continue; 		int here = path.back(); 		path.push_back(next); 		visited[next] = true; 		double cand = shortestPath(path,visited,currentLength+dist[here][next]); 		 		ret = min(ret,cand); 		visited[next] = false; 		path.pop_back();  	} 	return ret; }    int main() {	  	vector<int> path; 	vector<bool> visited(3,false); 	double currentLength = 0; 	double a = shortestPath(path,visited,currentLength); 	cout<<"最短距离为:"<<a<<endl;  	return 0; }  我的也有同样的问题

#include <stdio.h> #include <time.h> #include <stdlib.h>  int main(void) {    int face, roll, frequency[6000] = { 0 };    srand(time(NULL));        for (roll = 1; roll <= 6000; roll++)    {       face = rand() % 6000; //防止数组下标越界       frequency[face] += 1;    }     for (face = 1; face <= 6; face++)    {       printf("%d %d\n", face, frequency[face]);    }    return 0; }

引用 2 楼 das白的回复:roll 到6000一定会越界 楼上正解.. 可能会

roll 到6000一定会越界

潜在frequency越界访问 frequency[face]+=1;


Question: 这个正则表达式怎么写

引用 6 楼 user-2 的回复:我在网站上试的，http://tool.oschina.net/regex/ 串：SSSaaaaaaaaaaEEEaaaaaaaaaaaaEEEaaaaaaaaaaa 表达式：SSS.*?EEE 结果：SSSaaaaaaaaaaEEE  表达式：SSS.*EEE 结果：SSSaaaaaaaaaaEEEaaaaaaaaaaaaEEE ///////////////////////////////////////////////////// PS：你可以搜以下贪婪模式、我写的不一定对、网站的结果也不一定。 我弄出来了， /SSS.\{-}\zeEEE \{-}  -- 去掉贪婪模式 \ze	Matches at any position, and sets the end of the match there: The 	previous char is the last char of the whole match. |/zero-width| 	Can be used multiple times, the last one encountered in a matching 	branch is used. 	Example: "end\ze\(if\|for\)" matches the "end" in "endif" and 	"endfor"

引用 7 楼 zhao4zhong1 的回复:正则表达式速查 正则表达式举例 正则表达式学习 (4页A4纸)http://download.csdn.net/detail/zhao4zhong1/1808549  VIM的一些正则表达式功能没有出现在这个文档里，对JavaScript还是不错的。

引用 4 楼 user-2 的回复:/SSS.*?EEE  正则学过，但是没啥机会用。 默认是“贪婪模式”，你可以搜以下，感觉是这个问题。加？试试。  没匹配上任何东西啊。

引用 2 楼 user-2 的回复:并不需要正则 分别查找http和rtmp，然后比较以下出现的位置就可以了  问题再简化一下： 下面这一行， 如何匹配住从SSS到第一个EEE之前的内容， SSSaaaaaaaaaaEEEaaaaaaaaaaaaEEEaaaaaaaaaaa 我用/SSS.*EEE 总是匹配住了开头到第二个EEE的内容。

并不需要正则 分别查找http和rtmp，然后比较以下出现的位置就可以了

vim里想选定一些内容删除，半天搞不出来啊


Question: 无法统计  结果都是0；41；41；00那种  小白大一  求解答

引用 8 楼 qq_40926715 的回复:[quote=引用 4 楼 cfjtaishan 的回复:] #include "stdio.h" #include "stdlib.h"//srand,random #include "time.h"//time(NULL) #define RANGENUM 100//控制随机数的范围为0-100 int main() {     int nRandNum;     int a,b,c,d,e;     a = 0;     b = 0;     c = 0;     d = 0;     e = 0;     srand(time(NULL));     for(int i = 0;i<100;i++)     {         nRandNum=rand()%RANGENUM;         printf("The %dth random num is: %d\n",i,nRandNum);         switch(nRandNum / 20)         {             case 0:     //(0<nRandNum<20);                 a++;                 break;              case 1:     //(21<nRandNum<40);                 b++;                 break;              case 2:    //(41<nRandNum<60);                 c++;                 break;              case 3:    //(61<nRandNum<80);                 d++;                 break;              case 4:     //(81<nRandNum<100);                 e++;                 break;                 /*                    case'1':                    a++;                    case'2':                    b++;                    case'3':                    c++;                    case'4':                    d++;                    case'5':                    e++;                    */         }     }     printf("the number of 0<nRandNum<20 is :%d\n",a);     printf("the number of 21<nRandNum<40 is :%d\n",b);     printf("the number of 41<nRandNum<60 is :%d\n",c);     printf("the number of 61<nRandNum<80 is :%d\n",d);     printf("the number of 81<nRandNum<100 is :%d\n",e);      return 0; } 参考一下吧； '1'和数值1是有区别的。'1' - 1 = 48;即'1'十进制是49； rand() 得到的是数值；不是字符；    e的输出值为0.不知道怎么回事[/quote] 看一下随机值有80~100之间的吗？ 有可能得到随机值没有80~100之间

#include "stdafx.h" #include "stdio.h" #include "stdlib.h"//srand,random  #include "time.h"//time(NULL) #define RANGENUM 100//控制随机数的范围为0-100 int main() { 	int nRandNum; 	srand(time(NULL)); // 让每次产生的随机数都不一样   	int a, b, c, d, e; 	a = b = c = d = e = 0; 	for (int i = 0; i < 100; i++)  //产生10个随机数 	{ 		nRandNum = rand() % RANGENUM; 		printf("The %dth random num is: %d\n", i, nRandNum);//生成随机数，并利用取余数控制数值范围  		if (nRandNum <= 20) a++; 		else if (nRandNum <= 40) b++; 		else if (nRandNum <= 60) c++; 		else if (nRandNum <= 80) d++; 		else e++; 	} 	printf("the number of 0<nRandNum<20 is :%d\n", a); 	printf("the number of 21<nRandNum<40 is :%d\n", b); 	printf("the number of 41<nRandNum<60 is :%d\n", c); 	printf("the number of 61<nRandNum<80 is :%d\n", d); 	printf("the number of 81<nRandNum<100 is :%d\n", e); 	 	return 0;  }

case 和'1'等等之间需要加个空格

引用 4 楼 cfjtaishan 的回复:#include "stdio.h" #include "stdlib.h"//srand,random #include "time.h"//time(NULL) #define RANGENUM 100//控制随机数的范围为0-100 int main() {     int nRandNum;     int a,b,c,d,e;     a = 0;     b = 0;     c = 0;     d = 0;     e = 0;     srand(time(NULL));     for(int i = 0;i<100;i++)     {         nRandNum=rand()%RANGENUM;         printf("The %dth random num is: %d\n",i,nRandNum);         switch(nRandNum / 20)         {             case 0:     //(0<nRandNum<20);                 a++;                 break;              case 1:     //(21<nRandNum<40);                 b++;                 break;              case 2:    //(41<nRandNum<60);                 c++;                 break;              case 3:    //(61<nRandNum<80);                 d++;                 break;              case 4:     //(81<nRandNum<100);                 e++;                 break;                 /*                    case'1':                    a++;                    case'2':                    b++;                    case'3':                    c++;                    case'4':                    d++;                    case'5':                    e++;                    */         }     }     printf("the number of 0<nRandNum<20 is :%d\n",a);     printf("the number of 21<nRandNum<40 is :%d\n",b);     printf("the number of 41<nRandNum<60 is :%d\n",c);     printf("the number of 61<nRandNum<80 is :%d\n",d);     printf("the number of 81<nRandNum<100 is :%d\n",e);      return 0; } 参考一下吧； '1'和数值1是有区别的。'1' - 1 = 48;即'1'十进制是49； rand() 得到的是数值；不是字符；    OK了  刚才case是从12345  没有从0开始  所以最后没值 ，但开始那种为什么判断不能累加呢   谢谢你了

引用 4 楼 cfjtaishan 的回复:#include "stdio.h" #include "stdlib.h"//srand,random #include "time.h"//time(NULL) #define RANGENUM 100//控制随机数的范围为0-100 int main() {     int nRandNum;     int a,b,c,d,e;     a = 0;     b = 0;     c = 0;     d = 0;     e = 0;     srand(time(NULL));     for(int i = 0;i<100;i++)     {         nRandNum=rand()%RANGENUM;         printf("The %dth random num is: %d\n",i,nRandNum);         switch(nRandNum / 20)         {             case 0:     //(0<nRandNum<20);                 a++;                 break;              case 1:     //(21<nRandNum<40);                 b++;                 break;              case 2:    //(41<nRandNum<60);                 c++;                 break;              case 3:    //(61<nRandNum<80);                 d++;                 break;              case 4:     //(81<nRandNum<100);                 e++;                 break;                 /*                    case'1':                    a++;                    case'2':                    b++;                    case'3':                    c++;                    case'4':                    d++;                    case'5':                    e++;                    */         }     }     printf("the number of 0<nRandNum<20 is :%d\n",a);     printf("the number of 21<nRandNum<40 is :%d\n",b);     printf("the number of 41<nRandNum<60 is :%d\n",c);     printf("the number of 61<nRandNum<80 is :%d\n",d);     printf("the number of 81<nRandNum<100 is :%d\n",e);      return 0; } 参考一下吧； '1'和数值1是有区别的。'1' - 1 = 48;即'1'十进制是49； rand() 得到的是数值；不是字符；    e的输出值为0.不知道怎么回事

还是无法计数  已将 abcde初始化

不适合用switch，且:0<nRandNum<20逻辑不对，相当于:(0<nRandNum)<20,即先算0<nRandNum的结果（为真或假）然后再和20进行比较，整个结果必经为真 #include <stdio.h> #include <stdlib.h>  //srand,random  #include <time.h>    //time(NULL) #define RANGENUM 100 //控制随机数的范围为0-100 int main() { 	int i, nRandNum;      int a = 0, b = 0, c = 0, d = 0, e = 0;  	srand(time(NULL)); // 让每次产生的随机数都不一样   	 	for (i = 0; i < 100; i++)  //产生100个随机数 	{ 		nRandNum = rand() % RANGENUM; 		printf("The %dth random num is: %d\n", i, nRandNum); //生成随机数,并利用取余数控制数值范围	        if (0 <= nRandNum && nRandNum <= 20)       {          ++a;       }       else if (21 <= nRandNum && nRandNum <= 40)       {          ++b;       }       else if (41 <= nRandNum && nRandNum <= 60)       {          ++c;       }       else if (61 <= nRandNum && nRandNum <= 80)       {          ++d;       }       else if (81 <= nRandNum && nRandNum <= 100)       {          ++e;       } 	}  	printf("the number of 0<nRandNum<20 is :%d\n", a); 	printf("the number of 21<nRandNum<40 is :%d\n", b); 	printf("the number of 41<nRandNum<60 is :%d\n", c); 	printf("the number of 61<nRandNum<80 is :%d\n", d); 	printf("the number of 81<nRandNum<100 is :%d\n", e);  	return 0;  }

引用 3 楼 hefashion0190 的回复:#include "stdio.h" #include "stdlib.h"//srand,random  #include "time.h"//time(NULL) #define RANGENUM 100//控制随机数的范围为0-100 int main() { 	int nRandNum; 	srand(time(NULL)); // 让每次产生的随机数都不一样   	int a = 0, b = 0, c = 0, d = 0, e = 0; 	for (int i = 0; i < 100; i++)  //产生100个随机数 	{ 		nRandNum = rand() % RANGENUM; 		printf("The %dth random num is: %d\n", i, nRandNum);//生成随机数，并利用取余数控制数值范围 		switch (nRandNum) 		{ 		case'1':(0 < nRandNum < 20); 			a++; 		case'2':(21 < nRandNum < 40); 			b++; 		case'3':(41 < nRandNum < 60); 			c++; 		case'4':(61 < nRandNum < 80); 			d++; 		case'5':(81 < nRandNum < 100); 			e++; 		} 	}  	printf("the number of 0<nRandNum<20 is :%d\n", a); 	printf("the number of 21<nRandNum<40 is :%d\n", b); 	printf("the number of 41<nRandNum<60 is :%d\n", c); 	printf("the number of 61<nRandNum<80 is :%d\n", d); 	printf("the number of 81<nRandNum<100 is :%d\n", e);  	return 0;  } nRandNum不是字符吧，switch中的'1', '2', '3'，’4‘表示的是49， 50， 51， 52

a,b,c,d,e未初始化  int a=0,b=0,c=0,d=0,e=0;


Question: 这段代码怎么改才能把去掉空格后的全输出

#include <stdio.h> #include <stdlib.h> #include <string.h>  void deblack( char *p , char *q) {     while (*p) {         if(*p == ' ')             p++;         else             *q++ = *p++;     }     *p = 0; }  void main() {     FILE *fp ;     char str[100] , str1[100];      fp = fopen("a" , "r");     if (!fp)         return;     while(!feof(fp))     {         fgets(str, 100, fp);         deblack(str, str1);         printf("%s" , str1);     }     fclose(fp); } 参考一下吧

引用 4 楼 zhao4zhong1 的回复:void main() {     FILE *fp ;     char str[100] , str1[100];     fp = fopen("a" , "r");     while(1)  {         if (NULL==fgets(str , 100 , fp)) break;         deblack( str , str1);         printf("%s\n" , str1);     }     fclose(fp); } 欸，大叔，你这个方法也行耶，那说明我的问题出在没有结束while的判断，所以会出问题。

引用 8 楼 zhao4zhong1 的回复:#include <stdio.h> void delblank( char *p , char *q) {     char c,f;     f=1;     while (1) {         c=*p;         if (0==c) {             *q=0;             break;         }         if (f) {             if ('#'==c) {                 f=0;                 *q='\t';                 q++;                 *q=*p;                 q++;             } else if (!(' '==c || '\t'==c)) {                 *q=*p;                 q++;             }         } else {             *q=*p;             q++;         }         p++;     } } int main() {     char str[100]="           ip         =  192.168.219.136                 #这是ip" , str1[100];     delblank(str,str1);     printf("%s\n",str1);     return 0; } //ip=192.168.219.136      #这是ip // 谢谢，好厉害，我以后要是也能这样就好了

fgets是一行一行的读，一行一行的传给deblack（*q = '\0';   的用是在每行后面都加\0结束），然后用while (!feof(fp))这个循环把每行都这样遍历一遍     ，     这样理解对吗？

#include <stdio.h> #include <stdlib.h> #include <string.h>   void deblack(char* p, char* q) {     while (*p) {         if (*p == ' ')             *p++;         else             *q++ = *p++;     }     *q = '\0';  ///需要把字符串封闭掉  }   int main() {     FILE* fp ;     char str[100], str1[100];     fp = fopen("a.txt", "r");     while (!feof(fp)) {         fgets(str, 100, fp); /// fgets  读取换行的         deblack(str, str1);         printf("%s", str1);      }     fclose(fp); }  在楼主的代码上改吧

#include <stdio.h> #include <stdlib.h> #include <string.h>   char* deblack(char* src)    // 删除C风格字符串中的空格 {     char* ret = src;     char* fp = src;     while (*src) {         if (*src != ' ') { // 如果不是空格就复制             *fp = *src;             fp++;         }         src++;     }     *fp = '\0' ; //封闭字符串     return ret; }   int main() {     FILE* fp ;     char str[100];     fp = fopen("a.txt", "r");     while (!feof(fp)) {         fgets(str, 100, fp);         printf("%s\n", deblack(str));     }       fclose(fp); }   楼主的代码 少了  *fp = '\0' ; //封闭字符串

再问一下，在怎样改进能使注释符（#） ， 前加上'\t'  或不删除其前的空格  加入"a"的内容是            ip         =  192.168.219.136                 #这是ip   最后能输出 ip=192.168.219.136                   #这是ip


Question: c语言指针地址问题

是输出格式的问题么 %s  c

%s是输出或输入字符串，字符串那么就至少一个字符，即空串；输入或输出字符串，即需要提供字符串的首地址，即字符串开始的位置；%c是字符，即字符串中的字符，自然需要加*，加*只是表示第一个字符；若引用后面的字符需要加偏移。

%s要求参数是地址 %c要求参数是值

test是指针没错，但是它其实有两层含义：一个字符的内存地址，或一个字符串的首地址。所以关键在于输出格式，楼上都说了，%c是字符，此时要输出必须是*test，%s是字符串，则要求给出的是字符串首地址，即test。按整型数输出test的话则是地址的值。

基础不扎实，再复习一下指针、字符串指针

想要输出指针地址用%p

在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

楼主基础知识不扎实啊。 test是一个指针，在这里是字符串指针。 因此，test的值是字符串第一个字符的地址。 test直接输出它的值，是一个地址，字符串的地址。 *test，*是取值，取指针指向的内存地址中存储的值，所以运算结果是取到字符串的第一个字符 下面解答你的问题： 第一个：因为格式控制中用了%s，这是输出字符串用的，这时候printf函数需要你传递一个指向字符串的指针，你的test不正好就是么。其实它内部你可以这样理解， for(;*test!=0;test++)  putchar(*test); 第二个：前面也说，test是一个指针变量，它是储存内存地址的，然而我们要访问的是这个内存地址中的值，所以需要加星号。

具体结果可以看图


Question: 那位帮我看看

#include <stdio.h> #include <stdlib.h>  //* int KeepSingle(int array[], int n) {    int i;     for (i = 1; i < n; ++i)    {       if (array[i-1] == array[i])       {          for (; i < n; ++i)             array[i-1] = array[i];                 --n;          i = 1;       }    }     return n; }  int cmp(const void *a , const void *b) {    //return *(int *)a - *(int *)b; // 会有溢出隐患    return *(int *)a > *(int *)b; }  int main(void) {    int num[100];    int n, i = 0;    scanf("%d", &n);    while (i < n)    {       scanf("%d", &num[i]);       i++;    }         qsort(num, n, sizeof(num[0]), cmp);     for (i = 0; i < n; i++)       printf("%d\t", num[i]);    puts("");     n = KeepSingle(num, n);     for (i = 0; i < n; i++)       printf("%d\t", num[i]);       puts("");        return 0; }

#include<stdio.h>  static void print(const int *arr, int size); void bubble_sort(int *arr, int size); void del_repeat(int *arr, int *psize);   int main() { #if 1      int num_list[20], n, cur_cnt;     int i;      while (scanf("%d", &n) == 1 && (n < 10 || n > 20))         ;      i = 0;     while (i < n)         scanf("%d", &num_list[i++]);      print(num_list, n);      bubble_sort(num_list, n);     print(num_list, n);     cur_cnt = n;     del_repeat(num_list, &cur_cnt);      print(num_list, cur_cnt);  #else     int sum[100];     int n,j,t,i=0;     scanf("%d",&n);     while(i<n)     {         scanf("%d",&sum[i]);         i++;     }     for(i=0;i<n;i++)     {         for(j=i+1;j<n-1;j++)         {             if(sum[i]==sum[j])                 sum[i]=sum[j];             else if(sum[i]>sum[j])                 t=sum[i];             sum[i]=sum[j];             sum[j]=t;         }     }     for(i=0;i<n;i++)         printf("%d\t",sum[i]); #endif     return 0; }  static void print(const int *arr, int size) {     int i;      for (i = 0; i < size; i++)         printf("%d  ", arr[i]);     putchar(10); }  void del_repeat(int *arr, int *psize) {     int i, j;      for (i = 0; i < *psize - 1;)         if (arr[i] == arr[i+1]) {             for (j = i+1; j < *psize-1; j++)                 arr[j] = arr[j+1];             (*psize)--;         } else {             i++;         } }   void bubble_sort(int *arr, int size) {     int i, j;      for (i = 0; i < size; i++)         for (j = 0; j < size - i - 1; j++)             if (arr[j] > arr[j+1]) {                 int tmp = arr[j];                 arr[j] = arr[j+1];                 arr[j+1] = tmp;             } } 参考一下吧

设置断点，F10，F11单步调试看看每个变量的变化就知道你的问题了，if，elseif后面代码有多行时要括起来，变量初始化。

#include<stdio.h> int main() {     int sum[100],a[100];     int n=0,j=0,t=0,i=0,h=0; 	int m=0;//记录相同数据个数 	scanf("%d",&n); 	while(i<n) 	{ 		scanf("%d",&sum[i]); 		i++; 	}	 	for(i=0;i<n;i++) 	{ 		for(j=i+1;j<n;j++) 		{ 			if(sum[i]>sum[j]) 			{ 				t=sum[i]; 			sum[i]=sum[j]; 			sum[j]=t; 			} 		} 	} 	 	    for(i=0;i<n;)   { 	     			a[h]=sum[i]; 			if (sum[i]==sum[i+1]) 			{  			i=i+2; 			m++,h++; 			} 			else 			i++,h++;   }  			 		 		 	 	for(i=0;i<n-m;i++) 		printf("%d\t",a[i]); 	return 0; } 写得有点冗长，不过调试了一下应该没问题

修改为：  		for (j = i + 1; j < n; ) 		{ 			if (sum[i] == sum[j]) { 				t = sum[n-1]; 				sum[n - 1] = sum[j]; 				sum[j] = t; 				n--; 				continue; 			}  			if (sum[i] > sum[j]) { 				t = sum[i]; 				sum[i] = sum[j]; 				sum[j] = t; 			}  			j++; 		}

引用 2 楼 hefashion0190 的回复:t未初始化，else if判断为false时，t为不可知数值， 建议所有的变量都初始化 理解题意，设计算法 学会调试非常重要   仅供参考 #include<stdio.h> int main() { 	int sum[100] = {0}; 	int n = 0, j = 0, t = 0, i = 0; 	scanf("%d", &n); 	while (i < n) { 		scanf("%d", &sum[i]); 		i++; 	} 	for (i = 0; i < n; i++)	{ 		for (j = i + 1; j < n; j++) { 			if (sum[i] == sum[j]) { 				t = sum[n-1]; 				sum[n - 1] = sum[j]; 				sum[j] = t; 				n--; 			}  			if (sum[i] > sum[j]) { 				t = sum[i]; 				sum[i] = sum[j]; 				sum[j] = t; 			} 		} 	} 	for (i = 0; i < n; i++) 		printf("%d\t", sum[i]); 	return 0; } 算法还是有问题 输入 10 输入 3 3 3 3 3 3 3 3 3 3  剩下怎么解决你自己看了！

void del_repeat2(int *arr, int *psize) {     int *pdst, *pend;      pdst = arr;     pend = arr + *psize - 1;  #if 0     for (; arr < pend; arr++) {         if (*pdst != *(arr + 1))             *(++pdst) = *(arr + 1);          else             (*psize)--;     } #else     while (arr < pend) {         if (*pdst != *(arr + 1))             *(++pdst) = *(arr + 1);         else             (*psize)--;         arr++;     }   #endif } 指针形式，单层循环，提高运行效率；

如果遇到相同的数据、最后输出的个数就不是n个了


Question: while循环的输出问题，之中可能是scanf_s的输入问题。有大神帮帮菜鸟新人吗

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

将所有%1d都替换为%ld


Question: C语言数组指针不能进行自增自减以达到遍历数组的作用吗

引用 12 楼 qq_36450673 的回复:老哥我想问下list（0）变为list（1）时，指针是变化了的，那么申请空间的list（1）地址和一开始的list（1）地址有区别吗？是不是相当于两个不同的指针变量 我觉得 申请空间的list(1)地址和开始的地址是一致的 只不过是指针变量覆盖

引用 10 楼 lilimite 的回复:2楼大佬说得很对，多调试感受一下，int a[5]={3,4,5,6,7},*p; 	 	p=&a[0];  	 	printf("%d\n",*p);  	//printf("%d\n",*p++);     printf("%d\n",*++p); 	printf("%d\n",*p+1); 用这个代码对比一下。感觉直接对地址自加赋值，指针l所指的空间不一样了 我在分析得时候没有顾及到，沉迷于我自己的理论ａｃ

好，谢谢楼上几位

引用 7 楼 cfjtaishan 的回复:[quote=引用 4 楼 qq_35859033 的回复:] 上图的代码有点错误  Link* k = (Link*)malloc(sizeof(Link));     k->List = (int*)malloc(sizeof(int)*100);     k->List[0] = 0;     k->List[1] = 0;     printf("%d %d\n", k->List[0], k->List[1]);     *(k->List) = 1;     *(k->List++) = 2;     printf("%d %d\n", k->List[0], k->List[1]);  第一个可以得到两个0，因为List指针没有变化； 第二个输出是2个随机值； *(k->List++) = 2;该表达式有两个运算，第一个运算是将将2复制给k->List[0]，第二个运算是k->List++;即指针指向了初始的List[1]; 没错，开始*(k->List)是给k->List[0]赋值1，但是第二个紧接着是用2覆盖了1；此时List指针已经发生了变化，所以此时的k->List[0]就是申请空间时的List[1]，k->List[1]是开始的List[1]；所以，后面的printf输出两个随机值。*(k->List++) = 2；这样操作会导致内存泄漏，因为找不到申请空间的首地址了，指针指向下一个内存地址（偏移了4字节）； 若第二个表达式变成*(++k->List) = 2;那么输出的是2和一个随机值；这样操作一样会有内存泄露； 解决办法是将k->List指针指向的地址做备份，即int *bak = k->List;这样可以通过bak[0], bak[1]来验证你的赋值是怎样的。另外，free时可以直接free(bak);这样就可以把List申请的空间释放掉，而不会内存泄漏；[/quote] 老哥你分析得很对，是我学的太浅了！

引用 4 楼 qq_35859033 的回复:上图的代码有点错误  Link* k = (Link*)malloc(sizeof(Link));     k->List = (int*)malloc(sizeof(int)*100);     k->List[0] = 0;     k->List[1] = 0;     printf("%d %d\n", k->List[0], k->List[1]);     *(k->List) = 1;     *(k->List++) = 2;     printf("%d %d\n", k->List[0], k->List[1]);  第一个可以得到两个0，因为List指针没有变化； 第二个输出是2个随机值； *(k->List++) = 2;该表达式有两个运算，第一个运算是将将2复制给k->List[0]，第二个运算是k->List++;即指针指向了初始的List[1]; 没错，开始*(k->List)是给k->List[0]赋值1，但是第二个紧接着是用2覆盖了1；此时List指针已经发生了变化，所以此时的k->List[0]就是申请空间时的List[1]，k->List[1]是开始的List[1]；所以，后面的printf输出两个随机值。*(k->List++) = 2；这样操作会导致内存泄漏，因为找不到申请空间的首地址了，指针指向下一个内存地址（偏移了4字节）； 若第二个表达式变成*(++k->List) = 2;那么输出的是2和一个随机值；这样操作一样会有内存泄露； 解决办法是将k->List指针指向的地址做备份，即int *bak = k->List;这样可以通过bak[0], bak[1]来验证你的赋值是怎样的。另外，free时可以直接free(bak);这样就可以把List申请的空间释放掉，而不会内存泄漏；

x++ 和 ++x的区别么? 我也不太理解你的意思 你可以试着单步调试一下

引用 4 楼 qq_35859033 的回复:上图的代码有点错误  Link* k = (Link*)malloc(sizeof(Link));     k->List = (int*)malloc(sizeof(int)*100);     k->List[0] = 0;     k->List[1] = 0;     printf("%d %d\n", k->List[0], k->List[1]);     *(k->List) = 1;     *(k->List++) = 2;     printf("%d %d\n", k->List[0], k->List[1]);  指针自增是增加一个元素的size 比如p++,原来的p[1]就变成的现在的p[0]了 你又没把它复位,读取就是从p[1]开始的

引用 2 楼 qq_31709097 的回复:你不是刻舟求剑么,指针都++了,读取的当然也是自增后的 int* p=l 用p读取 老哥你没看明白我的意思    我的意思是想问在这自增运算过程中发生了什么，才造成了赋值的错误 = =、 这是问题的原型  Link* k = (Link*)malloc(sizeof(Link));     k->List = (int*)malloc(sizeof(int)*100);     k->List[0] = 0;     k->List[1] = 0;     printf("%d %d\n", k->List[0], k->List[1]);     *(k->List) = 1;     *(k->List) = 2;     printf("%d %d\n", k->List[0], k->List[1]);

各位大佬一起交流下啊，指点小弟一下


Question: 关于字符数组的问题

一起写表示的是判断b是否等于后面这些做||运算的结果

if(b[i]=='~'||'!'||'@'||'#'||'$'||'%'||'^') 不能这样写，你需要分成多个，if(b[i]=='~'|| b[i] == '!'|| b[i] == '@'|| b[i] == '#'|| b[i] == '$'|| b[i] == '%'|| b[i] == '^')

c = strlen(b);  for (i=0;i<c;i++) {      if (b[i] == '~'      || b[i] == '!'      || b[i] == '@'      || b[i] == '#'      || b[i] == '$'      || b[i] == '%'      || b[i] == '^') {          e = e+1;          break;     } }  //---------------------- c = strlen(b);  for (i=0;i<c;i++) {      if (strchr("~!@#$%^",b[i])) {         e = e+1;         break;     } }

c = strlen(b);  for(i=0;i<c;i++) {      if(b[i]=='~'|| b[i] == '!'|| b[i] == '@'|| b[i] == '#'|| b[i] == '$'|| b[i] == '%'|| b[i] == '^') {         e = e+1;         break;     } } C语言语法还需要加强学习呀

if(b[i]=='~'||'!'||'@'||'#'||'$'||'%'||'^')不能这样比较 应该if(b[i]=='~'||b[i]=='@'。。。。。)分开这样， 你写的比较只会判断第一个是否含有'~'然后因为'@'等的值肯定为真所以e都会+1；


Question: 安装codeblocks 出现Unexpected characters following option 'd'

CodeBlocks SVN 11112版闪亮登场 双11特别版...  百度网盘 https://pan.baidu.com/s/1nvqVAyd

缺少codeblocks environment ，得下载安装


Question: 求助!  奇怪的C语言计算偏差  求大佬解决

设置断点调试一次啊 看那不一样

可是为什么 赋初值就可以了呢

浮点数格式 http://bbs.csdn.net/topics/390676437

好像是的  谢谢啦  看来以后要多注意。

引用 10 楼 qq_34636559 的回复:但是直接用for 就不行了 你看看  那是你程序的问题，你看看fx的值运行中不是也发生变化了么，把fx=0和fx1=0初始化放在循环中你再试试，结果就一样了

但是直接用for 就不行了

对 其他的不变  只把第一次得到的x值 替代原来的0.08   这样可以的得到正确答案

除了x的值变化其他的不变么？

引用 6 楼 qq_34636559 的回复:那有没有什么办法解决呢 你所说的赋值是不是再把这行代码再执行一边呀？  int i,n;double fx=0;double x=0.08;//赋初值给x

那有没有什么办法解决呢

引用 4 楼 qq_34636559 的回复:就是第一次循环结束时的x值时对的，，但是当这个x值进入第二次循环的时候，得出的就不对了。。 然而把第一次循环得到的x值手动赋值给x，得到的是正确的。。。可以理解为电脑自动循环时得到的是错的。。。人工手动一次次计算。。是对的。。。。 不一样，因为精度问题，因为浮点类型的精度是最多能有7位有效数字，但绝对能保证的为6位，如果超过这个数据进行运算后，会自动进行省略小数点后的位数，所以导致第二遍循环的不准确。


Question: 如何读取不规则TXT数据

仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %31[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8

简单的说，不能。  看你的环境，如果有类似于getline的函数最好，读第一行后丢弃直接从第二行开始处理即可。取第几列，你要按一定格式来分割这一行，自己处理了。

可以使用fscanf/fprintf函数对文件进行读写；跳过首行，第一行可以考虑用fgets，下面的就是用fscanf读取，一次读一行

引用 6 楼 zhuimengdeluntai 的回复:[quote=引用 3 楼 cfjtaishan 的回复:] fscanf("%d %d %d %d %lf\n", &frame, &near, &echo, &dbchange, &real);  参考一下吧 没法做到每行之读前5个数[/quote] 怎么做不到？ 还有你的文件里有*吗？这些也是文件的内容吗？

引用 1 楼 ColorfulCode 的回复:挺规则的数据。 1.可以每次读一行，然后用正则去抓取数据，至于是所有列还是特定列，取决于你的正则表达式 2.还是每次读一行，然后自己撸代码抓取数据 具体怎么写？没用过正则，求指导

引用 3 楼 cfjtaishan 的回复:fscanf("%d %d %d %d %lf\n", &frame, &near, &echo, &dbchange, &real);  参考一下吧 没法做到每行之读前5个数


Question: 用来测试程序的一小段计时函数，没找到问题，可否帮忙一下？

看括号的化可以选中括号，然后按ctrl+]键，这样就可以帮你找到配对的括号啦，如果找不到就说明没有配好，一个小方法。

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

printf语句括号不对称，改成：printf("time=%f\n", (double)(end - start) / CLK_TCK);

#include<stdio.h> #include<time.h>  void main() {     int i=100,sum=0;     clock_t start,end;     start = clock();     for(i=0;i<1000;i++)     {         sum=sum+i;     }     end = clock();     printf("time=%lf\n",(double)(end-start)/CLK_TCK); } 两个问题： 1. printf中缺少一个左括号； 2. double输出格式应该是%lf

你括号都没配对啊

printf("time=%f\n",(double)end-start)/CLK_TCK);   少一个括号吧


Question: vs2015下，用C进行正文提取的疑惑

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

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

引用 39 楼 zhao4zhong1 的回复:本质上没区别，且c语言过滤文件用管道已经是业界通行做法。 https://zhidao.baidu.com/question/1446284622845532140.html 那这里面取标签之间的原理是什么，为什么要设置那么多参数，有点理解不了。。不明白为什么要加上那些判断语句什么的。能帮忙指点一下吗。

本质上没区别，且c语言过滤文件用管道已经是业界通行做法。

引用 36 楼 zhao4zhong1 的回复:开始、运行、cmd、确定 在黑色的cmd窗口中输入命令： cd /d "E:\我的VS之路\正文提取的test\Debug" "正文提取的test.exe" <www.txt >out.txt 现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！ 最好可以用到C语言文件的读取fopen之类的，然后操作，放入文件

引用 36 楼 zhao4zhong1 的回复:开始、运行、cmd、确定 在黑色的cmd窗口中输入命令： cd /d "E:\我的VS之路\正文提取的test\Debug" "正文提取的test.exe" <www.txt >out.txt 现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！ 呃。1.我现在分开了2个程序，一个是WinExec然后一个是1楼给的代码，都编译了，但是我运行WinExec的时候，黑框上就直接显示，请按任意键继续，然后我打开那个out.txt文件，都没有东西。         2.还有就是我在cmd上面填写你给的那个，上面显示系统找不到指定文件。。。。。         3.其实我只是想用一些代码来实现，最好只有关于C的，引用，操作，结束。。。涉及到别的话。可能就有点跟我的初衷有点相反了。

命令行解释器概述 命令行解释器是一个单独的软件程序，它可以在用户和操作系统之间提供直接的通讯。非图形命令行解释器用户界面提供运行基于字符的应用程序和实用程序的环境。通过使用类似于 MS-DOS 命令解释程序 Command.com 的单独字符，命令行解释器执行程序并在屏幕上显示其输出。Windows 服务器操作系统命令行解释器使用命令解释程序 Cmd.exe（该程序加载应用程序并指导应用程序之间的信息流动）将用户输入转换为操作系统可理解的形式。 可以使用命令行解释器创建和编辑可自动执行常规任务的批处理文件（也称作脚本）。例如，可以使用脚本自动管理用户帐户或夜间备份。还可以使用 Windows 脚本宿主 CScript 的命令行版本在命令行解释器中运行更高级的脚本。详细信息，请参阅运行 Windows 脚本宿主。通过使用批处理文件来执行操作，可比使用用户界面更有效率。批处理文件接受命令行上可用的所有命令。有关批处理文件和脚本的详细信息，请参阅使用批处理文件。 您可以自定义命令提示符窗口以易于查看并增强对程序运行方式的控制。有关自定义命令提示符窗口的详细信息，请参阅配置命令提示符。  使用命令语法 语法按命令及所带参数必须遵循的键入顺序出现。下面的 xcopy 命令示例显示了各种语法文本格式：  xcopy Source [Destination] [/w] [/p] [/c] [/v] [/q] [/f] [/l] [/g] [/d[:MM-DD-YYYY]] [/u] [/i] [/s [/e]] [/t] [/k] [/r] [/h] [{/a | /m}] [/n] [/o] [/x] [/exclude:File1[+[File2]][+[File3]] [{/y | /-y}] [/z]  下表说明如何解释不同的文本格式。  格式化图例 格式                                             含义 斜体                                             用户必须提供的信息 粗体                                             用户必须准确键入的要显示的元素 省略号(...)                                      在命令行中可多次重复的参数 中括号([])                                       可选项 大括号({})；选项用竖线(|)分隔。例如：{even|odd}  用户必须从选项集合中选择一个 Courier字体                                      代码或程序输出  使用多个命令和条件处理符号 使用条件处理符号可以在单个命令行或脚本中运行多个命令。通过条件处理符号运行多个命令时，条件处理符号右边的命令根据条件处理符号左边命令的执行结果来发挥作用。例如，只有在前一个命令失败的情况下才可能需要运行一个新命令。或者，只有在前一个命令成功时才可能需要运行一个新命令。 可以使用下表列出的特殊字符来传递多个命令。  字符       语法                            定义 & [...]    Command1 & Command2             用来分隔一个命令行中的多个命令。Cmd.exe 运行第一个命令，然后运行第二个命令。 && [...]   Command1 && Command2            只有在符号 && 前面的命令成功时，才运行该符号后面的命令。Cmd.exe 运行第一个命令，然后只有在第一个命令运行成功时才运行第二个命令。 || [...]   Command1 || Command2            只有在符号 || 前面的命令失败时，才运行符号 || 后面的命令。Cmd.exe 运行第一个命令，然后只有在第一个命令未能运行成功（接收到大于零的错误代码）时才运行第二个命令。 ( ) [...]  (Command1 & Command2)           用来分组或嵌套多个命令。 ;或者,     Command1 Parameter1;Parameter2  用来分隔命令参数。  注意 “与”符号 (&)、管道符号 (|) 以及括号 () 是特殊字符，将它们作为参数传递时，必须在其前面加上转义字符 (^) 或引号。 如果某个命令成功完成操作，该命令就返回零 (0) 退出代码或不返回任何退出代码。有关退出代码的详细信息，请参阅 Microsoft Windows 部署和资源工具包。  嵌套命令行解释器 通过在命令提示符下打开新的 Cmd.exe 实例，可以在 Cmd.exe 内嵌套命令行解释器。默认情况下，Cmd.exe 的每个实例继承其父 Cmd.exe 应用程序的环境。通过嵌套 Cmd.exe 的实例，可以更改局部环境，而不会影响 Cmd.exe 的父应用程序。这使您能够保留 Cmd.exe 的原始环境，并在终止嵌套的命令行解释器之后返回到原始环境。但是在嵌套的命令行解释器中所做的更改将不会被保存。 要嵌套命令行解释器，请在命令提示符下键入：  cmd  出现类似于下面内容的消息：  Microsoft (R) Windows Server 2003 Standard Edition (TM) (C) 版权所有 1985-2002 Microsoft Corp. 要关闭嵌套的命令行解释器，请键入 exit。  使用 setlocal 和 endlocal 命令，可以在 Cmd.exe 的实例中（或在脚本中）进一步将更改局部化。Setlocal 创建局部作用范围，而 endlocal 终止局部作用范围。在 setlocal 和 endlocal 作用范围内所做的更改将会被放弃，从而保持原始环境不变。这两个命令的嵌套最高可达到 32 级。有关 setlocal 和 endlocal 命令的详细信息，请参阅 Setlocal 和 Endlocal。  将环境变量与 Cmd.exe 一起使用 Cmd.exe 命令行解释器环境由确定命令行解释器和操作系统行为的变量进行定义。可以使用两种类型的环境变量（系统和局部）来定义命令行解释器环境或整个操作系统环境的行为。系统环境变量定义全局操作系统环境的行为。局部环境变量定义 Cmd.exe 当前实例环境的行为。 系统环境变量预置于操作系统之中，并可用于所有 Windows 服务器操作系统进程。只有具有管理凭据的用户才可以更改系统变量。这些变量最常用于登录脚本。 局部环境变量只有在创建变量时针对的目标用户登录到计算机时才有效。HKEY_CURRENT_USER 配置单元中设置的局部变量只对当前用户有效，但它们可定义全局操作系统环境的行为。  下表按优先顺序的降序描述变量的各种类型： 1.内置系统变量 2.在 HKEY_LOCAL_MACHINE 配置单元中找到的系统变量 3.在 HKEY_CURRENT_USER 配置单元中找到的局部变量 4.在 Autoexec.bat 文件中设置的所有环境变量和路径 5.在登录脚本（如果有的话）中设置的所有环境变量 6.在脚本或批处理文件中交互使用的变量  在命令行解释器中，Cmd.exe 的每个实例都继承其父应用程序的环境。因此，可以在不影响父应用程序环境的情况下更改新的 Cmd.exe 环境中的变量。 下表列出 Windows server operating system 的系统和本地环境变量。  变量                     类型       描述 %ALLUSERSPROFILE%        本地       返回“所有用户”配置文件的位置。 %APPDATA%                本地       返回默认情况下应用程序存储数据的位置。 %CD%                     本地       返回当前目录字符串。 %CMDCMDLINE%             本地       返回用来启动当前的Cmd.exe的准确命令行。 %CMDEXTVERSION%          系统       返回当前的“命令处理程序扩展”的版本号。 %COMPUTERNAME%           系统       返回计算机的名称。 %COMSPEC%                系统       返回命令行解释器可执行程序的准确路径。 %DATE%                   系统       返回当前日期。使用与date/t命令相同的格式。由Cmd.exe生成。有关date命令的详细信息，请参阅Date。 %ERRORLEVEL%             系统       返回上一条命令的错误代码。通常用非零值表示错误。 %HOMEDRIVE%              系统       返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。 %HOMEPATH%               系统       返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。 %HOMESHARE%              系统       返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。 %LOGONSERVER%            本地       返回验证当前登录会话的域控制器的名称。 %NUMBER_OF_PROCESSORS%   系统       指定安装在计算机上的处理器的数目。 %OS%                     系统       返回操作系统名称。Windows2000显示其操作系统为Windows_NT。 %PATH%                   系统       指定可执行文件的搜索路径。 %PATHEXT%                系统       返回操作系统认为可执行的文件扩展名的列表。 %PROCESSOR_ARCHITECTURE% 系统       返回处理器的芯片体系结构。值：x86或IA64（基于Itanium）。 %PROCESSOR_IDENTFIER%    系统       返回处理器说明。 %PROCESSOR_LEVEL%        系统       返回计算机上安装的处理器的型号。 %PROCESSOR_REVISION%     系统       返回处理器的版本号。 %PROMPT%                 本地       返回当前解释程序的命令提示符设置。由Cmd.exe生成。 %RANDOM%                 系统       返回0到32767之间的任意十进制数字。由Cmd.exe生成。 %SYSTEMDRIVE%            系统       返回包含Windowsserveroperatingsystem根目录（即系统根目录）的驱动器。 %SYSTEMROOT%             系统       返回Windowsserveroperatingsystem根目录的位置。 %TEMP%和%TMP%            系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP，而其他应用程序则需要 TMP。 %TIME%                   系统       返回当前时间。使用与time/t命令相同的格式。由Cmd.exe生成。有关time命令的详细信息，请参阅Time。 %USERDOMAIN%             本地       返回包含用户帐户的域的名称。 %USERNAME%               本地       返回当前登录的用户的名称。 %USERPROFILE%            本地       返回当前用户的配置文件的位置。 %WINDIR%                 系统       返回操作系统目录的位置。  设置环境变量 使用 set 命令创建、更改、删除或显示环境变量。set 命令只更改当前解释器环境中的变量。  要查看变量，请在命令提示符下键入：  set VariableName  要添加变量，请在命令提示符下键入：  set variablename=Value  要删除变量，请在命令提示符下键入：  set VariableName=  可以将大多数字符用作变量值，其中包括空格。如果使用特殊字符 <、>、|、& 或 ^，则必须在它们前面加上转义字符 (^) 或引号。如果使用引号，则必须将引号作为值的组成部分，因为等号后面的任何内容都会被视为值。请考虑下列示例：  要创建变量值 new&name，请键入： set varname=new^&name  要创建变量值 "new&name"，请键入： set varname="new&name"  如果在命令提示符下键入 set varname=new&name，就会出现与下面内容类似的错误消息： “'name' 不是内部或外部文件，也不是可运行的程序或批处理文件。” 变量名不区分大小写。但是，set 显示的变量与您键入的完全相同。可以在变量名中结合使用大写字母和小写字母，这样可以使代码更具有可读性（例如，UserName）。  注意  单个环境变量的最大大小为 8192 字节。 所有环境变量的大小总和（包括变量名和等号）最大为 65,536 KB。 替换环境变量值 要在命令行或脚本中启用变量值替换，请将变量名包括在百分号之中（即，%VariableName%）。使用百分号可以确保 Cmd.exe 引用变量值，而不是进行文字比较。为变量名定义变量值之后，请将变量名包括在百分号之中。Cmd.exe 搜索该变量名的所有实例，并用定义的变量值进行替换。例如，如果创建包含不同值（例如，用户名）的脚本，并且想要用这些值为每个用户定义 USERNAME 环境变量，可以使用包括在百分号之中的 USERNAME 来编写代码。运行此脚本时，Cmd.exe 将用变量值替换 %USERNAME%，这样就消除了为每个用户手动执行此任务的必要。变量替换是不可递归的。Cmd.exe 检查变量一次。有关变量替换的详细信息，请参阅 For 和 Call。

引用 31 楼 zhao4zhong1 的回复:你不会不懂 “正文提取的test.exe”对应我#1楼的test.cpp生成的exe 包含WinExec语句的.cpp文件生成的是另一个exe 吧。  我猜你是傻傻地把WinExec语句写到“正文提取的test.exe”对应的.cpp中了。   呃。是有点绕哈。。。。我这个的确不是很清楚，这个是操作系统的吗，如果是的话。我还没学习。。。。。我就暂时学了C。现在在练C。 。。要不然我今晚再看看。但是不一定看的出来。

calltest.cpp:#include <windows.h> int main() {  WinExec("cmd /c cd /d \"E:\\我的VS之路\\正文提取的test\\Debug\"&\"正文提取的test.exe\" <www.txt >out.txt",SW_HIDE);  return 0; } 用这个代码生成比如“E:\我的VS之路\正文提取的test\Debug\calltest.exe" 然后你双击运行calltest.exe，作用是调用”“E:\我的VS之路\正文提取的test\正文提取的test.exe“并指定输入输出重定向文件。

在任务管理器中先结束进程“正文提取的test.exe”  这些都是常识啊！  程序员的常识之一：不要将程序源代码或项目或exe放在桌面这种复杂（多半带空格和汉字且在防火墙或杀毒软件严密控制的C盘上）的目录下。

引用 27 楼 zhao4zhong1 的回复:WinExec("cmd /c cd /d \"E:\\我的VS之路\\正文提取的test\\Debug\"&\"正文提取的test.exe\" <www.txt >out.txt",SW_HIDE);  还是一样。。一样是另外一个进程在使用，进程无访问。。 还是说，可以用C写个语句，来读取这个txt文件，然后加上底下的操作之后，再输入到另外一个txt文件里面？

此内容可能已更新，有关最新信息，请参见 TechCenter 网站。Cmd启动命令解释程序 Cmd.exe 的新实例。如果在不含参数的情况下使用，cmd 将显示操作系统的版本和版权信息。  语法 cmd [{/c | /k}] [/s] [/q] [/d] [{/a | /u}] [/t:FG] [/e:{on | off}] [/f:{on | off}] [/v:{on | off}] [String]  参数 /c  执行 String 指定的命令，然后停止。  /k  执行 String 指定的命令并继续。  /s  修改 /c 或 /k 后对 String 的处理。  /q  关闭回显。  /d  禁用“自动运行”命令执行。  /a  将内部命令输出按美国国家标准协会 (ANSI) 格式化为管道或文件。  /u  将内部命令输出作为 Unicode 格式化为管道或文件。  /t:FG  设置前景 F 色和背景 G 色。下表列出了可用作 F 和 G 值的有效的十六进制数字。 值 颜色  0 黑色  1 蓝色  2 绿色  3 浅绿色  4 红色  5 紫色  6 黄色  7 白色  8 灰色  9 淡蓝色  A 淡绿色  B 淡浅绿色  C 淡红色  D 淡紫色  E 淡黄色  F 亮白色   /e:on  启用命令扩展。  /e:off  禁用命令扩展。  /f:on  启用文件和目录名自动完成。  /f:off  禁用文件和目录名自动完成。  /v:on  启用延迟的环境变量扩展。  /v:off  禁用延迟的环境变量扩展。  String  指定要执行的命令。  /?  在命令提示符下显示帮助。  注释 使用多个命令  可以在 String 中使用由命令分隔符 && 分隔的多个命令，但这些命令必须用引号括起来（例如，"Command&&Command&&Command"）。  处理引号  如果指定了 /c 或 /k，cmd 会处理 String 中的其余命令，并且只有在满足下述所有条件的情况下，才保留引号：  未使用 /s。  准确使用了一对引号。  在引号内未使用任何特殊字符（例如：&<>( ) @ ^ |）。  在引号内使用了一个或多个空白字符。  引号内的 String 为可执行文件的名称。  如果上述条件不能满足，则处理 String 时将首先检查它的第一个字符以验证其是否为左引号。如果第一个字符是左引号，则它会与右引号分离开。跟在右引号之后的任何文本都会得到保留。  执行注册表子项  如果在 String 中未指定 /d，则 Cmd.exe 会查找以下注册表子项：  HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun\REG_SZ   HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun \REG_EXPAND_SZ  如果上述的一个注册表子项或两个都存在，则会在执行其他变量之前执行它们。   警告  编辑注册表不当可能会严重损坏您的系统。在更改注册表之前，应备份计算机上任何有价值的数据。  启用和禁用命令扩展  在 Windows XP 中，命令扩展在默认情况下是启用的。对于特定进程，可使用 /e:off 禁用它们。通过设置下述 REG_DWORD 值，可以在计算机上或用户会话中启用或禁用所有 cmd 命令行选项的扩展名：  HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\EnableExtensions\REG_DWORD   HKEY_CURRENT_USER\Software\Microsoft\Command Processor\EnableExtensions\REG_DWORD   在注册表中使用 Regedit.exe 可以将 REG_DWORD 值设为 0×1（即启用）或 0×0（即禁用）。用户特定设置优先于计算机设置，并且命令行选项优先于注册表设置。   警告  编辑注册表不当可能会严重损坏您的系统。在更改注册表之前，应备份计算机上任何有价值的数据。  启用命令扩展后，会影响到下述命令：   assoc  call  chdir (cd)  color  del (erase)  endlocal  for  ftype  goto  if  mkdir (md)  popd  prompt  pushd  set  setlocal  shift  start（还包括将更改外部命令过程）   有关这些命令的详细信息，请参阅“相关主题”。  启用延迟的环境变量扩展  启用延迟的环境变量扩展，可以使用感叹号字符来替代运行时的环境变量值。  启用文件和目录名自动完成  默认情况下，禁用文件和目录名自动完成。对于特定的 cmd 命令处理，可以通过 /f:{on|off来启用或禁用文件名自动完成。通过设置下述 REG_DWORD 值，可以在计算机上或用户登录会话中启用或禁用所有 cmd 命令处理的文件和目录名自动完成：  HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\CompletionChar\REG_DWORD   HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\PathCompletionChar\REG_DWORD   HKEY_CURRENT_USER\Software\Microsoft\Command Processor\CompletionChar\REG_DWORD   HKEY_CURRENT_USER\Software\Microsoft\Command Processor\PathCompletionChar\REG_DWORD   要设置 REG_DWORD 值，请运行 Regedit.exe 并使用特定功能的控制字符的十六进制值（例如，用 0×9 表示 Tab，用 0×08 表示 Backspace）。用户特定设置优先于计算机设置，并且命令行选项优先于注册表设置。   警告  编辑注册表不当可能会严重损坏您的系统。在更改注册表之前，应备份计算机上任何有价值的数据。  如果使用 /f:on 启用了文件和目录名自动完成，则对于目录名自动完成，可使用 Ctrl+D；而对于文件名自动完成，可使用 Ctrl+F。要禁用注册表中特定字符的自动完成，请使用空格值 [0×20]，因为空格不是有效的控制字符。  按 Ctrl+D 或 Ctrl+F 时，cmd 会处理文件和目录名的自动完成操作。这些组合键的作用是在 String 后附加通配符（如果还未使用），并创建匹配的路径列表，然后显示第一个匹配的路径。如果所有路径都不匹配，文件和目录名自动完成操作会发出警告声，并且不更改所显示的内容。要逐个查看匹配路径列表中的路径，请重复按 Ctrl+D 或 Ctrl+F。要向后查看该列表，请在按 Shift 的同时按 Ctrl+D 或 Ctrl+F。要放弃已保存的匹配路径列表并生成新列表，可以编辑 String，然后按 Ctrl+D 或 Ctrl+F。如果在 Ctrl+D 和 Ctrl+F 之间切换，将会放弃已保存的匹配路径列表并生成新列表。Ctrl+D 组合键与 Ctrl+F 组合键之间唯一的不同在于，Ctrl+D 仅匹配目录名，而 Ctrl+F 既匹配文件名，又匹配目录名。如果在任何内部目录命令（CD、MD 或 RD）中使用文件和目录名的自动完成，将仅使用目录的自动完成。  如果将匹配路径置于引号之中，则文件和目录名自动完成会正确地处理含有空格或特殊字符的文件名。  下述特殊字符需要有引号：& < > [ ] { } ^ = ; !' + , ` ~ [空白区域]  如果所提供的信息包含空格，请使用引号将内容引起来（例如，"Computer Name"）。  如果从 String 内处理文件和目录名自动完成操作，则将放弃 [Path] 在光标右侧的任何部分（即在 String 中处理自动完成操作的位置）。  格式化图例 格式 含义  斜体 用户必须提供的信息  粗体 用户必须准确键入的要显示的元素  省略号 (...) 在命令行中可多次重复的参数  中括号 ([]) 可选项  大括号 ({})；选项用竖线 (|) 分隔。例如：{even|odd} 用户必须从选项集合中选择一个   Courier 字体 代码或程序输出    相关主题

引用 25 楼 zhao4zhong1 的回复:将1楼的代码放到控制台项目中,设置项目使用多字节字符集,生成对应的test.exe 在你需要去掉in.html中html marker的程序中开头添加#include <windows.h>,用WinExec……语句去掉in.html中html marker  WinExec("cmd /c cd /d E:\\我的VS之路\\正文提取的test\\Debug\\&正文提取的test.exe <www.txt >out.txt",SW_HIDE); 这样子写了之后他会显示 另一个程序正在使用此文件，进程无法访问。  我停了其他程序，也重开电脑，但是都还是这个。。

fscanf(fp,"%c",pBuf); //写文件 rewind(fp); fwrite(pBuf, 1, length, fp);   读一个字符到pBuf中，然后写length  * 1个字节到文件中？ 这是做什么？


Question: 错哪了

c没有初始化，是随机值，那么直接putchar();可能输出随机的字符； 另外，通过putchar(c)也能发现每次输入之后回车都会输出一个空白行，那是因为换行符也赋值给了c。

初始化c 多加一个getchar吸收回车  	char c = '\0'; 	printf("\n Please input a string ended with $:\n"); 	do { 		putchar(c); 		c = getchar(); 		getchar(); 	} while (c != '$');

同上，变量未初始化就使用，危害很大，注意编译告警。

字符要赋初值

char c='k';类似于这种，给c赋一个初值，不然putchar(c);不知道输出什么呀

#include"stdio.h"改为#include<stdio.h>吧

题目要求是什么，我这里把void变成int编译成功后结果是对的感觉


Question: 求助程序停止工作 C语言

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

引用 2 楼 cfjtaishan 的回复:#include<stdio.h> #include<stdlib.h> typedef struct huftree{     int weight;     int Plink,Llink,Rlink; } *HFT,Tnode; typedef struct hufcode{     int star;     int symbol;     int bits[5]; } *HFC,Cnode;  void intilTree(int *w,int n,HFT ht,HFC hc){     int i;     for(i=1;i<n+1;i++){         ht[i].Llink=0;         ht[i].Plink=0;         ht[i].Rlink=0;         ht[i].weight=w[i];      }     for(;i<2*n;i++){         ht[i].Llink=0;         ht[i].Plink=0;         ht[i].Rlink=0;         ht[i].weight=0;     }  }//intil main(){     HFT ht;     HFC hc;     int n;     int *w;     int i=0;     int w0;     int m;     printf("shuru N\n");     scanf("%d",&n);     m=2*n-1;     w=(int*)malloc((n+1)*sizeof(int));     ht=(HFT)malloc((m+1)*sizeof(Tnode));     hc=(HFC)malloc((n+1)*sizeof(Cnode));      for(i=1;i<n+1;i++){         printf("第%d个权值\n",i);         scanf("%d",&w0);         w[i]=w0;     }     intilTree(w,n,ht,hc);     printf("helloworld!\n");     for(i=1;i<=m;i++){         printf("%d   %d   %d  %d\n",ht[i].weight,ht[i].Llink,ht[i].Rlink,ht[i].Plink);     } } 如上的代码； 主要改一下一条代码语句的位置即可。即     scanf("%d",&n);     m=2*n-1; m = 2 * n -1;需要放在scanf之后，不然，n是随机值（可能很大，导致输出时越界，出现楼主的停止运行），那么m = 2 * n -1也会变得很大； 所以，m = 2 * n -1需要放在scanf之后，这样n确定大小了，m的值也会确定大小了。  谢谢谢谢 牛逼牛逼！！！！！！ 找了好久好久   都快崩溃了，原来问题出在这


Question: 为什么这个程序可以在老电脑上运行，但在新的电脑就不行？

感谢分享

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

学习了

具体是什么错？

问题已经找出：getpixel太浪费时间。 我尝试循环二十次（一开始的两个for循环） 并用time去时间，文字台输出结果为：  也就是说，按照屏幕这个配置（1600*900）， 这两个for（第一二个）所循环的时间为： 1600*900/20*483/1000/60/60约为10 也就是这两个循环需要10分钟才可以结束。 这也是为什么程序思路、逻辑，语法都没错 但是却无法在新的电脑运行的原因：getpixel受设备影响。

COLOUR colour[2000][5000];              //为[y][x] 目测这行代码不爽,用new COLOUR[2000][5000] 测试之

/* #include <graphics.h> initgraph 和 putpixel  两个函数 * 这个头文件 和 2个函数，vc编译器不代，应该是网上 从TC下移植过来的，要配置起来才行

求大神帮忙！


Question: 如何整数转为指数形式

2楼那样实现就可以的。

其实就是float和double的存储规则，

1楼的转成ｆｌｏａｔ最佳方案。。。话说ｆｌｏａｔ大概不就是这样存储的吗？

printf 也可以啊

检查前三位是否>255吧，是取两位存第一个字节，不是则存三位。现在指数部分已确定，存第三个字节。小数部分要简单点的话，就像前面取整数一样取两位或三位当整数一样存第二个字节，读取的时候也当整数读取放小数点后面。

大概思路就像2楼所说 先从10开始尝试去除，接着是100……到得数小于255就停止，这时候除数有几个0指数就是多少，整数除的得数就是整数部分 余数重复这个过程，得数就是小数部分

代码就不给你了，有思路应该很好写。 先从10开始尝试去除，接着是100……到得数小于255就停止，这时候除数有几个0指数就是多少，整数除的得数就是整数部分 余数重复这个过程，得数就是小数部分

将u32转成float类型，这是最简单的方法；


Question: warning: assignment from incompatible pointer type的问题

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

有多个问题， 问题1：结构体声明时，名字写错了"struct Lnode"--->"struct lnode"，应该是后者； 问题2：print函数都没有对定义的p指针初始化，而就直接使用p = p->next;很容易导致段错误； 问题3：insert和delete_函数都不能对1位置进行插入和删除；  以下是修改后的代码，参考一下吧：  #include <stdio.h> #include <stdlib.h>  typedef struct lnode{     char  data;     struct lnode *next; }lnode;  //生成单链表create void  creat(lnode *h) {     lnode *t,*p;     char ch;     t = h;     while((ch = getchar())!='\n')     {   //尾插法建立单链表         p = (lnode *)malloc(sizeof(lnode));//生成新结点p。并分配存储空间         p->data=ch;         p->next = NULL;//p的指针域为空         t->next = p; // p的next指向这个结点         t=p;      } } //遍历单链表 void print(lnode *h) {     lnode *p = h->next;     while(p)     {         printf("%c", p->data);   //输出p的数值域         p = p->next;//p指向下一结点         //if(p->data!=' ')         //printf(" ");     } } //求单链表的长度 void length(lnode *h) {     lnode *p = h->next;     int i=0;     while(p)     {         // if(p->data!=' ')         // {         i=i+1;         // }         p=p->next;     }     // i=i-1;     printf(" length: %d\n",i); } //数据插入函数 int insert(lnode *h, char x, int i)//h:单链表的头指针 x:要插入的元素 i:要插入的位置 {     int j;     lnode *p,*s;     p = h;     j=1;     while(p&&j<i)  //找到要插入的位置     {         ++j;         p = p->next;     }     if(i>0&&j==i)     {         s = (lnode*)malloc(sizeof(lnode));         s->data = x;//把x复制给s的数据域         s->next = p->next;//s指向p的下一个结点         p->next = s;//p指向s         return (1);     }     else         return(0); } //删除数据函数 int delete_(lnode *h,int i) {     int j;     lnode *p,*q;     p = h;  //p为首结点     j=1;     while(p&&j<i)     {         ++j;         p=p->next;     }     if(i>0&&j==i)     {         q=p->next;//q指向要删除结点的结点         p->next=q->next;//p的下一个结点位q的下一个结点         free(q);   //释放q的空间         return(1);     }     else         return(0); //失败返回0 } //查找函数 void locate(lnode *h,char x) {     lnode *p;     int idx = 1;     p = h->next;//此时p位首节点     while(p && p->data != x) {         idx++;         p=p->next;//s指向p的下一个结点     }     if(p)     {         printf("seccess!\n");         printf("你想查看的数据位置 : pos: %d, val: %c", idx, p->data);     }     else         printf("无法查看此结点\n"); } //主函数 //void main() int main() {     int i,j,k;     char x,y;     lnode *h;     h=(lnode*)malloc(sizeof(lnode));//建立表头结点     h->next = NULL;     printf("请输入一个单链表:\n");     creat(h);  //建立链表函数     while(1)//功能选择菜单     {         printf("\n");         printf("\n");         printf("+++++++++++++++++++++++");         printf("\n++++1.遍历单链表+++++++");         printf("\n++++2.求单链表的长度+++");         printf("\n++++3.单链表的插入+++++");         printf("\n++++4.单链表的删除+++++");         printf("\n++++5查找数据地址++++++");         printf("\n++++6.退出+++++++++");         printf("\n+++++++++++++++++++++++");         printf("\n");         printf("选择查看1~6: ");         scanf("%d",&i);         if(i<0||i>7)             printf("超出查询范围!\n");         if(i==1)         {             printf("输出单链表:");             print(h);         }         if(i==2)         {             printf("单链表的长度为；");             length(h);             printf("\n");         }         if(i==3)         {             getchar();             printf("输入插入内容");             x=getchar();             printf("\n输入插入数据位置；");             scanf("%d",&j);             insert(h,x,j);         }         if(i==4) //删除函数         {             printf("输入删除位置");             scanf("%d",&k);             delete_(h,k);         }         if(i==5)         {             getchar();             printf("输入所需要查找的数据");             y=getchar();             locate(h,y);         }         if(i==6) break;     }     printf(" \n ...");     //getch(); }  代码的风格建议注意下，可以参考以下比如华为的编码风格，或者Linux内核的风格等等； 注释不需要太多，没必要的注释尽量不要加；函数名如果能定义成见名知意最好；

都是这个警告 warning: assignment from incompatible pointer type 哪位大神能解答下谢谢


Question: 数据结构中的typedef问题

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

楼上的高手永远这么犀利。

实际定义了两个，一个是把struct LNode别名为LNode，另一个是把struct LNode*别名为LinkList，也就是说LinkList表示指针struct LNode*

引用 2 楼 zihui0459 的回复:引用 1 楼 hefashion0190 的回复:LinkList代表struct LNode*也就是相当于LNode*这个吧？为什么要改成这样呢？还有把struct LNode 改成LNode不就相当于没改吗?  c语言中，如果没有使用typedef新定义一个类型的话，需要使用struct LNode和struct LNode*，而此时直接使用LNode和LNode *会语法报错。 C++中struct与class关键字一样定义一个类，只不过struct默认访问属性为public，class访问属性为private

因为本来就是要讲链表。而简单的链表数据结构和Node没有什么区别。所以直接用typedef来重命名，这主要是让语义更清晰。

LNode 是  struct LNode LinkList 是 struct LNode * LinkList  是为了方便创建结构体指针，你也可以用LNode来创建指针  引用 5 楼 zihui0459 的回复:[quote=引用 4 楼 destory27 的回复:]   LNode 是  struct LNode？ LinkList 是 struct LNode * LinkList  是为了方便创建结构体指针，你也可以用LNode来创建指针用LNode创建结点，LNode*创建结点指针也是没问题的吧？[/quote]  没问题，又是必须写指针为了做复合结构，面试题常见。例子不记得了

引用 4 楼 destory27 的回复:LNode 是  struct LNode？ LinkList 是 struct LNode * LinkList  是为了方便创建结构体指针，你也可以用LNode来创建指针用LNode创建结点，LNode*创建结点指针也是没问题的吧？

LNode是struct LNode的别名； 同理：LinkList是struct LNode *的别名； 别名，就是用别名就是用struct LNode或struct LNode *

LinkList代表struct LNode*