Question: 实例句柄真的有用吗？

引用 11 楼 幻夢之葉 的回复:Type: HINSTANCE  A handle to the instance of the module to be associated with the window.  lpParam [in, optional] Type: LPVOID  A pointer to a value to be passed to the window through the CREATESTRUCT structure (lpCreateParams member) pointed to by the lParam param of the WM_CREATE message. This message is sent to the created window by this function before it returns.  If an application calls CreateWindow to create a MDI client window, lpParam should point to a CLIENTCREATESTRUCT structure. If an MDI client window calls CreateWindow to create an MDI child window, lpParam should point to a MDICREATESTRUCT structure. lpParam may be NULL if no additional data is needed. 还是懵逼呀，不知道这段讲的什么，是说实例句柄这个参数会作为一个结构体的成员传值到lParam？

刚查了以下MSND 不知道什么时候开始，CreateWindow(Ex)的 hInstance 参数已经变成可选的了。 NT/2000/XP以上被忽略 HWND WINAPI CreateWindow(   _In_opt_ LPCTSTR   lpClassName,   _In_opt_ LPCTSTR   lpWindowName,   _In_     DWORD     dwStyle,   _In_     int       x,   _In_     int       y,   _In_     int       nWidth,   _In_     int       nHeight,   _In_opt_ HWND      hWndParent,   _In_opt_ HMENU     hMenu,   _In_opt_ HINSTANCE hInstance,   _In_opt_ LPVOID    lpParam ); HWND WINAPI CreateWindowEx(   _In_     DWORD     dwExStyle,   _In_opt_ LPCTSTR   lpClassName,   _In_opt_ LPCTSTR   lpWindowName,   _In_     DWORD     dwStyle,   _In_     int       x,   _In_     int       y,   _In_     int       nWidth,   _In_     int       nHeight,   _In_opt_ HWND      hWndParent,   _In_opt_ HMENU     hMenu,   _In_opt_ HINSTANCE hInstance,   _In_opt_ LPVOID    lpParam );

类似访问资源的api需要用到实例句柄，比如dll里面调用FindResource，就必须用dll的句柄，不能像exe一样直接用null

引用 7 楼 Intel0011 的回复:这里的属于是归属于，是指注册在谁的名下，你的程序创建了窗口并且有消息循环当然可以收消息 就比如系统的edit控件是注册在系统名下的，你的程序创建了输入框edit照样可以收到消息 有几个问题，控件类之所以我们注册在其他地方而我们能用是因为它是全局的吧，我们注册的类不是全局的，如果注册在别的实例的名下，理应是不能用的呀。 还有就是，创建窗口也有指定实例句柄，不可能创建在别的实例的名下我们的实例也能接收到它的消息？ 最后一点就是，请问“参数可选”你是怎么看出来的？我看的上面只有说“要与窗口关联的模块实例的句柄”这么一句。

如果属于桌面，那么我这个线程就理应接收不到这个窗口的消息了呀，但实测能接收到

如果设为NULL，表示窗口和窗口类属于桌面，不是属于你创建的实例程序

引用 3 楼 耕者走兔 的回复:这里的 NULL 指的是默认句柄。默认和没有是两回事。 你确定吗？MSDN对于这两个函数的实例句柄一点没有这个说明呀。

这里的 NULL 指的是默认句柄。默认和没有是两回事。

引用 1 楼 幻夢之葉 的回复:你怎么设为NULL的？ 句柄应该是操作系统内核返回的，不能用户指定吧？如果能指定，只能指定窗口的父句柄，或者它使用到的资源的句柄（其他对象的） CreateWindow创建窗口、RegisterClass注册窗口类，这些不都要指定实例句柄吗？


Question: c语言编程

能打开本来就不一定能编译

如果vc6不行的话 可以试一下 DEV C++

不能编译是怎么提示的呢


Question: gw大神，能不能抽空替我看下这个求圆周率的c程序。为啥能编译跑不起来

我跑了一下你的代码，基本上没有问题呀，不过要输入0.0000005才能得到正确答案，这个题目好像有一丢丢问题

输入了啊 ，哪位大牛能带入下看看啊

对了，sum 最后还应该乘以一个2。 那个公式算的是  x/2 的值。

没看出啥问题。 输入  0.00005 了吗？


Question: C语言小白   想请教一下这个代码为什么插入节点后没有输出！谢谢了

可能return false了。另外，建议贴出代码，而不是贴图片

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


Question: 为什么r是8

引用 37 楼 mikal0571 的回复:引用 19 楼 自信男孩 的回复：跟参数入栈的顺序有关的，从结果来看，是从右向左入栈，因此传入的值是(8, 8);所以最终的结果r是16.对头，这才是最佳答案，很多人不知道。c99要求，运算是从右往左的、是运算，不是传参数！传参数不同CPU可能不一样，参数少，寄存器传，参数多堆栈传。 你这说法就有点问题了，你要入栈，就必须把参数的值运算出来，说白了，运算和入栈顺序是一样的

这帖子还没结呢啊

关于这个问题，我认为应该是未定义行为，代码没有任何意义

先算括号参数的内容 x,x+=2 x为8 func(8,8) 并不是他们说的参数从左往右计算 func(x += 2, x)还是16

从来不看这样的东西、问就是垃圾代码、永远不要写！

x += 2 不是1么

我补充一点，每一个语言的传参约定不一样，因为C语言支持参数变长，所以需要从右往左。Pascal因为不支持，所以需要从左往右。

这个函数传参顺序是从右到左，相当于你已经把x赋了8这个值，c=8+8

r应该等于16吧

爬楼学习了半天，到底参数是不是从右向左啊

引用 30 楼 qq_20679361 的回复:参数传值是从右向左传的。和传值没关系

参数传值是从右向左传的。

EFS

解释执行的C系统么？建议多多参加“confusingly C”学习。

x 等于8  然后8+8等于16

func(funcA(), funcB()) 不能假定funcA先执行或者funcB先执行，结果是未定义的 有的编译器答案是16，有的编译器答案是14，所以结果没有意义

引用 1 楼 qq_44933110的回复:[quote=引用 楼主 qq_44933110的回复:]#include<stdio.h> int func(int a, int b) { 	int c; 	c = a + b; 	return c; } void  main() { 	int x = 6, r; 	r = func(x, x += 2); 	printf("%d   %d\n", x, r); 	system("pause"); } 说错了，为什么r是16[/quote] 目测x += 2直接给x赋值8了，再到形参引用的的时候已经都是8了


Question: 大佬们教一下

啧啧，这种题目 你要区分：int  a[]={1,2,3,4}; 他考的是逗号运算符 你看看这个：printf("%d", (1,2,3,4,5)); 输出的结果是5，意思就是说，逗号运算符的运算结果是选择右边的值，所以“1,2”选择了2，然后“2,3”选择了3，以此类推，整个运算的结果就是最右边的值了，也就是5 而由于逗号运算符的优先级最低，所以它才能当做分隔用，而不是分隔就是它的功能 再看int a[1,2,3,4] 括号中就是个逗号运算，运算的结果是4，所以相当于int  a[4]，所以选A

～ int a[1,2,3,4]; 是什么鬼？ 错误定义！题目本身有问题。


Question: 求大佬帮忙，我用的2017

引用 8 楼 neu_ZZM的回复:[quote=引用 7 楼 qq_44933110 的回复:] [quote=引用 5 楼 neu_ZZM的回复:]把这个帖子结了呗，也算一点回报了 大佬，我晚上回宿舍用电脑进去看看，谢谢您[/quote] 额，就在这也右上角就有个“结贴”啊，点那个就行了[/quote] 结了，您看下，谢谢你，大一学生党，用的手机app，不能结帖，现在回宿舍结了贴，您看下，真的非常感谢

引用 7 楼 qq_44933110 的回复:[quote=引用 5 楼 neu_ZZM的回复:]把这个帖子结了呗，也算一点回报了 大佬，我晚上回宿舍用电脑进去看看，谢谢您[/quote] 额，就在这也右上角就有个“结贴”啊，点那个就行了

引用 5 楼 neu_ZZM的回复:把这个帖子结了呗，也算一点回报了 大佬，我晚上回宿舍用电脑进去看看，谢谢您

引用 5 楼 neu_ZZM的回复:把这个帖子结了呗，也算一点回报了 我在网上搜了怎么给分，可是完全找不到

把这个帖子结了呗，也算一点回报了

引用 3 楼 neu_ZZM的回复: #include<stdio.h> #include<stdlib.h> #include<time.h> void sortchoose(int (*a)[10]) {     int i,j;     int min,num,temp;     for(i=0;i<100;i++)     {         min=2147483647;         num=i;         for(j=i;j<100;j++)         {             if(a[j/10][j%10]<min)             {                 min=a[j/10][j%10];                 num=j;             }         }         temp=a[i/10][i%10];         a[i/10][i%10]=a[num/10][num%10];         a[num/10][num%10]=temp;     }     for(i=0;i<10;i++)     {         for(j=0;j<10;j++)             printf("%d ",a[i][j]);         printf("\n");     } }  void sortpao(int (*a)[10]) {     int i,j;     int temp;     for(i=0;i<99;i++)         for(j=0;j<99-i;j++)             if(a[j/10][j%10]>a[(j+1)/10][(j+1)%10])             {                 temp=a[j/10][j%10];                 a[j/10][j%10]=a[(j+1)/10][(j+1)%10];                 a[(j+1)/10][(j+1)%10]=temp;             }     for(i=0;i<10;i++)     {         for(j=0;j<10;j++)             printf("%d ",a[i][j]);         printf("\n");     } }  void sortinsert(int (*a)[10]) {     int i,j,k,l,m,n;     int b[10][10];     b[0][0]=a[0][0];     for(i=0;i<10;i++)         for(j=0;j<10;j++)         {             if(i==0&&j==0)                 continue;             for(k=0;k<10*i+j;k++)             {                 if(a[i][j]<b[k/10][k%10])                 {                     for(l=10*i+j;l>k;l--)                         b[l/10][l%10]=b[(l-1)/10][(l-1)%10];                     b[k/10][k%10]=a[i][j];                     break;                 }             }             if(k==10*i+j)             {                 b[k/10][k%10]=a[i][j];             }         }     for(m=0;m<10;m++)     {         for(n=0;n<10;n++)             printf("%d ",b[m][n]);         printf("\n");     } }  void search(int (*a)[10],int num) {     int i,j;     for(i=0;i<10;i++)     {         for(j=0;j<10;j++)             if(a[i][j]==num)             {                 printf("%d %d\n",i,j);                 break;             }         if(j<10)             break;     }     if(i==10)         printf("无此数"); }  void binary(int (*a)[10]) {     int i,j,p;     long long int num;     long long int b[10][10];     for(i=0;i<10;i++)     {         for(j=0;j<10;j++)             printf("%d ",a[i][j]);         printf("\n");     }     printf("\n");     for(i=0;i<10;i++)         for(j=0;j<10;j++)         {             num=0;             p=1;             while(1)             {                 num+=(a[i][j]%2)*p;                 a[i][j]/=2;                 p*=10;                 if(a[i][j]<2)                 {                     num+=a[i][j]*p;                     break;                 }             }             b[i][j]=num;         }      for(i=0;i<10;i++)     {         for(j=0;j<10;j++)             printf("%lld ",b[i][j]);         printf("\n");     } }  int issushu(int n) {     int i;     if(n==1)         return 0;     else if(n==2)         return 1;     else     {         for(i=2;i<n;i++)             if(n%2==0)                 return 0;         if(i==n)             return 1;     } }  void isorno(int (*a)[10]) {     int i,j,k;     for(i=0;i<10;i++)     {         for(j=0;j<10;j++)         {             if(a[i][j]%2==0)             {                 for(k=2;k<a[i][j];k++)                 {                     if(issushu(k)&&issushu(a[i][j]-k))                     {                         printf("%d=%d+%d\n",a[i][j],k,a[i][j]-k);                         break;                     }                 }             }         }     } }  void insert(int (*a)[10],int n) {     int i,j,k,l;     for(i=0;i<10;i++)     {         for(j=0;j<10;j++)         {             if(n<a[i][j])             {                 for(k=9;k>=i;k--)                     for(l=9;l>j;l--)                         a[k][l]=a[k][l-1];                 a[k][l]=n;                 break;             }         }         if(j<10)             break;     }     if(i==10&&j==10)         a[9][9]=n;      for(i=0;i<10;i++)     {         for(j=0;j<10;j++)             printf("%d ",a[i][j]);         printf("\n");     } }  void delet(int (*a)[10],int n) {     int i,j,k,l;     for(i=0;i<10;i++)     {         for(j=0;j<10;j++)         {             if(n==a[i][j])             {                 for(k=i;k<10;k++)                     for(l=j;l<10;l++)                         if(k==9&&l==9)                             break;                         else                             a[k][l]=a[k][l+1];                 break;             }         }         if(j<10)             break;     }     if(i==10&&j==10)         for(i=0;i<10;i++)         {             for(j=0;j<10;j++)                 printf("%d ",a[i][j]);             printf("\n");         }     else         for(i=0;i<10;i++)         {             for(j=0;j<10;j++)                 if(i==9&&j==9)                     continue;                 else                     printf("%d ",a[i][j]);             printf("\n");         } } int main() {     int a[11][10];     int i,j;     srand((unsigned)time(NULL));     for(i=0;i<10;i++)         for(j=0;j<10;j++)             a[i][j]=rand()/100;     sortchoose(a);     sortpao(a);     sortinsert(a);     search(a,a[3][6]+1);     binary(a);     isorno(a);     insert(a,666);     delet(a,a[9][9]);     return 0; }  每个功能一个函数，真鸡儿花时间 大佬多谢，真的谢谢你

引用 1 楼 user-2的回复:请问作者写出来了吗 不会，一点不懂，所以书大佬帮忙

请问作者写出来了吗


Question: 求助

引用 21 楼 amotym 的回复:只用gcc，昨晚发现（：ins后多了一个空格  改正后现在是这个情况  有进展就好，接着调试吧！ 用什么文本编辑器写代码的呢？难道是  vim ？ ～

按照固定格式去解析，按行去判断，找到开始和结尾就行了，考虑好怎么存就行了

引用 19 楼 拥抱Linux 的回复:[quote=引用 18 楼 amotym 的回复:] 完了，估计我的系统是假的 那不知道，俺代码里的xml文件的名字，俺顺手给改成了01.xml，你看看你的实际的xml文件的名字是啥？ 还是先把代码通读一遍吧，然后调试。你用什么IDE么？还是只用gcc和gdb？[/quote]  只用gcc，昨晚发现（：ins后多了一个空格  改正后现在是这个情况

