Question: 求助，关于图形化界面字符由键盘输入之后显示的问题

图形用户界面（GUI）编程可以学习C++ Builder，架构先进（和C#一样拖控件），入门比较容易。  C++ Builder的较新版本——RAD Studio XE3以上版本添加对iOS和Android的支持工具包，让开发者编写的Delphi/C++应用可以同时在Windows、OS X、iOS和Android平台上运行。现在最新版本是RAD Studio 10.2。  仅供参考： 初学者学习C++ Builder第一个程序（模拟聊天室），经典！ http://blog.163.com/tab_98/blog/static/11924097201693033057497/ C++ Builder绘图示例（模拟时钟） http://blog.163.com/tab_98/blog/static/11924097201611324819376/ 从C语言的菜单界面管理系统到C++ Builder的图形用户界面，一个简单的电话簿Demo例子 http://blog.163.com/tab_98/blog/static/1192409720158673337998/  C++ Builder写的《ZEC 纸牌游戏21点》 http://blog.163.com/tab_98/blog/static/119240972016115113039304/ C++ Builder写的《ZEC 僵尸版打地鼠》 http://blog.163.com/tab_98/blog/static/11924097201601084117748/ C++ Builder写的《ZEC 推箱子》 http://blog.163.com/tab_98/blog/static/11924097201612011839642/  书籍推荐： 《C++Builder 6程序设计教程（第二版）》 （陆卫忠，刘文亮　等编著 /2011-04-01 /科学出版社）（当当网） 《C++Builder 6编程实例精解》（赵明现），PDF，是数字版的，非扫描版的，里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》（台湾 吴逸贤），里面有10几个简单小游戏的实现，可以自己看懂以后再重写，才是自己掌握的。 《C++ Builder 5高级编程实例精解》（刘滨 编著）都是较大的实用的程序。

跳出easyx,入门GDI

引用 6 楼 llcdhm 的回复:[quote=引用 3 楼 u010165006 的回复:] 楼主是用EasyX图形库吗？   是的，我在做图形化界面第一个接触到[/quote]  EasyX不一定支持这样输入，可以考虑C++ Builder。

引用 3 楼 u010165006 的回复:楼主是用EasyX图形库吗？   是的，我在做图形化界面第一个接触到

为什么显示会是白框啊 编译是没有问题的 代码 char ch; 	char copy[50];        int i=; 	int x = 220; 	while (ch = getch() != VK_RETURN) 	{ 		outtextxy(x, 160, ch); 		*(mem[n].xuehao + i) = ch; 		x += 8; 		i++; 	}

楼主是用EasyX图形库吗？

楼主只贴一个图和部分代码在上面。这个没人能看得懂是哪里的问题啊！ 如果代码段不长的话，楼主不妨贴出来看看。 或者进行单步调试。


Question: scanf的问题,求助大侠

VS2015+Windows10 64位 可以用以下两种方法修改 1scanf("%ld",&num);改为scanf("%lld",&num); 2 if (!num)   break;改为if ((int)num==0)   break;

long long int 就应该用 %lld long int 用 %ld 输入的 long int 存入 long long int 位置中，num 没有占满，尽管输入0，其中还有别的东西呢


Question: C程序编译告警的问题

fgets(buf,len,stdin)

用gets_s 替代gets

gets是存在风险的，因为它不会检查输入的数据是否已经超过了缓存buffer的长度。比如  char buf[5]; gets(buf);  如果输入的字符串时hello，那么就会越界了。但是gets不会提示也不会截断输入的hello字符串；  建议使用fgets，如上面的代码，用fgets替换，  char buf[5]; fgets(buf, 5, stdin);  则输入hello，它会将hello截断，只将hell复制到buf里，并加上'\0' 建议编写一个小程序试一下，fgets也有另一个需要注意的，建议测试的能够发现。

int Getchar(charchar *A,int min,int max)//输入的字符串长度在[min,max]  <闭区间>  之间时 函数结束 返回字符串A的长度         {             int B,C;        do{                 A[max]=B=C=0;             while((A[B++]=getchar())!='\n'&&B<max);             if(A[B-1]!='\n')while(getchar()!='\n'&&++C);                 else A[--B]=0;          if(C||B&&B<min)            printf("您录入的字符串长度:%d字节\n只录入(%d--%d)个字节!\n",B+C,min,max);             }while(C||B<min);             return B;       }

http://blog.csdn.net/user-4/article/details/77422530 开头就有 Getchar()我自己写的 很好用


Question: 各位大神，我照着书打出来，怎么运行不了，究竟哪里出问题了

感谢各位大神， 问题已解决

只有个指针，没有给指针分配空间，就给指针成员变量赋值，所以错误。

在main函数里，这句下面加上一句就可以了。 struct student *s; 加： s = malloc(sizeof(struct student)); 原因是你的是野指针操作，需要将s指向可读可写的内存区域，比如malloc申请的堆上空间；   我估计这不是书上的源码，因为这个错误比较明显；书上可能定义的时结构体变量而非指针。

1 添加头文件 因为代码里使用了printf()函数，因此要添加stdio.h；又因为使用了strcpy()函数，因此要添加Windows.h #include <stdio.h> #include <Windows.h> 2 内存分配 因为代码中使用了自定义结构student的指针，但是没有对该指针分配内存。所以在定义*s时进行如下修改 struct student *s = new student(); 还需要在程序结尾处，即调用了display()函数之后，释放该分配的内存 delete s; 3 安全拷贝函数 代码中的strcpy()字符串拷贝函数容易导致溢出，所以要将其改为安全拷贝函数 strcpy_s(s->name, "sunyuhong"); 修改后的代码如下，VS2015+Windows10 64位，调试通过  #include "stdafx.h" #include <stdio.h> #include <Windows.h> struct student { int  rno; char name[20]; }; void display(struct student *st);   int main() { 	struct student *s = new student(); 	s->rno = 10; 	strcpy_s(s->name, "sunyuhong"); 	display(s); 	delete s; 	return 0; }  void display(struct student *st) { 	printf("\nrno=%d", st->rno); 	printf("\nname=%s", st->name); }

int _"t"main(int argc, _TCHAR* argv[])

不懂不懂不懂不懂不懂


Question: C语言编程，请教大神关于 光标移动 的语句理解问题

console屏幕处理例子程序。终端窗口屏幕处理相关API使用例子。来自MSVC20\SAMPLES\win32\console\ http://download.csdn.net/detail/zhao4zhong1/3461309

查到部分资料说coord是结构体，但是前面也没有结构体变量的定义，在这里使用是什么意思？ 有的，在头文件里。 SetConsoleCursorPosition函数作用是什么？ 设置(set)控制台(console)光标(cursor)位置(position) GetStdHandle函数和STD_OUTPUT_HANDLE变量是什么意思？ 获取(get)标准(standard,std)句柄(handle),标准(std)输出(output)句柄(handle)


Question: while循环判断条件为阻塞函数的情况

最后，再结帖之前，把这个问题解决了吧(同事看了代码之后告诉我的)。 1：服务器通过send函数将数据向socket接口发送，在发送结束后将socket接口关闭(close)。  2：客户端用while循环去接收服务器发送过来的的数据，在接收完所有数据后，本来是会阻塞在while循环那里的(因为while循环的判断条件是recv的阻塞模式)，但是由于服务器在将文件发送完毕后，主动断开连接。所以导致客户端在接收完所有数据后，recv在收到服务器断开信息后，会返回一个0，这样就跳出这个循环。  3：希望将来有人遇到相同问题能够快速解决。

服务器的：send_response(sock_control, 226);	// 发送应答码 226（关闭数据连接，请求的文件操作成功） 客户端的：while ((num_recvd = recv(sock_data, buf, MAXSIZE, 0)) > 0)  不知道具体的 它注释说的是    关闭数据连接   那么客户端的返回值应该是0  所以跳出循环

对，这两个判断是在同一个函数中完成的

再弄个线程就可以了吧 那俩判断是放一个函数里面的么?

回复一楼一下(第一次用，不知道怎么回复。。。)，服务器和客户端都有两个socket接口，而且两个socket接口是不同的，一个用于传输控制消息，一个用于传送数据的。主要是为了避免客户端无法识别到底是控制消息还是数据消息。

对滴对滴，这就是别人写的ftp程序，我看的有点不明白，不过运行的时候，好像也没出什么错，所以就准备好好分析一下这个程序，看到这里就看不懂了。

有种东东叫非阻塞IO，参考：  无阻塞的设置方法 方法一:fcntl      //文件控制函数 int flag; if (flag = fcntl(fd, F_GETFL, 0) <0)      perror("get flag"); flag |= O_NONBLOCK; if (fcntl(fd, F_SETFL, flag) < 0)     perror("set flag");  方法二:ioctl       //设备控制接口函数 int b_on = 1; ioctl (fd, FIONBIO, &b_on);  即便如此，这种设计不合理吧，虽然有点像FTP协议的方式。 不同socket先后发送出数据，能保证接收端也是这样按顺序接收到数据么？ 更合理的方式应该只用一个socket，在发送数据前的报文头上加上数据的字节数。


Question: 在VC中画图

easyx再好用，它也是二道贩子！ #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; }

引用 5 楼 u011367219 的回复:[quote=引用 3 楼 ooolinux的回复:][quote=引用 2 楼 u010165006 的回复:] 百度EasyX。  看它的说明和示例。[/quote] easyx是真的好用，不光是画图的函数，而且支持各种编译器(新版的不知道)。官网也有很多示例代码和教程[/quote]  支持各种编译器不了解，支持VC各个版本是有。

引用 3 楼 ooolinux的回复:[quote=引用 2 楼 u010165006 的回复:] 百度EasyX。  看它的说明和示例。[/quote] easyx是真的好用，不光是画图的函数，而且支持各种编译器(新版的不知道)。官网也有很多示例代码和教程

下个插件头文件 在CSDN下载里：

引用 2 楼 u010165006 的回复:百度EasyX。  看它的说明和示例。

百度EasyX。

用 Turbo C 2.0 或 Borland C++


Question: 写程序的时候遇到一个小问题

for （i = 0； i < 4; i++)     if (a[i] == 0)         putchar('N');  遍历数组，然后比较，输出

有一个int a[4]  如果函数里面是0的话 则输出N  这个怎么实现呀

2.用for循环 大约是  a = 123； for（a; a>0; a/10) ........ 为啥是无限次循环呢   3.有什么资料是介绍sort之类有用的函数的书 根据知识点练习的题也行啊

for（a; a>0; a/10) 这个for退出条件是a，但是a一直是123，因为第三个循环表达式没有改变a的值。 改成： for（a; a>0; a = a/10) 排序，建议先从冒泡和选择，插入，合并，快排这些排序方法学起吧。 网上有很多这些算法的描述和讲解，甚至是排序代码

引用 2 楼 hou09tian 的回复:for循环应该没问题，不会死循环啊 http://blog.csdn.net/hou09tian/article/details/77001685 这个帖子是介绍for循环的，希望能帮助到你 看错了，for循环还是有问题for循环里面的“表达式语句”改为a=a/10


Question: scanf 第二次循环的时候我还没从键盘输入就自己读取了一个0?

printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

引用 4 楼 zhagoodwell 的回复:#include <stdio.h> #include "string.h" #include "errno.h" #include <stdlib.h> int sys_cmd(char * _pszcmd) {     printf("%s\n",_pszcmd);     system(_pszcmd);     return 0; } int main(int argc, char **argv) {     int iCount = 0;     int iKey = 0; /*任务号*/     int pszKey,i;     char A[]= {"Mission0"};     while(1)     {         printf("===================================\n");         for(i=0; i<5; i++)             printf("=  %d.任务%d                        =\n",i+1,i+1);         printf("===================================\n");         do         {             printf("输入你要运行的任务数字号:");             scanf("%d",&pszKey);             while(getchar()!='\n');             if(pszKey<1||pszKey>5)                 printf("输入有误！请重新");         }         while(pszKey<1||pszKey>5);         printf("pszKey = %d\n",pszKey);         A[7]=pszKey+48;         sys_cmd(A);     }     return 0; }  改一下  A[7]=pszKey+48;

#include <stdio.h> #include "string.h" #include "errno.h" #include <stdlib.h> int sys_cmd(char * _pszcmd) {     printf("%s\n",_pszcmd);     system(_pszcmd);     return 0; } int main(int argc, char **argv) {     int iCount = 0;     int iKey = 0; /*任务号*/     int pszKey,i;     char A[]= {"Mission0"};     while(1)     {         printf("===================================\n");         for(i=0; i<5; i++)             printf("=  %d.任务%d                        =\n",i+1,i+1);         printf("===================================\n");         do         {             printf("输入你要运行的任务数字号:");             scanf("%d",&pszKey);             while(getchar()!='\n');             if(pszKey<1||pszKey>5)                 printf("输入有误！请重新");         }         while(pszKey<1||pszKey>5);         printf("pszKey = %d\n",pszKey);         A[7]+=pszKey;         sys_cmd(A);     }     return 0; }

楼主 你好 我觉得这样更方便一些 也能拍错 至于字符串输入限制的我也有 我们私聊把 我QQ2423824433 下面是改的代码 #include <stdio.h>  #include "string.h" #include <stdlib.h> int sys_cmd(char * _pszcmd) {     printf("%s\n",_pszcmd);     system(_pszcmd);     return 0; 	 } int main(int argc, char **argv) {     int iCount = 0;     int iKey = 0; /*任务号*/     int pszKey,i; 	char A[]={"Mission0"};     while(1)     {         printf("===================================\n"); 	for(i=0;i<5;i++) 		printf("=  %d.任务%d                        =\n",i+1,i+1); 	printf("===================================\n");	 	do{         printf("输入你要运行的任务数字号:"); 		scanf("%d",&pszKey); 		while(getchar()!='\n'); 		if(pszKey<1||pszKey>5) 			printf("输入有误！请重新"); 	}while(pszKey<1||pszKey>5); 	printf("pszKey = %d\n",pszKey); 	A[7]+=pszKey; 	sys_cmd(A); } return 0; }

百度scanf  它会在缓冲区保留回车符

while(1)         {             iCount = scanf("%c",&pszKey);             getchar();    /*接受输入缓存里的回车符-->'\n' */             printf("iCount = %d\n",iCount);             if(  iCount != 1)             {                 printf("不能多于一个参数\n");                      }             break;         } 改成上面的代码试试，这是因为%c输入，当你输入一个字符时，紧接着输入了回车，字符写到了内存里，但是在输入缓存里还残留这上次输入的回车符，下次输入时，回车符匹配了%c


Question: 帮助完成一下行列转换的函数吧!谢谢!

这要用到矩阵的知识吧

谢谢各位高手,没有能帮助我的哥哥吗?


Question: 用C语言获取本机硬件的网卡MAC地址

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/ioctl.h> #include <sys/socket.h> #include <netinet/in.h> #include <net/if.h>  int main(int argc, char *argv[]) { 	struct ifreq ifreq; 	int sock = 0; 	char mac[32] = "";  	if(argc < 2){ 		printf("Usage: ./main eth0"); 		return 1; 	}  	sock = socket(AF_INET,SOCK_STREAM,0); 	if(sock < 0) 	{ 		perror("error sock"); 		return 2; 	}  	strcpy(ifreq.ifr_name,argv[1]); 	if(ioctl(sock,SIOCGIFHWADDR,&ifreq) < 0) 	{ 		perror("error ioctl"); 		return 3; 	}  	int i = 0; 	for(i = 0; i < 6; i++){ 		sprintf(mac+3*i, "%02X:", (unsigned char)ifreq.ifr_hwaddr.sa_data[i]); 	} 	mac[strlen(mac) - 1] = 0; 	printf("MAC: %s\n", mac);  	return 0; } Linux下获取网卡的MAC地址

百度有不少 你可以去试试


Question: 怎样确定一个数能被0.5整除？

谢谢你---感谢了！！！

我要的是高精度～不是一个double就可以解决的

#include <stdio.h> using namespace std; int main(void) { 	double a; 	scanf_s("%lf", &a); 	int b(2*a); 	if (a * 2 - b) 	{ 		printf("%s", "buneng"); 	} 	else 		printf("%s", "neng"); 	return 0; } 。。写的比较粗糙，大概就这么个感觉吧

0.5有整除的概念么? 除以0.5 就是乘以2 乘以2 怎么判断余数 ??

建议把被除数和除数都同时扩大10倍，然后首先看整数部分能否是5个倍数，然后若是5的倍数，再看小数部分是否小于1E-6,如果小于，则认为是能整除0.5

能不能编程给我？C语言～

精度有限 用字符串吧  小数点后一位是0或者5 且 小数点后两位以后后面全为0即可整除


Question: c中栈的生长方向和buf的内存增长方向的比较

所以呢, 楼主想得到什么答案, 或者什么结论?

啥叫“栈”？

感觉没错


Question: 函数可以返回一个本地的指针吗？

你用的编译器太古老了

这个帖子就是讨论函数返回局部变量指针的，希望对你有帮助 http://bbs.csdn.net/topics/392214962

引用 2 楼 自信男孩的回复:[quote=引用 1 楼 qq_38204686 的回复:] 上面相当于返回一个变量 *new..=*ppi  *ppi没了也没关系 下面返回的是变量的地址 *new..=&pi    pi没了可就出问题了  所以下面的有警告 我的编译器输出都有问题  pi都销毁了 输出怎么可能正常呢 第一个程序，返回局部变量得到的值是未定义的。再说函数调用结束，函数内的变量都会被释放，那么返回函数里的变量地址有什么意义，变量已经被释放，空间可能被其他函数调用，那么原有的变量可能会被重新占用和赋值，所以是未定义的，当然，如果未被使用，这就是可能得到你想要的值。 第二个函数也是一样的。 建议不要返回局部变量，如果想返回局部变量指针，建议将该指针指向堆上的内存空间，即用malloc或者new申请的内存空间。 [/quote] 学习了..

我觉得真的有必要普及一下这篇文章： 【译制】每个 C 程序员都应知道的关于未定义行为的那点事

引用 1 楼 qq_38204686 的回复:上面相当于返回一个变量 *new..=*ppi  *ppi没了也没关系 下面返回的是变量的地址 *new..=&pi    pi没了可就出问题了  所以下面的有警告 我的编译器输出都有问题  pi都销毁了 输出怎么可能正常呢 第一个程序，返回局部变量得到的值是未定义的。再说函数调用结束，函数内的变量都会被释放，那么返回函数里的变量地址有什么意义，变量已经被释放，空间可能被其他函数调用，那么原有的变量可能会被重新占用和赋值，所以是未定义的，当然，如果未被使用，这就是可能得到你想要的值。 第二个函数也是一样的。 建议不要返回局部变量，如果想返回局部变量指针，建议将该指针指向堆上的内存空间，即用malloc或者new申请的内存空间。


Question: 指针变换的值问题

引用 1 楼 user-2 的回复:前面验证了int占4个字节 从&array[4]开始的4个单元中数据分别是 0x05, 0x06, 0x07, 0x08 如果是小端模式，作为一个int，这4个字节是 0x08070605 如果是大端模式，则为 0x05060708   刚才打错了 0x05060708, 我忘记了是大小端的问题，是 0x08070605;     你说的是对的！ 谢谢

楼上正解 你输出16进制试一试  unsigned char array[8] = {1,2,3,4,5,6,7,8}; 	unsigned int *p = NULL; 	  	p = (unsigned int *)array; 	printf("\n %x \n", *(++p));


Question: 在VC中画图，编译总出错，求解决方案

跳出easyx，入门GDI #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; }

引用 5 楼 自信男孩的回复:很奇怪，你没有包含提示错误里的头文件，怎么会提示error呢。 头文件包含头文件

很奇怪，你没有包含提示错误里的头文件，怎么会提示error呢。

图形用户界面（GUI）编程可以学习C++ Builder，架构先进（和C#一样拖控件），入门比较容易。  C++ Builder的较新版本——RAD Studio XE3以上版本添加对iOS和Android的支持工具包，让开发者编写的Delphi/C++应用可以同时在Windows、OS X、iOS和Android平台上运行。现在最新版本是RAD Studio 10.2。  仅供参考： 初学者学习C++ Builder第一个程序（模拟聊天室），经典！ http://blog.163.com/tab_98/blog/static/11924097201693033057497/ C++ Builder绘图示例（模拟时钟） http://blog.163.com/tab_98/blog/static/11924097201611324819376/ 从C语言的菜单界面管理系统到C++ Builder的图形用户界面，一个简单的电话簿Demo例子 http://blog.163.com/tab_98/blog/static/1192409720158673337998/  C++ Builder写的《ZEC 纸牌游戏21点》 http://blog.163.com/tab_98/blog/static/119240972016115113039304/ C++ Builder写的《ZEC 僵尸版打地鼠》 http://blog.163.com/tab_98/blog/static/11924097201601084117748/ C++ Builder写的《ZEC 推箱子》 http://blog.163.com/tab_98/blog/static/11924097201612011839642/  书籍推荐： 《C++Builder 6程序设计教程（第二版）》 （陆卫忠，刘文亮　等编著 /2011-04-01 /科学出版社）（当当网） 《C++Builder 6编程实例精解》（赵明现），PDF，是数字版的，非扫描版的，里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》（台湾 吴逸贤），里面有10几个简单小游戏的实现，可以自己看懂以后再重写，才是自己掌握的。 《C++ Builder 5高级编程实例精解》（刘滨 编著）都是较大的实用的程序。

百度EasyX

你要重装vc，因为是winnt.h（vc6标准头文件）的问题，意思是缺少包含文件。重装vc就好了。

你想用的画图的东西，是要使用TC的


Question: 关于程序中数组的存储问题

http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组

对于AB的选择，也有另外一种办法，那就是把int arr[100][100] = {1};这句注释和不注释，分别编译出可执行文件，看看大小的变化。 这些问题还是有多种办法分析的。但是，建议还是了解一下编译的原理。

建议去了解一下变量在内存里存放的区域，已经变量的生命周期（生命周期跟这个问题关系不大，但是也是比较重要的知识点）。 在Linux下，内存分为内核区和用户区； 这个问题主要是在用户区，用户区又分为栈，堆，只读数据段，数据段，代码段等；建议去网上查阅一下详细信息； arr是全局变量，那就是不会在栈和堆上，栈上的空间时对于局部变量的，堆上的空间时通过malloc，new等申请的空间；  对于AB选项的选择，建议查阅一下编译的过程，可执行文件生成的过程

引用 4 楼 ID870177103 的回复:首先这个还真不一定占用可执行文件的大小 因为源码文件会被编译成模块文件，访问模块的静态变量只需要模块的地址加上变量的偏移，就像访问局部变量只需要栈祯地址和加上变量偏移一样 只需要改变模块文件的大小描述，不需要增加额外信息，不过外部连接可能会不一样吧 因为模块变大了，运行时系统会分配更多内存 所以肯定会占用进程的内存大小 再者就是静态区是和模块绑定的，肯定不是栈上分配的，不过硬说是堆上分配的也不无道理，毕竟内存都来自全局堆   感觉本来还有点头绪了，听你这么一说，变复杂了，又混乱了。。。

引用 2 楼 FanYiRanTeXi 的回复:这个数组是定义在main函数之外的，属于全局变量，而且已经初始化，所以应该存在全局区，不属于堆栈，在编译的时候分配内存，运行时灭有调用，不占用进程空间或者可执行空间   哦，应该是属于数据区的静态数据区吧； 如果调用了， 是占用的进程的栈空间是吧？

那就AC了。 知道是栈内存，那就不是堆内存了。


Question: 求解:怎么才能遍历结构体指针

7 楼 cfjtaishan 的回复:] 谢谢你了。我以后一定注意这个问题.这个代码的逻辑我已经弄顺了.可以的话.帮我看看我的两篇文章.总感觉有点问题

已经解决麻烦大家了

#include <stdio.h> #include <stdlib.h>  #define MAX_SIZE 103 #define INIT_SIZE 5 typedef int Element;  typedef struct { 	Element *data; 	int length; 	int maxSize; }Sql_L;  int initArrayList(Sql_L *ArrayList ) { 	ArrayList->data = (Element *)malloc(sizeof(Element *)*INIT_SIZE); 	if(ArrayList->data == NULL) 	{ 		printf("初始化失败,程序即将推出!"); 		exit(0); 	} 	else 	{ 		ArrayList->length = 0; 		ArrayList->maxSize = INIT_SIZE;  		printf("初始化成功!"); 		return 1; 	} } /*@@@@1 int getLength()    */ int getLength(Sql_L *L) { 	return L->length;  }  int insertElement(Sql_L *L) { 	if(L->length >= L->maxSize) { 		/* add buffer space */ 		/* 		L->data = (Element *)realloc((INIT_SIZE + L->maxSize) * sizeof(Element)); 		L->maxSize += INIT_SIZE; 		*/ 		printf("容量已经满了,需要扩容了!"); 		return 0; 	} 	else 	{ 		int element;//初始化 与 不初始化的区别在哪里？ 		printf("请输入你要插入的数字:(选择的第一种很方式为追加到元素的尾部)"); 		scanf("%d", &element); 		printf("element的值位:%d",element); 		L->data[L->length++] = element; 		return 1; 	} } void prior(Sql_L *L) { 	int i;   	for(i = 0; i < L->length; i++) { 		printf("进入到这里面了里面的数值为:"); 		printf("%d\n",L->data[i]); 		printf("当前的长度为:%d\n",L->length);  	}  } int main() { 	Sql_L ArrayList; 	int length; 	int status; 	int insertElement_status; 	int backStatus = 1; 	status = initArrayList(&ArrayList); 	if(status) { 		printf("初始化成功!\n"); 	} 	while(backStatus) 	{ 		backStatus = insertElement(&ArrayList); 		prior(&ArrayList); 	}  	printf("遍历成功!"); 	return 0; }   程序里有多出逻辑错误，个人认为可以这样改一下； 详见上面的代码； 代码里注释不宜太多，多了反而会起反作用。注释本来是为了理解代码而加的，多了反而让代码的可读性变差，建议能通过代码表明逻辑的还是建议使用见名知义的变量和函数。这个还得慢慢来。

大神 留个邮箱 单发你

给自己动手丰衣足食的点个赞[/quote] 谢谢大神

注释太多           。

引用 4 楼 qq_27416233 的回复:已经解决麻烦大家了 给自己动手丰衣足食的点个赞

自己顶一下，在线等 .我继续调调查查资料


Question: 编译报错

你可能设置输出为lib而非exe了。

不行，这个根本定不到位置

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

引用 4 楼 qq_38829844 的回复:我要怎么看我设置的输出是exe还是lib，然后是lib的话怎么改为exe Options、Linker、Settings...、Output

不清楚你用的是单独的bc编译器还是安装的Borland C++、C++Builder，后两者都附带tasm32汇编器。

我用的bc编译器可以处理吗，不行的话要下载一个汇编器吗？

cod.asm这是汇编文件，用c++编译器不能编译的，要先用单独的汇编器生成obj。

我要怎么看我设置的输出是exe还是lib，然后是lib的话怎么改为exe


Question: 已知M=3.6X+4.8Y+5.4Z-Q，Q为一定值，初始输入条件，约束条件：-0.2≤M≤0.2，且X、Y、Z均为大于等于0的整数，求解怎么编程输出x、y、z

谢谢。我试试

三重循环遍历 Q=27; for (X=0;X<=32767;X++)  for (Y=0;Y<=32767;Y++)  for (Z=0;Z<=32767;Z++)  {  M=3.6*X+4.8*Y+5.4*Z-Q;  if (-0.2<=M && M<=0.2) {   printf("%d,%d,%d\n",X,Y,Z);  } }


Question: c问题

同意楼上的，VS2015+Windows10 64位运行你的代码有问题 1 如果改成 	char *pa = (char*)&a[1]; 	printf(" 这两个打印的结果是多少,怎么算的..谢谢%x\n",pa-(char*)a); 输出的值是8，就是结构aa的大小。结构aa的大小为什么是8呢，这就涉及到结构的内存对齐问题了，请参考下面的文章 http://blog.csdn.net/hou09tian/article/details/74359172 2 如果改成 	A *pa = (char*)&a[1]; 此时的输出1。即此时以aa结构大小为基本单位。这就涉及到数组地址偏移问题了，请参考下面的文章 http://blog.csdn.net/hou09tian/article/details/75332577

pa是a[1]的地址，a是a[0]的地址，相减的结果就是结构体的大小了。

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

#include <stdio.h>  typedef struct aa {     int a;     char b;     char c; }A;  int main(void) {     A a[20];     char *pa = (char *)&a[1];     //int *pa =&a[1];     printf("a = %p, pa = %p\n", a, pa);     printf(" 这两个打印的结果是多少,怎么算的..谢谢%u\n", pa - (char *)a);      return 0; } 猜测解决不了问题，先知道输出结果，然后在分析结果的原因。因此，还是要自己编译运行一下。 pa指向a[1]，那么前面还有一个a[0],根据结构体a[1]与a[0]相差一个结构体的长度，根据结构体对齐原则，一个结构体长度是8。因此，pa - a的长度就是8。

应该就是结构体的大小，第二个的指针减第一个的指针 用sizeof(A)更合理一些


libssh2 中的函数可一直接实现对压缩文件的sftp传输，  问题比较逗比，，，


Question: 有关结构体，共同体，指针

引用 4 楼 weixin_36741484 的回复:看了大家的讲解，懂了很多，还有一点没有弄懂， void (*free)(struct String *ptr); 中String为typedef定义的结构体别名，现在这个定义还没有结束，在定义的过程中又用到这个别名，那么和在定义结束后用这个别名有什么区别？ 另外free()在c语言中本来就是一个函数，这里又把它定义为一个函数指针变量，是对free()进行了二次定义了吗？ 希望能帮忙再解答一下 首先要明白“不完全类型（imcomplete type）”的概念： 如果有一个定义类String class String;//声明String，未定义 在声明之后，定义之前，自定义类就是一个不完全类型。即已知String是一个类型，但是不知道包含哪些成员。 同理，“完全类型”指的是定义之后的类。只有当类A为“完全类型”时，在类B中数据成员才能被指定为类A的类型，如果累A是“不完全类型”，则类B的数据成员只能是类A的指针或者引用。 这样，如果类A中要包含本身A的数据成员，因为在定义类A的数据成员时，类A肯定是“不完全类型”，所以，类A的数据成员可以且只能是自身类型的指针或引用。 void (*free)(struct String *ptr); free函数指针的参数是String*是正确的，如果是String则错误！