还有一个也忘了说了，你上面发的xml文件的内容，「(:ins」这一行的末尾有一个空格，但是代码里面的检查字符串是没有空格的，空格也是一个字符哦，你把xml文件里「(:ins」这一行的末尾的多余的空格删掉，再运行程序。 嗯，细节～

引用 18 楼 amotym 的回复:完了，估计我的系统是假的 那不知道，俺代码里的xml文件的名字，俺顺手给改成了01.xml，你看看你的实际的xml文件的名字是啥？ 还是先把代码通读一遍吧，然后调试。你用什么IDE么？还是只用gcc和gdb？

引用 17 楼 拥抱Linux 的回复:[quote=引用 16 楼 amotym 的回复:] 改完后依然使段错误（核心已转储） 上面最后提到的输出的循环，第一层的结束条件也改了一下， 从  i < first + 1 ; 改成了 i < first ; 忘了说了，但是上面的代码是看得到的。 还有段错误（核心已转储）的话，就把 数组长度再改小一点， 够用就行了。 俺这边运行没问题：  #include <stdio.h> #include <stdlib.h> #include <string.h>  int main(int argc, char const *argv[]) { 	FILE *fp; 	fp = fopen("01.xml", "r"); 	if (NULL == fp) { 		printf("Error! File open #1 failed!\n"); 		exit(EXIT_FAILURE); 	}  	/*遍历01.xml，得到所需数据的行数，即字符数组数*/ 	char instr_start[20] = "(:ins"; 	char instr_end[20] = ")"; 	char line_check[200]; 	char chuan[20][200]; 	int len, i, j; 	static int first = 0; 	// 按行来读取，需要额外添加一行来读取行尾换行符 	fscanf(fp, "%[^\n]", line_check); 	fgetc(fp);  	while (0 != strcmp(instr_start, line_check) && !feof(fp)) { 		fscanf(fp, "%[^\n]", line_check); 		fgetc(fp); 	} 	//int parenthesis_count = 0; 	fscanf(fp, "%[^\n]", line_check); 	fgetc(fp); 	while (0 != strcmp(instr_end, line_check)) { 		//char chuan[10][200]; 		//fscanf(fp, "%[^\n]", line_check); 		//fgetc(fp); 		//int len,i,j; 		//static int first=0; 		len = strlen(line_check); 		for (i = 0; i < len; i++) { 			chuan[first][i] = line_check[i]; 		} 		first++; 		fscanf(fp, "%[^\n]", line_check); 		fgetc(fp); 	} 	fclose(fp); 	for (i = 0; i < first; i++) { 		for (j = 0; chuan[i][j] != '\0'; j++) { 			printf("%c", chuan[i][j]); 		} 		printf("\n"); 	} 	return 0; }  ～[/quote]  完了，估计我的系统是假的

引用 16 楼 amotym 的回复:改完后依然使段错误（核心已转储） 上面最后提到的输出的循环，第一层的结束条件也改了一下， 从  i < first + 1 ; 改成了 i < first ; 忘了说了，但是上面的代码是看得到的。 还有段错误（核心已转储）的话，就把 数组长度再改小一点， 够用就行了。 俺这边运行没问题：  #include <stdio.h> #include <stdlib.h> #include <string.h>  int main(int argc, char const *argv[]) { 	FILE *fp; 	fp = fopen("01.xml", "r"); 	if (NULL == fp) { 		printf("Error! File open #1 failed!\n"); 		exit(EXIT_FAILURE); 	}  	/*遍历01.xml，得到所需数据的行数，即字符数组数*/ 	char instr_start[20] = "(:ins"; 	char instr_end[20] = ")"; 	char line_check[200]; 	char chuan[20][200]; 	int len, i, j; 	static int first = 0; 	// 按行来读取，需要额外添加一行来读取行尾换行符 	fscanf(fp, "%[^\n]", line_check); 	fgetc(fp);  	while (0 != strcmp(instr_start, line_check) && !feof(fp)) { 		fscanf(fp, "%[^\n]", line_check); 		fgetc(fp); 	} 	//int parenthesis_count = 0; 	fscanf(fp, "%[^\n]", line_check); 	fgetc(fp); 	while (0 != strcmp(instr_end, line_check)) { 		//char chuan[10][200]; 		//fscanf(fp, "%[^\n]", line_check); 		//fgetc(fp); 		//int len,i,j; 		//static int first=0; 		len = strlen(line_check); 		for (i = 0; i < len; i++) { 			chuan[first][i] = line_check[i]; 		} 		first++; 		fscanf(fp, "%[^\n]", line_check); 		fgetc(fp); 	} 	fclose(fp); 	for (i = 0; i < first; i++) { 		for (j = 0; chuan[i][j] != '\0'; j++) { 			printf("%c", chuan[i][j]); 		} 		printf("\n"); 	} 	return 0; }  ～

引用 15 楼 拥抱Linux 的回复:[quote=引用 14 楼 amotym 的回复:]  （～略～） 数组 line_check[100000] 和 chuan[20][20000]  的大小太大了， 超出了编译器允许分配给数组的内存空间的大小了，也就是说 这两个数组的定义是无效的，所以后面输出的时候会出现段错误。 原因：数组的内存空间是编译器自动分配在栈上面的，栈的空间是很小的，希望分配的内存空间超过了栈的大小的话，就会分配失败。 对应办法：（1）简单的，把数组长度定义小一点，根据你xml文件里每行的字符长度，定义个200、500啥的也绰绰有余了。（2）通用的，动态申请内存。 具体代码：按简单的办法，更改数组的长度为          char line_check[200]; 	char chuan[20][200];  另外，while (0 != strcmp(instr_end, line_check)) {下面的有两句语句多余了，注释掉，即  	while (0 != strcmp(instr_end, line_check)) { 		//char chuan[10][200]; 		//fscanf(fp, "%[^\n]", line_check); 		//fgetc(fp); 		//int len,i,j; 		//static int first=0; 		len = strlen(line_check); 		for (i = 0; i < len; i++) { 			chuan[first][i] = line_check[i]; 		} 		first++; 		fscanf(fp, "%[^\n]", line_check); 		fgetc(fp); 	}  输出的循环，第2层循环的结束条件修改一下：  	for (i = 0; i < first; i++) { 		for (j = 0; chuan[i][j] != '\0'; j++) { 			printf("%c", chuan[i][j]); 		} 		printf("\n"); 	}  ～[/quote]   改完后依然使段错误（核心已转储）

引用 14 楼 amotym 的回复:（～略～） 数组 line_check[100000] 和 chuan[20][20000]  的大小太大了， 超出了编译器允许分配给数组的内存空间的大小了，也就是说 这两个数组的定义是无效的，所以后面输出的时候会出现段错误。 原因：数组的内存空间是编译器自动分配在栈上面的，栈的空间是很小的，希望分配的内存空间超过了栈的大小的话，就会分配失败。 对应办法：（1）简单的，把数组长度定义小一点，根据你xml文件里每行的字符长度，定义个200、500啥的也绰绰有余了。（2）通用的，动态申请内存。 具体代码：按简单的办法，更改数组的长度为          char line_check[200]; 	char chuan[20][200];  另外，while (0 != strcmp(instr_end, line_check)) {下面的有两句语句多余了，注释掉，即  	while (0 != strcmp(instr_end, line_check)) { 		//char chuan[10][200]; 		//fscanf(fp, "%[^\n]", line_check); 		//fgetc(fp); 		//int len,i,j; 		//static int first=0; 		len = strlen(line_check); 		for (i = 0; i < len; i++) { 			chuan[first][i] = line_check[i]; 		} 		first++; 		fscanf(fp, "%[^\n]", line_check); 		fgetc(fp); 	}  输出的循环，第2层循环的结束条件修改一下：  	for (i = 0; i < first; i++) { 		for (j = 0; chuan[i][j] != '\0'; j++) { 			printf("%c", chuan[i][j]); 		} 		printf("\n"); 	}  ～

引用 13 楼 拥抱Linux 的回复:[quote=引用 12 楼 amotym 的回复:] 每一行的符号中间字母不一样，设置循环全部判断一遍吗 字母在ASCII码表中是连续分布的呀，检查字符的ASCII码值是不是位于字母表的首尾字母的ASCII码值之间就可以判断字符是不是字母之一了呀。[/quote]  现在我改用存入（：ins到<instr>前的）中的内容存入数组，现在可以通过编译但是溢出？不知道是什么原因 #include <stdio.h> #include <stdlib.h> #include <string.h>  int main(int argc, char const *argv[]) {     FILE *fp;     fp = fopen("test.xml", "r");     if (NULL == fp) {         printf("Error! File open #1 failed!\n");         exit(EXIT_FAILURE);     }      /*遍历01.xml，得到所需数据的行数，即字符数组数*/     char instr_start[20] = "(:ins";     char instr_end[20] = ")";     char line_check[100000];  char chuan[20][20000]; int len,i,j; 	static int first=0;     // 按行来读取，需要额外添加一行来读取行尾换行符     fscanf(fp, "%[^\n]", line_check);     fgetc(fp);      while (0 != strcmp(instr_start, line_check) && !feof(fp)) {         fscanf(fp, "%[^\n]", line_check);         fgetc(fp);     }     int parenthesis_count = 0;     fscanf(fp, "%[^\n]", line_check);     fgetc(fp);     while (0 != strcmp(instr_end, line_check)) { 	//char chuan[10][200]; 	fscanf(fp,"%[^\n]",line_check); 	fgetc(fp); 	//int len,i,j; 	//static int first=0; 	len=strlen(line_check); 	for(i=0;i<len;i++) 	{ 		chuan[first][i]=line_check[i]; 	} 	first++; 	fscanf(fp, "%[^\n]", line_check);         fgetc(fp);        }         fclose(fp); 	for(i=0;i<first+1;i++){ 		for(j=0;j<200;j++) 		{ 			printf("%c",chuan[i][j]); 		} 	printf("\n"); 	} return 0; 	}

引用 12 楼 amotym 的回复:每一行的符号中间字母不一样，设置循环全部判断一遍吗 字母在ASCII码表中是连续分布的呀，检查字符的ASCII码值是不是位于字母表的首尾字母的ASCII码值之间就可以判断字符是不是字母之一了呀。

引用 11 楼 拥抱Linux的回复:[quote=引用 10 楼 amotym 的回复:] instr中的内容，循环读取存入的时候，有tab键和（：的符号，不太好设置循环开始和结束的字符 找到特征就好了吧。 看你的说法，似乎应该是存入 符号中间的 字母， 那只要设置检测条件是 符号中间的 字母 就可以了吧。[/quote] 每一行的符号中间字母不一样，设置循环全部判断一遍吗

引用 10 楼 amotym 的回复:instr中的内容，循环读取存入的时候，有tab键和（：的符号，不太好设置循环开始和结束的字符 找到特征就好了吧。 看你的说法，似乎应该是存入 符号中间的 字母， 那只要设置检测条件是 符号中间的 字母 就可以了吧。

引用 6 楼 拥抱Linux的回复:[quote=引用 5 楼 amotym 的回复:] [quote=引用 3 楼 拥抱Linux的回复:]俺又来了。：） 楼主前面的那个提问帖和这个是大同小异吧，稍微改改应该就可以用了的。 直接按行读取文件中需要的内容，存入字符数组即可。 要求查询的话，考虑简单一点，就写个小函数，对所有字符数组从头到尾遍历一下，有一样的单词就返回或者打印出单词所在数组的下标（行、列）就可以了呀。 ～ 在＜instr＞和＜/instr＞中的内容要实现和＜info＞中的匹配，像（sort x remotecontrol）中的x进行和＜info＞中的sort 16 remotecontrol相匹配，x为16[/quote] 你还是先尝试写写吧，遇到了具体的问题再提上来大伙儿帮你分析、解决。 ～[/quote] instr中的内容，循环读取存入的时候，有tab键和（：的符号，不太好设置循环开始和结束的字符

引用 7 楼 amotym的回复:[quote=引用 6 楼 拥抱Linux的回复:][quote=引用 5 楼 amotym 的回复:] [quote=引用 3 楼 拥抱Linux的回复:]俺又来了。：） 楼主前面的那个提问帖和这个是大同小异吧，稍微改改应该就可以用了的。 直接按行读取文件中需要的内容，存入字符数组即可。 要求查询的话，考虑简单一点，就写个小函数，对所有字符数组从头到尾遍历一下，有一样的单词就返回或者打印出单词所在数组的下标（行、列）就可以了呀。 ～ 在＜instr＞和＜/instr＞中的内容要实现和＜info＞中的匹配，像（sort x remotecontrol）中的x进行和＜info＞中的sort 16 remotecontrol相匹配，x为16[/quote] 你还是先尝试写写吧，遇到了具体的问题再提上来大伙儿帮你分析、解决。 ～[/quote] 在＜instr＞中的内容存入数组并查找后怎么将关键字的内容与另一个数组中的＜info＞内容依次进行匹配呀[/quote] 不行啊，存入循环的时候＜instr＞和＜/instr＞之间的内容开始有一个tab的位置

引用 7 楼 amotym 的回复:[quote=引用 6 楼 拥抱Linux的回复:][quote=引用 5 楼 amotym 的回复:] [quote=引用 3 楼 拥抱Linux的回复:]俺又来了。：） 楼主前面的那个提问帖和这个是大同小异吧，稍微改改应该就可以用了的。 直接按行读取文件中需要的内容，存入字符数组即可。 要求查询的话，考虑简单一点，就写个小函数，对所有字符数组从头到尾遍历一下，有一样的单词就返回或者打印出单词所在数组的下标（行、列）就可以了呀。 ～ 在＜instr＞和＜/instr＞中的内容要实现和＜info＞中的匹配，像（sort x remotecontrol）中的x进行和＜info＞中的sort 16 remotecontrol相匹配，x为16[/quote] 你还是先尝试写写吧，遇到了具体的问题再提上来大伙儿帮你分析、解决。 ～[/quote] 在＜instr＞中的内容存入数组并查找后怎么将关键字的内容与另一个数组中的＜info＞内容依次进行匹配呀[/quote] 查找，存储另一个的数组地址，建立映射关系。

引用 6 楼 拥抱Linux的回复:[quote=引用 5 楼 amotym 的回复:] [quote=引用 3 楼 拥抱Linux的回复:]俺又来了。：） 楼主前面的那个提问帖和这个是大同小异吧，稍微改改应该就可以用了的。 直接按行读取文件中需要的内容，存入字符数组即可。 要求查询的话，考虑简单一点，就写个小函数，对所有字符数组从头到尾遍历一下，有一样的单词就返回或者打印出单词所在数组的下标（行、列）就可以了呀。 ～ 在＜instr＞和＜/instr＞中的内容要实现和＜info＞中的匹配，像（sort x remotecontrol）中的x进行和＜info＞中的sort 16 remotecontrol相匹配，x为16[/quote] 你还是先尝试写写吧，遇到了具体的问题再提上来大伙儿帮你分析、解决。 ～[/quote] 在＜instr＞中的内容存入数组并查找后怎么将关键字的内容与另一个数组中的＜info＞内容依次进行匹配呀

引用 5 楼 amotym 的回复:[quote=引用 3 楼 拥抱Linux的回复:]俺又来了。：） 楼主前面的那个提问帖和这个是大同小异吧，稍微改改应该就可以用了的。 直接按行读取文件中需要的内容，存入字符数组即可。 要求查询的话，考虑简单一点，就写个小函数，对所有字符数组从头到尾遍历一下，有一样的单词就返回或者打印出单词所在数组的下标（行、列）就可以了呀。 ～ 在＜instr＞和＜/instr＞中的内容要实现和＜info＞中的匹配，像（sort x remotecontrol）中的x进行和＜info＞中的sort 16 remotecontrol相匹配，x为16[/quote] 你还是先尝试写写吧，遇到了具体的问题再提上来大伙儿帮你分析、解决。 ～

引用 3 楼 拥抱Linux的回复:俺又来了。：） 楼主前面的那个提问帖和这个是大同小异吧，稍微改改应该就可以用了的。 直接按行读取文件中需要的内容，存入字符数组即可。 要求查询的话，考虑简单一点，就写个小函数，对所有字符数组从头到尾遍历一下，有一样的单词就返回或者打印出单词所在数组的下标（行、列）就可以了呀。 ～ 在＜instr＞和＜/instr＞中的内容要实现和＜info＞中的匹配，像（sort x remotecontrol）中的x进行和＜info＞中的sort 16 remotecontrol相匹配，x为16


Question: 大佬们能帮忙看下是什么问题么

1>  正在对“Debug\city.unsuccessfulbuild”执行 Touch 任务。 1>ClCompile: 1>  main.cpp 1>main.obj : error LNK2019: 无法解析的外部符号 "void __cdecl CreatGraph(struct AdjMGraph *,int * const,int,struct RowColWeight * const,int)" (?CreatGraph@@YAXPAUAdjMGraph@@QAHHQAURowColWeight@@H@Z)，该符号在函数 _main 中被引用 1>G:\city\Debug\city.exe : fatal error LNK1120: 1 个无法解析的外部命令 1> 1>生成失败。


Question: c语音的排序法，升序，降序

这里面有详细讲解哦！ sort函数排序 https://blog.csdn.net/weixin_43956598/article/details/90241551 冒泡排序 https://blog.csdn.net/weixin_43956598/article/details/90176251 选择排序 https://blog.csdn.net/weixin_43956598/article/details/90178197 插入排序 https://blog.csdn.net/weixin_43956598/article/details/90181567 快速排序 https://blog.csdn.net/weixin_43956598/article/details/90215135 希尔排序 https://blog.csdn.net/weixin_43956598/articledetails/90234480 堆排序https://blog.csdn.net/weixin_43956598/article/details/90343547


Question: C选择法排序学习

谢谢😜，还没入门，一个一个来

推荐学习排序算法 sort函数排序 https://blog.csdn.net/weixin_43956598/article/details/90241551 冒泡排序 https://blog.csdn.net/weixin_43956598/article/details/90176251 选择排序 https://blog.csdn.net/weixin_43956598/article/details/90178197 插入排序 https://blog.csdn.net/weixin_43956598/article/details/90181567 快速排序 https://blog.csdn.net/weixin_43956598/article/details/90215135 希尔排序 https://blog.csdn.net/weixin_43956598/articledetails/90234480 堆排序https://blog.csdn.net/weixin_43956598/article/details/90343547


Question: 这是什么问题啊？按照教程来写的代码，老是出现这种问题

你的引号位置错了，应该是 scanf("%d", &i); 第24行printf也写错了

scanf格式不对，引号位置不对，printf写错了，对于初学者基础知识很重要，当然检查错误的能力也很重要，这篇文章对你以后也有好处https://blog.csdn.net/weixin_43956598/article/details/90062550

emmm 认真一点啊 教程可不背这锅

你的引号位置错了，应该是 scanf("%d", &i);


Question: C语言

直接百度有代码

额...老哥问题描述能不能清楚一些


Question: c语言程序设计

先学学排序算法 sort函数排序 https://blog.csdn.net/weixin_43956598/article/details/90241551 冒泡排序 https://blog.csdn.net/weixin_43956598/article/details/90176251 选择排序 https://blog.csdn.net/weixin_43956598/article/details/90178197 插入排序 https://blog.csdn.net/weixin_43956598/article/details/90181567 快速排序 https://blog.csdn.net/weixin_43956598/article/details/90215135 希尔排序 https://blog.csdn.net/weixin_43956598/articledetails/90234480

各种排序算法动画演示http://www.webhek.com/misc/comparison-sort/


Question: 帮我看看哪里写错了谢谢大佬们！！！！

我很久没写C++代码了，不过我觉得，按照你的想法，应该是这么玩的：  #include <iostream>  using namespace std;  int check(char* title, char* name, char* rightMessage, char* errorMessage, char* failedMessage, int target, int limit) {     int i = 0, temp = 0;     cout << title << endl;     while(true)     {         i++;         cout << name;         cin >> temp;         if(temp == target)         {             cout << rightMessage << endl;             return (0);         }         else if (i < limit)         {             cout << errorMessage << endl;         }         else         {             cout << failedMessage <<endl;             return (1);         }     } }  int main() {     const int USER = 201904, PSW = 123456, COUNT = 3;//const常量     if(0 != check("请输入账号", "USER:", "", "账号错误，请重试", "账号错误已满03次", USER, COUNT))     {         return (1);     }     if(0 != check("请输入密码", "PSW:", "", "密码错误，请重试", "密码错误已满03次", PSW, COUNT))     {         return (2);     }     cout << "登陆成功" << endl;     return 0; }

程序基础设计就是错的，哪家的用户登录输入用户名就报错的？都是需要输入用户名和密码后才显示账号或者密码错误

程序问题在于： 1、if和else混乱 2、程序的逻辑有问题，导致程序看起来很混乱，可以看看这篇文章，思维的重要性！！https://blog.csdn.net/weixin_43956598/article/details/90049508 修改后的程序如下，有备注说明的：  #include<iostream> using namespace std; int main() { 	const int USER=201904,PSW=123456;//const常量 	int user,psw,i; 	cout<<"请输入账号"<<endl<<"USER；"; 	cin>>user; 	if(user==USER) 		cout<<"请输入密码"<<endl<<"PSW；"; 	else { 		//while循环是在else的大括号里面的 		i=0;//初始化 		while(i<3) {  //这里i并没有赋值，你这个条件根本就无法成立。 			cout<<"账号错误，请重试"<<endl; 			cout<<"USER:"<<endl; 			cin>>user; 			i++;//统计输入的次数 			if(user==USER) 				break;//跳出循环 		} 		if(i==3) { //当已经输了3次，可以给出正确的账户 			cout<<"登录失败"<<endl; 			return 0;//终止程序  		} 		cout<<"请输入密码:"; 	} 	cin>>psw; 	if(psw==PSW) 		cout<<"登陆成功"<<endl; 	else { 		i=0;//重新初始化 		while(i<3) { 			cout<<"密码错误，请重试"<<endl; 			cout<<"PSW:"<<endl; 			cin>>psw; 			i++; 			if(psw==PSW) 				break;//跳出循环 			 		} 		if(i==3) { 			cout<<"登陆失败"<<endl; 			return 0;//终止程序  		} 		cout<<"登录成功，请稍后。"; 	} 	return 0; }

你这个if-else看的我脑壳疼，还有那个变量i，用来干什么的，也不初始化就拿来用了


Question: 请问下为何输入了数据无法运行出来

我是看到你的名字才进来看看的，结果看到你贴的代码，瞬间就不想看了……

你的程序太多问题了，不知道你写完后有没有认真读过你的程序。有语法问题、逻辑问题。可以看看这几篇文章，对你会有帮助； 程序找错的方法：https://blog.csdn.net/weixin_43956598/article/details/90062550 逻辑思维的重要性！https://blog.csdn.net/weixin_43956598/article/details/90049508 修改后的代码和标注如下，希望你好好自己改改程序：   #include<stdio.h> #define ARR_SIZE 30 int	ReadScore(long num[], float score[]); int	GetFail(long num[], float score[]); int	GetAboveAver(long num[], float score[]); void GetDetail(float score[]); int x,y,n; int main () { //新的C++标准 	long num[ARR_SIZE]; 	float score[ARR_SIZE]; 	n=ReadScore( num, score); 	printf("不及格学生:"); 	x=GetFail( num, score); 	printf("不及格人数为:  %d \n",x); 	printf("及格学生:"); 	y=GetAboveAver( num,  score); 	printf("及格人数为: %d \n",y); 	GetDetail(score); 	return 0; } int	ReadScore(long num[], float score[]) { 	int i; 	n=0; 	i=0;//应该在循环体外吧！不然每次都初始化为0 	do { 		scanf("%ld",&num[i]);//long型的格式控制符为%ld 		scanf("%f",&score[i]);//输入应该有& 		n++; 		i++; 	} while(score[i-1]>0); 	return(n-1);//这里应该是n-1,因为最后一个分数小于0表示结束输入， 	//而此时的n已经加1了，所以需要减1 }  int	GetFail(long num[], float score[]) { 	int i; 	x=0; 	for(i=0; i<n; i++) { 		if(score[i]<60) { //这里有个大括号，因为是当成绩小于60的学生才输出 			x++;		//没有大括号就代表只统计不及格的人数 			printf(" %d ", num[i]); 		} 	} 	printf("\n"); 	return(x); } int	GetAboveAver(long num[], float score[]) { 	int i; 	float t=0;//最好初始化一下 	y=0; 	//这里应该是先把所有学生的总分。 	for(i=0; i<n; i++) { 		t+=score[i]; 	} 	//求平均分 	float ave=t*1.0/n;//注意：程序中的/和数学中的除法不一样，想要得到小数，可以通过乘以1.0的方式 	//依次查找及格的学生，统计人数 	for(i=0; i<n; i++) { 		if(score[i]>=60) {  			y++; 			printf(" %d ", num[i]); 		} 	} 	printf("\n"); 	printf("全班平均分:  %f  ",ave); 	return(y); } void GetDetail(float score[]) { 	int i,a, b; 	float u,v,w; 	u=(float)x/n; 	a=b=0;//初始化一下 	for(i=0; i<n; i++) { 		if(score[i]>=60&&score[i]<80)//这里是&&，表示与，而不是||  			a++; 		if(score[i]>=80&&score[i]<=100) 			b++; 	} 	v=(float)a/n; 	w=(float)b/n; 	printf("不及格学生占百分比: %f \n",u); 	printf("60分到80占百分比: %f \n",v); 	printf("80分以上占百分比: %f  \n",w); }

小错误不少，有一些是scanf函数的参数使用不正确，有一些是代码逻辑问题，还有一些是编程风格方面的问题，比如全局变量和局部变量的名称一样，等等。 就不一一指出来了，你自己一行一行地看吧。   在你的代码基础上修改之后的结果如下，供参考：  #include <stdio.h>  #define ARR_SIZE 30  int ReadScore(long num[], float score[]); int GetFail(long num[], float score[]); int GetAboveAver(long num[], float score[]); void GetDetail(float score[]);  int x, y, n;  int main(void) { 	long num[ARR_SIZE]; 	float score[ARR_SIZE]; 	n = ReadScore(num, score); 	printf("学生总人数为： %d\n", n); 	printf("不及格学生:"); 	x = GetFail(num, score); 	printf("不及格人数为:  %d \n", x); 	printf("及格学生:"); 	y = GetAboveAver(num, score); 	printf("及格人数为: %d \n", y); 	GetDetail(score); 	return 0; }  int ReadScore(long num[], float score[]) { 	int i = 0; 	n = 0; 	do { 		scanf("%ld", &num[i]); 		scanf("%f", &score[i]); 		n++; 		i++; 	} while (score[i - 1] > 0); 	return (n - 1); }  int GetFail(long num[], float score[]) { 	int i; 	x = 0; 	for (i = 0; i < n; i++) { 		if (score[i] < 60) { 			x++; 			printf(" %ld ", num[i]); 		} 	} 	printf("\n"); 	return (x); } int GetAboveAver(long num[], float score[]) { 	int i; 	float t = 0; 	y = 0; 	for (i = 0; i < n; i++) { 		t += score[i] / n; 		if (score[i] >= 60) { 			y++; 			printf(" %ld ", num[i]); 		} 	} 	printf("\n"); 	printf("全班平均分:  %.1f\n", t); 	return (y); } void GetDetail(float score[]) { 	int i, a = 0, b = 0; 	float u, v, w; 	u = (float)x / n; 	for (i = 0; i < n; i++) { 		if (score[i] >= 60 && score[i] < 80) 			a++; 		if (score[i] >= 80 && score[i] <= 100) 			b++; 	} 	v = (float)a / n; 	w = (float)b / n; 	printf("不及格学生占百分比: %.0f %% \n", u * 100); 	printf("60分到80占百分比: %.0f %% \n", v * 100); 	printf("80分以上占百分比: %.0f %%  \n", w * 100); }  如有帮助，欢迎 及时 结帖、给分！ ：-） ～


Question: 【C语言】大写字母转小写字母

c2 = c1 + 32;或c2 = c1 | (1u<<5);或tolower  第二种方法，当小写转大写时，用c2 = c1 ^ (1u<<5);

告诉你个技巧，可以不用记32，凡32的地方都可以用（'a'-'A'）代替

#include <ctype.h>

加油吧

引用 1 楼 袁君元的回复:还可以用一个函数就可以了 tolower函数，不过要加头文件#include<string.h> 大佬好  (握手握手)

引用 2 楼 拥抱Linux的回复:可喜可贺！ 另外，提一个无关代码的小疏忽：表达「输入」这个意思的英文单词可以用「 input 」或者「 enter 」，但是 「 inter 」确实没有 输入的意思哦。 ：） 好的！多谢提醒


Question: 希望大佬帮助解答

请问如何计算该文件的行数，并且全部存入结构体？

文件的读写、结构体、结构体排序+重载运算符

文件IO+结构体+排序


Question: 这个要怎么写？可以帮助一下吗

你的else if中的条件写错了，程序中没有这种写法，应该写成x>＝-5&&x<=5，这里是小于5，不是10哦，看仔细

没有1<=x<10的这种语法，请修改成1<=x && x<10


Question: if中的return有什么用

引用 7 楼 拥抱Linux 的回复:[quote=引用 6 楼 bbcvb 的回复:] 明白了 我以为return的返回值是if 的 哦，原来如此。 if 不是函数， 只是 一个 关键字。  祝 C 语言学习进步、开心！ ：-） ～[/quote] 谢谢

引用 6 楼 bbcvb 的回复:明白了 我以为return的返回值是if 的 哦，原来如此。 if 不是函数， 只是 一个 关键字。  祝 C 语言学习进步、开心！ ：-） ～

明白了 我以为return的返回值是if 的

return是跳出整个函数吧？

引用 2 楼 bbcvb 的回复:我意思是不明白这语句  if (!InitInstance (hInstance, nCmdShow))     {         return FALSE;     } 如果把它改成InitInstance (hInstance, nCmdShow)；不也一样吗？ 嗯，假设 「InitInstance (hInstance, nCmdShow);」的返回值是 0 ， 也就是说这个函数运行过程中失败了，那么不判断的话， 它这个函数的运行情况如何，函数外面的程序根本不知道啊，那么如果后面还有语句的话，程序仍然会继续往下执行，但是这样的话，后面语句的运行不是就会出问题了吗？ ～

引用 2 楼 bbcvb 的回复:[quote=引用 1 楼 拥抱Linux 的回复:] 程序运行的流程变了吧？ 我意思是不明白这语句  if (!InitInstance (hInstance, nCmdShow))     {         return FALSE;     } 如果把它改成InitInstance (hInstance, nCmdShow)；不也一样吗？[/quote]  这么写 功能是一样的。但是你得考虑初始化失败的情况，失败了还继续往下运行，可能就会导致其他地方出错，然后代码多了可能还不好找原因

引用 1 楼 拥抱Linux 的回复:程序运行的流程变了吧？ 我意思是不明白这语句  if (!InitInstance (hInstance, nCmdShow))     {         return FALSE;     } 如果把它改成InitInstance (hInstance, nCmdShow)；不也一样吗？

程序运行的流程变了吧？  return 的话，运行的位置就返回到 return 的那个入口去了。  不 return 的话， 这句语句后面的 语句还会被执行。


Question: 是线程消息队列还是应用程序消息队列？

应用程序可以开多个线程，每个线程里创建自己的窗口，自己的消息（MSG）循环。

引用 1 楼 user-1 的回复: 应用程序可以开多个线程，每个线程里创建自己的窗口，自己的消息（MSG）循环。 这个消息队列是以进程为单位还是线程为单位？这里的应用程序是否是指进程？


Question: C语言

可以看看这篇文章https://blog.csdn.net/weixin_43956598/article/details/90055036

你想调用fun，需要跟sad一样，再main函数前面声明下

就是你图片中的使用方式啊！ main是一个函数，printf是一个函数，fun是一个函数，sad是一个函数，你的图片里的代码不是已经调用了4个函数了么？ 这还是看得到的，背后还有看不到的呢！  不知道你是不是想问「函数名（参数，参数，……）」这样的使用？  其实就跟数学的函数一样，把自变量放进去，返回值就是因变量，只不过程序的函数还可以有一大堆副作用，而很多情况下程序都是为了得到这些一大堆副作用才使用函数的。：） ～

图看不清，调用多个函数是很正常的事情，不会有问题


Question: 编写程序，大佬们帮帮忙，这个我实在不会

引用 1 楼 user-1的回复: #include<stdio.h>  //定义队列结构体 struct queue{     int front;//队头     int endline;//队尾     int data[10];//数据 };  typedef struct queue Queue;  //初始化队列 void initQueue(Queue * p); //入队 void enQueue(Queue *pque, int data); //出队 void deQueue(Queue *pque); //遍历队列 void printfQueue(Queue *pque);  //数组队列只能使用一次，使用之后必须初始化后才可以继续使用  void main(){     Queue myQueue={0,6,{50,60,70,80,90,100}};     Queue *pque = &myQueue;     //插入队列     enQueue(pque,40);     enQueue(pque,30);     printfQueue(pque); }  //初始化队列 void initQueue(Queue *pque){     pque->front = 0;     pque->endline = 0;//清空队列 }  //入队 void enQueue(Queue *pque,int data){     //判断队列是否溢出     if (pque->endline<10)     {         //判断队列是否为空         if (pque->front == pque->endline)//队头和队尾重合表明没有元素         {             //初始化队列             initQueue(pque);         }         pque->data[pque->endline] = data;         pque->endline += 1;      }     else{         return;     }  }  //出队 void deQueue(Queue *pque){     //判断队列是否为空     if (pque->front == pque->endline)     {         //队列为空         return;     }     else{         //直接弹出最后一个         printf("弹出的元素是%d\n", pque->data[pque->front]);         pque->front+= 1;     } }  //遍历队列 void printfQueue(Queue *pque){     int i;     for (i = pque->front; i < pque->endline; i++)     {         printf("第%d门成绩为%d分\n",i+1,pque->data[i]);     } }   谢谢大佬的指点，我努力搞懂试试

哇，谢谢谢谢，真的太谢谢了


Question: 萌新求助

引用 13 楼 amotym 的回复:[quote=引用 10 楼 拥抱Linux的回复:]既然没有报错，说明程序肯定是完全运行下去了的。 嗯，没有输出的话，看看在你的电脑上，实际读取的test.xml文件中究竟是和上面给的例子一样有想要的内容呢，还是没有想要的内容呢？ 找到原因了，我的info前面有一个tab的位置[/quote] 哦，原来如此，程序一直没有找到一模一样的字符串"<info>"。昨天晚上尝试写代码的时候，都是顺手写下去的，对于这类读入异常的情况没有做什么识别、判断，毕竟太费事了。你如有有实际需要的话，可以自己尝试添加相关的检测代码哦。 好了，总之能得到想要的结果就好。 ～

引用 11 楼 amotym 的回复: 看样子是进入死循环了，俺估计是在 fscanf 和 fgetc 的地方进入死循环的，因为文件指针没有走到下一行。 试试把所有的 fget 替换为 fgets 函数，如下：          // 在main 函数的开头，定义一个字符数组，用来接收所读取文件的每行的末尾残余字符         char empty[100]; 	         //fgetc(fp);         fgets(empty,10,fp);  俺这边运行下来，结果是一样的，都可以输出。你再试试。 还不行的话，可以把你实际的代码，和你实际的 xml 文件内容都放上来，俺复制过来再实际运行试试。 ～ 另外，不知道你的是纯Ubuntu还是windows下的WSL，究竟对于读取文本文件有没有影响俺不是太清楚，不过windows的换行符和linux的换行符不一样，有可能导致上面的代码下，文件指针没有前往下一行。

引用 10 楼 拥抱Linux的回复:既然没有报错，说明程序肯定是完全运行下去了的。 嗯，没有输出的话，看看在你的电脑上，实际读取的test.xml文件中究竟是和上面给的例子一样有想要的内容呢，还是没有想要的内容呢？ 找到原因了，我的info前面有一个tab的位置

引用 10 楼 拥抱Linux的回复:既然没有报错，说明程序肯定是完全运行下去了的。 嗯，没有输出的话，看看在你的电脑上，实际读取的test.xml文件中究竟是和上面给的例子一样有想要的内容呢，还是没有想要的内容呢？ 用的是一模一样的例子

引用 9 楼 拥抱Linux 的回复:[quote=引用 8 楼 amotym 的回复:] 谢谢啦，Ubuntu16.04中无输出 俺的系统是elementary Loki，同样是基于Ubuntu 16.04的，程序运行结果就是上面的截图那样啊。 录了一张gif动图，不知道csdn论坛支不支持，发一下试试。 [/quote]

引用 8 楼 amotym 的回复:谢谢啦，Ubuntu16.04中无输出 俺的系统是elementary Loki，同样是基于Ubuntu 16.04的，程序运行结果就是上面的截图那样啊。 录了一张gif动图，不知道csdn论坛支不支持，发一下试试。

引用 7 楼 拥抱Linux的回复:[quote=引用 6 楼 amotym 的回复:] 可不可以请教一下从info的下一行开始存储 动态申请内存吧。 在Linux环境下写了一下代码，不够优雅，仅供参考。 具体而言，是根据你提供的测试文本test.xml来写的，没有考虑其它比如文本内容有异常的情况哦。 另外，Windows环境下没有测试过，有问题的话自己调试吧，俺爱莫能助。  #include <stdio.h> #include <stdlib.h> #include <string.h>  int main(int argc, char const *argv[]) { 	FILE *fp; 	fp = fopen("test.xml", "r"); 	if (NULL == fp) { 		printf("Error! File open #1 failed!\n"); 		exit(EXIT_FAILURE); 	}  	/*遍历test.xml，得到所需数据的行数，即字符数组数*/ 	char info_start[10] = "<info>"; 	char info_end[10] = "</info>"; 	char line_check[1000];  	// 按行来读取，需要额外添加一行来读取行尾换行符 	fscanf(fp, "%[^\n]", line_check); 	fgetc(fp);  	while (0 != strcmp(info_start, line_check) && !feof(fp)) { 		fscanf(fp, "%[^\n]", line_check); 		fgetc(fp); 	} 	int parenthesis_count = 0; 	fscanf(fp, "%[^\n]", line_check); 	fgetc(fp); 	while (0 != strcmp(info_end, line_check)) { 		char *p = line_check; 		while ('\0' != *p) { 			if ('(' == *p) { 				while (')' != *p && '\0' != *p) { 					p++; 				} 				if (')' == *p) { 					parenthesis_count++; 				} else if ('\0' == *p) { 					printf("Warning : missing ')' !"); 				} 			} else { 				p++; 			} 		} 		fscanf(fp, "%[^\n]", line_check); 		fgetc(fp); 	} 	fclose(fp);  	// 开始获取需要的字符串  	fp = fopen("test.xml", "r"); 	if (NULL == fp) { 		printf("Error! File open #2 failed!\n"); 		exit(EXIT_FAILURE); 	}  	// 指针数组，存储各个字符数组的首地址 	char *whole[parenthesis_count]; 	int count = 0;  	char search[1000]; 	fscanf(fp, "%[^\n]", search); 	fgetc(fp); 	while (0 != strcmp(info_start, search)) { 		fscanf(fp, "%[^\n]", search); 		fgetc(fp); 	}  	fscanf(fp, "%[^\n]", search); 	fgetc(fp); 	while (0 != strcmp(info_end, search)) { 		char *p = search; 		char *q = search; 		while ('\0' != *p) { 			p = strchr(p, '(') + 1; 			q = p; 			p = strchr(p, ')') + 1; 			int len = p - q - 1; 			char *dst = (char *)malloc(sizeof(char) * (len + 1)); 			for (int i = 0; i < len; i++) { 				dst[i] = *q; 				q++; 			} 			dst[len] = '\0'; 			whole[count++] = dst; 		} 		fscanf(fp, "%[^\n]", search); 		fgetc(fp); 	}  	fclose(fp);  	for (int i = 0; i < count; i++) { 		printf("%s\n", whole[i]); 	}  	for (int i = 0; i < count; i++) { 		free(whole[i]); 		whole[i] = NULL; 	}  	return 0; }  Linux环境，运行截图： （1）局部，  （2）局部，  如有帮助，欢迎 及时 结帖、给分！：-） ～[/quote] 谢谢啦，Ubuntu16.04中无输出😂

引用 6 楼 amotym 的回复:可不可以请教一下从info的下一行开始存储 动态申请内存吧。 在Linux环境下写了一下代码，不够优雅，仅供参考。 具体而言，是根据你提供的测试文本test.xml来写的，没有考虑其它比如文本内容有异常的情况哦。 另外，Windows环境下没有测试过，有问题的话自己调试吧，俺爱莫能助。  #include <stdio.h> #include <stdlib.h> #include <string.h>  int main(int argc, char const *argv[]) { 	FILE *fp; 	fp = fopen("test.xml", "r"); 	if (NULL == fp) { 		printf("Error! File open #1 failed!\n"); 		exit(EXIT_FAILURE); 	}  	/*遍历test.xml，得到所需数据的行数，即字符数组数*/ 	char info_start[10] = "<info>"; 	char info_end[10] = "</info>"; 	char line_check[1000];  	// 按行来读取，需要额外添加一行来读取行尾换行符 	fscanf(fp, "%[^\n]", line_check); 	fgetc(fp);  	while (0 != strcmp(info_start, line_check) && !feof(fp)) { 		fscanf(fp, "%[^\n]", line_check); 		fgetc(fp); 	} 	int parenthesis_count = 0; 	fscanf(fp, "%[^\n]", line_check); 	fgetc(fp); 	while (0 != strcmp(info_end, line_check)) { 		char *p = line_check; 		while ('\0' != *p) { 			if ('(' == *p) { 				while (')' != *p && '\0' != *p) { 					p++; 				} 				if (')' == *p) { 					parenthesis_count++; 				} else if ('\0' == *p) { 					printf("Warning : missing ')' !"); 				} 			} else { 				p++; 			} 		} 		fscanf(fp, "%[^\n]", line_check); 		fgetc(fp); 	} 	fclose(fp);  	// 开始获取需要的字符串  	fp = fopen("test.xml", "r"); 	if (NULL == fp) { 		printf("Error! File open #2 failed!\n"); 		exit(EXIT_FAILURE); 	}  	// 指针数组，存储各个字符数组的首地址 	char *whole[parenthesis_count]; 	int count = 0;  	char search[1000]; 	fscanf(fp, "%[^\n]", search); 	fgetc(fp); 	while (0 != strcmp(info_start, search)) { 		fscanf(fp, "%[^\n]", search); 		fgetc(fp); 	}  	fscanf(fp, "%[^\n]", search); 	fgetc(fp); 	while (0 != strcmp(info_end, search)) { 		char *p = search; 		char *q = search; 		while ('\0' != *p) { 			p = strchr(p, '(') + 1; 			q = p; 			p = strchr(p, ')') + 1; 			int len = p - q - 1; 			char *dst = (char *)malloc(sizeof(char) * (len + 1)); 			for (int i = 0; i < len; i++) { 				dst[i] = *q; 				q++; 			} 			dst[len] = '\0'; 			whole[count++] = dst; 		} 		fscanf(fp, "%[^\n]", search); 		fgetc(fp); 	}  	fclose(fp);  	for (int i = 0; i < count; i++) { 		printf("%s\n", whole[i]); 	}  	for (int i = 0; i < count; i++) { 		free(whole[i]); 		whole[i] = NULL; 	}  	return 0; }  Linux环境，运行截图： （1）局部，  （2）局部，  如有帮助，欢迎 及时 结帖、给分！：-） ～

引用 3 楼 拥抱Linux的回复:（1）打开文件，（2）按行比较字符串，找到<info>，（3）从下一行开始读取数据，并存入字符数组，一对圆括号表示一个数组，（4）按行比较到</info>则结束读取。（5）关闭文件指针。  设置可以查找的指针。  是什么意思？ 用一个函数来传入字符指针，在前面获得的字符数组集合里查询有无相应的字符串，并且返回字符串的位置么？ ～ 可不可以请教一下从info的下一行开始存储

引用 4 楼 amotym的回复:[quote=引用 3 楼 拥抱Linux的回复:]（1）打开文件，（2）按行比较字符串，找到<info>，（3）从下一行开始读取数据，并存入字符数组，一对圆括号表示一个数组，（4）按行比较到</info>则结束读取。（5）关闭文件指针。  设置可以查找的指针。  是什么意思？ 用一个函数来传入字符指针，在前面获得的字符数组集合里查询有无相应的字符串，并且返回字符串的位置么？ ～ 是的，就是这个意思。[/quote] 可不可以请教一下从info的下一行开始存储

引用 3 楼 拥抱Linux的回复:（1）打开文件，（2）按行比较字符串，找到<info>，（3）从下一行开始读取数据，并存入字符数组，一对圆括号表示一个数组，（4）按行比较到</info>则结束读取。（5）关闭文件指针。  设置可以查找的指针。  是什么意思？ 用一个函数来传入字符指针，在前面获得的字符数组集合里查询有无相应的字符串，并且返回字符串的位置么？ ～ 是的，就是这个意思。

引用 1 楼 赵4老师的回复:仅供参考：//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   抱歉，还是不太明白，我们要存入的是（）里的字符


Question: C语言实现线性列表

前面几楼都正解。

引用 2 楼 单眼皮的根号3的回复:create函数写错了，end指针没有递增，一直都是在head的位置，所以你即使输入5个数，但是只有head一个节点，修改如下：  感谢感谢，厉害厉害，原来是我create写错了。

引用 1 楼 user-3的回复:问题在于create 函数，有个赋值搞反了 LinkList *create (int n) { LinkList *head, *node, *end; head = (LinkList *)malloc(sizeof(LinkList));  end = head; int i; for( i = 0; i < n; i++) { node = (LinkList *)malloc(sizeof(LinkList)); scanf("%d", &node->score); end->next = node; //node = end; end = node; } end->next = NULL; return head; } 谢谢你的的讲解，我明白了。


Question: c语言

引用 2 楼 表面镇定，心在滴血 的回复:[quote=引用 1 楼 jsx_SEVEN的回复:]  #include <stdio.h> #include <stdlib.h>  void swap(int *p1, int *p2) { 	int *p; 	p = *p1; 	*p1 = *p2; 	*p2 = p; } int main() { 	int i, x, y; 	int array[10]; 	int *p = array; 	for ( i = 0; i < 10; i++) 	{ 		scanf("%d", &array[i]); 	} 	printf("输入要交换的两个下标："); 	scanf("%d %d", &x, &y); 	 	swap(&array[x], &array[y]);  	for ( i = 0; i < 10; i++) 	{ 		printf("%d ", array[i]); 	} }  老哥，怎么运行不了的[/quote] 我用的VS2017，可以运行，你那边是显示编译错误还是答案错误？  #include <stdio.h> #include <stdlib.h>  void swap(int *p1, int *p2) { 	int *p; 	p = *p1; 	*p1 = *p2; 	*p2 = p; } int main() { 	int i, x, y; 	int array[10]; 	int *p = array; 	printf("输入10个数，以空格分开"); 	for (i = 0; i < 10; i++) 	{ 		scanf("%d", &array[i]); 	} 	printf("输入要交换的两个下标(以空格分开)："); 	scanf("%d %d", &x, &y);  	swap(&array[x], &array[y]);  	for (i = 0; i < 10; i++) 	{ 		printf("%d ", array[i]); 	} }

引用 1 楼 jsx_SEVEN的回复:  #include <stdio.h> #include <stdlib.h>  void swap(int *p1, int *p2) { 	int *p; 	p = *p1; 	*p1 = *p2; 	*p2 = p; } int main() { 	int i, x, y; 	int array[10]; 	int *p = array; 	for ( i = 0; i < 10; i++) 	{ 		scanf("%d", &array[i]); 	} 	printf("输入要交换的两个下标："); 	scanf("%d %d", &x, &y); 	 	swap(&array[x], &array[y]);  	for ( i = 0; i < 10; i++) 	{ 		printf("%d ", array[i]); 	} }  老哥，怎么运行不了的


Question: 有没有可以帮忙写一下这个C语言程序，不用链表做

哪方面不懂呢？不知道怎么操作文件吗？


Question: 迫切求助

https://bbs.csdn.net/topics/390479595?_da0.05341788334771991  https://jingyan.baidu.com/article/3c48dd3492421ee10ae35869.html

可以尝试以下方法： 1、关闭与杀毒软件、安全卫士相关的软件，再重新编译运行。（包括关闭任务进程里面与安全卫士、电脑管家类似的进程） 2、检查一下你是不是多次运行了这个程序，导致另外有一个运行程序的dos窗口 3、卸载软件，重装！！

代码是没问题的，你有按顺序点击编译、链接、运行吗？ 如果有正确点击还是这样，那么你可以试试创建文件的时候不要用.cpp后缀，用.c后缀。 如果还是不行的话，你换个IDE吧，可以编译C的IDE一大把，比如DEV-C++


Question: C语言错误

引用 4 楼 636f6c696e的回复:是的，请不要指望发现了个底层的bug [quote=引用 3 楼 CZzyw 的回复:] [quote=引用 2 楼 636f6c696e的回复:]不用看这一层调用栈，这种一般是你调用的传参有问题导致的 意思是参数错误？？？[/quote][/quote] 害的我虚惊一场

是的，请不要指望发现了个底层的bug 引用 3 楼 CZzyw 的回复:[quote=引用 2 楼 636f6c696e的回复:]不用看这一层调用栈，这种一般是你调用的传参有问题导致的 意思是参数错误？？？[/quote]

引用 2 楼 636f6c696e的回复:不用看这一层调用栈，这种一般是你调用的传参有问题导致的 意思是参数错误？？？

不用看这一层调用栈，这种一般是你调用的传参有问题导致的

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


Question: c语言链表题目

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

建议自己先写写吧，创建一个链表至少要写出来。  排序方法：可以考虑交换数据，不改变next指向

新建并维护有序链表


Question: 刚学C语言，第一题代码怎么写？

遍历字符串 如果发现星号  就从后向前找到第一个不是星号的字符 并交换


Question: 请问如何实现十进制转负二进制，请教我

-13（base10）=110111（base-2） 注:在负2为基底，(-2)^n为各个数位的权值的负二进制中，11转化为十进制，为-1 解一：易见-13=-16+4-1，故-13(base10tobase-2)=110000+100+11(base-2)=110111 解二：先将13转化，再乘以-1. 13=16-8+4+1=11101(base-2), 故-13=11101*11=111010+11101(base-2), 易见在负二进制中,11+1=0,     1+1=110(base-2), 故(111,010) + (11,101)=(1,010) + (1,101)=110111  解三：先将13转化，再求相反数. 13=16-8+4+1=11101(base-2), 易见在负二进制中,11+1=0，故11101+110111=0，故-13=110111(base-2)  相关：负二进制加法表中的不显然项目： 1+1=110; 11+01=0; 推出： 11+10=(1,1)+(1,0)=(110,1)=1101;  10+10=(110,0)=1110

引用 1 楼 真相重于对错的回复:你转的不对。 没错吧，题目上是这么写的

引用 7 楼 636f6c696e 的回复:负二进制不是求到2进制后取补码，而是： -13=1 * (-2)^0 + 1 * (-2)^1 + 1 * (-2)^2 + 0 * (-2)^3 + 1 * (-2)^4 + 1 * (-2)^5 所以-13的负二进制是110111 [quote=引用 6 楼 真相重于对错 的回复:] -13 如果存贮在一个字节中。 13的源码 00001101。 负数是用补码表示 按位去反+1 变成 11110011；[/quote] sorry，我看成2进制了

负二进制不是求到2进制后取补码，而是： -13=1 * (-2)^0 + 1 * (-2)^1 + 1 * (-2)^2 + 0 * (-2)^3 + 1 * (-2)^4 + 1 * (-2)^5 所以-13的负二进制是110111 引用 6 楼 真相重于对错 的回复:-13 如果存贮在一个字节中。 13的源码 00001101。 负数是用补码表示 按位去反+1 变成 11110011；

谢谢各位，我会做了。

二进制没有正负吧，负整数在二进制看来，它之所以为负，是因为有个表示负数的比特位上有了1，所以这个数就被认为是负数。现在有负数的类型有char、short、int、long long，你要将-13（10）转换为110111（-2）是有问题的，也就是你规定了第一个1表示负数，然而你规定的并不行。要转也是转成1111 0011这样的char，或者1111 1111 1111 0011这样的short，或者1111 1111 1111 1111 1111 1111 1111 0011这样的int，或者1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0011这样的long long。至于转二进制的方法，和整型是一样的：  #include "stdio.h"  void main( void ) { 	unsigned n=0;			//利用unsigned，0xffffffff是可以正常计算的正数 	int m=0;				 	char result[32]={0};	        //保存二进制结果，视你要多少位而定 	printf("十进制："); 	scanf("%d",&n); 	printf("二进制："); 	for( ; n>0 ; n/=2 , m++) 		result[m]=n%2;	 	for(m-- ; m>=0 ; m-- )	//倒序输出 		printf("%d",  result[m]); }

二进制有多种处理方案 源码补码反码说清楚

#include<stdio.h> int main(){ 	int n,result=0; 	int key = 0, count = 1; 	scanf("%d", &n); 	if (n < 0) { 		key = 1; 		n = -n; 	} 	while (n) { 		result += n % 2 * count; 		n /= 2; 		count *= 10; 	} 	if (key)  		result += count; 	printf("%d", result); 	return 0; }

你转的不对。


Question: 这个第四个程序该怎么写的跟图片一样啊，急。

#include<stdio.h> #include<string.h>  #define     ROW     4 #define     COL     4  int main() {     int i, j;     int arr[ROW][COL], sum, cnt = 1;      for (i = 0; i < ROW-1; i++) {         sum = 0;         for (j = 0; j < COL-1; j++) {             arr[i][j] = cnt;             sum += cnt++;         }         arr[i][j] = sum;     }      j = 0;     while (j < COL) {         sum = 0;         for (i = 0; i < ROW-1; i++)             sum += arr[i][j];         arr[i][j] = sum;         j++;     }      for (i = 0; i < ROW; i++) {         for (j = 0; j < COL; j++)             printf("%4d", arr[i][j]);         putchar(10);     }      return 0; }  比较笨的方法，供参考～

两个循环就可以了，先从行中找到最大值，然后再从对应列中判断是不是最小值，如果是，就找到了。


Question: C语言

MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl   Audio Samples  Click to open or copy the files for the Audio samples.  Sample Description  ACMAPP Displays wave file format, and plays, records, and converts wave files. Demonstrates how to use the Audio Compression Manager API's in Windows. Can be used as an ACM driver test.  IDFEDIT MIDI IDF (Instrument Definition File) editor.   LOWPASS Low-pass filter for waveform audio.  MCIAPP MCI test application.  MCIPLAY Simple video playback application. Uses MCIWnd.  MCIPUZZL Application lets you make a 15-square puzzle of a playing video sequence. Shows how to use installable draw procedures.  MIDIMON Sample that displays textual listing of MIDI input messages.  MIDIPLYR Sample MIDI player.  MIXAPP Sample mixer application.  MMCAPS Sample that shows the multimedia capabilities of the hardware.  REVERSE Simple application that will play a waveform in reverse.  SOUNDAPP Simple application showing the SndPlaySound API.  WAVEFILE Sample AVIFile file handler for waveform audio files.  To install, execute dseqfile.reg and copy dll to system dir. Can be used with AVIEDIT or AVIVIEW.    See also, in the Video Samples section:  LANGPLAY Plays back multi-audio stream AVI files. MULTILNG.AVI is an example file found on the CD.    Building SDK Samples


Question: 求指教，为什么程序在vc上运行会出现乱码，在cf和vs上都可以成功运行

引用 1 楼 赵4老师的回复:“多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？ 我知道问题在哪了，谢谢您

引用 1 楼 赵4老师的回复:“多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？ 老师您好，谢谢你的指点，但是我发现问题是每一个数组的第一个都没有存储数据在里面，不知道是什么原因，希望您能指教


Question: 数据结构的一道相关题目

模糊查询稍稍修改一下条件

思考2个问题： 1、单词库怎样存？用数组？链表？集合？还是树？这些集合的优缺点是什么？你题目的需求又是什么？ 2、怎样匹配？顺序匹配速度够快吗？如果不用顺序匹配，用什么匹配算法？要用到什么数据结构？

使用链式结构 构造一棵搜索树，在单词匹配的时候使用搜索树进行匹配，不要用库，库的适用性很强，但针对性不强，单次使用效率很高，但重复性使用效率极低


Question: 用c判断exe是32位还是64位的？

主要代码如下：  // 获取机器标志码 // -1 打开文件失败 // -2 读取文件失败 // -3 文件格式错误 // 0      任何处理器 // 0x14c  x86处理器 // 0x8664 x64处理器 // 0x166  MIPS处理器 // 0x1C0  ARM处理器 INT GetMachine(const TCHAR * szFilePath) {     // _tprintf(TEXT("%s\n"), szFilePath);      // 打开文件     FILE * fp = _tfopen(szFilePath, TEXT("rb"));     if( fp == NULL )     {         return -1;     }      // 获取文件长度     long len = filelength(fileno(fp));     if( len < 0 )     {         fclose(fp);         return -1;     }      // 文件格式错误     if( len < 0x40 )     {         fclose(fp);         return -3;     }      WORD buf;      // 读取MZ文件头     if( fread(&buf, 1, 2, fp) != 2 )     {         fclose(fp);         return -2;     }      // 文件格式错误     if( buf != 0x5A4D )     {         fclose(fp);         return -3;     }      // 移到PE头偏移     if( fseek(fp, 0x3C, SEEK_SET) )     {         fclose(fp);         return -2;     }      // 读取PE头偏移     if( fread(&buf, 1, 2, fp) != 2 )     {         fclose(fp);         return -2;     }      // 文件格式错误     if( len < buf + 6 )     {         fclose(fp);         return -3;     }      // 移到PE头     if( fseek(fp, buf, SEEK_SET) )     {         fclose(fp);         return -2;     }      // 读取PE头     if( fread(&buf, 1, 2, fp) != 2 )     {         fclose(fp);         return -2;     }      // 文件格式错误     if( buf != 0x4550 )     {         fclose(fp);         return -3;     }      // 移到机器码     if( fseek(fp, 2, SEEK_CUR) )     {         fclose(fp);         return -2;     }      // 读取机器码     if( fread(&buf, 1, 2, fp) != 2 )     {         fclose(fp);         return -2;     }      fclose(fp);     return buf; }  　　如果要检测64位系统System32目录下的文件，需要把文件重定向关闭：  BOOL DisableWow64FsRedirection() {     typedef BOOL (WINAPI* WOW64DISABLEWOW64FSREDIRECTION)(PVOID *OldValue);     WOW64DISABLEWOW64FSREDIRECTION Wow64DisableWow64FsRedirection;      HMODULE hKernel32 = GetModuleHandle(TEXT("kernel32.dll"));     if( hKernel32 == NULL )     {         return FALSE;     }      Wow64DisableWow64FsRedirection = (WOW64DISABLEWOW64FSREDIRECTION)GetProcAddress(hKernel32, "Wow64DisableWow64FsRedirection");     if( Wow64DisableWow64FsRedirection == NULL )     {         return TRUE;     }      PVOID OldValue = NULL;     if( Wow64DisableWow64FsRedirection(&OldValue) == FALSE && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED )     {         return FALSE;     }      return TRUE; }

https://www.cnblogs.com/God4/articles/11721559.html 关于exe或dll等PE格式文件32位还是64位的检测  代码很简单，工具审核通过后传上去。

查winnt.h  #define IMAGE_FILE_MACHINE_UNKNOWN           0 #define IMAGE_FILE_MACHINE_I386              0x014c  // Intel 386. #define IMAGE_FILE_MACHINE_R3000             0x0162  // MIPS little-endian, 0x160 big-endian #define IMAGE_FILE_MACHINE_R4000             0x0166  // MIPS little-endian #define IMAGE_FILE_MACHINE_R10000            0x0168  // MIPS little-endian #define IMAGE_FILE_MACHINE_WCEMIPSV2         0x0169  // MIPS little-endian WCE v2 #define IMAGE_FILE_MACHINE_ALPHA             0x0184  // Alpha_AXP #define IMAGE_FILE_MACHINE_SH3               0x01a2  // SH3 little-endian #define IMAGE_FILE_MACHINE_SH3DSP            0x01a3 #define IMAGE_FILE_MACHINE_SH3E              0x01a4  // SH3E little-endian #define IMAGE_FILE_MACHINE_SH4               0x01a6  // SH4 little-endian #define IMAGE_FILE_MACHINE_SH5               0x01a8  // SH5 #define IMAGE_FILE_MACHINE_ARM               0x01c0  // ARM Little-Endian #define IMAGE_FILE_MACHINE_THUMB             0x01c2  // ARM Thumb/Thumb-2 Little-Endian #define IMAGE_FILE_MACHINE_ARMNT             0x01c4  // ARM Thumb-2 Little-Endian #define IMAGE_FILE_MACHINE_AM33              0x01d3 #define IMAGE_FILE_MACHINE_POWERPC           0x01F0  // IBM PowerPC Little-Endian #define IMAGE_FILE_MACHINE_POWERPCFP         0x01f1 #define IMAGE_FILE_MACHINE_IA64              0x0200  // Intel 64 #define IMAGE_FILE_MACHINE_MIPS16            0x0266  // MIPS #define IMAGE_FILE_MACHINE_ALPHA64           0x0284  // ALPHA64 #define IMAGE_FILE_MACHINE_MIPSFPU           0x0366  // MIPS #define IMAGE_FILE_MACHINE_MIPSFPU16         0x0466  // MIPS #define IMAGE_FILE_MACHINE_AXP64             IMAGE_FILE_MACHINE_ALPHA64 #define IMAGE_FILE_MACHINE_TRICORE           0x0520  // Infineon #define IMAGE_FILE_MACHINE_CEF               0x0CEF #define IMAGE_FILE_MACHINE_EBC               0x0EBC  // EFI Byte Code #define IMAGE_FILE_MACHINE_AMD64             0x8664  // AMD64 (K8) #define IMAGE_FILE_MACHINE_M32R              0x9041  // M32R little-endian #define IMAGE_FILE_MACHINE_CEE               0xC0EE  从这个定义看，只是处理器的类型而已，不能作为判断程序是32位还是64位，还有IMAGE_FILE_MACHINE_UNKNOWN这样的值呢........

在32位程序里调用hLibrary = LoadLibrary(szFileName); 如果是32位程序，hLibrary肯定不为空，64为程序hLibrary肯定为空。程序如下，编译成32位的，找个大家都能下载的程序，360杀毒64位.exe，hLibrary为空，说明是64位程序，但是wWord1 为276（x10b），说明64位程序的Magic不一定是0x2xx。现在我程序就用hLibrary = LoadLibrary(szFileName) 来判断了.........   #include "stdafx.h" #include <Windows.h>   int _tmain(int argc, _TCHAR* argv[]) { 	HANDLE hFile; 	DWORD dwFileSize; 	//char szFileName[] = "D:\\Windows技术详解\\Result\\X64Test\\Debug\\X64Test1.exe";  	char szFileName[] = "D:\\Windows技术详解\\Result\\X64Test\\Debug\\360杀毒64位.exe";  	BOOL bRet = FALSE; 	BOOL bFileX64 = FALSE; 	HMODULE hLibrary;  	hLibrary = LoadLibrary(szFileName);  	if (NULL != hLibrary) 	{ 		FreeLibrary(hLibrary); 		bFileX64 = FALSE; 	} 	else 	{ 		bFileX64 = TRUE; 	}  	hFile = CreateFile(szFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 	dwFileSize = GetFileSize(hFile, 0);  	BYTE *pData = new BYTE[dwFileSize]; 	if (NULL == pData) 	{ 		return bRet; 	} 	DWORD dwBytesRead = 0; 	ReadFile(hFile, pData, dwFileSize, &dwBytesRead, NULL); 	CloseHandle(hFile);  	WORD wWord = *(WORD*)(pData + 0x3c);  	wWord = wWord + 0x18;  	WORD wWord1 = *(WORD*)(pData + wWord);  	return 0; }

给我个下载码给我个下载码给我个下载码

引用 22 楼 stherix 的回复:[quote=引用 20 楼 wula0010 的回复:] 这个word是imageNtHeaders.FileHeader.Machine ，我还是不认为通过这个可以判断程序是32位还是64位的，看我上面贴的winnt.h里的定义，这个只是处理器的类型。   我最后还是通过LoadLibrary来判断的，.......  我给你的方法,并不是读文件头里的imageNtHeaders.FileHeader.Machine,这个有可能不准确 而是读可选头的Magic字,这两者不是同一个东西![/quote]  是我搞错了，你是对的

引用 20 楼 wula0010 的回复:这个word是imageNtHeaders.FileHeader.Machine ，我还是不认为通过这个可以判断程序是32位还是64位的，看我上面贴的winnt.h里的定义，这个只是处理器的类型。   我最后还是通过LoadLibrary来判断的，.......  我给你的方法,并不是读文件头里的imageNtHeaders.FileHeader.Machine,这个有可能不准确 而是读可选头的Magic字,这两者不是同一个东西!

还是我搞错了， 把imageNtHeaders.FileHeader.Machine 和  OptionalHeader.Magic搞混了，根据OptionalHeader.Magic应该是可以的。

引用 19 楼 stherix 的回复:[quote=引用 18 楼 wula0010 的回复:] [quote=引用 17 楼 stherix 的回复:] [quote=引用 13 楼 wula0010 的回复:] 希望谁能有更好的办法，或者指出我的程序的错误在哪里....................  我下了个360 64位的 它的安装程序是32位的,并不是64的  不要混淆安装程序和运行程序[/quote]  真是32位么？你按我说的方法试试，在32位程序里调用hLibrary = LoadLibrary(szFileName); 这样能加载么？？？？[/quote]  你用64位的程序去 LoadLibrary看下? 加载不成功有很多因素,未必是32/64不匹配[/quote] 我搞错了，32位的可以加载成功 “360杀毒64位.exe”，这个是32位的安装程序。  这个word是imageNtHeaders.FileHeader.Machine ，我还是不认为通过这个可以判断程序是32位还是64位的，看我上面贴的winnt.h里的定义，这个只是处理器的类型。   我最后还是通过LoadLibrary来判断的，.......

引用 18 楼 wula0010 的回复:[quote=引用 17 楼 stherix 的回复:] [quote=引用 13 楼 wula0010 的回复:] 希望谁能有更好的办法，或者指出我的程序的错误在哪里....................  我下了个360 64位的 它的安装程序是32位的,并不是64的  不要混淆安装程序和运行程序[/quote]  真是32位么？你按我说的方法试试，在32位程序里调用hLibrary = LoadLibrary(szFileName); 这样能加载么？？？？[/quote]  你用64位的程序去 LoadLibrary看下? 加载不成功有很多因素,未必是32/64不匹配

引用 17 楼 stherix 的回复:[quote=引用 13 楼 wula0010 的回复:] 希望谁能有更好的办法，或者指出我的程序的错误在哪里....................  我下了个360 64位的 它的安装程序是32位的,并不是64的  不要混淆安装程序和运行程序[/quote]  真是32位么？你按我说的方法试试，在32位程序里调用hLibrary = LoadLibrary(szFileName); 这样能加载么？？？？

引用 13 楼 wula0010 的回复:希望谁能有更好的办法，或者指出我的程序的错误在哪里....................  我下了个360 64位的 它的安装程序是32位的,并不是64的  不要混淆安装程序和运行程序

引用 12 楼 wula0010 的回复:在32位程序里调用hLibrary = LoadLibrary(szFileName); 如果是32位程序，hLibrary肯定不为空，64为程序hLibrary肯定为空。程序如下，编译成32位的，找个大家都能下载的程序，360杀毒64位.exe，hLibrary为空，说明是64位程序，但是wWord1 为276（x10b），说明64位程序的Magic不一定是0x2xx。现在我程序就用hLibrary = LoadLibrary(szFileName) 来判断了.........  你建个64位程序,返回也可能为空的,你试下

引用 8 楼 stherix 的回复:[quote=引用 7 楼 wula0010 的回复:] [quote=引用 3 楼 stherix 的回复:] WORD wWord1 = *(pData + wWord)  不对  要 WORD wWord1 = *(WORD *)(pData + wWord) 这样修改后，32位和64位读出来的都是267,.........................  还有，我理解你这个读的数据，还是pe头里的数据，pe头里没这个数据应该..........................................[/quote]  267也就是0x10B,肯定是32位的[/quote]  这个WORD叫Magic,是可选头的最开始部分 10B则为32位程序,20B则是64位的  64位的exe读出来不可能是10B

引用 7 楼 wula0010 的回复:[quote=引用 3 楼 stherix 的回复:] WORD wWord1 = *(pData + wWord)  不对  要 WORD wWord1 = *(WORD *)(pData + wWord) 这样修改后，32位和64位读出来的都是267,.........................  还有，我理解你这个读的数据，还是pe头里的数据，pe头里没这个数据应该..........................................[/quote]  267也就是0x10B,肯定是32位的

引用 3 楼 stherix 的回复:WORD wWord1 = *(pData + wWord)  不对  要 WORD wWord1 = *(WORD *)(pData + wWord) 这样修改后，32位和64位读出来的都是267,.........................  还有，我理解你这个读的数据，还是pe头里的数据，pe头里没这个数据应该..........................................

IMAGE_DOS_HEADER DosHead = { 0 }; IMAGE_NT_HEADERS NtHead = { 0 }; IMAGE_SECTION_HEADER ImageSectionHeader = { 0 }; FILE* fp; _wfopen_s(&fp, szFile, L"rb"); fread(&DosHead, sizeof(IMAGE_DOS_HEADER), 1, fp); fseek(fp, DosHead.e_lfanew, SEEK_SET); fread(&NtHead, sizeof(IMAGE_NT_HEADERS), 1, fp); if (NtHead.FileHeader.Machine == IMAGE_FILE_MACHINE_I386) { 	//32位 } if (NtHead.FileHeader.Machine == IMAGE_FILE_MACHINE_AMD64) { 	//64位 }

//读0x3C WORD //这个WORD加上0x18 //再Seek到这个位置,读WORD //0x1xx就是32位 //0x2xx就是64位 #pragma warning(disable:4996) //开头加这句或项目、属性、配置属性、C/C++、预处理器、预处理器定义中添加“_CRT_SECURE_NO_WARNINGS” typedef unsigned short int WORD; #include <stdio.h> FILE *f; WORD w; int main(int argc,char **argv) {     if (argc==1) {         printf("Usage:\n    %s filename.exe\nto show 32/64 bit program\n",argv[0]);         return 1;     }     f=fopen(argv[1],"rb");     if (NULL==f) {         printf("Can not open file %s\n",argv[1]);         return 2;     }     if (fseek(f,0x3C,SEEK_SET)) {         printf("Can not seek to 0x3C\n");         fclose(f);         return 3;     }     if (1!=fread(&w,2,1,f)) {         printf("Can not read a word at offset 0x3C\n");         fclose(f);         return 4;     }     if (fseek(f,w+0x18,SEEK_SET)) {         printf("Can not seek to word ptr (0x3C)+0x18\n");         fclose(f);         return 5;     }     if (1!=fread(&w,2,1,f)) {         printf("Can not read a word at offset word ptr (0x3C)+0x18\n");         fclose(f);         return 6;     }     fclose(f);     w&=0xFF00;          if (0x0100==w) printf("%s is a 32 bit program",argv[1]);     else if (0x0200==w) printf("%s is a 64 bit program",argv[1]);     else                printf("%s is a 32/64  program",argv[1]);     return 0; }


Question: 我觉得是3

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

是5没问题，因为one和two公用同一个内存空间，最后赋值的5，所以输出的是5.

union是共用体，成员中的变量共享一个存储空间，因此，每次只能有一个成员占用空间，空间里存储的是最近的成员变量，所以是5

在任意时刻，union联合中只能有一个数据成员可以有值。当给联合中某个成员赋值之后，该联合中的其它成员值就会发生改变。 所以，当 t.one=5; 时，因为one和two的类型都是int，所以，t.two的值也变成了5.  请参考《C++中union的使用方法》 希望能够帮到你！

百度union结构吧。。。话说你union都不懂怎么就这么确认是3的

百度百科：共用体

没问题，是5，union是共用体，具体介绍你可以度娘，关于共用体，你只需要记住一点：最后一次赋值所得的值就是共用体的值

说白了，你这个t是共用体类型，在你这个程序中，它只有1个int成员，one和two使用的都是这同一个，所以one先改变了这个int，two接着也改变了这个int，所以这个int的值肯定是后改变的那个值了，也就是5。


Question: 求大佬帮忙解释下代码含义

这个是C语言的基础知识，可以先自己学一下。看懂别人的程序也是一种提升！

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


Question: VC++6.0中提示文件没有找到是什么原因？应该怎么解决？

引用 1 楼 user-3的回复:先要编译生成exe 好的，弄好了，谢谢

能不能教教我怎么处理的，我被困扰很久了

引用 2 楼 轻箬笠的回复:先编译，再调试。如果还是不行，可以把项目放到“无中文且无空格”的目录下，重新编译试试 好的，弄好了，谢谢

先要编译生成exe


Question: 请教: 如何去掉每行结尾的换行符? C .

引用 9 楼 UIUI 的回复://修改版.  To 赵4老师: 程序不能编译程序 VS2019 程序还没看懂.收藏再消化. To 六道佩恩: 查看网上的方法,有不少是用一个字符一个字符读的方法. 我试试后,再用你列举的两个方法.    /* 标准文档模板 */  #include "Stdio.h" #include "Conio.h" #include <sys\stat.h>  #include <time.h> #include "ctype.h" #include "stdlib.h" #include "string.h"   char* NopEnter(char* str)  // 此处代码是抄的,  但是比较 好懂. { 	char* p; 	if ((p = strchr(str, '\n')) != NULL) 		* p = '\0'; 	return str; }  int main() { 	FILE* fpSS; 	FILE* fpDS; 	int err; 	char* str; 	char* temp; 	system("color 17");  	str = (char*)malloc(sizeof(char)*101); 	temp = (char*)malloc(sizeof(char)*101); 	err = fopen_s(&fpSS, "filess.txt", "r"); 	err = fopen_s(&fpDS, "fileds.txt", "w"); 	if (fpDS == NULL) 	{ 		puts("-fileds.txt- 文件打开错误!!\n"); 		exit(-1); 	} 	if (fpSS == NULL) 	{ 		puts("-filess.Txt- 文件打开错误\n"); 		fputs("源文件打开错误!", fpDS); 		exit(-1); 	}   	while (fgets(str, 100, fpSS) != NULL) 	{ 		puts(str);    		str = NopEnter(str);  //去掉回车 		fputs(str, fpDS);   	} 	fclose(fpSS); 	fclose(fpDS); 	return(0); }   这个方法也挺好的，跟fwrite的那个方法应该差不多，fgets应该就是以换行为结尾获取的一行字符，那么换行应该就在结尾。

仅供参考：#include <stdio.h> FILE *f; int c1,c2; int main(int argc,char *argv[]) {     if (argc!=2) {         printf("Usage: CR2CRLF filename\n");         return 1;     }     f=fopen(argv[1],"rb+");     if (NULL==f) {         printf("Can not open file [%s]!\n",argv[1]);         return 2;     }     while (1) {         c1=fgetc(f);         if (EOF==c1) break;         if ('\r'==c1) {             c2=fgetc(f);             if (EOF==c2) {                 fseek(f,-1L,SEEK_CUR);                 fputc('\n',f);                 break;             }             if ('\n'!=c2) {                 fseek(f,-2L,SEEK_CUR);                 fputc('\n',f);                 fseek(f,1,SEEK_CUR);             }         }     }     fclose(f);     return 0; }

str=(char*)malloc(sizeof(char));   temp=(char*)malloc(sizeof(char));   你这里分配一个字节空间，然后下列代码中一次读一行最长101字节。 你不怕越界访问内存？？你这段代码写的问题很大。   while (  fgets(str,100+1,fpSS) != NULL )      {         puts(str);    //在这里如何用temp 变换一下,再写入文件?         fputs(str,fpDS);       }

引用 3 楼 user-5的回复:  str=(char*)malloc(sizeof(char));   temp=(char*)malloc(sizeof(char));你好像完全不知道这2句代码是干嘛的? 空间分配啊                ，

引用 1 楼 이 몽 결的回复:去掉\n？。。。。。。，，，， 我也不知道是n还是r

去掉\n？。。。。。。，，，，

引用 3 楼 user-5的回复:  str=(char*)malloc(sizeof(char));   temp=(char*)malloc(sizeof(char));你好像完全不知道这2句代码是干嘛的? 知道，却用错了。应该是*100

你可以不用fputs， 方法一：改用fputc，循环单个字符输出到文件，遇到换行不输出 方法二：用fwrite，检测字符串的长度，然后写这个长度-1个字符（换行在最后的话）


Question: 求助 最基本c语言题目

最简单有效的办法：百度一下，你就知道。 当然了，也不排除论坛里有闲得蛋疼的大神帮你把代码整整齐齐地写出来，格式调整好，双手洗干净，最后恭恭敬敬地端到你的面前。


Question: 怎样添加管理员输入条件，对日期进行限制。让月数不超过12，天数不超过31

简单点的办法：对输入的字符进行判断。不符合规则给出提示。 复杂点的办法：使用键盘钩子。


Question: 谁能帮我写个代码啊，用C语言，我是真的不会了

难度在哪里？表映射就好了

引用 1 楼 user-1的回复:难度在哪里？表映射就好了 就是如何把文件里面的相关东西弄到数组里面？

就是如何把文件里面的相关东西弄到数组里面


Question: 数组问题

引用 4 楼 自信男孩 的回复:[quote=引用 2 楼 csucxy 的回复:] #include <stdio.h> #include <math.h> int main(void) {     //double num[8];     double num[9];     int index;     double i;      //for (index = 0; index < 8; index++)     for (index = 0; index <= 8; index++)     {         i = index;         num[index] = pow(2, i);     }      //printf("%f\n", num[1]);      index = 0;     do     {         //printf("%f\n", num[index]);         printf("%d\t%d\n", index, int(num[index]));         index++;         //} while (index < 7);     } while (index <= 8);      return 0; } 注意，while的判断条件index <= 8不能等于8，否则数组越界了[/quote] 原题求2的前8次幂，我的理解是包括2的8次方，所以应该修改数组的长度，循环也应该等于8.

引用 2 楼 csucxy 的回复:#include <stdio.h> #include <math.h> int main(void) {     //double num[8];     double num[9];     int index;     double i;      //for (index = 0; index < 8; index++)     for (index = 0; index <= 8; index++)     {         i = index;         num[index] = pow(2, i);     }      //printf("%f\n", num[1]);      index = 0;     do     {         //printf("%f\n", num[index]);         printf("%d\t%d\n", index, int(num[index]));         index++;         //} while (index < 7);     } while (index <= 8);      return 0; } 注意，while的判断条件index <= 8不能等于8，否则数组越界了

#include <stdio.h> #include <math.h>  int main(void) {     double num[8];     int index;     double i;      for (index = 0; index < 8; index++) {         i = index;         num[index] = pow (2 , i);     }     //printf("%f\n", num[1]);     index = 0;     do     {         printf("%.0f\n", num[index++]);     } while (index < 8);     return 0;  }  供参考！


Question: c语言运算问题

既然这样的话，直接定义三个变量，int a,b; char  op ;//表示运算符 因此要考虑到一点，输出b时，应该是输出abs(b)，因为符号我们单独提取出来了，注意加abs的头文件#include<math.h> 修改后的代码如下：  #include<stdio.h> #include<math.h> //abs函数的头文件   int main() {     int a,b;     char op;     scanf("%d%d",&a,&b);     op=b>0?'+':'-';  //当b大于0时，op是+，当b小于0时，op是-     printf("%d%c%d=%d",a,op,abs(b),a+b);//由于当b小于0时，op为负号，所以这里取的是b的绝对值           return 0; }

printf("%d %c %d = %d\r\n",      a, b>=0?'+':'-', abs(b), a + b);

引用 3 楼 wc2cwl48 的回复:[quote=引用 1 楼 拥抱Linux的回复:]输入的时候，中间的 英文半角的 逗号 输入了么？ 输入了，可是还是不行，第二个数只要是负数就不对[/quote] 你说的 正号 实际上只是 你的 printf 的 格式化字符串里面固化的那个  加号吧？  变量b输入的是负数的话，输出来的肯定是负数啊，只不过 printf  里不管正数负数都会照常输出中间的那个固化的  加号 啊。  比如，输入「10,-5」，输出结果是「10+-5=5」 ==》  「10 加号 -5 = 5 」。是这样的吧？ 简单的解决办法的话，就是根据b的值的正负情况，按不同的输出格式来输出喽。正数的话，就是 "%d+%d=%d"，负数的话，就是"%d%d=%d"。 ～

引用 1 楼 拥抱Linux的回复:输入的时候，中间的 英文半角的 逗号 输入了么？ 输入了，可是还是不行，第二个数只要是负数就不对

输入了，可是还是不行，第二个数只要是负数就不对

输入的时候，中间的 英文半角的 逗号 输入了么？


Question: 调试一直无限循环

你的程序存在以下问题： 1、for(;int i=0.i<N;i++) 修改为for(int i=0;i<N;i++) 2、你stu[i].sum=a;最好写在j的循环外面，因为你是把这个学生的所有成绩之和放在sum中，当然不放在循环体外也没有问题，只是多次赋值而已。 3、你的a初始化应该放在i的循环体内，因为a是存储每一位学生的总分，所以在计算每一位学生的总分前均要初始化为0. 4、stu[i].ave=stu[i].sum/3;改为stu[i].ave=stu[i].sum*1.0/3;因为平均分可能会有小数。 5、你的程序死循环是因为你的输入的学号和姓名没有按照你指定的格式输入，中间要有一个英文的逗号。有关scanf的使用可以看看这篇文章。https://blog.csdn.net/weixin_43956598/article/details/90416984 6、你缺少输出平均值的语句；printf("第%d名同学的平均成绩为：%f\n",i+1,stu[i].ave); 修改后的程序为：  #include<stdio.h> #include<string.h> #define N 5  struct student { 	int id; 	float score[3]; 	float sum,ave; 	char name[10]; 	student(){ 		sum=0; 		ave=0; 		for(int i=0;i<3;i++) 		score[i]=0; 	} } stu[N]; int main() { 	int i,j; 	float a; 	for(i=0; i<N; i++) { 		a=0;//在这里初始化 		printf("第%d名同学的学号和姓名",i+1); 		scanf("%d,%s",&stu[i].id,&stu[i].name); 		for(j=0; j<3; j++) { 			printf("请输入%s的第%d门成绩：\n",stu[i].name,j+1); 			scanf("%f",&stu[i].score[j]); 			a=a+stu[i].score[j]; 		} 		stu[i].sum=a;//写在循环外 		stu[i].ave=stu[i].sum*1.0/3;//这里必须乘以1.0才能得到有小数的结果  		printf("第%d名同学的平均成绩为：%f\n",i+1,stu[i].ave); 	}  	return 0; }

为什么发图片呢？直接把代码粘贴上

把第一张显示代码的照片，重新拍成跟后面的一样清晰的，然后发上来吧！ 全是噪音条纹没法儿看。 目前，只能顶着闪瞎的条纹隐约看到  for循环的圆括号里面的语句，写错位了！   （1）代码里面的错误写法是  for(;i =0, i<N;i++)  应该改成  for(i =0; i<N;i++)  因为错误的写法中，循环的判断条件，也就是中间那部分，永远都是成立的，所以是死循环。 ～ （2）输入学号和姓名的时候， scanf函数的格式化字符串里面是什么，就严格按照格式输入，按照你的代码是应该输入「学号」、「逗号（英文半角）」、「姓名」这三部分的，中间的「逗号」不能用空格或者回车来代替，否则scanf接收不到期望的输入值，会产生错误。 ～ 其它部分实在看不清楚了，你先把这个改了，测试一下再说吧。 ～ 如有帮助，烦请及时结帖、给分啊！ ：-） ～

一直循环的原因找到了，没输逗号，但还是一直是第一名学生

一直循环的原因找到了，没输逗号，但还是一直是第一名学生


Question: c语言示例

一个小小的提醒：一般情况下，语句或者语句块里，都需要注意用分号来结尾，不要把语句末尾的分号遗漏了哦！  当然了，总有一些特殊的情况，偶尔也会有在花括号括起来的语句块里，不出现分号，但是也正常、合法地运行的代码。比如：  #include <stdio.h>  int main(void) { 	// if代码块中不必出现语句末尾的分号         if (printf("Hello, world!\n")) { 	}  	return 0; }   上面的代码权当是一个小玩笑吧！正式的代码，肯定不会这样写。  总之，还是想提醒一下：一般情况下，语句或者语句块里，都需要注意用分号来结尾，不要把语句末尾的分号遗漏了哦！ ～

从基础学起，加油


Question: 在线求答案 急要 谢谢

在线求人民币 急要 谢谢


EM_LINEINDEX An application sends an EM_LINEINDEX message to retrieve the character index of a line in a multiline edit control. The character index is the number of characters from the beginning of the edit control to the specified line.   EM_LINEINDEX  wParam = (WPARAM) line; // line number  lParam = 0;             // not used; must be zero    Parameters line  Value of wParam. Specifies the zero-based line number. A value of –1 specifies the current line number (the line that contains the caret).  Return Values The return value is the character index of the line specified in the line parameter, or it is –1 if the specified line number is greater than the number of lines in the edit control.   QuickInfo   Windows NT: Requires version 3.1 or later.   Windows: Requires Windows 95 or later.   Windows CE: Requires version 1.0 or later.   Header: Declared in winuser.h.  See Also Edit Controls Overview, Edit Control Messages, EM_LINEFROMCHAR


Question: C语言上#ifdef和#ifndef等宏定义为什么都不分级缩进？

引用 11 楼 JhonDao 的回复:总共说了两句话，但是一句没在正题上。回答别人的问题就好像打擦边球，似是而非。看起来说的很有道理，但其实啥也没说，你到底知不知道啊？ 悄悄告诉你，你发现了一个真相，一个 隐藏 在这个论坛的 公开 的真相！  说回帖子问题，查询了一下，个人觉得大概是两个原因，（1）历史遗留原因，（2）可读性与易分辨的综合作用原因。  （1）历史遗留原因： 远古时期（ANSI-C之前）的C编译器只认 # 位于一行的开头才是宏定义，于是形成了一种风格。尽管后来至今的 C 标准以及编译器早就允许 # 的前面、后面可以有空格，但是还是有很多人有顶格写 # 的习惯， 包括很多文本编辑器的自动缩进方案也是把宏定义的 # 调整为顶格。  （2）可读性与易分辨的综合作用原因： 诚如楼主所言，把宏定义（条件编译命令）的 #ifdef 、#else 、 #endif 等采用 整体 分层缩进的形式，可读性很好，很容易看清楚层次。 不过，就楼主贴出来的代码片段本身，实际上也是采用了分层缩进的形式的呀，只不过不是整体缩进，而是对 # 后面的内容进行缩进而已。俺以为，觉得可读性不高的原因应该是 不同习惯的人，阅读的时候有不适应的感觉吧。这个嘛，还是偏主观方面多一些吧？  另外还有一种情况是宏定义（条件编译命令）不是在文件头部，而是混合在代码中间的情况，如果不顶格而是跟随一般代码采用同样的缩进的话，宏 与 一般代码 混合在一起，才更不容易发现、阅读。比如：  #include <stdio.h>  int main()  { 	#ifdef DEBUG 	printf("debug"); 	#else 	printf("notdebug"); 	#endif 	return 0; }  和  #include <stdio.h>  int main() { #ifdef DEBUG 	printf("debug"); #else 	printf("notdebug"); #endif 	return 0; }  当然了，这第二种情况和楼主说的分层缩进可能不完全是同一个意思，权且顺便一说。  总结一下：俺个人还是觉得这个问题更大的原因在于 个人的编程风格和习惯 ，分层缩进 只要不是在远古级别的编译器里应该都不会出错，所以应该是觉得哪种更顺手、顺眼就使用了哪种吧！一家之言，仅供参考！ ～

引用 10 楼 赵4老师 的回复:[quote=引用 5 楼 赵4老师 的回复:] 代码被编译时编译宏的嵌套层次 和 代码运行时复合语句的嵌套层次 怎么能混为一谈呢？！  天仙投胎到人间前在仙班的座次 和 天仙投胎到人间后在人间的地位 怎么能混为一谈呢？！ [/quote]总共说了两句话，但是一句没在正题上。回答别人的问题就好像打擦边球，似是而非。看起来说的很有道理，但其实啥也没说，你到底知不知道啊？

引用 5 楼 赵4老师 的回复:代码被编译时编译宏的嵌套层次 和 代码运行时复合语句的嵌套层次 怎么能混为一谈呢？！  天仙投胎到人间前在仙班的座次 和 天仙投胎到人间后在人间的地位 怎么能混为一谈呢？！

编码风格，没有对错

引用 5 楼 赵4老师 的回复:代码被编译时编译宏的嵌套层次 和 代码运行时复合语句的嵌套层次 怎么能混为一谈呢？！ 1.宏定义有可能出现多层次的嵌套，并且宏定义还比较长，至少一屛显示不完。2.前面加缩进不会导致编译问题，至少我的VS2005没出现这个问题。3.结合前面两点，得出结论，宏定义中采用分层缩进会增加代码的易读性。跟什么混为一谈没什么关系。

引用 2 楼 袁君元 的回复:主要用于方便调试程序，举个简单的例子，当你程序有问题的时候，你需要通过输出中间结果来检查问题，当程序很复杂的时候，你输出的中间结果很多，最后调试正确后，你就需要把中间结果注释掉，这个时候用它的话，只需要把中间变量进行宏定义。就可以一次性把所有的中间结果注释掉。我问的是宏定义的分层缩进，你在回答宏定义的作用。

引用 1 楼 user-6 的回复:因为一般都习惯#和命令挨着写 而#必须顶格看来你没实际操作过，不清楚到底能不能这么做。

我也不知道为什么，我个人分析头文件的时候会习惯修改，加上缩进分层次。

引用 1 楼 user-6 的回复:因为一般都习惯#和命令挨着写 而#必须顶格 #必须顶格？谁说的？没这回事。难道你在#include "stdio.h"前面敲个空格就没法编译了？

因为一般都习惯#和命令挨着写 而#必须顶格


Question: c语言

C语言是本科水平

计算机专业，面试时候可能需要c语言编程。理论考试应该没有哪个专业会考某语言编程。


Question: 64位、32位系统问题

我说的是PE头，不是什么SizeOfOptionalHeader，DOS Stub接下来就是PE头，PE头的开始标记是50 45 00 00，接下来一个16位字就是machine

引用 3 楼 早打大打打核战争 的回复:最简单的方法，GetBinaryType 复杂一点，直接读PE头，第一个16位字就是Machine（CPU Type） 0x14c i386 0x14d i486 0x14e Pentium+ 0x8664 x64 还有很多，参考winnt.h  这个，表示怀疑中，pe文件的NT头里，SizeOfOptionalHeader，对于32位文件来说，它是224；对于64位文件来说，它是240

PE结构有区别 在可选头开始有一个Magic的WORD 32位和64位是不一样的

當然可以了，網上搜一下就出來：  https://blog.csdn.net/reversalc/article/details/8022977


Question: C语言编程题

指点谈不上，给你指条明路：百度一下，你就知道。 当然了，也不排除论坛里有闲得蛋疼的大神帮你把代码整整齐齐地写出来，格式调整好，双手洗干净，最后恭恭敬敬地端到你的面前。


Question: 这个错误怎么解决

谢谢您的指导，万分感谢

struct people {         char name[10];         float basedmoney;         float floatmoney;         float output;     }a[50] = {" ", .basedmoney=0, .floatmoney=0, .output=0 }; 供参考！  另外，程序还有其他问题，数组越界，即a是50个成员，循环次数使用100； 第二个问题，name是数组，却用%c格式输入/输出。  最后，建议问问题直接贴代码，发图片没问题，只是发的清晰一些的图片

麻烦你以后还是直接粘贴代码： 存在以下问题： 1、明明定义的结构体数组大小为50，怎么后面i循环到100了呢？数组越界 2、name是数组，用%s输入输出，%c只是针对单个字符 3、定义结构体数组的时候，可以不用赋值。直接写成：      struct people {         char name[10];         float basedmoney;         float floatmoney;         float output;     }a[50];


Question: 关于一个函数内五条打印的问题， 涉及性能，达人请进

打印或输出log 都不要太频繁，不然降低性能。

可以在run to complete的系统上run一下， 或者内核里面写同样的打印，试试效果。

并发和单次调用是如何写的呢，是否与多核多线程工作有关？ 另外，for循环中调用怎么写的，是否与函数调用传参，高速缓存以及IO调用方式有关？

可以通过绑核、核隔离来提升，确保不会出现cpu切换、cpu被抢占带来的耗时 引用 2 楼 szws 的回复:另外一个实验， 把5条打印， 放在for循环里， 循环1万次，  则 CPU会冲高到7%， 并且， 5条打印总耗时， 只有 13us。  恶的天啊， 为啥 相差这么大， 从197us 到 13us ？  能否始终提高 CPU的效率？ 让他一只很high的工作？

感觉是 cpu 使用率越高， 处理效率就越高

可以设置下线程为FIFO试试 引用 5 楼 szws 的回复:[quote=引用 3 楼 636f6c696e 的回复:] 可以通过绑核、核隔离来提升，确保不会出现cpu切换、cpu被抢占带来的耗时 [quote=引用 2 楼 szws 的回复:] 另外一个实验， 把5条打印， 放在for循环里， 循环1万次，  则 CPU会冲高到7%， 并且， 5条打印总耗时， 只有 13us。  恶的天啊， 为啥 相差这么大， 从197us 到 13us ？  能否始终提高 CPU的效率？ 让他一只很high的工作？[/quote]  已经绑核，没啥改变~~~[/quote]

这个就是windows分配时间片的策略啊 你的工作越忙,就越不可能CPU时间被分给其他的线程 你也可以手动提高线程的优先级

无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

引用 3 楼 636f6c696e 的回复:可以通过绑核、核隔离来提升，确保不会出现cpu切换、cpu被抢占带来的耗时 [quote=引用 2 楼 szws 的回复:] 另外一个实验， 把5条打印， 放在for循环里， 循环1万次，  则 CPU会冲高到7%， 并且， 5条打印总耗时， 只有 13us。  恶的天啊， 为啥 相差这么大， 从197us 到 13us ？  能否始终提高 CPU的效率？ 让他一只很high的工作？[/quote]  已经绑核，没啥改变~~~


Question: C语言 VS2019出现问题

说错了哈哈哈，别介意

你用C＋＋语言写程序却用C语言的去调试，肯定不行啊

test1.c改成test1.cpp 不然会按照c编译而不是c++


Question: 最近在自学c，向各位大佬求助一个程序，最好有完整的程序式，个人做做学习参考

引用 1 楼 jsx_SEVEN 的回复:没写注释  #include <stdio.h>  struct Employee { 	char ID[30]; 	char Sex[10]; 	double Salary; };  int main() { 	struct Employee emp = {"zhangsan","Man",5000}; 	printf("%s\n", emp.ID); 	printf("%s\n", emp.Sex); 	printf("%f\n", emp.Salary); }  看到性别是 Man  笑出声了～

引用 1 楼 jsx_SEVEN 的回复:没写注释  #include <stdio.h>  struct Employee { 	char ID[30]; 	char Sex[10]; 	double Salary; };  int main() { 	struct Employee emp = {"zhangsan","Man",5000}; 	printf("%s\n", emp.ID); 	printf("%s\n", emp.Sex); 	printf("%f\n", emp.Salary); }  salary建议用float就可以了。


Question: 程序编译无误但是没有显示输出

明显的野指针问题，根本就没有定义time的实体

把代码粘贴出来

引用 5 楼 袁君元 的回复：你这个定义的是结构体指针，但是这个指针系统并没有为它分配内存，就是楼上说的野指针，其实一般情况下能不用指针的地方就不用，新手很容易弄错的，你这里直接把*time改为time就可以了，把它变为一个结构体变量，然后后面用点.来访问其成员变量即可嗯嗯！！

引用 3 楼 自信男孩 的回复：野指针使用。建议在main函数内加上这两句：struct time tm; time = &tm;谢谢！！

引用 2 楼 拥抱Linux 的回复：（1）代码中 只 定义了 一个 结构体指针 struct time *time ，注意了，是指针，而不是结构体变量，所以 time 这个指针只能指向一个结构体变量。也就是说， 代码没有定义任何一个 结构体变量， 系统也就没有分配内存单元给任何一个结构体变量，指针 time 也没有指向任何一个结构体变量， 所以 「time->成员」这样的行为是非法的，会访问一个未知的内存地址，从而引发了内存访问错误。 （2）最简单的修改办法是，在main 函数中先定义一个 struct time 的变量， 然后让 指针 time 指向它，然后后面的代码就不用改了。 （3）当然了，你也可以把 time 定义的前面的 * 去掉，让这个 time 成为一个结构体变量，只不过后面的 访问成员的表达式 要把 ->运算符 改成 . 运算符，麻烦一点。谢谢！！！我知道了！！


Question: 【求助】C语言比较两个账号是否一致

if (name2[i] != '*' && name2[i] != name[i]) // not equal


Question: 萌新求助

建议用字符串的方式处理读取的内容。楼主这种方式也就用来学习，还能接受

请判断fscanf函数的返回值。

那应该怎么解决，怎么删除这一空行呢

可能是因为你文件结尾有一行空行吧


Question: 不知道能不能在这里找到人知道c语言作业。

有个简单的思路就是你直接从后往前把字符存入到新的数组里面就可以了

（1）如果要求必须在原字符数组中操作，而不能定义新的数组来赋值转移的话，就把前6个字符按第1个与第6个、第2个与第5个、第3个与第4个逐对逐次交换的办法来获得逆序存放的结果。交换变量的值，你肯定会的嘛，就不细说了。最后输出字符数组就可以看到结果了。 （2）如果可以定义一个新的字符数组的话，更简单，不需要交换操作，直接把原数组的前6个元素按6个到第1个的顺序赋值给新数组的第1个到第6个，然后把剩下的元素按同样的顺序赋值给新数组就行了。 ～


Question: C语言问题

这个9是随机值，因为你只是定义了s这个字符数组。但并没有给s这个字符数组赋值，而strlen是根据‘\0’来确定s的长度，既然你没有赋值，所以'\0'的位置不确定，因而它的长度就不确定的。

引用 2 楼 Italink的回复:我这里还输出63了，初始化一下字符串，字符串以\0为终止字符，没有初始化的话，会访问字符串外的数据 ，直到访问到\0  # include"stdio.h" # include"string.h" void part(char* s) { 	printf("%d", strlen(s)); } int main() { 	char s[50]=""; 	part(s); }  嗯，谢谢，懂了       ！

引用 1 楼 user-3的回复:不初始化你想要什么结果？ strlen遇到\0就截止了啊，任何结果都有可能 我还以为有什么特殊含义呢！原来是垃圾值，我说怎么连字符串都没输入，怎么有结果呢！谢谢

不初始化你想要什么结果？ strlen遇到\0就截止了啊，任何结果都有可能


Question: 求教c语言基础题

引用 3 楼 诉说丶淡黑色的回复:double吧，double 的等级比int高，int会向double转换 好像强制类型转换会把后边转换成int

对，我看错了

应该是C了，注意一下强制类型转换，把后面的看成int，前面char转int，所以最后是int

int，C，(int)强制转换

C 呀。如果你确定不了，就用 sizeof（w*x+(int)(z-y)）看看，结果为4就是int。 如果非要说4字节也有可能是unsigned int，我有办法验证这个常量是int还是unsigned，前提是你需要的话。

引用 楼主 weixin_44091029 的回复:char w;int x;float y;double z；则表达式w*x+(int)(z-y)的结果类型为（） A。float   B。char  C。int D。double (int)(z-y)中无论（z-y）转成什么类型最后都被int强制截断 所以C

选择C int类型

应该是C，int型。 （1）隐式类型转换，也叫自动类型转换，纯粹由编译器自主完成，转换的方向是从小的数据类型向大的数据类型转换。 （2）显式类型转换，也叫强制类型转换，是由用户（程序员 / 代码）主动发起的类型转换行为，转换的方向与隐式类型转换正好相反：从大的数据类型向小的数据类型转换，否则也没必要进行显式转换了。 ～

选C；原因如下： w*x中w是char型，x是int型，当char型变量用于运算的时候，一般都是用字符对应的ASCII码值参与运算的，而ASCII码值是int型，所以w*x也是int型； (int)(z-y)是把z-y的计算结果强制转化为int型。 所以最终结果是int型

double吧，double 的等级比int高，int会向double转换

引用 1 楼 hzh_Beyond的回复:第一眼看过去，C 我也觉得是C但是室友说肯定是D，互相说服不了所以来问问大家

第一眼看过去，C


Question: 菜鸡一枚，请大佬们帮下忙

知道为什么没人回答你的问题吗？因为别人没义务帮你做作业，原则上说，我也不应该帮。但愿你只是不会，而不是不愿意动手  #include<stdio.h> #define  MAX 100 void assign(int a[], int len) { 	for (int i = 0; i < len; i++) 		scanf("%d", &a[i]); } int max(int a[], int len) { 	int max_value = a[0]; 	for (int i = 1; i < len; i++) 		if (a[i] > max_value) 			max_value = a[i]; 	return max_value; }int min(int a[], int len) { 	int value = a[0]; 	for (int i = 1; i < len; i++) 		if (a[i] < value) 			value = a[i]; 	return value; } int main(){ 	int a[MAX]; 	int len = 5;	//假设长度为5 	assign(a, len); 	printf("max = %d\n", max(a, len)); 	printf("min = %d\n", min(a, len)); 	return 0; }


Question: 求助，

引用 12 楼 Just、一缕阳光 的回复:[quote=引用 11 楼 袁君元的回复:]哦，原来是这样，那只需要把我的程序稍作修改就可以，加一个输入测试数据的个数就可以了，这个就交给楼主自己加了，顺便锻炼一个楼主 多谢大佬们精彩纷呈的指点，你的代码的确很好，受教了。但是我还是想弱弱的问一句，对于我自己的代码，为什么在如下这个代码的判断中，当a不是b的子列时，还能将b赋给c。 if(a[k][i]!=b[k][j]){          j++; }else{ c[k][i]=b[k][j]; i++,j++;  ｝[/quote]  你这个程序从输入就有问题，你先自己调试一下！

引用 6 楼 自信男孩 的回复:[quote=引用 5 楼 袁君元 的回复:] [quote=引用 4 楼 自信男孩 的回复:] [quote=引用 3 楼 袁君元 的回复:] 本题的思路：将s从开始字符逐次在t中查询，找到了要标记一下位置j 把j+1赋值给flag(表示t进行下一次比对的起始位置)，这样下次查找的时候就从标志位开始查找。这样就能保证s中的字符在t中的相对顺序一致，这样就可以不用考虑这个子串到底是通过增加字符还是减少字符得到的。这个是字符串处理中的技巧。 有什么不懂的可以问哦！ 附上完整的代码和注释：  #include<iostream> #include<cstring> using namespace std; int check(string t,int lent,string s,int lens) { 	int flag=0;//设置找到的标记位。 	int i,j; 	for(i=0; i<lens; i++) { 		for(j=flag; j<lent; j++) { 			if(s[i]==t[j]){ 				flag=j+1;//记录好标志位。下一次就从t的下一位开始找  				break;//跳出内层循环，又把s的下一个字符拿出来比较。  			} 		} 		if(j==lent){//全部都遍历了t的字符都没有找到。就可以说明它不是子串了。  		return 0; 		break; 		}  	} 	return 1; 	 } int main() { 	string s,t; 	while(cin>>s>>t) { 		int lens=s.length(); 		int lent=t.length(); 		int ans=check(t,lent,s,lens); 		if(ans==1) 			cout<<"Yes"<<endl; 		else 			cout<<"No"<<endl; 	} 	return 0; }  建议先测试一下，看是否满足条件，比如： sequence, subsequence（这个输入输出的是No，我想应该输出Yes吧）[/quote]  我这输出是正确的呀，就是输出的Yes，你在哪里运行出来是No了？？？     [/quote]  这个是我粘贴你的代码，然后测试之后输出的： sequence subsequence No person compersion No [/quote] 代码没问题，我是用楼主的测试用例测试你的代码，但是你的代码没有输入个数的，所以会有问题

引用 6 楼 自信男孩 的回复：[quote=引用 5 楼 袁君元 的回复:] [quote=引用 4 楼 自信男孩 的回复:] [quote=引用 3 楼 袁君元 的回复:] 本题的思路：将s从开始字符逐次在t中查询，找到了要标记一下位置j 把j+1赋值给flag(表示t进行下一次比对的起始位置)，这样下次查找的时候就从标志位开始查找。这样就能保证s中的字符在t中的相对顺序一致，这样就可以不用考虑这个子串到底是通过增加字符还是减少字符得到的。这个是字符串处理中的技巧。 有什么不懂的可以问哦！ 附上完整的代码和注释：  #include<iostream> #include<cstring> using namespace std; int check(string t,int lent,string s,int lens) { 	int flag=0;//设置找到的标记位。 	int i,j; 	for(i=0; i<lens; i++) { 		for(j=flag; j<lent; j++) { 			if(s[i]==t[j]){ 				flag=j+1;//记录好标志位。下一次就从t的下一位开始找  				break;//跳出内层循环，又把s的下一个字符拿出来比较。  			} 		} 		if(j==lent){//全部都遍历了t的字符都没有找到。就可以说明它不是子串了。  		return 0; 		break; 		}  	} 	return 1; 	 } int main() { 	string s,t; 	while(cin>>s>>t) { 		int lens=s.length(); 		int lent=t.length(); 		int ans=check(t,lent,s,lens); 		if(ans==1) 			cout<<"Yes"<<endl; 		else 			cout<<"No"<<endl; 	} 	return 0; }  建议先测试一下，看是否满足条件，比如： sequence, subsequence（这个输入输出的是No，我想应该输出Yes吧）[/quote]  我这输出是正确的呀，就是输出的Yes，你在哪里运行出来是No了？？？     [/quote]  这个是我粘贴你的代码，然后测试之后输出的： sequence subsequence No person compersion No [/quote]同样的代码运行出不同的结果，难道有鬼

引用 6 楼 自信男孩 的回复：[quote=引用 5 楼 袁君元 的回复:] [quote=引用 4 楼 自信男孩 的回复:] [quote=引用 3 楼 袁君元 的回复:] 本题的思路：将s从开始字符逐次在t中查询，找到了要标记一下位置j 把j+1赋值给flag(表示t进行下一次比对的起始位置)，这样下次查找的时候就从标志位开始查找。这样就能保证s中的字符在t中的相对顺序一致，这样就可以不用考虑这个子串到底是通过增加字符还是减少字符得到的。这个是字符串处理中的技巧。 有什么不懂的可以问哦！ 附上完整的代码和注释：  #include<iostream> #include<cstring> using namespace std; int check(string t,int lent,string s,int lens) { 	int flag=0;//设置找到的标记位。 	int i,j; 	for(i=0; i<lens; i++) { 		for(j=flag; j<lent; j++) { 			if(s[i]==t[j]){ 				flag=j+1;//记录好标志位。下一次就从t的下一位开始找  				break;//跳出内层循环，又把s的下一个字符拿出来比较。  			} 		} 		if(j==lent){//全部都遍历了t的字符都没有找到。就可以说明它不是子串了。  		return 0; 		break; 		}  	} 	return 1; 	 } int main() { 	string s,t; 	while(cin>>s>>t) { 		int lens=s.length(); 		int lent=t.length(); 		int ans=check(t,lent,s,lens); 		if(ans==1) 			cout<<"Yes"<<endl; 		else 			cout<<"No"<<endl; 	} 	return 0; }  建议先测试一下，看是否满足条件，比如： sequence, subsequence（这个输入输出的是No，我想应该输出Yes吧）[/quote]  我这输出是正确的呀，就是输出的Yes，你在哪里运行出来是No了？？？     [/quote]  这个是我粘贴你的代码，然后测试之后输出的： sequence subsequence No person compersion No [/quote]好奇怪哦，我也是直接运行的我的代码，结果是正确的。那个break确实多余了，可以去掉

if(j==lent){//全部都遍历了t的字符都没有找到。就可以说明它不是子串了。          return 0;         break;         }  这个代码中的break是冗余的代码，不会执行到break,return就直接跳出函数了。

引用 5 楼 袁君元 的回复:[quote=引用 4 楼 自信男孩 的回复:] [quote=引用 3 楼 袁君元 的回复:] 本题的思路：将s从开始字符逐次在t中查询，找到了要标记一下位置j 把j+1赋值给flag(表示t进行下一次比对的起始位置)，这样下次查找的时候就从标志位开始查找。这样就能保证s中的字符在t中的相对顺序一致，这样就可以不用考虑这个子串到底是通过增加字符还是减少字符得到的。这个是字符串处理中的技巧。 有什么不懂的可以问哦！ 附上完整的代码和注释：  #include<iostream> #include<cstring> using namespace std; int check(string t,int lent,string s,int lens) { 	int flag=0;//设置找到的标记位。 	int i,j; 	for(i=0; i<lens; i++) { 		for(j=flag; j<lent; j++) { 			if(s[i]==t[j]){ 				flag=j+1;//记录好标志位。下一次就从t的下一位开始找  				break;//跳出内层循环，又把s的下一个字符拿出来比较。  			} 		} 		if(j==lent){//全部都遍历了t的字符都没有找到。就可以说明它不是子串了。  		return 0; 		break; 		}  	} 	return 1; 	 } int main() { 	string s,t; 	while(cin>>s>>t) { 		int lens=s.length(); 		int lent=t.length(); 		int ans=check(t,lent,s,lens); 		if(ans==1) 			cout<<"Yes"<<endl; 		else 			cout<<"No"<<endl; 	} 	return 0; }  建议先测试一下，看是否满足条件，比如： sequence, subsequence（这个输入输出的是No，我想应该输出Yes吧）[/quote]  我这输出是正确的呀，就是输出的Yes，你在哪里运行出来是No了？？？     [/quote]  这个是我粘贴你的代码，然后测试之后输出的： sequence subsequence No person compersion No

引用 4 楼 自信男孩 的回复:[quote=引用 3 楼 袁君元 的回复:] 本题的思路：将s从开始字符逐次在t中查询，找到了要标记一下位置j 把j+1赋值给flag(表示t进行下一次比对的起始位置)，这样下次查找的时候就从标志位开始查找。这样就能保证s中的字符在t中的相对顺序一致，这样就可以不用考虑这个子串到底是通过增加字符还是减少字符得到的。这个是字符串处理中的技巧。 有什么不懂的可以问哦！ 附上完整的代码和注释：  #include<iostream> #include<cstring> using namespace std; int check(string t,int lent,string s,int lens) { 	int flag=0;//设置找到的标记位。 	int i,j; 	for(i=0; i<lens; i++) { 		for(j=flag; j<lent; j++) { 			if(s[i]==t[j]){ 				flag=j+1;//记录好标志位。下一次就从t的下一位开始找  				break;//跳出内层循环，又把s的下一个字符拿出来比较。  			} 		} 		if(j==lent){//全部都遍历了t的字符都没有找到。就可以说明它不是子串了。  		return 0; 		break; 		}  	} 	return 1; 	 } int main() { 	string s,t; 	while(cin>>s>>t) { 		int lens=s.length(); 		int lent=t.length(); 		int ans=check(t,lent,s,lens); 		if(ans==1) 			cout<<"Yes"<<endl; 		else 			cout<<"No"<<endl; 	} 	return 0; }  建议先测试一下，看是否满足条件，比如： sequence, subsequence（这个输入输出的是No，我想应该输出Yes吧）[/quote]  我这输出是正确的呀，就是输出的Yes，你在哪里运行出来是No了？？？

引用 11 楼 袁君元的回复:哦，原来是这样，那只需要把我的程序稍作修改就可以，加一个输入测试数据的个数就可以了，这个就交给楼主自己加了，顺便锻炼一个楼主 多谢大佬们精彩纷呈的指点，你的代码的确很好，受教了。但是我还是想弱弱的问一句，对于我自己的代码，为什么在如下这个代码的判断中，当a不是b的子列时，还能将b赋给c。 if(a[k][i]!=b[k][j]){          j++; }else{ c[k][i]=b[k][j]; i++,j++;  ｝

引用 3 楼 袁君元 的回复:本题的思路：将s从开始字符逐次在t中查询，找到了要标记一下位置j 把j+1赋值给flag(表示t进行下一次比对的起始位置)，这样下次查找的时候就从标志位开始查找。这样就能保证s中的字符在t中的相对顺序一致，这样就可以不用考虑这个子串到底是通过增加字符还是减少字符得到的。这个是字符串处理中的技巧。 有什么不懂的可以问哦！ 附上完整的代码和注释：  #include<iostream> #include<cstring> using namespace std; int check(string t,int lent,string s,int lens) { 	int flag=0;//设置找到的标记位。 	int i,j; 	for(i=0; i<lens; i++) { 		for(j=flag; j<lent; j++) { 			if(s[i]==t[j]){ 				flag=j+1;//记录好标志位。下一次就从t的下一位开始找  				break;//跳出内层循环，又把s的下一个字符拿出来比较。  			} 		} 		if(j==lent){//全部都遍历了t的字符都没有找到。就可以说明它不是子串了。  		return 0; 		break; 		}  	} 	return 1; 	 } int main() { 	string s,t; 	while(cin>>s>>t) { 		int lens=s.length(); 		int lent=t.length(); 		int ans=check(t,lent,s,lens); 		if(ans==1) 			cout<<"Yes"<<endl; 		else 			cout<<"No"<<endl; 	} 	return 0; }  建议先测试一下，看是否满足条件，比如： sequence, subsequence（这个输入输出的是No，我想应该输出Yes吧）

#include<stdio.h> #include <stdlib.h> #include <string.h>  #define MAX_COL_SZ  80  int main(void) { #if 1      int n, i, j;     char **src_str, **sub_str, *tmp_str;      scanf("%d", &n);      src_str = (char **)malloc(n * sizeof(char *));     if (!src_str)         return -1;     for (i = 0; i < n; i++) {         src_str[i] = (char *)malloc(sizeof(char) * MAX_COL_SZ);         if (!src_str[i]) {             for (j = 0; j < i; j++)                 free(src_str[j]);             free(src_str);             return -1;         }     }      sub_str = (char **)malloc(n * sizeof(char *));     if (!sub_str)         return -1;     for (i = 0; i < n; i++) {         sub_str[i] = (char *)malloc(sizeof(char) * MAX_COL_SZ);         if (!sub_str[i]) {             for (j = 0; j < i; j++)                 free(sub_str[j]);             free(sub_str);             return -1;         }     }      for (i = 0; i < n; i++)         scanf("%s%s", sub_str[i], src_str[i]);      for (i = 0; i < n; i++) {         tmp_str = src_str[i];         for (j = 0; sub_str[i][j]; j++) {             if ((tmp_str = strchr(tmp_str, sub_str[i][j])) == NULL)                 break;         }         if (sub_str[i][j] == '\0')             printf("Yes\n");         else             printf("No\n");     }  #else     int t,k,f,i,j,A;     scanf("%d",&t);     char a[t][100],b[t][100],c[t][100];      for(i=0;i<t;i++){         //scanf("%s%s",&a[i],&b[i]);         scanf("%s%s", a[i], b[i]);    //remove the signal '&'         c[i][0]='\0';     }         for(k=0;k<t;k++){         A=0;         for(i=0,j=0;a[k][i]!='\0';){             if(a[k][i]!=b[k][j]){                 j++;             }else{                 c[k][i]=b[k][j];                 i++,j++;             }         }            for(i=0;a[k][i]!='\0';i++){             if(c[k][i]!=a[k][i]){                 A=1;break;             }         }          if(A==1)printf("No\n");         else printf("Yes\n");       } #endif     return 0; }   char **alloc_mem(int row, int col) {     char **str;     int i, j;      str = (char **)malloc(row * sizeof(char *));     if (!str)         return NULL;     for (i = 0; i < row; i++) {         str[i] = (char *)malloc(sizeof(char) * col);         if (!str[i]) {             for (j = 0; j < i; j++)                 free(str[j]);             free(str);             return NULL;         }     }      return str; }  供参考～ 建议使用库函数能让代码更简单一些

我也是一个新手，学到的知识也不是很多，我就从我的角度看了看，说错了什么请忽略😄 1.在定义a,b,c数组时应该用动态内存分配，原因好像是给数组分配空间时是在预编译时做的，此时还没有输入t，所以会出错 2.a和b是二维数组，所以a[i]是一维数组，它本身就是一个地址，指向a[i][0]，所以不需要& 3.因为是在b中找a中的元素，所以肯定是b先结束，所以比较时应该判断b 4.比较a和c时，可以用strcmp函数，它包含在string.h头文件中，是用来比较数组的，相等的话会返回0 5.注意格式，保持锯齿状，方便看 其他的好像没问题，反正我是看不出来了😂


Question: 求助!用c语言写一个超市管理系统要用到哪些东西？很急，在线等！

引用 1 楼 老马何以识途的回复:c做這种應用有點費勁啊，你需要連接一個數據庫，在數據庫做增刪改查的操作 但是我们只学了c语言，老师让写的大作业

c做這种應用有點費勁啊，你需要連接一個數據庫，在數據庫做增刪改查的操作


Question: 教一下怎么做，谢谢！用c语言

引用 3 楼 bin_shuaiwang 的回复：[quote=引用 2 楼 袁君元的回复:]这道题很简单，思路如下： 1、计算出第一个a...a（共n个a）的值，因为是在它的基础上进行减法的，所以它就作为初始值；这个计算其实就用一个for循环就可以得出。 2、由于后面每一个数的变化规律就是在前一个数的基础上少一位，这有个技巧，可以直接用/10的方法得到，因为程序中的除以10可以起到去掉最后一位的效果，这样就可以实现这种规律变化 3、最后在for循环中实现减法就可以了。有什么不懂再问哦！ 完整的代码和重要的标注如下：  #include<iostream> using namespace std; int main() { 	int a,n,i; 	scanf("%d%d",&a,&n); 	int result=0;//存储结果,初始化 	for(i=0; i<n; i++) { 		result=result*10+a; //计算a...a(共n个a）的值 	} 	int temp=result;//存储result的值 	for(i=0; i<n-1; i++) { 		temp=temp/10;  //存储下一个数 		result=result-temp; 	} 	printf("%d\n",result); 	return 0; }  看了你的代码后我知道怎么做了，谢谢[/quote]这里都是干货哦

引用 2 楼 袁君元的回复:这道题很简单，思路如下： 1、计算出第一个a...a（共n个a）的值，因为是在它的基础上进行减法的，所以它就作为初始值；这个计算其实就用一个for循环就可以得出。 2、由于后面每一个数的变化规律就是在前一个数的基础上少一位，这有个技巧，可以直接用/10的方法得到，因为程序中的除以10可以起到去掉最后一位的效果，这样就可以实现这种规律变化 3、最后在for循环中实现减法就可以了。有什么不懂再问哦！ 完整的代码和重要的标注如下：  #include<iostream> using namespace std; int main() { 	int a,n,i; 	scanf("%d%d",&a,&n); 	int result=0;//存储结果,初始化 	for(i=0; i<n; i++) { 		result=result*10+a; //计算a...a(共n个a）的值 	} 	int temp=result;//存储result的值 	for(i=0; i<n-1; i++) { 		temp=temp/10;  //存储下一个数 		result=result-temp; 	} 	printf("%d\n",result); 	return 0; }  看了你的代码后我知道怎么做了，谢谢

#include <stdio.h>  int main() { 	int n = 0; 	int a = 0; 	int rezult = 0; 	int temp = 0;		//计算用到的临时变量 	int arr[10] = { NULL }; 	int i = 0;			//控制循环变量 	printf("请输入a的值：\n"); 	scanf("%d", &a); 	printf("请输入n的值：\n"); 	scanf("%d", &n); 	for( i = 0 ; i < n ; i++){ 		arr[i] = a; 		rezult = rezult * 10 + arr[i]; 	}  	while (n != 1) { 		temp = 0; 		for (i = 1; i < n; i++) { 			temp = temp * 10 + arr[i]; 		} 		rezult -= temp;  		n--; 	}  	printf("rezult = %d\n", rezult); 	return 0; }  好像写的很麻烦，但是问题解决掉了~


Question: 作为一个C语言小白，计算 PI/4 = 1 - 1/3 + 1/5 - 1/7 +...，直到最后一项小于 10 负 6 次方

题目要求最后一项小于10负6次方，你的程序中没有加该条件，由于最后一项前面的符号可能是+，也可能是减。所以它的条件应该写为： -1e-6<1.0/(i*j) && 1.0/(i*j)<1e-6，修改后的代码为：  #include <stdio.h> int main() {     double pi=0.0,i=1.0,j=1.0;       for(;i<1000000.0;i=i+2.0,j=-j)     {         if (-1e-6<1.0/(i*j) && 1.0/(i*j)<1e-6) break;         pi = pi+(1.0/(i*j));     } pi = pi*4; printf("%lf\n",pi);//注意这里是%lf，而不是%fl     return 0; }

#include <stdio.h> int main() {     double pi=0.0,i=1.0,j=1.0;      for(;i<1000000.0;i=i+2.0,j=-j)     {         if (-1e-6<1.0/(i*j) && 1.0/(i*j)<1e-6) break;         pi = pi+(1.0/(i*j));     }     printf("%.6lf\n",pi);     printf("%.6lf\n",pi*4.0);     return 0; } //0.785398 //3.141591 //


Question: 用easyX写了个小软件，vs下一开始debug可以，换成release就不行了，现在debug也不行了

引用 6 楼 ooolinux的回复:用相对路径。十个字。。 没事，我自己查查吧，，，，，，，，

引用 6 楼 ooolinux的回复:用相对路径。十个字。。 怎么用呀。。。。。。。。。。

用相对路径。十个字。。

引用 1 楼 老马何以识途 的回复:這樣很難幫到你，不如你貼一些報錯信息和關鍵代碼 szName是已经用_getcwd获取过了

引用 1 楼 老马何以识途 的回复:這樣很難幫到你，不如你貼一些報錯信息和關鍵代碼 它没有报错，就是不能运行了。其实是这样的，我不会用vs添加资源，所以就一直用easyX里的loadimage手动添加路径加载图片，现在写好了其实没问题，但是才想起来别人电脑上不好找路径了。现在就是想用_getcwd来获取目录路径，然后打开图片（其中char*转TCHAR*也弄得很头疼），但是用这个方法程序就无法运行了，也不知道为什么，部分代码我贴在下面了，其他部分本来都可以正常运行的

引用 2 楼 赵4老师 的回复:建议换GDI或MFC或Qt 初学者啊，以后肯定会去学的，但目前这个东西已经写了一个多礼拜了，抛弃实在舍不得

建议换GDI或MFC或Qt

這樣很難幫到你，不如你貼一些報錯信息和關鍵代碼

strcat(szName, name).  //前后顺序错误。

你好像用錯strcat了，這個函數是把第二個參數添加到第一個參數的末尾，另外要留意第一個參數的空間，避免溢出。

你这个肯定是路径不对 首先你可以获取本身exe所在目录 然后拼接一个相对路径来引用那些图片文件,就不会有问题了


Question: cpp第一章的编程练习，各位大佬给我看看有没有错呗？

引用 1 楼 袁君元 的回复:程序设计还可以输出用户输入的英寸值等于多少厘米 更改答案，程序设计，可以在程序里打印一句话提醒用户输入英寸值，之后根据用户输入的英寸值计算出厘米值并输出到屏幕上。 谢谢大佬指导

程序设计还可以输出用户输入的英寸值等于多少厘米


无法解决你的问题，你还是先看一下你的编译器

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

死循环了，建议检查两个break，条件是否会满足。另外，p和n的值都没有找到变化指出。另外，p = i/2;那么p是0，因为i为0.

你的fun函数中i的外层循环是个死循环，应该给i加一个条件


Question: c 地址变量

引用 2 楼 user-8 的回复:void *啊 需要用什么数据类型就强转 Thanks.

地址就是指针，&a是指针常量，int *p，p的指针变量，你说的地址变量就是指针变量吧，指向的数据类型不定的话，你可以用void *p，这样p可指向任何地方，与其他类型地址运算可自动转换类型，你也可以手动转。 比如  #include <stdio.h> int main() { 	int a=5; 	double b=7; 	void *p=&a; 	printf("%d ",*(int*)p);		//将指针强制转换为int*型再访问  	p=&b; 	printf("%f ",*(double*)p); 	return 0; }  void*指针用得最多的地方是函数形参，这样不管传什么类型的指针都能接收。

如果是函数调用时，想用不同类型的参数实例化，可以用类模板 template <class T> //T为类型的别名  #include<iostream> using namespace std; template <class T> T add(T& left, T& right) { 	return left + right; }  int main() { 	int a = 3, b = 2; 	double c = 5.0, d = 1.0; 	printf("%d\n",add(a, b)); 		printf("%lf\n",add(c, d)); }

使用malloc为一个数据类型创建一块内存再保存数据你就明白了

不确定类型，那么怎么知道应该给分配多少内存呢？

先用空类型，后续再转换类型

引用 2 楼 user-8 的回复:void *啊 需要用什么数据类型就强转

其實char *應該都可以，它只要指向一個字節的地址就夠了，只要保證有足夠的連續空間存放不同的數據類型。

void *啊 需要用什么数据类型就强转

引用 楼主 benny.xuthus的回复:可否定义一个地址变量，该地址指向的地方数据类型不定。 int ? ... ...


Question: 笔记-筛选法找素数

Finding prime numbers - Kenneth Haugland  Different schemas for finding prime numbers explained with code http://www.codeproject.com/Articles/429694/Finding-prime-numbers

所以你只是来秀一段代码而不是提问？

引用 1 楼 user-2的回复:所以你只是来秀一段代码而不是提问？ 我只是来记录一下而已


Question: 孤何罪之有？蒙圈了

引用 3 楼 lin5161678 的回复:[quote=引用 2 楼 拥抱Linux 的回复:]  （3）scanf里面的格式符直接用%d就行，不需要%3d，没有任何作用。输出的时候才起作用。for循环的右花括号的后面也不需要分号了，当然，加了也不会错，只是不必要。 %3d 当然有作用了 加了会不会出错看逻辑了  这里说求和没限制取值范围  如果输入  1234 %3d 只会读取到 123  后面的 4 会被下一个scanf处理  [/quote] 哦，是的，你提到的这样的情况确实起作用，是俺上面的说法简单化、片面了。 刚才一连看到数组的两个3，再加上这个3，直觉认为楼主把这3个3联系在一起了，所以说不起作用，也许只是俺的直觉失误。主观还是想表达这里不需要%3d，而且这个%3d的3和数组的行列长度3没关系，直接用%d就行。

程序要求是输入9个，输入6个后程序会继续等待你的输入

1. 3*3=9，就是要输入9个数字 2. 求和算法也不对，也应该用两层循环

引用 2 楼 拥抱Linux 的回复:（3）scanf里面的格式符直接用%d就行，不需要%3d，没有任何作用。输出的时候才起作用。for循环的右花括号的后面也不需要分号了，当然，加了也不会错，只是不必要。 %3d 当然有作用了 加了会不会出错看逻辑了  这里说求和没限制取值范围  如果输入  1234 %3d 只会读取到 123  后面的 4 会被下一个scanf处理

看上去没毛病啊！ （1）只能输入6个数字吗？ 再怎么输入，都输入不了了吗？很奇怪啊！看代码应该是可以输入9个数字的呀！再试试输入9个数字看看。 （2）要输出sum的结果的话，肯定要先输入9个数字，程序才会运行到下面去！ （3）scanf里面的格式符直接用%d就行，不需要%3d，没有任何作用。输出的时候才起作用。for循环的右花括号的后面也不需要分号了，当然，加了也不会错，只是不必要。 （4）如果sum是计算数组中所有数字的求和结果的话，还是跟上面的输入部分一样，用两个循环来做。 （5）你的IDE太老旧了，建议你可以试试vscode这段轻量级的文本编辑器，安装插件之后就可以变身为IDE了，很强大！具体配置C语言的编译、运行过程，可以百度一下。推荐一篇文章给你看看，虽然文章说的是在linux平台下的操作，但是vscode本身是跨平台软件，所以内容基本都是一样的。配置vscode调试C程序 （6）另外，附赠你上面的程序的参考代码如下：  #include <stdio.h>  int main(void) { 	int a[3][3]; 	int sum = 0; 	for (int i = 0; i < 3; i++) { 		for (int j = 0; j < 3; j++) { 			scanf("%d", &a[i][j]); 			sum += a[i][j]; 		} 	} 	printf("sum = %d\n", sum);                  char done[10];         scanf("%s",done);  	return 0; }

求和不对，你是a[i][i]

1、你这个输出的结果第一行就是乱码的，不知道是不是你的编译器有问题。 2、你输入数组元素的scanf不要设置为%3d，一般情况下scanf是不需要设置格式控制的，除非有特殊要求。 3、你的sum并不是计算的每一行之和，你写的是计算对角线上的数之和，可以用一个sum[10]的数组来存储每一行数之和，在这之前把sum数组的值初始化为0，循环改为: for(i=0;i<3;i++) for(j=0;j<3;j++) sum[i]+=a[i][j]; 然后输出sum数组的值即可


Question: 这份代码为什么Output Limit Exceeded

估计是while循环的结束条件和题目的隐含要求不一致。 （1）题目里面没说输入的数据如何结束，应该不是以两个0来结束输入，应该是以文件结束符EOF来结束输入的吧，毕竟这种题库都是自动从内部文件读入输入数据来进行测试的。你可以试试把while循环的条件改成下面这样：  while(scanf("%d%d",&n,&m)  != EOF)  （2）题目说， n <= 100 ，所以 数组 a 的长度至少应该也是100吧。 （3）题目说，如果最后不足m个，则以实际数量求平均值，意思还是要对最后的不足m个的数字求平均值。 （4）如果 n <= m 的话，输出结果应该也是平均值而不应该是总和哦。 （5）不知道需不需要考虑 n 为 0 的情况。

//while(scanf("%d%d",&n,&m) && n!=0&&m!=0){    3     while(scanf("%d%d",&n,&m)==2 && n!=0&&m!=0){   2     |   if (n >= 99)    //防止越界   1     |   |   n = 99; 11      |   for(i=0;i<n;i++){                                                                                1     |   |   a[i]=(i+1)*2;   2     |   }      改成这样？

引用有一个长度为n ( n ≤ 100 ) 的数列  int a[99];  达到最大长度会越界

引用Input 输入数据有多组，每组占一行，包含两个正整数n和m，n和m的含义如上所述。 没说 0 0 结束

引用 1 楼 user-4 的回复:题目要求的输入输出是分开的，而你的代码是一行输入一行输出这个没问题

题目要求的输入输出是分开的，而你的代码是一行输入一行输出


Question: 可视化界面

显示大于32767行数据对应的折线图VC源代码 https://download.csdn.net/download/zhao4zhong1/7610833 4楼的试试用qt、duilib、mfc、wpf、winform、javascript、……实现一下同样功能。 就能理解我上贴说的话了。

引用 4 楼 轻箬笠 的回复:赵老师提供的方法可行，也是我深恶痛绝的。我宁愿换个方式，比如qt、duilib、mfc等等 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George  前微软C#编辑器的开发主管Jay Bazuzi列出的一些有助于找到正确方向的问题；他觉得前同事们应该用这些问题来问自己；实际上不管在哪里工作的开发者们都应该经常问问自己这些问题： ◆“要保证这个问题不会再出现，我该怎么做？” ◆“要想少出些Bug，我该怎么做？” ◆“要保证Bug容易被修复，我该怎么做？” ◆“要保持对变化的快速响应，我该怎么做？” ◆“要保证我的软件的运行速度，我该怎么做？” 如果大多数团队都能不时问一下自己，必定会从中得益，因为这些都是真正强而有力的问题。

#pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {     PAINTSTRUCT ps;     HDC hdc;     HFONT hfont,ohfont;     RECT r;     COLORREF oc;      switch(message) {     case WM_CLOSE://按Alt+F4退出         PostQuitMessage(0);         break;     case WM_PAINT:         BeginPaint(hWnd, &ps);         hdc = ps.hdc; // the device context to draw in         GetClientRect(hWnd, &r); // Obtain the window's client rectangle         hfont = CreateFont(200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体");         ohfont=(HFONT)SelectObject(hdc,hfont);         oc=SetTextColor(hdc,0x00C080FF);         SetBkMode(hdc, TRANSPARENT);         TextOut(hdc,r.left+r.right/2-600, r.top+r.bottom/2-100,"最短画图程序",12);         SelectObject(hdc,ohfont);         SetTextColor(hdc,oc);         DeleteObject(hfont);         EndPaint(hWnd, &ps);         break;     default:         return DefWindowProc(hWnd, message, wParam, lParam);     }     return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {     MSG msg             = {0};     WNDCLASS wc         = {0};     HBRUSH hbrh;     hbrh=CreateSolidBrush(0x00000000);     wc.lpfnWndProc      = WndProc;     wc.hInstance        = hInstance;     wc.hbrBackground    = hbrh;     wc.lpszClassName    = "minwindowsapp";     wc.hCursor          = LoadCursor(NULL,IDC_ARROW);     if (0==RegisterClass(&wc)) return 1;      if (NULL==CreateWindow(wc.lpszClassName,                         "Minimal Windows Application",                         WS_POPUP|WS_VISIBLE,                         0,                         0,                         GetSystemMetrics(SM_CXSCREEN),                         GetSystemMetrics(SM_CYSCREEN),                         0,                         0,                         hInstance,                         NULL))         return 2;      while( GetMessage( &msg, NULL, 0, 0 ) > 0 ) {         DispatchMessage( &msg );     }     DeleteObject(hbrh);     return 0; }

Qt不错呀，跨平台，信号与槽的用起来也是很舒服 这是我写的一个demo  楼主可以参考：https://blog.csdn.net/pyuxing/article/details/82903767

谢谢啊 但是我现在啥也不懂 慢慢学吧

EasyX比较简单，但是学习简单的东西也需要时间，还不如多花点时间，学一个功能比较强大的GUI，比如QT


Question: C代码报错

你自己看看，贴的代码能看么。。。 用论坛里自带的插入代码来贴代码吧

#include<stdio.h>#include<string.h>#include<stdlib.h>int i = 0;int q = 0;int p;struct yonghu{	char name[100];	char password[7];	int money;	int user;};yonghu a[1000];void zhujiemian(){	printf("欢迎进入ATM管理系统。\n");	printf("按任意键继续。\n");	getchar();	system("cls");	printf("1.用户注册。\n");	printf("2.用户登录。\n");	printf("3.退出系统。\n");}void zhujiemian1(){	system("cls");	printf("1.用户注册。\n");	printf("2.用户登录。\n");	printf("3.退出系统。\n");}void zhuce(){	system("cls");	printf("请输入注册用户名。\n");	scanf("%s",&a[i].name);	printf("请输入密码。\n");	scanf("%s",&a[i].password);	printf("请输入开户金额\n");	scanf("%d",&a[i].money);	a[i].user = 10000 + i;	printf("注册完成。\n\n");	printf("用户信息如下；\n");                printf("%s 姓名\n%d账号\n%d开户金额\n",a[i].name,a[i].user,a[i].money);	i++;}void denglu(){	system("cls");	int hao;	char mima[7];	int j, k, m = 1;	for (k = 1; k <= 3; k++)	{		printf("请输入账号：");		scanf("%d",&hao);		for (j = 0; j <= i; j++)		{			if (hao == a[j].user)			{				m = 0;				p = j;				break;			}		}		if (m == 1 && k != 3)		{			system("cls");			printf("账号错误，剩余输入机会%d\n：",3 - k);		}		else if (m == 0)		{			break;		}		else if (m == 1 && k == 3)		{			q = 1;			break;		}	}	for (k = 1; k <= 3; k++)	{		if (q == 1)		{			break;		}		printf("请输入密码：");		scanf("%s", mima);		if (strcmp(a[p].password, mima) == 0)		{			m = 0;		}		else		{			m = 1;		}		if (m == 1 && k != 3)		{			system("cls");			printf("密码错误，剩余输入机会%d\n：",3 - k );		}		else if (m == 0)		{			q = 0;			break;		}		else if (m == 1 && k == 3)		{			q = 1;			break;		}	}}void fuwujiemian(){	printf("1.存款。\n");	printf("2.取款。\n");	printf("3.转帐。\n");	printf("4.更改密码。\n");	printf("5.查询信息。\n");	printf("6.退出系统。\n");}void cunkuan(){	system("cls");	int jine;	printf("请输入存款金额：\n");	scanf("%d", &jine);	a[p].money += jine;	printf("存款成功，账户余额为%d\n：",a[p].money);}void qukuan(){	system("cls");	int qukuan;	printf("当前账户剩余金额%d\n：",a[p].money);	printf("请输入取款金额：");	scanf("%d",qukuan);	a[p].money -= qukuan;	printf("取款成功，账户余额为%d\n：",a[p].money);}void zhuanzhang(){	system("cls");	int zhuanzhang;	int zhanghao;	printf("请输入对方账号：");	scanf("%d",&zhanghao);	printf("请输入转账金额：");	scanf("%d",&zhuanzhang);	a[p].money -= zhuanzhang;	printf("转账成功，账户余额为%d\n：",a[p].money);}void gaimi(){	while (1)	{		system("cls");		char mima1[7],mima2[7];		printf("请输入新密码：");		scanf("%d",&mima1);		printf("\n");		printf("再次输入新密码：");		scanf("%d",&mima2);		if (strcmp(mima1, mima2) == 0)		{			printf("修改成功。\n");			strcpy(a[p].password, mima1);			break;		}		else		{			printf("两次密码输入不一致，重新输入\n");			getchar();			getchar();		}	}}void dayin(){	system("cls");	printf("%s 姓名\n%d账号\n%d余额\n",a[i].name,a[i].user,a[i].money);}void fuwu(){	system("cls");	fuwujiemian();	int m;	while (1)	{		scanf("%d",&m);		if (m == 6)		{			q = 2;			break;		}		if (m == 1)		{			cunkuan();		}		if (m == 2)		{			qukuan();		}		if (m == 3)		{			zhuanzhang();		}		if (m == 4)		{			gaimi();		}		if (m == 5)		{			dayin();		}		printf("按任意键继续。\n");		getchar();		getchar();		system("cls");		fuwujiemian();	}}void menu(){	int n;	while (1)	{		if (q == 1)		{			system("cls");			printf("账号密码都不知道，还取什么钱？\n");			break;		}		if (q == 2)		{			system("cls");			printf("感谢使用本系统\n");			break;		}		scanf("%d",&n);		if (n == 1)		{			zhuce();			printf("按任意键继续\n");			getchar();			getchar();			zhujiemian1();		}		else if (n == 2)		{			denglu();			if (q == 0)			{				fuwu();			}		}		else if (n == 3)		{			system("cls");			printf("感谢使用本系统\n");			break;		}	}}int main(){	zhujiemian();	menu();	return 0;}


Question: 关于DLL静态调用的问题

编译期出错说明问题出在源代码中。鼠标放在EdrCenterText()上右键选择“转到定义”，看看Edrlib.h是否真的存在，是否被你包含进来了。缺了它，EdrCenterText()就不能被正确转化为EdrCenterTextA()或EdrCenterTextW()。或者，你直接明确地调EdrCenterTextA()或EdrCenterTextW()，而不调EdrCenterText()。

头文件有包括么？


Question: 求助

visual studio


Question: 关于C 泛型选择 _Generic

引用 4 楼 拥抱Linux 的回复:看楼上的说法，那就应该是编译器不支持引入 _Generic 的新标准而造成的错误了，不是代码的问题。俺没用过你截图中的编译器，认不出来。 要不试试 vscode 吧，也是巨硬家的，本身是非常轻量级的文本编辑器，安装插件之后就可以变身为IDE，只是不像很多IDE一来就从建立工程开始，所以会影响对工程这个概念的认识。安利一篇为 vscode 配置 C 编译、调试环境的文章，因为是跨平台软件，无论是Linux还是Windows下的界面和设置都是一样的，所以虽然文章内容是说的Linux平台下，但是可以通用于Windows平台。配置vscode调试C程序 ～ 试了别的编译器结果也一样

我看这代码没问题，gcc上编译通过结果为1。你不用define试试，直接把_Generic写到printf里试试，我估计基本是它现在没支持C11，你百度下，加编译命令，让它支持C11。

引用 5 楼 bbcvb 的回复:试了别的编译器结果也一样 那正说明你试的别的编译器也没有支持C语言的泛型这个新特性啊！ 有没有看过上面给你推荐的安装、配置vscode的文章呢？安装软件和插件，试过了吗？ 嫌麻烦的话，再给你推荐一款网页版的在线编译器：wandbox 下面是俺把你的代码粘贴进去，点击了运行之后的截图：  你自己可以试试。 ～

引用 2 楼 bbcvb 的回复:改成C也没用vs? 人家早就说了 没支持C99 你们为什么就是不听呢

改成C也没用

代码本身，除了 换行符 的反斜杠打错了、没有返回值语句  之外，泛型本身相关的内容 没看出来什么问题啊。 把文件类型从 cpp 改成 c  看看。