引用 5 楼 hou09tian 的回复:union（联合）是一种特殊的类。一个union可以有多个数据成员，但是在任意时刻只有一个数据成员可以有值。union提供了一种有效的途径使得可以方便地表示一组类型不同的互斥值。   union {         char *buf;         char array[16];     } o;  个人认为这种union的定义方式，就是某个数据的两种不同表示方式。如果需要一个整体的字符串，则使用array数组，如果需要字符串中的某个字符或者某个子字符串，则使用char指针buf。 这种定义union的方法就像套接字编程里面对IP地址节结构in_addr的定义类似 struct in_addr{ union{   struct{     unsigned char s_b1, s_b2, s_b3, s_b4; }S_un_b;   struct{ unsigned short s_w1, s_w2;   }S_un_w;   unsigned long S_addr; }S_un; }; 在struct中包含了一个union，在这个union中包含了IP地址的各种形式。如果需要IP地址的unsigned long，则使用S_addr，如果需要IP地址的四个段，则使用结构S_un_b，里面包含了四个段。这样就不需要额外再将IP地址转换为四个段的代码了。 C语言的数据结构不建议使用C++的语法知识来分析，结构体和类还是有一定区别的。

引用 5 楼 hou09tian 的回复:union（联合）是一种特殊的类。一个union可以有多个数据成员，但是在任意时刻只有一个数据成员可以有值。union提供了一种有效的途径使得可以方便地表示一组类型不同的互斥值。   union {         char *buf;         char array[16];     } o;  个人认为这种union的定义方式，就是某个数据的两种不同表示方式。如果需要一个整体的字符串，则使用array数组，如果需要字符串中的某个字符或者某个子字符串，则使用char指针buf。 这种定义union的方法就像套接字编程里面对IP地址节结构in_addr的定义类似 struct in_addr{ union{   struct{     unsigned char s_b1, s_b2, s_b3, s_b4; }S_un_b;   struct{ unsigned short s_w1, s_w2;   }S_un_w;   unsigned long S_addr; }S_un; }; 在struct中包含了一个union，在这个union中包含了IP地址的各种形式。如果需要IP地址的unsigned long，则使用S_addr，如果需要IP地址的四个段，则使用结构S_un_b，里面包含了四个段。这样就不需要额外再将IP地址转换为四个段的代码了。 “但是在任意时刻只有一个数据成员可以有值” 这句话有问题，不是只有一个成员有值，而是它们共同有这个值。根据成员占用字节数，区分占有这个值的多少个字节。

//编译平台vs2013 #include <stdio.h>  typedef  void(*FUNCPTR)(int);  //定义一个函数 void my_int_func(int x){ 	printf("output:%d\n", x); }  int _tmain(int argc, _TCHAR* argv[]) { 	void(*foo)(int x); //定义一个函数指针foo 	void(*fsa)(int x); //定义一个函数针织fsa 	foo = my_int_func; //初始化函数指针 	fsa = &my_int_func; //初始化函数指针，此处目的是告诉你在初始化函数指针时，是否使用“&”并无关系 	FUNCPTR fun = my_int_func; //定义一个函数指针并初始化 	foo(3);  //调用函数 	fsa(4); 	fun(5); 	return 0; }  我想这段代码可以告诉你前面void (*free)(struct String *ptr);的意思了。 关于struct与union的知识点，需要你花点时间去理解一下书本

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

void (*free)(struct String *ptr);是一个函数指针，union是一个共同体。

void (*free)(struct String *ptr); 这个是一个函数指针变量，即它也是一个变量，只不过比较特殊是一个函数指针变量，它可以指向一个参数为struct String类型指针变量，返回值为void的函数。它是结构体String的一个元素。 联合体o也是结构体的一个元素，联合体里有一个数组和一个指针，即若缓存较大时（大于16个字节）可以用指针存放一个缓存（大于16个字节）的首地址。如果缓存不大于16，可以直接用array，联合体的长度是16个字节。


Question: 循环语句中的if和while问题

谢谢大家，刚学C，第一次发帖，很多不熟悉，看了好多回答，我自己吸收下，再次谢谢大家。

遗憾的是%*c只能跳过一个\n

#include<stdio.h> int Gcd(int a, int b); int main() {     int a = 0;     int b = 0;     int i = 1;     int gcd = 1;     int ret = 0;     printf("Input a and b:\n");     do     {         ret = scanf("%d%*c%d",&a,&b);         if(ret == 0 || ret == 1 || a <= 0 || b <= 0)         {             while(getchar() != '\n');             printf("Input error!\nPlease input again!\n");         } else         {             gcd = Gcd(a, b);             printf("gcd = %d\n", gcd);         }     }while(ret == 2);      return 0; }  int Gcd(int a, int b)    //求最大公约数 {     int gcd = 0;     int i = 0;     if(a <= b)     {         gcd = a;         for(i = gcd; i >= 0; i--)         {             if((a % i == 0)&&(b % i == 0))             {                 printf("gcd = %d\n",i);                 break;             }         }     }     else     {         gcd = b;         for(i = gcd; i >= 0; i--)         {             if((a % i == 0) && (b % i == 0))             {                 printf("gcd = %d\n",i);                 break;             }         }     }      return gcd; }

do     {         ret = scanf("%d%*c%d",&a,&b);         if(ret == 0 || ret ==1 || a <= 0 || b <= 0)         {                                                                while(getchar() != '\n');    /*注意这儿有分号*/             printf("Input error!\nPlease input again!\n");         }         {             Gcd(a, b);         }     }while(ret != 2); /*此处应该改成==，因为ret 等于2，因为输入10, -1之后ret为2*/  问题可能处在while判断条件上，注意上面代码的注释。 另外，Gcd函数没有返回值，根据函数类型是应该有返回值的。

仅供参考：#include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }  以上代码实现输入任意内容间隔的两个整数。

当用if时，运行时输入10    -1，则无法进行循环，而用while时则正常进行循环。 为什么啊？


Question: rhel 下有啥好使的c语言 profile工具？求指导

自己找了一个perf

引用 2 楼 cfjtaishan 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 啥叫rhel？ 坊间传闻，Intel有一款棒棒达profiler RHEL是Red Hat Enterprise Linux的缩写，是Red Hat公司的Linux系统[/quote]  大牛求指导

引用 3 楼 zhao4zhong1 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] 啥叫rhel？ 坊间传闻，Intel有一款棒棒达profiler RHEL是Red Hat Enterprise Linux的缩写，是Red Hat公司的Linux系统[/quote] 涨姿势了！ 百度搜“linux profiler”？[/quote] 要不要 这么直接。。

引用 2 楼 cfjtaishan 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 啥叫rhel？ 坊间传闻，Intel有一款棒棒达profiler RHEL是Red Hat Enterprise Linux的缩写，是Red Hat公司的Linux系统[/quote] 涨姿势了！ 百度搜“linux profiler”？

引用 1 楼 zhao4zhong1 的回复:啥叫rhel？ 坊间传闻，Intel有一款棒棒达profiler RHEL是Red Hat Enterprise Linux的缩写，是Red Hat公司的Linux系统

啥叫rhel？ 坊间传闻，Intel有一款棒棒达profiler


Question: 小白关于仿照内核的C语言双向循环链表问题

引用 1 楼 adlay 的回复:plist 不要用指针, 直接用结构. 用指针必须先初始化   struct student{     char name[10];     	    int  id;     	    struct list * plist;     };   ==>  struct student{     char name[10];     	    int  id;     	    struct list alist;     }; 谢谢 已经解决了


Question: 求助      高手们

#include <stdio.h>  void func(char *s); int main(void) {     char str[81] = "*******A*BC*DEF*G****";      func(str);     puts(str);      return 0;  }  void func(char *s) {     int i = 0, k;     int cnt = 0;      while (s[i] == '*')         i++;      cnt = i;     k = 0;     while (s[i])         s[k++] = s[i++];      i = 0;     while (i++ < cnt)         s[k++] = '*';     s[k] = 0; } 上面的代码作为一个参考吧！ 建议自己还是要练一练，哪怕是写错了呢，起码通往成功的路自己走过。

引用 1 楼 zhao4zhong1 的回复:作业要自己做， 上厕所要自己去。吃饭也要自己吃

作业要自己做， 上厕所要自己去。


Question: 关于C语言scanf函数的用法

在每一条scanf语句后面加一条fflush(stdin);来清空输入缓冲区。

请判断scanf函数的返回值！

谢谢大神指导malloc，但那个scanf又调试了一下，temp里面还是之前读进去的内容，没有再读进换行啊......

scanf函数返回值为0，fflush与rewind以后可以读。 另外将代码改成下面也可以读。

谢谢各位大神前辈们指点，我回去按各位所说调试一下

引用 8 楼 bie_niu1992 的回复:第一个for循环里 scanf("%s",temp);改成 scanf("%s%*c",temp); %*c的作用是读入\n,否则后面scanf("%[^\n]",temp);读入的将是\n就直接跳过了 建议后面的scanf("%[^\n]",temp); 也加入%*c 可惜的是%*c只能跳过一个\n

printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

应该是上面的输入的回车符匹配了最后的scanf。 malloc的参数都有问题，这个程序运行起来可能会出段错误；   第一个malloc应该是pri = malloc(sizeof(privaledge) * p); 第二个malloc应该是： posi = malloc(sizeof(position) * r);

有没有大神帮忙解答一下啊。。。。。。


Question: C基本库找不到

注意这个头文件路径是否正确。如果路径没加到系统里，可以编译时加上-I path

regez.h有放到你的项目文件里吗？

-I <dir>                  Add <dir> to the end of the main include path


Question: C基本库找不到

看一下编译环境有没有区别，或者makefile文件里一些路径也检查一下

路径可能不对


Question: 请教一下各位大神，图中的这道题目应该怎么做？

# include <stdio.h> # define N 20 void change(int *a,int *b){//交换函数         int c=*a;         *a=*b;         *b=c;     }     void paixu(int A[][N],int left,int right)//快速排序升序     {         int i=left,j=right,temp[2]={A[0][left],A[1][left]};         if(left>=right)  return;         while(i!=j)         {             while((A[0][j]<temp[0]||A[0][j]==temp[0]&&A[1][j]>=temp[1])&& i<j)j--;             while((A[0][i]>temp[0]||A[0][i]==temp[0]&&A[1][i]<=temp[1])&& i<j)i++;             if(i<j)             {                 change(&A[0][i],&A[0][j]);                 change(&A[1][i],&A[1][j]);             }     }     if(i!=left)     {         change(&A[0][left],&A[0][i]);         change(&A[1][left],&A[1][i]);     }         paixu(A,left,i-1);         paixu(A,i+1,right);     }   int main(){ 	char A[N]={"\0"}; 	int S[2][N]; 	int B,C,i; 	freopen("A.txt","r",stdin); 	scanf("%d",&B); 	while(B--){ 	 scanf("%d",&C); 	 i=0; 	 while(C){ 	 	A[i++]+=C&1; 	 	C=(C>>1); 	 }	 	} 	for(i=0;i<N;i++) 	{ 		S[1][i]=1<<i; 		S[0][i]=A[i]; 	} 	paixu(S,0,N-1); 	for(i=0;i<N;i++) 	  if(S[0][i]) 	  printf("%d %d\n",S[1][i],S[0][i]); 	return 0; }  解决了能给我分数吧？

# include <stdio.h> # define N 20 int main(){ 	char A[N]={"\0"},D[N]={"\0"}; 	int B,C,i; 	freopen("A.txt","r",stdin); 	scanf("%d",&B); 	while(B--){ 	 scanf("%d",&C); 	 i=0; 	 while(C){ 	 	A[i++]+=C&1; 	 	C=(C>>1); 	 }	 	} 	for(i=0;i<N;i++) 	if(A[i]) 	  printf("%d %d\n",1<<i,A[i]); 	return 0; }  剩下的你自己排个序即可

//11的二进制代码为1011 所以投票就是 //把一个整数转化为二进制 然后把带有1的个数给合计出来即可 //用位运算 # include <stdio.h> int main(){     int A=11,num=0;    while(A) {    num+=A>>1;   A=A>>1;    } printf("%d",num);     return 0; }

int num = 6;             int[] arrvote = { 1, 3, 7, 1023, 2048, 128 };             int[] tech = new int[20];             for (int i = 0; i < num; i++)             {                 for (int j = 0; j <20; j++)                 {                     if ((arrvote[i] >> j & 0x01) != 0)                         tech[j]++;                 }             }

lz，贴的图全吗？ 如果全的话差一张票2048

取前十名，在print_cnt函数里，for循环条件改成MAX_TEACH_NUM/2

有奇数的全部减1并计入1号教师，现在所有投票都是偶数了，分别循环除以2，直到结果为1，排列组合的思想统计票数。题目中缺少是否可以一个学生可以给一个老师投多张票或者是只投给一个老师的信息

#include <stdio.h> #include <stdlib.h>  struct teacher {     int id;     int cnt; };  #define     MAX_TEACH_NUM   20  static void init_id(struct teacher *pteach, int num); static void print_cnt(struct teacher *pteach, int num); void bubble_sort(struct teacher *pteach, int num); void count_tickets(struct teacher *pteach, int t_num, unsigned int *tickets, int ticket_num);  int main(void) {     struct teacher teach[MAX_TEACH_NUM];     int *tickets = NULL, num;     int i;       scanf("%d", &num);     tickets = (int *)malloc(sizeof(int) * num);     if (!tickets) {         fprintf(stderr, "malloc error!\n");         exit(-1);     }      for (i = 0; i < num; i++)         scanf("%d", tickets + i);      init_id(teach, MAX_TEACH_NUM);     count_tickets(teach, MAX_TEACH_NUM, tickets, num);     printf("Before sort: \n");     print_cnt(teach, MAX_TEACH_NUM);     bubble_sort(teach, MAX_TEACH_NUM);     printf("After sort: \n");     print_cnt(teach, MAX_TEACH_NUM);       return 0; }  void init_id(struct teacher *pteach, int num) {     int i;      for (i = 0; i < num; i++) {         pteach[i].id = (1u << i);         pteach[i].cnt = 0;     } }  static void print_cnt(struct teacher *pteach, int num) {     int i;      for (i = 0; i < num; i++) {         if (pteach[i].cnt > 0)         printf("ID: %6d\t %d \n", pteach[i].id, pteach[i].cnt);     }  }   void count_tickets(struct teacher *pteach, int t_num, unsigned int *tickets, int ticket_num) {     int i, j;     unsigned int num;      for (i = 0; i < ticket_num; i++) {         num = tickets[i];         for (j = 0; j < t_num; j++) {             if (num & (1u << j))                 pteach[j].cnt++;         }     } }  void bubble_sort(struct teacher *pteach, int num) {     struct teacher tmp;     int i, j;      for (i = 0; i < num -1; i++)         for (j = 0; j < num - 1 - i; j++)             if (pteach[j].cnt < pteach[j+1].cnt) {                 tmp = pteach[j];                 pteach[j] = pteach[j+1];                 pteach[j+1] = tmp;             } } 参考一下，主要是找到ID和投票值之间的关系。 使用的都是基本的C语言知识，如果一点也写不出来，这要问问自己了。

最笨的办法 穷举。投的号码跟每一个老师的号码比较。大于老师的号码就+1

提示  位运算


Question: 定时 1分钟，51单片机

百度搜相关关键字。


Question: 怎么改这段程序

不建议改这段代码，而是建议在这段代码前加减宏或者修改宏。因为这段代码里通过宏支持了多个不同的变量，因此根据需要在外面加宏，用于支持某个变量或者某些变量。

“能不改就不改”是码农的座右铭。


Question: 结构体

//偏移一个MyStruct地址. p + sizeof(struct MyStruct );

MyStruct mystruct; MyStruct* p = &mystruct; 把这两句的指针p改成这样定义就能实现你想要的（p+1指向age）： int* p = （int*）&mystruct;

p+1的地址是结构体向后偏移sizeof(结构体）长度，即8个字节。计算一下你输出的地址，是不是p+1的地址减去p的地址是不是8个字节。 p+1是偏移之后的内存空间，是未定义的，输出的内容也是未定义的（不确定的），可以归结为越界操作。

p+1的操作后，指针指向的区域是未知的

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

引用 6 楼 hou09tian 的回复:[quote=引用 5 楼 LD_______ 的回复:] [quote=引用 3 楼 hou09tian 的回复:] 如果把代码改成 printf("值：%d %d\n", *p, *p); 打印出来的还是10和20。 可以考虑改成 printf("值：%d %d\n", p->age, ((p+1)->age));  (p+1)->age肯定越界啊，不过还是试了下，打印的值一长串子，不认识[/quote] 对啊，p+1本来就越界了嘛，p+1的地址是12ffdb4了嘛[/quote]  我想知道12ffdb4和12ffdb0的值为什么是一样的，有什么玄妙吗

C++数组地址偏移 http://blog.csdn.net/hou09tian/article/details/75332577 希望对你有帮助

引用 5 楼 LD_______ 的回复:[quote=引用 3 楼 hou09tian 的回复:] 如果把代码改成 printf("值：%d %d\n", *p, *p); 打印出来的还是10和20。 可以考虑改成 printf("值：%d %d\n", p->age, ((p+1)->age));  (p+1)->age肯定越界啊，不过还是试了下，打印的值一长串子，不认识[/quote] 对啊，p+1本来就越界了嘛，p+1的地址是12ffdb4了嘛

引用 3 楼 hou09tian 的回复:如果把代码改成 printf("值：%d %d\n", *p, *p); 打印出来的还是10和20。 可以考虑改成 printf("值：%d %d\n", p->age, ((p+1)->age));  (p+1)->age肯定越界啊，不过还是试了下，打印的值一长串子，不认识

把 printf("值：%d %d\n", *p, *(p + 1)); 分成两个printf 	printf("值：%d\n", (*p)); 	printf("值：%d\n", *(p+1));

引用 1 楼 hdt 的回复:加一指的是 p+sizeof(你的结构体);  是的，p+结构体大小后指针指向的是结构体的末尾，为什么打印出来的值是结构体里的值。 age的地址和p+1的地址打印的不一样，但是得出的值确实一样的

加一指的是 p+sizeof(你的结构体);


Question: 大神帮忙分析下，问题可能出在哪malloc的空间在free时出错了，gdb调试时在刚开始malloc的内存地址和free时的内存地址是一致的，但一free就错误

感谢各位回复，我找到错误了，是指针操作时改变了动态开辟的空间之外的空间，也就是非法操作了没有申请的空间，所以在程序运行过程中没有出错，但是在程序运行结束之前，编译器检查到我改变了未申请的内存空间，导致上面看到的错误． 谢谢各位！

仅供参考：//将c:\\tmp文件夹下的所有文件的内容全部放到用malloc分配的内存中 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <io.h> struct FB {     char fn[256];     size_t fl;     char *b;     struct FB *next;     struct FB *prev; } *fh,*fb,*ft; char ln[256]; char fpn[256]; FILE *af; FILE *f; int L,n; int main() {     system("dir /b /a-d c:\\tmp\\*.* >c:\\allfn.txt");     af=fopen("c:\\allfn.txt","r");     if (NULL==af) {         printf("Can not open file c:\\allfn.txt!\n");         return 1;     }     fh=NULL;     fb=NULL;     n=0;     while (1) {         if (NULL==fgets(ln,256,af)) break;         L=strlen(ln);         if ('\n'==ln[L-1]) ln[L-1]=0;         printf("read %s\n",ln);         strcpy(fpn,"c:\\tmp\\");         strcat(fpn,ln);         ft=(struct FB *)malloc(sizeof(struct FB));         if (NULL==ft) {             printf("Can not malloc ft!\n");             fclose(af);             return 2;//之前的malloc在main退出后由操作系统自动free         }         printf("ft[%d]==%p\n",n,ft);         strcpy(ft->fn,fpn);         f=fopen(fpn,"rb");         if (NULL==f) {             printf("Can not open file %s!\n",fpn);             fclose(af);             return 3;//之前的malloc在main退出后由操作系统自动free         }         ft->fl=_filelength(fileno(f));         ft->b=malloc(ft->fl);         if (NULL==ft->b) {             printf("Can not malloc ft->b!\n");             fclose(f);             fclose(af);             return 4;//之前的malloc在main退出后由操作系统自动free         }         printf("ft[%d]->b==%p\n",n,ft->b);         if (ft->fl!=fread(ft->b,1,ft->fl,f)) {             printf("fread error!\n");             fclose(f);             fclose(af);             return 5;//之前的malloc在main退出后由操作系统自动free         }         fclose(f);         ft->next=NULL;          if (NULL==fh) {             ft->prev=NULL;             fh=ft;         } else {             fb->next=ft;             ft->prev=fb;         }         fb=ft;         n++;     }     fclose(af);     printf("-----list-----\n");     for (ft=fh;NULL!=ft;ft=ft->next) {         printf("%8d %s\n",ft->fl,ft->fn);         if (NULL!=ft) fb=ft;     }     printf("-----free-----\n");     n--;     if (NULL!=fh) {         for (ft=fb->prev;NULL!=ft;ft=ft->prev) {             if (NULL!=ft->next->b) {                 printf("ft[%d]->b==%p\n",n,ft->next->b);                 free(ft->next->b);             }             if (NULL!=ft->next) {                 printf("ft[%d]==%p\n",n,ft->next);                 free(ft->next);             }             n--;         }         if (NULL!=fh->b) {             printf("ft[0]->b==%p\n",fh->b);             free(fh->b);         }         printf("ft[0]==%p\n",fh);         free(fh);     }     return 0; } //C:\tmp\tmp\Debug>dir /a-d c:\tmp // 驱动器 C 中的卷是 C_HD5_1 // 卷的序列号是 1817-D526 // // c:\tmp 的目录 // //找不到文件 // //C:\tmp\tmp\Debug>tmp //找不到文件 //-----list----- //-----free----- // //C:\tmp\tmp\Debug>dir /a-d c:\tmp // 驱动器 C 中的卷是 C_HD5_1 // 卷的序列号是 1817-D526 // // c:\tmp 的目录 // //2011-06-30  18:04            44,840 my_c.rar //2011-06-30  17:18             1,036 err.frm //2011-06-30  14:32            14,243 出租.txt //2011-06-28  12:08            23,681 MSDN98书签.txt //             4 个文件         83,800 字节 //             0 个目录 17,041,870,848 可用字节 // //C:\tmp\tmp\Debug>tmp //read my_c.rar //ft[0]==00421800 //ft[0]->b==00520068 //read err.frm //ft[1]==00421670 //ft[1]->b==0052AFC0 //read 出租.txt //ft[2]==00421530 //ft[2]->b==00378F28 //read MSDN98书签.txt //ft[3]==004213F0 //ft[3]->b==0052B3F8 //-----list----- // 44840 c:\tmp\my_c.rar //  1036 c:\tmp\err.frm // 14243 c:\tmp\出租.txt // 23681 c:\tmp\MSDN98书签.txt //-----free----- //ft[3]->b==0052B3F8 //ft[3]==004213F0 //ft[2]->b==00378F28 //ft[2]==00421530 //ft[1]->b==0052AFC0 //ft[1]==00421670 //ft[0]->b==00520068 //ft[0]==00421800 // //C:\tmp\tmp\Debug>

建议贴代码，这样才能分析出问题。

还是贴代码吧

(核心已转储)   貌似一般都是   double free 了吧 ，  你释放了未分配的内存 如  char* c = NULL;    free(c) ;       //   (核心已转储)

free时出错， 可以考虑从这些方面进行排查： 1. 避免重复释放，指针释放后一定要置为NULL 2.指针由于某些操作，没有指向最初分配空间的地址，比如指针++操作 3.指针指向空间被破坏，这种情况往往是其他操作导致，最难排查 比如：数组越界


Question: 将数字转换成图片的粗略方法

大佬能麻烦解释解释么。。 菜鸡表示看不懂

#include <stdio.h> #include <stdlib.h> #include <windows.h> #define ROW 20 #define COL 30  int main (void) { 	FILE *fp;     HANDLE fh; 	int	origin[ROW][COL]; 	char now[ROW][COL+1]; 	const char trans[10+1]=" .':~*=|%#"; 	int	i,j; 	int	temp; 	if((fp=fopen("number.txt","rb+"))==NULL) 	{ 		fputs("cannot open the file .\n",stderr); 		exit(EXIT_FAILURE); 	} 	for(i=0;i<ROW;i++) 		for(j=0;j<COL;j++) 			fscanf(fp,"%d",&origin[i][j]); 	for(i=0;i<ROW;i++) 	{ 		for(j=0;j<COL;j++) 		{ 			temp=origin[i][j]; 			now[i][j]=trans[temp]; 		} 		now[i][j]='\0'; 	} 	rewind(fp); 	for(i=0;i<ROW;i++) 	{ 		fwrite((void *)&now[i][0],COL,1,fp); 		putc('\r',fp); 		putc('\n',fp); 	}     fh=(HANDLE)_get_osfhandle(fileno(fp));     SetEndOfFile(fh); 	if(fclose(fp)!=0) 		fputs("error in closing files.\n",stderr); 	return 0; }

是换行符的问题吗？？


Question: VS2015生成的exe文件 不能直接打开 不能在mfc中通过按钮来执行该exe文件

引用 6 楼 DHL1002512576 的回复:还有一个问题 通过mfc的按钮打开的exe关闭不了 需要通过任务管理器来关闭 WinExec("cmd /c taskkill /F /IM 灰度图.exe“,SW_HIDE);

还有一个问题 通过mfc的按钮打开的exe关闭不了 需要通过任务管理器来关闭

路径里面有空格,需要先cd到exe所在的目录

老师请问这是什么原因？ 是因为路径吗？还是代码格式的问题

WinExec("cmd /c cd /d \"G:\\Me\\face detect\\人脸识别\\灰度图\"&\"灰度图.exe\"", SW_HIDE);

现在是可以在Debug中打开exe文件 但在mfc中引用后不能通过按钮打开   代码如下： WinExec("G:\\Me\\face detect\\人脸识别\\灰度图\\灰度图.exe", SW_HIDE);

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


Question: 请教问题：形参和实参

感谢无敌的赵老师

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

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

断点断住啊 单步调啊 打开监控窗口查看变量的值啊，变量的地址啊  撸个几遍，各种套路无比清晰  撸点汇编更佳啊

String形参是接收两个字符类型的数据地址，实参是两个字符的地址。String函数的功能就是交换这两个字符的值。实参传递给形参是是两个字符的地址值，通过交换使用引用*,这样实际操作的是实参。

void String(char *buf1, char *buf2) { 	char temp;  	temp = *buf1;    // 形参buf1指向的字符对象赋给临时变量temp 	*buf1 = *buf2;	 // 形参buf2指向的字符对象赋给buf1指向的字符对象 	*buf2 = temp;    // 临时对象的字符赋给形参buf2指向的字符对象  	printf("buf1 = %c\nbuf2= %c\n", *buf1, *buf2);  } int main() { 	char arr[] = { "12" };  	printf("arr[0] = %c \narr[1]= %c\n", arr[0], arr[1]);  	String(&arr[0], &arr[1]);  // 把字符数组的第0位个第1位的地址传入调用函数，函数中形参buf1和buf2会分别得到这两个的地址，有了地址，通过*号解引用操作就可以操作指向的对象了 	printf("arr[0] = %c \narr[1]= %c\n", arr[0], arr[1]); }


Question: 一道c语言练习题,求高手帮忙解答

感谢楼上两位大神的无私帮助 想对cfjtaishan点对我有用,手滑点了板砖,sorry哈

#include <stdio.h> #include <stdlib.h>  #define STUDENT_SIZE (3)  typedef struct ScoreInfo{//分数信息     int mathScore;     int chineseScore;     int englishScore; }ScoreInfo;  typedef struct StudentInfo{//学生信息  包含分数信息     char stuName[10];     int stuID;     int stuAge;     ScoreInfo stuScore;     int total_score; }StudentInfo;   void displayStuInfo(StudentInfo stu[],int pos);        //打印最高分学生详细信息 void sumScore(StudentInfo* pStu);    //计算总分 int findFirst(StudentInfo* pStu);    //查找最高分数的学生  返回学生序号  int main(void) {     StudentInfo stuArray[STUDENT_SIZE] = {         {"Lisa",1,12,{25,80,75}, 0},         {"Tom",2,13,{85,70,80}, 0},         {"Lucy",3,12,{100,90,99}, 0}         };      int pos=0;     sumScore(stuArray);     pos = findFirst(stuArray);     if(pos < 0){         printf("\nError,please check");     }else{         displayStuInfo(stuArray,pos);    //打印最高分学生详细信息     }     return 0; } void sumScore(StudentInfo* pStu) {     if(NULL==pStu){         return;     }      int i = 0;     for(i = 0; i < STUDENT_SIZE; i++){         pStu[i].total_score = pStu[i].stuScore.chineseScore + pStu[i].stuScore.mathScore + pStu[i].stuScore.englishScore;     } } int findFirst(StudentInfo* pStuArray) {     if(NULL == pStuArray){         return -1;     }     int firstPos = -1;     int maxScore = 0;     int i;      for(i = 0;i < STUDENT_SIZE; i++){         if(maxScore < pStuArray[i].total_score){             maxScore = pStuArray[i].total_score;             firstPos = i;         }     }     return firstPos; }  void displayStuInfo(StudentInfo stu[],int pos) {     printf("\n  name:%s",stu[pos].stuName);     printf("\n  ID:%d",stu[pos].stuID);     printf("\n  Age:%d",stu[pos].stuAge);     printf("\n Math %d", stu[pos].stuScore.mathScore);     printf("\n Chinese %d", stu[pos].stuScore.chineseScore);     printf("\n English %d", stu[pos].stuScore.englishScore); } 在数据结构中加了一个变量，这样所有的函数都跟着变化。 可以参考一下，有问题继续提出来。

1.stuArray 2.pos < 0 3.pStu[i].stuScore.chineseScore + pStu[i].stuScore.englishScore + pStu[i].stuScore.mathScore 4.{0, 0, 0} 5.pStuArray, sumArray 6.firstPos = i; 7.stu[pos].stuScore.mathScore 8.stu[pos].stuScore.chineseScore 9.stu[pos].stuScore.englishScore


Question: 有几个基础问题

每输入一个数空格，最后回车，或者每输入一个数回车

3楼正解！

Format Specification Fields: scanf and wscanf Functions A format specification has the following form:  % [width] [{h | l | I64 | L}]type  The format argument specifies the interpretation of the input and can contain one or more of the following:   White-space characters: blank (' '); tab ('\t'); or newline ('\n'). A white-space character causes scanf to read, but not store, all consecutive white-space characters in the input up to the next non–white-space character. One white-space character in the format matches any number (including 0) and combination of white-space characters in the input.   Non–white-space characters, except for the percent sign (%). A non–white-space character causes scanf to read, but not store, a matching non–white-space character. If the next character in stdin does not match, scanf terminates.   Format specifications, introduced by the percent sign (%). A format specification causes scanf to read and convert characters in the input into values of a specified type. The value is assigned to an argument in the argument list.  The format is read from left to right. Characters outside format specifications are expected to match the sequence of characters in stdin; the matching characters in stdin are scanned but not stored. If a character in stdin conflicts with the format specification, scanf terminates, and the character is left in stdin as if it had not been read.  When the first format specification is encountered, the value of the first input field is converted according to this specification and stored in the location that is specified by the first argument. The second format specification causes the second input field to be converted and stored in the second argument, and so on through the end of the format string.  An input field is defined as all characters up to the first white-space character (space, tab, or newline), or up to the first character that cannot be converted according to the format specification, or until the field width (if specified) is reached. If there are too many arguments for the given specifications, the extra arguments are evaluated but ignored. The results are unpredictable if there are not enough arguments for the format specification.  Each field of the format specification is a single character or a number signifying a particular format option. The type character, which appears after the last optional format field, determines whether the input field is interpreted as a character, a string, or a number.   The simplest format specification contains only the percent sign and a type character (for example, %s). If a percent sign (%) is followed by a character that has no meaning as a format-control character, that character and the following characters (up to the next percent sign) are treated as an ordinary sequence of characters, that is, a sequence of characters that must match the input. For example, to specify that a percent-sign character is to be input, use %%.  An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.

第一个问题，建议自己实际写个小程序试一下；不加空格是不行的，比如如下输入：  12 3 4 5  这样scanf会认为输入了4个，而不是5个。注意空格是区分每个n[i]的。  typedef是定义别名，即比如typedef signed int s32;那么s32就是signed int的别名（另一个名字），那么用s32定义的变量就相当于用signed int定义。  break就是跳出switch的。

第一个问题有没有影响，自己尝试验证下就知道了 第二个问题，那个Next就是个结构体指针。 第单个问题，跳出判断是通过break语句。


Question: 在练习pta题目的时候有两个编了两个程序老是错 求指点

#include <stdio.h> int main () {     long int S=0;     int i,A,N,T=0,b;      scanf("%d %d",&A,&N); 	for(i=0;i<N;i++)         { 			if(i==0) 				b = 1; 			else             b=b*10+A;             S+=b;         }     printf("%ld",S);  	getchar();     return 0; }

#include <stdio.h> int main () {     long int S=0;     int i,A,N,T=0;      scanf("%d%d",&A,&N);     for (T=A,i=0;i<N;i++)         {         	S+=T;             T=T*10+A;         }     printf("%ld",S);      return 0; }

#include <stdio.h> #include <math.h>  int main () {     long int S=0;     int i,A,N, tmp = 0;      scanf("%d%d",&A,&N);         tmp = A;         S += tmp;     if (N >= 2 && N < 10) {         printf("S = %d + ", tmp);         for (i = 1; i < N - 1; i++) {             tmp = A * pow(10, i) + tmp;             printf("%d + ", tmp);             S += tmp;         }         tmp = A * pow(10, i) + tmp;         S += tmp;         printf("%d = %ld\n", tmp, S);     } else if (N == 1) {         printf("S = %d = %ld\n", tmp, S);     }      return 0; } 注意分析问题的逻辑，上面的代码作为一个参考吧

PTA今天好像就关闭了

第一个题目你写的有问题

还有本题要求实现一个对数组进行循环左移的简单函数：一个数组aa中存有nn（>0>0）个整数，在不允许使用另外数组的前提下，将每个整数循环向左移mm（\ge 0≥0）个位置，即将aa中的数据由（a_0 a_1 \cdots a_{n-1}a 0  a 1  ⋯a n−1  ）变换为（a_{m} \cdots a_{n-1} a_0 a_1 \cdots a_{m-1}a m  ⋯a n−1  a 0  a 1  ⋯a m−1  ）（最前面的mm个数循环移至最后面的mm个位置）。如果还需要考虑程序移动数据的次数尽量少，要如何设计移动的方法？  输入格式:  输入第1行给出正整数nn（\le 100≤100）和整数mm（\ge 0≥0）；第2行给出nn个整数，其间以空格分隔。  输出格式:  在一行中输出循环左移mm位以后的整数序列，之间用空格分隔，序列结尾不能有多余空格。  输入样例：  8 3 1 2 3 4 5 6 7 8 输出样例：  4 5 6 7 8 1 2 3 ------------------------------------------------- #include <stdio.h> int swap (int n[],int m,int l); int main() {     int n[100];     int l,m,i;      scanf("%d %d",&l,&m);     for (i=0;i<l;i++)         scanf("%d",&n[i]);     swap(n,m,l);      return 0; }  int swap(int n[],int m,int l) {     int i,t,j;     for (i=0;i<m;i++)         for (j=l;j>0;j--)             {             t=n[l-1];             n[l-1]=n[l-2];             n[0]=t;             }     for (i=0;i>l;i++)         printf("%d",n[i]);      return 0; } 不出结果呀怎么


Question: c语言中判别scanf函数输入格式

仅供参考：#include <stdio.h> #include <string.h> char s[80]; int i; char c; int main() {     while (1) {         printf("Input a integer:");fflush(stdout);         rewind(stdin);         fgets(s,80,stdin); 		if (strlen(s)>10) { 			printf("Input too long(>9)!\n"); 			continue; 		}         if (2==sscanf(s,"%d%c",&i,&c)) {             if ('\n'==c) {                 printf("%d is a integer.\n",i);                 break;             }         }         if ('\n'==s[strlen(s)-1]) s[strlen(s)-1]=0;         printf("\"%s\" is NOT a integer!\n",s);     }     return 0; }

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

建议使用字符串吧，通过解析字符串来判定输入的是否为整数。

输入字符串 判断是否只有数字 然后转成int


Question: C语言控制台中输入数字后怎么执行

去掉scanf里面的\n

去掉scanf中的'\n' 回车符； scanf("%d", &a);


Question: FATFS连续建立文件夹时程序会跑飞

向这个学习： //循环向a函数每次发送200个字节长度（这个是固定的）的buffer, //a函数中需要将循环传进来的buffer，组成240字节（也是固定的）的新buffer进行处理， //在处理的时候每次从新buffer中取两个字节打印 #ifdef _MSC_VER     #pragma warning(disable:4996) #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef _MSC_VER     #include <windows.h>     #include <process.h>     #include <io.h>     #define  MYVOID             void     #define  vsnprintf          _vsnprintf #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  MYVOID             void * #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef _MSC_VER void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } void sleep_ms(int ms) {     Sleep(ms); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } void sleep_ms(int ms) {     usleep(ms*1000); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} #define ASIZE    200 #define BSIZE    240 #define CSIZE      2 char Abuf[ASIZE]; char Cbuf[CSIZE]; CRITICAL_SECTION cs_HEX; CRITICAL_SECTION cs_BBB; struct FIFO_BUFFER {     int  head;     int  tail;     int  size;     char data[BSIZE]; } BBB; int No_Loop=0; void HexDump(int cn,char *buf,int len) {     int i,j,k;     char binstr[80];      Lock(&cs_HEX);     for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%03d %04x -",cn,i);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             Log("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         Log("%s\n",binstr);     }     Unlock(&cs_HEX); } int GetFromRBuf(int cn,CRITICAL_SECTION *cs,struct FIFO_BUFFER *fbuf,char *buf,int len) {     int lent,len1,len2;      lent=0;     Lock(cs);     if (fbuf->size>=len) {         lent=len;         if (fbuf->head+lent>BSIZE) {             len1=BSIZE-fbuf->head;             memcpy(buf     ,fbuf->data+fbuf->head,len1);             len2=lent-len1;             memcpy(buf+len1,fbuf->data           ,len2);             fbuf->head=len2;         } else {             memcpy(buf     ,fbuf->data+fbuf->head,lent);             fbuf->head+=lent;         }         fbuf->size-=lent;     }     Unlock(cs);     return lent; } MYVOID thdB(void *pcn) {     char        *recv_buf;     int          recv_nbytes;     int          cn;     int          wc;     int          pb;      cn=(int)pcn;     Log("%03d thdB              thread begin...\n",cn);     while (1) {         sleep_ms(10);         recv_buf=(char *)Cbuf;         recv_nbytes=CSIZE;         wc=0;         while (1) {             pb=GetFromRBuf(cn,&cs_BBB,&BBB,recv_buf,recv_nbytes);             if (pb) {                 Log("%03d recv %d bytes\n",cn,pb);                 HexDump(cn,recv_buf,pb);                 sleep_ms(1);             } else {                 sleep_ms(1000);             }             if (No_Loop) break;//             wc++;             if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);         }         if (No_Loop) break;//     } #ifndef _MSC_VER     pthread_exit(NULL); #endif } int PutToRBuf(int cn,CRITICAL_SECTION *cs,struct FIFO_BUFFER *fbuf,char *buf,int len) {     int lent,len1,len2;      Lock(cs);     lent=len;     if (fbuf->size+lent>BSIZE) {         lent=BSIZE-fbuf->size;     }     if (fbuf->tail+lent>BSIZE) {         len1=BSIZE-fbuf->tail;         memcpy(fbuf->data+fbuf->tail,buf     ,len1);         len2=lent-len1;         memcpy(fbuf->data           ,buf+len1,len2);         fbuf->tail=len2;     } else {         memcpy(fbuf->data+fbuf->tail,buf     ,lent);         fbuf->tail+=lent;     }     fbuf->size+=lent;     Unlock(cs);     return lent; } MYVOID thdA(void *pcn) {     char        *send_buf;     int          send_nbytes;     int          cn;     int          wc;     int           a;     int          pa;      cn=(int)pcn;     Log("%03d thdA              thread begin...\n",cn);     a=0;     while (1) {         sleep_ms(100);         memset(Abuf,a,ASIZE);         a=(a+1)%256;         if (16==a) {No_Loop=1;break;}//去掉这句可以让程序一直循环直到按Ctrl+C或Ctrl+Break或当前目录下存在文件No_Loop         send_buf=(char *)Abuf;         send_nbytes=ASIZE;         Log("%03d sending %d bytes\n",cn,send_nbytes);         HexDump(cn,send_buf,send_nbytes);         wc=0;         while (1) {             pa=PutToRBuf(cn,&cs_BBB,&BBB,send_buf,send_nbytes);             Log("%03d sent %d bytes\n",cn,pa);             HexDump(cn,send_buf,pa);             send_buf+=pa;             send_nbytes-=pa;             if (send_nbytes<=0) break;//             sleep_ms(1000);             if (No_Loop) break;//             wc++;             if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);         }         if (No_Loop) break;//     } #ifndef _MSC_VER     pthread_exit(NULL); #endif } int main() { #ifdef _MSC_VER     InitializeCriticalSection(&cs_log);     InitializeCriticalSection(&cs_HEX);     InitializeCriticalSection(&cs_BBB); #else     pthread_t threads[2];     int threadsN;     int rc;     pthread_mutex_init(&cs_log,NULL);     pthread_mutex_init(&cs_HEX,NULL);     pthread_mutex_init(&cs_BBB,NULL); #endif     Log("Start===========================================================\n");      BBB.head=0;     BBB.tail=0;     BBB.size=0;  #ifdef _MSC_VER     _beginthread((void(__cdecl *)(void *))thdA,0,(void *)1);     _beginthread((void(__cdecl *)(void *))thdB,0,(void *)2); #else     threadsN=0;     rc=pthread_create(&(threads[threadsN++]),NULL,thdA,(void *)1);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1);     rc=pthread_create(&(threads[threadsN++]),NULL,thdB,(void *)2);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1); #endif      if (!access("No_Loop",0)) {         remove("No_Loop");         if (!access("No_Loop",0)) {             No_Loop=1;         }     }     while (1) {         sleep_ms(1000);         if (No_Loop) break;//         if (!access("No_Loop",0)) {             No_Loop=1;         }     }     sleep_ms(3000);     Log("End=============================================================\n"); #ifdef _MSC_VER     DeleteCriticalSection(&cs_BBB);     DeleteCriticalSection(&cs_HEX);     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_BBB);     pthread_mutex_destroy(&cs_HEX);     pthread_mutex_destroy(&cs_log); #endif     return 0; }

你添加写日志功能了吗？ 如果添加了，还是找不到问题在哪里，那就是你添加得还不够详细。

Total RO  Size (Code + RO Data)                31312 (  30.58kB)     Total RW  Size (RW Data + ZI Data)             29728 (  29.03kB)     Total ROM Size (Code + RO Data + RW Data)      31556 (  30.82kB)   是这个造成的么？我这个芯片只有32KB的SRAM

程序就一直在这循环里,跳不出去

引用 7 楼 qq_39801976 的回复:感觉像是打开了一个新世界的大门,但是还没完全打开

感觉像是打开了一个新世界的大门,但是还没完全打开

有时不将“调用函数名字＋各参数值，进入函数后各参数值，中间变量值，退出函数前准备返回的值，返回函数到调用处后函数名字＋各参数值＋返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的，包括捕获各种异常、写日志到屏幕、单步或设断点或生成core或dmp文件、……这些方法都不行！ 写日志到文件参考下面： #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef _MSC_VER     #pragma warning(disable:4996)     #include <windows.h>     #include <io.h> #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef _MSC_VER void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} int main(int argc,char * argv[]) {     int i; #ifdef _MSC_VER     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL); #endif     for (i=0;i<10000;i++) {         Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);     } #ifdef _MSC_VER     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //1-79行添加到你带main的.c或.cpp的那个文件的最前面 //81-86行添加到你的main函数开头 //90-94行添加到你的main函数结束前 //在要写LOG的地方仿照第88行的写法写LOG到文件MyLog1.log中  http://blog.csdn.net/zhao4zhong1/article/details/53078924 老司机找bug的十年心路历程

他时而在建立第五个的时候跑飞,时而在第十几个时跑飞,单步调试可以正常运行全部建立成功,全速运行才会出现跑飞

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

DATA文件夹是已经成功建好了的

应该跟外面的延时没有什么关系, 外面有一定的延时就可以了

求好心人指导!!!


Question: MATLAB中的传递函数如何转成C语言，或者哪位大佬帮我写成表达式

找一种连续到离散的具体方法，确定c语言执行环节的周期作为离散时间，zaimatlab里直接调用离散函数即可

不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，再将b.txt改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？ 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话，文本文件的格式问题可参考json或xml  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！


Question: 关于ncurses使用颜色的问题

缺少头文件，如果是LInux下的程序，建议加： #include <stdio.h> #include <stdlib.h> #include <string.h>

没有包含exit和strlen的头文件，加上#include<iostream>


Question: 怎么用C语言把一张图片转为字符画

百度搜“文本字符构成的图片”


Question: 计算文件中字符串出现的次数

//返回b在a中的个数   int BF(char a[],char b[]){                            int i=0,j=0,k=0;        do{           if (b[j]&&a[i++]==b[j])                ++j;           else           {               b[j]?(i-=j):k++;                j=0;                       }       }while(a[i-1]);           return k;   } 比如你要查 "AAA"那么把文件用a[]存起来 然后  直接 n=BF(a,"AAA"); 即可

kmp算法就是处理这个东西的.

引用 4 楼 ByXc_lzc 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] 根据你文件里名字存在的格式来定。你给的需求不够详细，不好确定是用那种办法。 一般是遍历文件数据（先读到内存，可以边读边解析名字），然后找到对应的名字解析，统计。 以下是数据结构，可以考虑一下：  struct word {     char name[32];     int num;     /* count the time of the name appearing.*/ };  由于不清楚name的个数，建议使用链表我是用结构， 但链表我还没学到。其实这是 c primer plus十四章编程练习的第6题。只是这一段我不知到怎么去实现[/quote] 如果没学到链表，那么建议用数组吧，但是数组长度需要实现确定。建议定义一个足够大的数组（比预计多一些空间），或者使用动态申请空间，malloc和realloc配合使用

引用 2 楼 cfjtaishan 的回复:根据你文件里名字存在的格式来定。你给的需求不够详细，不好确定是用那种办法。 一般是遍历文件数据（先读到内存，可以边读边解析名字），然后找到对应的名字解析，统计。 以下是数据结构，可以考虑一下：  struct word {     char name[32];     int num;     /* count the time of the name appearing.*/ };  由于不清楚name的个数，建议使用链表我是用结构， 但链表我还没学到。其实这是 c primer plus十四章编程练习的第6题。只是这一段我不知到怎么去实现

引用 1 楼 user-4 的回复:使用strtok把文件拆开，检查拆开的数量 注意头尾的处理 另外要求似乎不是很明确，比如名字是aa 那么文件中有   aaaaaa 这样算几次？文件的字符串是有格式的比如 Jessie Joybat 一个名字一行


Question: C语言运行时崩溃 unhandled exception 0xC0000005:Access Violation

#include <stdio.h>  #define NUM_RATES ((int)(sizeof(value)/sizeof(value[0]))) #define INITIAL_BALANCE 100.00  int main() {     int i,low_rate, num_years,year;     double value[5];      printf("Enter interest rate: ");     scanf("%d", &low_rate);   /* parameter error*/     printf("Enter number of years: ");     scanf("%d", &num_years);      printf("\nYears");     for (i=0;i<NUM_RATES;i++){         printf("%6d%",low_rate+i);   /* parameter error!*/         value[i]=INITIAL_BALANCE;     }     printf("\n");      for (year = 1; year <= num_years;year++){         printf("%3d   ", year);         for (i=0;i<NUM_RATES;i++){             value[i] += (low_rate+i)/100.0*value[i];             printf("%7.2f", value[i]);         }         printf("\n");     }     return 0; } 两个地方错误，不过都是基本的语法错误；建议还是多学习一下基础知识。错误已经改正，详见上面的代码（添加注释的地方是错误的位置）。

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

或者和电脑本身有关系吗？可能哪里有bug?


Question: two or more data types in declaration of....问题

bool是系统关键字，不能用来做变量名。你要看看定义变量时，标识符的规定 只能是字母，数字或下划线组成，标识符不能以数字开头。 而且不能是系统已有的关键字。

bool是类似int, char这样的关键字，这些关键字不能作为变量名，即不能定义的变量名或函数名与这些关键字重名。 将bool改成其他名字。

把所有的bool统一换成另一个变量名，想不出来就mybool

您好！ 那我应该怎么改呢？有没有什么办法？学的不好，这代码是一个课本上抄下来的。实在是头疼。 非常感谢！

编译器把bool当成类型关键字了，不能作为变量名。


Question: 求问一款重构软件

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

引用 2 楼 antuicang9886 的回复:[quote=引用 1 楼 lianshaohua 的回复:] 现在很多IDE都有重构的功能，个人感觉没有必要为了重构使用一个单独的工具。  如VS之类的？ 看来自己平常用到的功能都太简单了，我先多研究研究。[/quote] VS的VA助手不错，可以支持一些重构功能；当然VS的第三方插件也很丰富，可以去了解了解；

引用 1 楼 lianshaohua 的回复:现在很多IDE都有重构的功能，个人感觉没有必要为了重构使用一个单独的工具。  如VS之类的？ 看来自己平常用到的功能都太简单了，我先多研究研究。

现在很多IDE都有重构的功能，个人感觉没有必要为了重构使用一个单独的工具。


Question: 对同一个txt文件进行读写操作

谢谢各位大佬

建议了解一下文件读写的原理，对同一个文件进行交替读写，那么如果不控制读写的位置，是不能实现你想要的结果的

a+状态下又改怎么改写？？

引用 2 楼 hou09tian 的回复: fpos_t pos = 0;     while ((ch = getc(source)) != EOF)     {         fgetpos(source, &pos);         ch = toupper(ch);         pos -= 1;        //读操作切换到写操作         fsetpos(source, &pos);         putc(ch, source);       //写操作切换到读操作         fflush(source);          //如不使用fflsuh()函数，可以如下的设置位置函数         //pos += 1;         //fsetpos(source, &pos);     }  不是很懂。。能不能详细解释下 - -

至于"r+"和“a+”的区别，MSDN给出的两个不同的单词：“r+”是“update”（覆盖），“a+”是“append”（添加）。英文解释应该好理解些。所以以上代码成功的前提是使用fopen_s()函数打开文件的权限是"r+"，而不是"a+"

1 r+的含义 摘自英文MSDN "r+" Opens for both reading and writing. (The file must exist.) 可以对打开的文件进行读和写的操作，但是该文件必须存在。 2 读和写的切换问题 摘自英文MSDN When the "r+" access type is specified, both reading and writing are allowed. (The file is said to be open for "update".) However, when you switch from reading to writing, the input operation must encounter an EOF marker. If there is no EOF, you must use an intervening call to a file-positioning function. The file-positioning functions are fsetpos, fseek, and rewind. When you switch from writing to reading, you must use an intervening call to either fflush or to a file-positioning function. 当fopen_s的访问权限是"r+"时，可以对指定文件进行读和写的操作（该文件被打开用来“更新”）。但是，当从读操作换成写操作时，输入操作必须遇到一个EOF标识符（也就是说，必须全部读取完毕后才能写）。如果不想全部读取完毕后再能写，就必须使用一个设置文件位置函数作为中介。设置文件位置的函数可以是fsetpos()、fseek()和rewind()。当从写操作换成读操作时，必须调用fflush()函数或者设置文件位置函数作为中介。 3 程序分析      while((ch=getc(source))!=EOF)     {         ch=toupper(ch);         putc(ch,source);     }  以上代码的功能是逐一读取文件中的字符，将其转换为大写后再写到文件中。很明显要用到“2读和写的切换问题”中提到的读写操作切换时的中介函数。 fpos_t pos = 0;  	while ((ch = getc(source)) != EOF) 	{ 		fgetpos(source, &pos); 		ch = toupper(ch); 		pos -= 1; 		fsetpos(source, &pos); 		putc(ch, source); 		fflush(source);                 //如不使用fflsuh()函数，可以如下的设置位置函数 		//pos += 1; 		//fsetpos(source, &pos); 	}

引用 4 楼 qianluoxun 的回复:[quote=引用 2 楼 hou09tian 的回复:]  fpos_t pos = 0;     while ((ch = getc(source)) != EOF)     {         fgetpos(source, &pos);         ch = toupper(ch);         pos -= 1;        //读操作切换到写操作         fsetpos(source, &pos);         putc(ch, source);       //写操作切换到读操作         fflush(source);          //如不使用fflsuh()函数，可以如下的设置位置函数         //pos += 1;         //fsetpos(source, &pos);     }  不是很懂。。能不能详细解释下 - -[/quote] 根据您的问题写了篇小文章 http://blog.csdn.net/hou09tian/article/details/77148218 另外还有一篇是关于文件流读写的 http://blog.csdn.net/hou09tian/article/details/73657925 请多指教


Question: C语言返回值问题

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

引用 12 楼 zhao4zhong1 的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构…… 路漫漫其修远兮，吾将上下而求索

返回的是指向栈内存指针，函数调用结束，栈内存会被释放，而在主函数访问该片内存，是为初始化的，因此出错

引用 6 楼 自信男孩的回复:这也算是经典问题了，返回局部变量是未定义行为。 了解这个问题的原因，需要学习栈的申请和释放原理； 谢谢，我刚学C语言，在看c primer plus 对栈和堆的部分很少，也快看完了有什么关于这方面的书介绍吗？

不是不可返回，返回一个在函数里面定义的局部变量，如果返回的是指针或者数组。正确的做法是先申请内存，否则会出错。 申请内存方法有malloc(c语言）和new(c++)两种。

改成  return &count;

改成 return count;

调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx

局部变量可以返回, 但是会出现什么结果, 就不知道了

返回局部变量，引起的问题

引用 2 楼 JILAU_WHO_AM_I_Q234 的回复:十分感谢，对了你这个是什么软件 Visual Studio 2015

栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……

十分感谢，对了你这个是什么软件

1 局部变量 在函数中定义的变量的名字只位于函数的作用域中：这些名字只在函数体中可见。函数中的局部变量当函数的执行结束时撤销。当函数结束时，会释放它的局部存储空间。在函数结束时，函数体内的局部变量都不能再访问了。 2 函数返回值 函数的返回值用于初始化在调用函数处创建的临时对象。在调用函数的地方会将函数返回值复制给临时对象。 3 问题分析 当执行text()函数时，数组count的地址是0x00B5F888，此时该地址的内容是  所以此时的输出为1、2、3.....10 当text()函数执行完毕后，因为count数组是局部变量，该变量会被释放，即其地址中的内容会清空。此时主函数中pointer的变量值虽然还是0x00B5F888，但该地址的内容已经被释放  所以此时的输出是一些很大的负数 因此，对于函数来说


Question: 形参为指针数组，为何实参指针数组被改变

你这里确实只是改变了指针指向,  因为你是一个二维指针啊. 每个字符串本身的保存地址中对应的内容并没有改变, 在你的程序中, 只是把字符串指针的排列顺序改变了.  传值与传址的区别, 你要记清楚.  你是直接使用传进来的值, 还是把传进来的值作为一个指针在使用, 有*或者[]的方式访问的地址内容.  (指的是修改)  如果直接使用的值, 那么主是值传递.  如果有 *或者[]的修改, 那就是传址调用.

引用 13 楼 xiaohuh421 的回复:所谓的静态内存区无法改变, 只是一种建议,要求. 但实际上, 只要指针指向的地址有写权限, 那么就肯定能改变. 不幸的是, 静态存储区是在程序自己的空间内, 地址是完全的写权限的.   语法规定不能写, 但通过自动或者强制转换后, 仍然可以修改的.  哪怕它是const指定的那我的那个例子中，字符串是相当于互换了吗？书上说只改变了指针的指向并没有改变指针指向的字符串的值。谭浩强那本书有可能会有出错的地方，是不是他写错了

引用 6 楼 wyyy2088511 的回复:传一个数组名进来，改变数组的内容正常，只不过这里传的是指针数组，所以可以改变。指针指向的是字符串，字符串在静态内存区不是无法改变的吗

引用 2 楼 d179212934 的回复:在这个例子中，你说传的是形参是指针数组，而不是指针所指向的变量。 我们所说的是形参的改变不影响实参，那么，如果你对该函数中的形参也就是指针进行修改，是不会影响到外面的实参指针。但是本例中，所修改的内容时指针所指向的内容！指针指向的内容是字符串，字符串分配在静态内存区，是无法修改的吧

引用 3 楼 xiaohuh421 的回复:传址和传值,  楼主没有搞清楚. 如果你懂点汇编, 就知道, 所谓的值传递和地址传递, 其实都是在函数开始的地方, 把参数"值" push到堆栈中了. 而这个值, 可能是一个真数值,也可能是一个地址.  如果是地址, 那么这个地址你在函数内部把可重新指向, 但不影响外部, 相当于值传递, 但如果你通过这个地址, 修改了地址对应位置内存的值, 那么这个地址对应的内存中的数据就会真正改变了.  void swap(int *val1, int *val2) {     //交换指针指向的内存中的值      int temp = *val2;      *val2 = *val1;      *val1 = temp;           //交换指针变量     int *pT = val1;     val1 = val2;     val2 = pT; }  void main() {     int val1 = 10;     int val2 = 20;     int  *p1 = &val1;     int *p2 = &val2;    printf("val1=%d  val2=%d  p1=%p   p2=%p\n",val1,val2, p1,p2);     swap(p1,p2);     printf("val1=%d  val2=%d  p1=%p   p2=%p\n",val1,val2, p1,p2);     //交换后, 你会发现, val1,和val2的值交换了, p1和p2是没有变的. }  原因在上面已经说了. 对于p1,p2指针变量本身来说, 他们是值传递的,  只是对于val1和val2来说, 是传递的他们的地址.所以函数内部可以通过地址来修改它们的值.这个确实改变的是指针指向的整形变量的值，不过我的那个改变的应该是实参的指向，因为字符串分配在静态内存区是无法改变的啊

引用 8 楼 zihui0459 的回复:[quote=引用 5 楼 cfjtaishan 的回复:] 这个并没有不是形参改变了实参，描述本身就有问题。形参就是一个变量，实参将值传递给形参，形参接收，这个动作并没有改变实参。而是函数里的逻辑改变了实参的值（地址值），所以描述还是要准确一些。 参数（形参）分为传入参数和传出参数。这个函数的形参，即作为该函数的传入参数，也做为这个函数的传出参数，即将实参的值带给函数，并修改实参的值，并将实参修改后的值反给调用函数，即传出参数。怎么看传出参数是什么呢？如果是交换两个指向int变量的指针swap（int*p1,int*p2） temp=p1; p1=p2;  p2=temp;肯定是换不了的，必须用*p1改变指针指向的变量的值，但是改变字符数组的那个，字符串是分配在静态内存区，字符串的值是没办法改变的啊[/quote] 字符串是分配在静态内存区？什么是静态内存区，你描述的是只读内存区？ 你的这个字符串排序，应该时字符串指针数组吧，指针数组交换每个元素指向的地址值，就可以改变它所指向的字符串。

引用 5 楼 cfjtaishan 的回复:这个并没有不是形参改变了实参，描述本身就有问题。形参就是一个变量，实参将值传递给形参，形参接收，这个动作并没有改变实参。而是函数里的逻辑改变了实参的值（地址值），所以描述还是要准确一些。 参数（形参）分为传入参数和传出参数。这个函数的形参，即作为该函数的传入参数，也做为这个函数的传出参数，即将实参的值带给函数，并修改实参的值，并将实参修改后的值反给调用函数，即传出参数。怎么看传出参数是什么呢？如果是交换两个指向int变量的指针swap（int*p1,int*p2） temp=p1; p1=p2;  p2=temp;肯定是换不了的，必须用*p1改变指针指向的变量的值，但是改变字符数组的那个，字符串是分配在静态内存区，字符串的值是没办法改变的啊

引用 1 楼 user-6 的回复:首先你要搞清楚到底传的什么参数。 指针传值时，参数是指针，而不是指针指向的量，此时在函数内对指针本身进行修改，是不会影响到外面的实参指针，但是如果函数内是对指针指向的量的修改，因为形参指针和实参指针都指向同一个量，自然会影响到该量的值。 char* name[]作为参数时，相当于二级指针 char **name，name是传值，对name的修改不会影响到外面的数组，但对name[i]以及*(name+i)的修改，就会影响到外面的数组。对name[i]的修改也不会改变字符串的值吧？字符串存储在静态内存区，不是无法改变的吗？谭浩强的书上说实参数组和形参数组是同一数组，改变了他们的指向，并没有改变字符串的值。但问题是为什么形参和实参是同一数组，这样说的话那为什么指向int变量的实参和形参不能像这样互换呢？

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

传一个数组名进来，改变数组的内容正常，只不过这里传的是指针数组，所以可以改变。


Question: c语言中char * ，char ** ，char *& ，char &，char 【】的区别

同问

*是一级指针，**是二级指针，*&比如说*&a，按照优先级和结合性，*和&的优先级相同，从右到左，是取指向a地址的值，即a本身，而&*a是指向指针a指向地址的值的地址，【】是与数组有关吗

建议通过写几行程序，通过测试程序了解这集中类型的区别。另外，注意将警告也一并去掉，警告也可能导致程序出错。 动手实践，比看书要记忆好，了解的深刻。

5楼正解，我当时搞不清楚char* char[] string Cstring char**就是一个个看内存的，别怕麻烦，建议自己写几行代码调试下，印象深刻，再也不会忘记了！

引用 3 楼 JILAU_WHO_AM_I_Q234 的回复:char**也可写作char*[]那只是 写在函数参数的时候出现的特例  其他情况两者是不同的

char**也可写作char*[]

char*是字符指针char**是字符指针的指针

C语言中没有char *& ，char & 确定是在学C语言？


Question: 使用按键，使得控制的流水灯重复流水显示，只显示一次，留下微信，解答成功5红包

一直按着是不是一直显示了


Question: 实现将字符串常量s2的值赋给字符串常量s1，让字符串s1输出字符串s2的值，为什么无法实现?

引用 6 楼 a1qwertyuiop1 的回复:下面这段代码输出结果为abc，为何这里字符串常量s1的值却可以修改为abc? 之前的代码却不可以? #include <stdio.h> #include"stdlib.h" main() {     char y[9];     char *s1="iya";     char *s2="abc";     int i=0;     for(;*s1;s1++,s2++,i++){       y[i]=*s2;     }      *s1='\0';     s1=&y[0];     printf("%s",s1);       system("pause"); } 你的这个程序改变的并不是"iya"，而是s1指针的内容，使s1指向了数组y。    从第3张图可以看到，保存字符串iya的地址0x01266b30中的内容并没有改变；改变的是s1的内容，s1指向的内容变为了abc。 在VS2015+Windows10 64位调试的过程中，你的代码还需要修改一下： 1将char y[9];改为char y[9]={0};即对数组y进行初始化，否则输出的s1有“烫”字； 2将 *s1='\0';注释掉，从第二张图可以看到，此时s1的值是0x01266b33，对该处内存地址赋值时不允许的，要报错。

引用 10 楼 wenpinglaoyao 的回复:[quote=引用 1 楼 hou09tian 的回复:] VS2015+Windows10 64位调试得到如下信息  对于     for(;*s2;s1++,s2++){       s1=s2;                         //这行将s2的地址赋给s1,是不是相当于将地址对应的值赋给s1,也就是实现*s1=*s2.     }  此时s1的值是0x002a6b30；s2的值是0x002a6b34。第一次执行for循环内的执行语句，s1的值变为0x002a6b34；之后执行for循环的表达式语句，此时s1和s2的值都是0x002a6b35，第二次执行for循环内的执行语句，两个变量值都是0x002a6b35，实际上for循环内的执行语句并没有起作用，这两个变量始终都相等。最后s1和s2的值都是0x002a6b37，此时如果再赋值 *s1='\0'; 就会报错，因为0x002a6b37这个位置是不能赋值的（没有对这个内存地址进行声明） 而 s1=&s2[0];                   //这行是不是相当于将指针s1指向s2的首地址， 是正确的，就相当于  您好朋友，您回答里面的图片是怎么搞出来的，调试时visual studio给您做出来的？？[/quote] WPS里面的画图功能

#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

char*赋初值后是字符串常量，不可改！

引用 1 楼 hou09tian 的回复:VS2015+Windows10 64位调试得到如下信息  对于     for(;*s2;s1++,s2++){       s1=s2;                         //这行将s2的地址赋给s1,是不是相当于将地址对应的值赋给s1,也就是实现*s1=*s2.     }  此时s1的值是0x002a6b30；s2的值是0x002a6b34。第一次执行for循环内的执行语句，s1的值变为0x002a6b34；之后执行for循环的表达式语句，此时s1和s2的值都是0x002a6b35，第二次执行for循环内的执行语句，两个变量值都是0x002a6b35，实际上for循环内的执行语句并没有起作用，这两个变量始终都相等。最后s1和s2的值都是0x002a6b37，此时如果再赋值 *s1='\0'; 就会报错，因为0x002a6b37这个位置是不能赋值的（没有对这个内存地址进行声明） 而 s1=&s2[0];                   //这行是不是相当于将指针s1指向s2的首地址， 是正确的，就相当于  您好朋友，您回答里面的图片是怎么搞出来的，调试时visual studio给您做出来的？？

s2一直++，指向一个空才停止下来，然后把s2赋给s1，s1当然没有值了。

s1, s2是指向只读数据段，那么就不能被修改。另外，赋值也是有问题，即使s1是可读可写的，那么赋值也不能是s1 = s2，而是 *s1 = s2; 代码如下： #include <stdio.h> #include"stdlib.h" int main() {     char y[9];     char *s1= y;     char *s2="abc";      for(;*s2;s1++,s2++){         *s1 = *s2;     }     *s1 = '\0';      printf("%s\n", y);     system("pause"); }

同样是字符串常量，为何这里字符串常量s1的值却可以修改？ #include <stdio.h> #include"stdlib.h" main() {     char y[9];     char *s1="iya";     char *s2="abc";     int i=0;     for(;*s1;s1++,s2++,i++){       y[i]=*s2;     }      *s1='\0';     s1=&y[0];     printf("%s",s1);       system("pause"); }

引用 3 楼 a1qwertyuiop1 的回复:既然s2各个字符地址已经传给了s1.为何没将值"abc"传过去呢？ "abc"、“iya”是字符串常量，是不能被修改的。

既然s2各个字符地址已经传给了s1.为何没将值"abc"传过去呢？

对于for循环语句的初始化语句、条件语句、表达式语句和执行语句的含义，请看 http://blog.csdn.net/hou09tian/article/details/77001685 我自己写的一篇关于for循环的小文章，请多指教


Question: 控制台终端 打印如何实现修改这一行的内容

printf("process=%f\r", process);  \r 是光标移到开始，后面输入的数据会覆盖已有的数据

console屏幕处理例子程序。终端窗口屏幕处理相关API使用例子。来自MSVC20\SAMPLES\win32\console\ http://download.csdn.net/detail/zhao4zhong1/3461309

#include"iostream" #include <ctime>  using namespace std; void Delay(int   time)//time*1000为秒数  {  	clock_t now = clock();  	while(clock() - now < time);  }   int main() { 	for(int i = 0;i < 100; i++) 	{ 		if(i%2) 			cout << "..............\\ " << i; 		else 			cout << "............../ " << i; 		Delay(500); 		if(i < 10) 			cout << "\b\b\b\b\b\b\bb\b\b\b\b\b\b\b\b\b\b\b\b\b\b"; 		else if(i >=10 && i < 100) 			cout << "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"; 		else if(i >=100 && i < 1000) 			cout << "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"; 	} 	return 0; }  简单粗暴的做法，哈哈


Question: 求指教！cb下C语言控制台程序的运行（模拟消息循环）

参考BC31中TVISION http://download.csdn.net/source/2805028


Question: 结构体内定义了多个成员变量时，声明结构体数组后如何赋值？

引用 4 楼 qq_38576126 的回复:[quote=引用 2 楼 qq848439256 的回复:]  刚才不知道怎么的这种没试成功，现在已经成功了，就是我这个图。 City c[3]={{"001","北京"},{"002","上海"},{"003","深圳"}}; 大括号的和不加括号的是对的，小括号的不对[/quote] 好的

引用 2 楼 qq848439256 的回复: 刚才不知道怎么的这种没试成功，现在已经成功了，就是我这个图。 City c[3]={{"001","北京"},{"002","上海"},{"003","深圳"}}; 大括号的和不加括号的是对的，小括号的不对

引用 1 楼 qq_38576126 的回复: #include<iostream> #include<stdio.h> using namespace std; typedef struct {     char qh[8];     char name[15]; } City; int main() {     City c[3];     //第一种     for(int i=0; i<3; i++)         scanf("%s%s",c[i].qh,c[i].name);     for(int i=0; i<3; i++)         printf("%s %s\n",c[i].qh,c[i].name);     //第二种     for(int i=0; i<3; i++)         scanf("%s%s",(c+i)->qh,(c+i)->name);     for(int i=0; i<3; i++)         printf("%s %s\n",(c+i)->qh,(c+i)->name); }  谢谢你，虽然不是我想要的那种。我知道怎么用了，刚才不知道怎么弄的没成功，现在已经成功

刚才不知道怎么的这种没试成功，现在已经成功了，就是我这个图。


Question: 求叶片泵吸压油体积变化编程

百度搜相关关键字。


Question: 跟链表有关的，程序无法运行

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

引用 3 楼 自信男孩的回复:#include<stdio.h> #include<stdlib.h>  #define LEN sizeof(struct B)  struct B {     int a;     struct B *p; }; struct B*creat() {     char b;     struct B*head,*p1,*p2;     int c=0;     head=NULL;     b = getchar();     while(b!='\n')     {         if(c == 0)    /*here is not '=' */         {             p1 = (struct B*)malloc(LEN);             p2 = p1;             head = p1;             p1->a = c++;   /* here c must add 1*/             continue;         }         else         {             p1=(struct B*)malloc(LEN);             p2->p = p1;             p2 = p1;             p1->a = c + 1;         }         c = c + 1;         b = getchar();     }     p1->p = NULL;     printf("%d", c);     return head; } int main() {     struct B*p3;     p3=creat();     return 0; } 两个问题，分别在语句后面加了注释。 个人建议，结构体用于指向下一个节点的地址指针，建议取名为next或者pnext；这样见名知义，提高代码的可读性。 多谢，完美解决了我的问题


Question: 如何转换16进制数？

引用 16 楼 fishworm 的回复:1、存储数字字符串的长度是否固定？ 2、不固定则最好是先将字符串转换为16进制数字 3、可以使用联合中的char数组，将数字转换为字符串 4、可以方便解决字节序的问题

引用 4 楼 zhao4zhong1 的回复:没人注意字节序吗？好像是反的，不过倒过来存储应该就没问题了吧

引用 1 楼 cfjtaishan 的回复:#include <stdio.h>  union num {     unsigned int number;     unsigned char num_list[4]; };   int main(void) {     union num a;     char *str = "4953434d";      sscanf(str, "%x", &a.number);      printf("%x: %x, %x, %x, %x\n", a.number,            a.num_list[0], a.num_list[1],            a.num_list[2], a.num_list[3]);      return 0; }非常感谢！

没人注意字节序吗？

同意2楼，只是代码要稍微改一下  	printf("%x: \\x%x, \\x%x, \\x%x, \\x%x\n", a.number, 		a.num_list[3], a.num_list[2], 		a.num_list[1], a.num_list[0]);

使用查表法比较快

引用 10 楼 zhanggongjkl 的回复:[quote=引用 9 楼 wyyy2088511 的回复:] [quote=引用 8 楼 wyyy2088511 的回复:] 先两位两位分割，然后用strtoul。 先两个字节分割[/quote]具体怎么分割能讲下吗，新手。。。[/quote] #include <iostream> #define MAX_LEN 100 void main( ) { 	char *str = "4953434d4d53"; 	int data[MAX_LEN]; 	char szData[MAX_LEN][3]; 	int len = strlen(str); 	for(int i=0; i<len; i+=2) 	{ 	    szData[i/2][0] = str[i];         szData[i/2][1] = str[i+1]; 	}  	for(int i=0; i<len/2; i++) 	{ 	    data[i] = strtoul(szData[i],NULL,16); 	}  	for(int i=0; i<len/2; i++) 	{ 		printf("%x ",data[i]);	 	}  	printf("\n"); 	system("pause"); }

引用 7 楼 zhanggongjkl 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] #include <stdio.h>  union num {     unsigned int number;     unsigned char num_list[4]; };   int main(void) {     union num a;     char *str = "4953434d";      sscanf(str, "%x", &a.number);      printf("%x: %x, %x, %x, %x\n", a.number,            a.num_list[0], a.num_list[1],            a.num_list[2], a.num_list[3]);      return 0; }麻烦再问下，要是str再多出几位比如 "4953434d4d53"的话好像就出错了，是不是因为unsigned int的长度不够了？[/quote]  是的，因为你的需求里是32位，所以用了一个无符号整型

引用 12 楼 zhao4zhong1 的回复: 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。6个函数已经记在小本本上~感谢~

//字符串 "4953434d" 如何把它转换成字符串数组 {'\x49','\x53','\x43','\x4d'} #include <stdio.h> char s[]="4953434d"; char b[4]; int v,i; int main() {     for (i=0;i<4;i++) {         sscanf((char *)s+i*2,"%2x",&v);         b[i]=(char)v;         printf("\\x%02x\n",(unsigned char)b[i]);     }     return 0; } //\x49 //\x53 //\x43 //\x4d //

引用 9 楼 wyyy2088511 的回复:[quote=引用 8 楼 wyyy2088511 的回复:] 先两位两位分割，然后用strtoul。 先两个字节分割[/quote]具体怎么分割能讲下吗，新手。。。

引用 8 楼 wyyy2088511 的回复:先两位两位分割，然后用strtoul。 先两个字节分割

先两位两位分割，然后用strtoul。

引用 1 楼 cfjtaishan 的回复:#include <stdio.h>  union num {     unsigned int number;     unsigned char num_list[4]; };   int main(void) {     union num a;     char *str = "4953434d";      sscanf(str, "%x", &a.number);      printf("%x: %x, %x, %x, %x\n", a.number,            a.num_list[0], a.num_list[1],            a.num_list[2], a.num_list[3]);      return 0; }麻烦再问下，要是str再多出几位比如 "4953434d4d53"的话好像就出错了，是不是因为unsigned int的长度不够了？


Question: 二元运算符重载的友元函数实现

Java转过来的？C++里非引用传参就是复制一份，不是传什么指针。

friend Coordinate operator-(const Coordinate &c1, const  Coordinate &c2);    friend Coordinate operator-(const Coordinate c1, const  Coordinate c2);

引用 3 楼 a673786103 的回复:[quote=引用 2 楼 hdt 的回复:] 可是 如果没有引用符号 两个指针的值都不同  怎么操作原来的空间？ =========================== 比如  int c = a-b;   难道 你要在operator- 里面修改输入参数？？？ 从语义上来说a和b是只读的  但是两个地址和实参都不相同 不是一个地方[/quote] 传值相当于复制，为何要一样呢？ 传值的缺点是效率比较低而已。 如果你真想了解其中区别，建议看看ec++

引用 2 楼 hdt 的回复:可是 如果没有引用符号 两个指针的值都不同  怎么操作原来的空间？ =========================== 比如  int c = a-b;   难道 你要在operator- 里面修改输入参数？？？ 从语义上来说a和b是只读的  但是两个地址和实参都不相同 不是一个地方

ec++ 关于重载操作符，有详细的讲解


Question: 编程新手！！！想请教一下关于怎样编程日期合法性的问题！！！

# include <stdio.h>   int gainint(int *p,int a,int b);   int main(){   int month[]={31,28,31,30,31,30,31,31,30,31,30,31},i;   int charge[6]={1,1,1,2016,12,0};   char zifu[][5]={"年份","月份","天数"};   int a[3];   for(i=0;i<3;i++)   {   printf("请输入%s(%d--%d):\n",zifu[i],charge[i],charge[i+3]);   gainint(&a[i],charge[i],charge[i+3]);   if(i==0)   month[1]=!(a[0]%4&&a[0]%100)||!(a[0]%400)?29:28;   if(i==1)   charge[5]=month[a[1]-1];   }   printf("%04d年%02d月%02d日",a[0],a[1],a[2]);   getchar();   return 0;   }   int gainint(int *p,int a,int b)//a为最小值b为最大值   {   int c[2]={0,1};   do{   scanf("%d",p);   while(getchar()!='\n');     if(*p>b||*p<a)   printf("输入有误,请重新输入(%d--%d):",a,b);   }while(*p>b||*p<a);   return *p;//返回数字的位数   }

//我相信我的代码 # include <stdio.h>   int gainint(int *p,int a,int b);   int main(){   int month[]={31,28,31,30,31,30,31,31,30,31,30,31},i;   int charge[6]={1,1,1,2016,12,0};   char zifu[][5]={"年份","月份","天数"};   int a[3];   for(i=0;i<3;i++)   {   printf("请输入%s(%d--%d):\n",zifu[i],charge[i],charge[i+3]);   gainint(&a[i],charge[i],charge[i+3]);   if(i==0)   month[1]=!(a[0]%4&&a[0]%100)||!(a[0]%400)?29:28;   if(i==1)   charge[5]=month[a[1]-1];   }   printf("%04d年%02d月%02d日",a[0],a[1],a[2]);   getchar();   return 0;   }   int gainint(int *p,int a,int b)//a为最小值b为最大值   {   int c[2]={0,1};   do{   scanf("%d",p);   while(getchar()!='\n');     if(*p>b||*p<a)   printf("输入有误,请重新输入(%d--%d):",a,b);   }while(*p>b||*p<a);       while(*p/c[1])   {   c[1]*=10;   c[0]++;   }   return c[0];//返回数字的位数   }

选择语句就简单来说有双边选择语句和多边选择语句，楼主的代码混在一起，应该参考1楼的代码，清晰又不会出错。

引用 5 楼 zhao4zhong1 的回复:COleDateTime::COleDateTime COleDateTime( ); COleDateTime( const COleDateTime& dateSrc ); COleDateTime( const VARIANT& varSrc ); COleDateTime( DATE dtSrc ); COleDateTime( time_t timeSrc ); COleDateTime( const SYSTEMTIME& systimeSrc ); COleDateTime( const FILETIME& filetimeSrc ); COleDateTime( int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec ); COleDateTime( WORD wDosDate, WORD wDosTime );  Parameters  dateSrc  An existing COleDateTime object to be copied into the new COleDateTime object.  varSrc  An existing VARIANT data structure (possibly a COleVariant object) to be converted to a date/time value (VT_DATE) and copied into the new COleDateTime object.  dtSrc  A date/time (DATE) value to be copied into the new COleDateTime object.  timeSrc  A time_t value to be converted to a date/time value and copied into the new COleDateTime object.  systimeSrc  A SYSTEMTIME structure to be converted to a date/time value and copied into the new COleDateTime object.  filetimeSrc  A FILETIME structure to be converted to a date/time value and copied into the new COleDateTime object.  nYear, nMonth, nDay, nHour, nMin, nSec  Indicate the date and time values to be copied into the new COleDateTime object.  wDosDate, wDosTime  MS-DOS date and time values to be converted to a date/time value and copied into the new COleDateTime object.  Remarks  All of these constructors create new COleDateTime objects initialized to the specified value. The following table shows valid ranges for each date and time component:  Date/Time Component Valid Range  year 100 – 9999  month 0 – 12  day 0 – 31  hour 0 – 23  minute 0 – 59  second 0 – 59    Note that the actual upper bound for the day component varies based on the month and year components. For details, see the SetDate or SetDateTime member functions.  Following is a brief description of each constructor:   COleDateTime( )   Constructs a COleDateTime object initialized to 0 (midnight, 30 December 1899).   COleDateTime( dateSrc )   Constructs a COleDateTime object from an existing COleDateTime object.   COleDateTime( varSrc )   Constructs a COleDateTime object. Attempts to convert aVARIANT structure or COleVariant object to a date/time (VT_DATE) value. If this conversion is successful, the converted value is copied into the new COleDateTime object. If it is not, the value of the COleDateTime object is set to 0 (midnight, 30 December 1899) and its status to invalid.   COleDateTime( dtSrc )   Constructs a COleDateTime object from a DATE value.   COleDateTime( timeSrc )   Constructs a COleDateTime object from a time_t value.   COleDateTime( systimeSrc )   Constructs a COleDateTime object from a SYSTEMTIME value.   COleDateTime( filetimeSrc )   Constructs a COleDateTime object from a FILETIME value.   COleDateTime( nYear, nMonth, nDay, nHour, nMin, nSec )   Constructs a COleDateTime object from the specified numerical values.   COleDateTime( wDosDate, wDosTime )   Constructs a COleDateTime object from the specified MS-DOS date and time values.  For more information, see theVARIANT entry in the Win32 SDK OLE Programmer's Reference.  For more information on the time_t data type, see thetime function in the Run-Time Library Reference.  For more information, see theSYSTEMTIME andFILETIME structures in the Win32 SDK documentation.  For more information on MS-DOS date and time values, seeDosDateTimeToVariantTime in the Win32 SDK documentation.  For more information about the bounds for COleDateTime values, see the articleDate and Time: Automation Support in Visual C++ Programmer’s Guide.  COleDateTime Overview |  Class Members |  Hierarchy Chart  See Also   COleDateTime::SetDate, COleDateTime::SetDateTime, COleDateTime::SetTime, COleDateTime::GetStatus, COleDateTime::operator =, COleDateTime::m_dt, COleDateTime::m_status  老赵神回复，草木皆兵了

COleDateTime::GetStatus DateTimeStatus GetStatus( ) const;  Return Value  Returns the status of this COleDateTime value.  Remarks  Call this member function to get the status (validity) of a given COleDateTime object.  The return value is defined by the DateTimeStatus enumerated type, which is defined within the COleDateTime class.  enum DateTimeStatus{    valid = 0,    invalid = 1,    null = 2, };  For a brief description of these status values, see the following list:   COleDateTime::valid   Indicates that this COleDateTime object is valid.   COleDateTime::invalid   Indicates that this COleDateTime object is invalid; that is, its value may be incorrect.   COleDateTime::null   Indicates that this COleDateTime object is null, that is, that no value has been supplied for this object. (This is “null” in the database sense of “having no value,” as opposed to the C++ NULL.)  The status of a COleDateTime object is invalid in the following cases:   If its value is set from a VARIANT or COleVariant value that could not be converted to a date/time value.   If its value is set from a time_t, SYSTEMTIME, or FILETIME value that could not be converted to a valid date/time value.   If its value is set by SetDateTime with invalid parameter values.   If this object has experienced an overflow or underflow during an arithmetic assignment operation, namely, += or -=.   If an invalid value was assigned to this object.   If the status of this object was explicitly set to invalid using SetStatus.  For more information about the operations that may set the status to invalid, see the following member functions:   COleDateTime   SetDateTime   operator +, -   operator +=, -=  For more information about the bounds for COleDateTime values, see the articleDate and Time: Automation Support in Visual C++ Programmer’s Guide.  COleDateTime Overview |  Class Members |  Hierarchy Chart  See Also   COleDateTime::SetStatus, COleDateTime::m_status

case 2少一个break,建议加上。

#include <stdio.h>  int main() {     int year,month,day;     scanf("%d-%d-%d",&year,&month,&day); #if 1     if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&day<=31) {         printf("YES");     } else if((month==4||month==6||month==9||month==11)&&day<=30) {         printf("YES");     } else if(month==2&&((year%100!=0&&year%4==0)||(year%400==0))&&day<=29) {         printf("YES");     } else {         printf("NO");     } #else     switch (month) {         case 1: case 3:         case 5: case 7:         case 8: case 10:         case 12:             if (day <= 31) {                 printf("YES\n");             } else {                 printf("NO\n");             }             break;          case 4: case 6:         case 9: case 11:             if (day <= 30)                 printf("YES\n");             else                 printf("NO\n");             break;          case 2:             if ((year % 100 != 0 && year % 4 == 0) || (year % 400 == 0)) {                 if (day <= 29)                     printf("YES\n");                 else                     printf("NO\n");             } else if (day <= 28) {                 printf("YES\n");             } else {                   printf("NO\n");             }          default:             printf("Not support!\n");             break;      } #endif     return 0; }  参考一下上面的代码， else总是和上面和它最近的if匹配。 若if else超过3个，建议改用switch case代替。

#include <stdio.h>  int main() { 	int year,month,day; 	scanf("%d-%d-%d",&year,&month,&day); 	if((month==1||month==3||month==5||month==7||month==8|| 				month==10||month==12)&&day<=31){ 		printf("YES\n"); 	} 	else if((month==4||month==6||month==9||month==11)&&day<=30){ 		printf("YES\n"); 	}         else if(month==2&&((year%100!=0&&year%4==0)||(year%400==0))&&day<=29){ 		printf("YES\n"); 	} 	else{ 		printf("NO\n"); 	} 	return 0;									     } 这样就好了，相当于else里面镶嵌了else if，对判断过程的细化，注意判断结果的唯一性


Question: 链表删除操作遇到Segmentation fault，求指点

引用 1 楼 cfjtaishan 的回复:#include<stdio.h> #include<stdlib.h> #include<string.h>  #define LEN sizeof(struct Clerk)  struct Clerk {     long num;     char name[30];     struct Clerk *next; }; int n;  struct Clerk *creat(void) {     struct Clerk *head = NULL;     struct Clerk *p1 = NULL;     struct Clerk *p2 = NULL;     n = 0;      p1 = p2 = (struct Clerk *) malloc(LEN);     printf("please enter num and name:\n");     scanf("%ld,%s", &p1->num, p1->name);     head = NULL;     while(0 != strncmp("end", p1->name, 3))     {         n = n + 1;         if(1 == n){             head = p1;         }         else{             p2->next = p1;         }         p2 = p1;         p1 = (struct Clerk *)malloc(LEN);         scanf("%ld,%s", &p1->num, p1->name);     }     free(p1);     p2->next = NULL;     return(head); }  void print(struct Clerk *head) {     struct Clerk *p = NULL;     printf("this %d clerks are:\n", n);     p = head;     if(head != NULL) {    /*here del ';' */         do {             printf("%ld  %s\n", p->num, p->name);             p = p->next;         }while(p != NULL);     } }  struct Clerk *del(struct Clerk *head,long num) {     struct Clerk *p1 = NULL;     struct Clerk *p2 = NULL;      if(head == NULL){    /*here, not '=' */         return head;     }     p1 = head;     while(num != p1->num && p1->next != NULL)     {         p2 = p1;         p1 = p1->next;     }     if(num == p1->num){         if(p1 == head){             head = p1->next;         }         else{             p2->next = p1->next;         }         n = n - 1;     }     else{     }      return head; }   struct Clerk *insert(struct Clerk *head, struct Clerk *cl) {     struct Clerk *p0 = NULL;     struct Clerk *p1 = NULL;     struct Clerk *p2 = NULL;     p1 = head;     p0 = cl;      if(head == NULL){         head = p0;     }     else{         while((p0->num > p1->num) && (p1-> next != NULL))         {             p2 = p1;             p1 = p1->next;         }         if(p0->num <= p1->num){             if(head == p1){                 head = p0;                 p0->next = p1;             }             else{                 p2->next = p0;                 p0->next = NULL;             }         }         n = n + 1;     }         return head; }  int main(int argc, const char *argv[]) {     struct Clerk *head,cl;     long del_num;      head = creat();     print(head);      printf("input the deleted number:\n");     scanf("%ld", &del_num);     head = del(head, del_num);     print(head);      printf("input clerk:\n");     scanf("%ld,%s", &cl.num, cl.name);     head = insert(head, &cl);     print(head);      return 0; } 有几处逻辑错误；详见上面代码里的注释。 对比一下代码，然后测试一下看看是否还有问题。 解决了，唉！。。。。总是犯这种错误，还找不到。。。多谢

引用 3 楼 hekylej 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] 另外，del函数里，return head放在else外面。 return head是在else外面的[/quote] 看错了，是insert函数

引用 2 楼 cfjtaishan 的回复:另外，del函数里，return head放在else外面。 return head是在else外面的

另外，del函数里，return head放在else外面。


Question: 关于SCONS的ARGUMENTS的问题

VS IDE中，在不明白的符号上点鼠标右键，选转到定义。


Question: 在win10 ，vs2015，wdk10开发环境下，出现C1083错误，不同的wdk平台版本出现不同的.h错误

Windows驱动开发 http://www.osronline.com/

卸载重装WINSDK跟WDK试下

引用 10 楼 zwfgdlc 的回复:卸载重装WINSDK跟WDK试下  今天卸载重装了一下，已经解决了。

引用 8 楼 zwfgdlc 的回复:[quote=引用 6 楼 qq_27255679 的回复:] [quote=引用 5 楼 zwfgdlc 的回复:] Windows SDK跟WDK版本是不是不一样？  设置了，两个平台版本更换的时候都进行sdk更改了。[/quote] 我是说你安装的WINSDK跟WDK是不是一样， 比如WINSDK版本10.0.15063.xxx对应的WDK版本也要是10.0.15063.xxx [/quote]  我的wdk版本用的是10.0.10586.0。sdk也是10.0.10586.0

引用 6 楼 qq_27255679 的回复:[quote=引用 5 楼 zwfgdlc 的回复:] Windows SDK跟WDK版本是不是不一样？  设置了，两个平台版本更换的时候都进行sdk更改了。[/quote] 我是说你安装的WINSDK跟WDK是不是一样， 比如WINSDK版本10.0.15063.xxx对应的WDK版本也要是10.0.15063.xxx

引用 5 楼 zwfgdlc 的回复:Windows SDK跟WDK版本是不是不一样？  设置了，两个平台版本更换的时候都进行sdk更改了。

Windows SDK跟WDK版本是不是不一样？

引用 2 楼 zwfgdlc 的回复:工程属性里选择目标平台版本   选择了，两个都试了。10.0.10586.0和10.0.15063.0都更换了一下，都不行。不过报的错误不一样。

引用 1 楼 u013276931 的回复:我也遇到了相同的问题，望大佬解答  你QQ多少，咱们交流一下

工程属性里选择目标平台版本

我也遇到了相同的问题，望大佬解答