Question: 新人求助~谢谢大家

VC不支持VLA 不要在C++中使用VLA（尽管一些C++编译器支持VLA，但C++标准是不支持的）

谢谢大家！我刚初学，溢出什么的也半懂不懂的  还有刚发现一个问题 为什么C-Free运行和Dev-C++都不会出错，但VC++6.0运行就出错了呢？@弓长羊羽  @iamlbk

更正：可以不用存储矩阵元素

数组分配在栈上，而栈的大小是有限的 只是打印出n阶单位矩阵，可以存储矩阵元素：  int main(void) { 	int i, j, b; 	do 	{ 		scanf("%d", &b); fflush(stdin); 	} while (b <= 0); 	for (i = 0; i < b; i++) 	{ 		for (j = 0; j < b; j++) 		{ 			if (i == j) printf("%-2d", 1); 			else printf("%-2d", 0); 		} 		printf("\n"); 	} 	return 0; }

额， 如果真的能运行的话，就是栈溢出。 参见这个帖子：http://bbs.csdn.net/topics/391025508 其实你完全可以把数组删了的。。。

可以运行 刚学到数组，来实践下 话说那个程序为什么输入720或以上的数字会出错呢？

额，其实不需要使用数组吧，说道数组，lz的程序可以运行？


Question: C语言static的一个困惑

哦，是不是在一个工程里面实现

嗯，有点懂了，等于我是直接把exam01.h这个文件导入到了main文件中，所以static int INT_MAX就是一个main中的变量了。 那我该怎么分别编译这两个文件呢，求指教

楼上两位的解答是对的，楼主main函数的cpp文件包含了定义static变量的exam01.h头文件，所以static变量INT_MAX在cpp文件中是可见的。

题主 你得想弄清楚什么是 #include 这个预处理之类是把 指定文件的全部内容都写到#include 的位置 所以你的 main文件 预处理之后的代码是 ........ static int INT_MAX = 1000; int sum()...... int main() ......  你的INT_MAX 的确是内部链接 的确是其他文件找不到 这个INT_MAX 但是你没有在其他文件找这个符号  你是在本文件使用这个符号  所以没什么问题   记住一点 .h 文件只是 .cpp文件的 一个片段

这个，我觉得这样理解。 static变量定义了，就在内存里面画了一块内存出来，然后这个内存就一直占用着，直到程序结束。 而不是楼主想的那样，内部外部不能引用。 不知道楼主是不是接触了面向对象编程，那里面有个私有变量，那个外部就不能访问了， 楼主不要弄混了


Question: C语言读取8位bmp图  转换成像素输出

引用 11 楼 qq_34811991 的回复:8位位图没有颜色表啊，格式怎么简单，不会啊 你在开玩笑嘛？8位位图怎么会没有颜色表？

8位位图没有颜色表啊，格式怎么简单，不会啊

引用 9 楼 dadaobiancheng 的回复:[quote=引用 8 楼 hnwyllmm 的回复:] [quote=引用 6 楼 dadaobiancheng 的回复:] [quote=引用 5 楼 hnwyllmm 的回复:] [quote=引用 3 楼 dadaobiancheng 的回复:] [quote=引用 1 楼 hnwyllmm 的回复:] 我正好写过一个，但是当时收集的资料都弄丢了，只有代码了，不要积分下载，希望对楼主有帮助： http://download.csdn.net/detail/hnwyllmm/6700471\   我想把像素的坐标一起读出来   读成一个灰度的二维数组     就是每个点上都是灰度值 用txt写出来[/quote] 我的代码里面这个函数From24or32ToGray可以从24位位图或32位位图中读取象素信息，然后转换为灰度图，楼主可以直接复制读取位图象素信息的代码，读取出来保存到文件即可 [/quote]   我直接把fDst  写成   xx.txt读出来是乱码  是不可以直接读取吗[/quote] 写的数据是二进制的[/quote]   8位图的位图也可以用这个方法来计算吗  它不应该是从颜色表中读取吗[/quote] 8位位图不用，没有颜色表，格式更简单

引用 8 楼 hnwyllmm 的回复:[quote=引用 6 楼 dadaobiancheng 的回复:] [quote=引用 5 楼 hnwyllmm 的回复:] [quote=引用 3 楼 dadaobiancheng 的回复:] [quote=引用 1 楼 hnwyllmm 的回复:] 我正好写过一个，但是当时收集的资料都弄丢了，只有代码了，不要积分下载，希望对楼主有帮助： http://download.csdn.net/detail/hnwyllmm/6700471\   我想把像素的坐标一起读出来   读成一个灰度的二维数组     就是每个点上都是灰度值 用txt写出来[/quote] 我的代码里面这个函数From24or32ToGray可以从24位位图或32位位图中读取象素信息，然后转换为灰度图，楼主可以直接复制读取位图象素信息的代码，读取出来保存到文件即可 [/quote]   我直接把fDst  写成   xx.txt读出来是乱码  是不可以直接读取吗[/quote] 写的数据是二进制的[/quote]   8位图的位图也可以用这个方法来计算吗  它不应该是从颜色表中读取吗

引用 5 楼 hnwyllmm 的回复:[quote=引用 3 楼 dadaobiancheng 的回复:] [quote=引用 1 楼 hnwyllmm 的回复:] 我正好写过一个，但是当时收集的资料都弄丢了，只有代码了，不要积分下载，希望对楼主有帮助： http://download.csdn.net/detail/hnwyllmm/6700471\   我想把像素的坐标一起读出来   读成一个灰度的二维数组     就是每个点上都是灰度值 用txt写出来[/quote] 我的代码里面这个函数From24or32ToGray可以从24位位图或32位位图中读取象素信息，然后转换为灰度图，楼主可以直接复制读取位图象素信息的代码，读取出来保存到文件即可 [/quote]   我直接把fDst  写成   xx.txt读出来是乱码  是不可以直接读取吗

引用 6 楼 dadaobiancheng 的回复:[quote=引用 5 楼 hnwyllmm 的回复:] [quote=引用 3 楼 dadaobiancheng 的回复:] [quote=引用 1 楼 hnwyllmm 的回复:] 我正好写过一个，但是当时收集的资料都弄丢了，只有代码了，不要积分下载，希望对楼主有帮助： http://download.csdn.net/detail/hnwyllmm/6700471\   我想把像素的坐标一起读出来   读成一个灰度的二维数组     就是每个点上都是灰度值 用txt写出来[/quote] 我的代码里面这个函数From24or32ToGray可以从24位位图或32位位图中读取象素信息，然后转换为灰度图，楼主可以直接复制读取位图象素信息的代码，读取出来保存到文件即可 [/quote]   我直接把fDst  写成   xx.txt读出来是乱码  是不可以直接读取吗[/quote] 写的数据是二进制的

仅供参考：#include <iostream> #include <fstream> #include <string> #include <windows.h> #include <gdiplus.h> #pragma comment(lib, "gdiplus.lib")  using namespace std; using namespace Gdiplus;  int main() {     GdiplusStartupInput gdiplusstartupinput;     ULONG_PTR gdiplustoken;     GdiplusStartup(&gdiplustoken, &gdiplusstartupinput, NULL);      wstring infilename(L"1.jpg");     string outfilename("color.txt");      Bitmap* bmp = new Bitmap(infilename.c_str());     UINT height = bmp->GetHeight();     UINT width  = bmp->GetWidth();     cout << "width " << width << ", height " << height << endl;      Color color;     ofstream fout(outfilename.c_str());      for (UINT y = 0; y < height; y++)     for (UINT x = 0; x < width ; x++) {             bmp->GetPixel(x, y, &color);             fout << x << "," << y << ";"                  << (int)color.GetRed()   << ","                  << (int)color.GetGreen() << ","                  << (int)color.GetBlue()  << endl;     }      fout.close();      delete bmp;     GdiplusShutdown(gdiplustoken);     return 0; }

那你需要RGB转YUV,然后单拿Y出来

引用 3 楼 dadaobiancheng 的回复:[quote=引用 1 楼 hnwyllmm 的回复:] 我正好写过一个，但是当时收集的资料都弄丢了，只有代码了，不要积分下载，希望对楼主有帮助： http://download.csdn.net/detail/hnwyllmm/6700471\   我想把像素的坐标一起读出来   读成一个灰度的二维数组     就是每个点上都是灰度值 用txt写出来[/quote] 我的代码里面这个函数From24or32ToGray可以从24位位图或32位位图中读取象素信息，然后转换为灰度图，楼主可以直接复制读取位图象素信息的代码，读取出来保存到文件即可

引用 1 楼 hnwyllmm 的回复:我正好写过一个，但是当时收集的资料都弄丢了，只有代码了，不要积分下载，希望对楼主有帮助： http://download.csdn.net/detail/hnwyllmm/6700471\   我想把像素的坐标一起读出来   读成一个灰度的二维数组     就是每个点上都是灰度值 用txt写出来

8位就是一个调色版，可以看成pal[256]，每个内容4字节，R，G，B，另一个对齐，转成24位输出最简单，


Question: 问一个关于ＴＣＰ的问题

谢谢，不过不是这里的问题，我改成“127.0.0.1”了，可还是一样的

引用 1 楼 Jacob1_1 的回复:客户端与服务器端实现了交互，可为什么无论我从键盘上输入什么，都显示不出来结果呢？输入“ｂｙｅ”也没有停止客户端的运行，真不知道哪里出现问题了，大神们，帮帮忙了  127.0.0.1

不需要啊，只要套接字连接就好了

这是java啊  早忘记了.............  随便看了下，server不需要bind吗？

算了，我就不说了。。。

楼主手滑了。最近手滑出错的新闻比较多，楼主想上头条？

好像发错了

你确定没发错论坛？确定不是java代码？


Question: 求助  setCursorPosition(0,0);这个怎么用

帮了我好大忙，谢谢~~

第1行＋第88～95行。

引用 2 楼 zhao4zhong1 的回复:仅供参考：#include <windows.h> #include <stdio.h>  void ConPrint(char *CharBuffer, int len); void ConPrintAt(int x, int y, char *CharBuffer, int len); void gotoXY(int x, int y); void ClearConsole(void); void ClearConsoleToColors(int ForgC, int BackC); void SetColorAndBackground(int ForgC, int BackC); void SetColor(int ForgC); void HideTheCursor(void); void ShowTheCursor(void);  int main(int argc, char* argv[]) {    HideTheCursor();    ClearConsoleToColors(15, 1);    ClearConsole();    gotoXY(1, 1);    SetColor(14);    printf("This is a test...\n");    Sleep(5000);    ShowTheCursor();    SetColorAndBackground(15, 12);    ConPrint("This is also a test...\n", 23);    SetColorAndBackground(1, 7);    ConPrintAt(22, 15, "This is also a test...\n", 23);    gotoXY(0, 24);    SetColorAndBackground(7, 1);    return 0; }  //This will clear the console while setting the forground and //background colors. void ClearConsoleToColors(int ForgC, int BackC) {    WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);    //Get the handle to the current output buffer...    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);    //This is used to reset the carat/cursor to the top left.    COORD coord = {0, 0};    //A return value... indicating how many chars were written    //not used but we need to capture this since it will be    //written anyway (passing NULL causes an access violation).    DWORD count;     //This is a structure containing all of the console info    // it is used here to find the size of the console.    CONSOLE_SCREEN_BUFFER_INFO csbi;    //Here we will set the current color    SetConsoleTextAttribute(hStdOut, wColor);    if(GetConsoleScreenBufferInfo(hStdOut, &csbi))    {       //This fills the buffer with a given character (in this case 32=space).       FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);        FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);       //This will set our cursor position for the next print statement.       SetConsoleCursorPosition(hStdOut, coord);    } }  //This will clear the console. void ClearConsole() {    //Get the handle to the current output buffer...    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);    //This is used to reset the carat/cursor to the top left.    COORD coord = {0, 0};    //A return value... indicating how many chars were written    //   not used but we need to capture this since it will be    //   written anyway (passing NULL causes an access violation).    DWORD count;    //This is a structure containing all of the console info    // it is used here to find the size of the console.    CONSOLE_SCREEN_BUFFER_INFO csbi;    //Here we will set the current color    if(GetConsoleScreenBufferInfo(hStdOut, &csbi))    {       //This fills the buffer with a given character (in this case 32=space).       FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);       FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);       //This will set our cursor position for the next print statement.       SetConsoleCursorPosition(hStdOut, coord);    } }  //This will set the position of the cursor void gotoXY(int x, int y) {    //Initialize the coordinates    COORD coord = {x, y};    //Set the position    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); }  //This will set the forground color for printing in a console window. void SetColor(int ForgC) {    WORD wColor;    //We will need this handle to get the current background attribute    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);    CONSOLE_SCREEN_BUFFER_INFO csbi;     //We use csbi for the wAttributes word.    if(GetConsoleScreenBufferInfo(hStdOut, &csbi))    {       //Mask out all but the background attribute, and add in the forgournd color       wColor = (csbi.wAttributes & 0xF0) + (ForgC & 0x0F);       SetConsoleTextAttribute(hStdOut, wColor);    } }  //This will set the forground and background color for printing in a console window. void SetColorAndBackground(int ForgC, int BackC) {    WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);;    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wColor); }  //Direct console output void ConPrint(char *CharBuffer, int len) {    DWORD count;    WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), CharBuffer, len, &count, NULL); }  //Direct Console output at a particular coordinate. void ConPrintAt(int x, int y, char *CharBuffer, int len) {    DWORD count;    COORD coord = {x, y};    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);    SetConsoleCursorPosition(hStdOut, coord);    WriteConsole(hStdOut, CharBuffer, len, &count, NULL); }  //Hides the console cursor void HideTheCursor() {    CONSOLE_CURSOR_INFO cciCursor;    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     if(GetConsoleCursorInfo(hStdOut, &cciCursor))    {       cciCursor.bVisible = FALSE; 	  SetConsoleCursorInfo(hStdOut, &cciCursor);    } }  //Shows the console cursor void ShowTheCursor() {    CONSOLE_CURSOR_INFO cciCursor;    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     if(GetConsoleCursorInfo(hStdOut, &cciCursor))    {       cciCursor.bVisible = TRUE; 	  SetConsoleCursorInfo(hStdOut, &cciCursor);    } }        能不能简单点，初学者，看不懂，而且我只能用那个函数

就是设置光标位置啦，一个参数是横坐标，一个是纵坐标。


Question: 求大神帮助词法分析，当输入第一个1.2e12时可以输出，当时输入第二个1.2e12时就不能输出了，万分感谢，还有不能识别x=7*8+9中的+9，

词法分析(1)---词法分析的有关概念以及转换图: http://www.cppblog.com/woaidongmao/archive/2009/09/25/97245.aspx

建议参考TCC源代码。

那你能给我讲讲吗？？谢谢了，跪求！！！

源码错误好多，先改改错误

状态机不对 或 代码未严格按照正确的状态机编写。

算法思路是什么？

已经写出来了，就不懂为什么代码就是实现不了，只能第一次读取字符，而且代码中有一个错误，我差了好多资料都没改对，你能给我讲讲吗？？

先把它的状态机写出来

就是那个错误不会改了，求大神帮忙啊谢谢！！！！


Question: 分求C语言问题解决——关于TXT文件导入(第二贴，能给出的这个100和另外的100一起拿走！)

链表及文件操作参考代码 https://github.com/707wk/Senior-middle-school/blob/master/Filling%20in%20the%20gaps.c

#include<stdio.h> #include<malloc.h>  int main() { 	int invalidnum; 	int id,len; 	char *val=NULL; 	FILE *file=fopen("in.txt","r"); 	if(!file) 	{ 		fputs("Can't open file in.txt",stderr); 		return 1; 	} 	else 	{ 		while(fscanf(file,">read_%d_%d_%d random_genome_%d %d %d\n",&invalidnum,&id,&invalidnum,&invalidnum,&invalidnum,&len)!=EOF) 		{ 			char *tval=(char*)realloc(val,sizeof(char)*++len); 			if(!tval) 			{ 				if(val)free(val); 				fclose(file); 				fputs("No memory can be allocated",stderr); 				return 2; 			} 			val=tval; 			fgets(val,len,file); 			printf("%s\t%d\n",val,id); 			fgetc(file); 		} 		if(val)free(val); 		fclose(file); 	} 	return 0; }

1.单链表双链表都可行，好像你知道总数（100个），因此，静态或动态指针数组也能办 2.如果是格式化数据结构写进去的，当然逆向能格式化读出。如果不是转3 3.字符串解析，很显然，遇到第一个大写字母，开始记录，遇到第一个非大写字母，提取字符串结束。将此字符串存储编号；如此循环 注：为了提高读取的速度，可考虑使用文件映射方式，将文件映射进内存，如此就像处理普通字符串数组一样了！

额，题目的要求是什么？如果只是编号1楼的程序没解决吗？ 要不lz把题目截个图，把完整的要求发上来

两贴无区别啊

第32行     for (i=0;i<n;i++) printf("%s  %d\n",i+1,DNA+i*200); 应改为     for (i=0;i<n;i++) printf("%s  %d\n",DNA+i*200,i+1);

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> char *DNA; char ln[200]; char st[200]; FILE *f; int i,n; int main() {     DNA=(char *)calloc(1000000*200,1);     if (null==DNA) {         printf("Can not calloc 1000000*200 bytes!\n");         return 1;     }     f=fopen("in.txt","r");     if (NULL==f) {         printf("Can not open file in.txt!\n");         return 2;     }     i=0;     while (1) {         if (NULL==fgets(ln,200,f)) break;         if (1==sscanf(ln,"%199[ACGT]",st)) {             strcpy(DNA+i*200,st);             i++;             if (i>=1000000) break;         }     }     fclose(f);     n=i;     for (i=0;i<n;i++) printf("%s  %d\n",i+1,DNA+i*200);     free(DNA);     return 0; }


Question: 求水仙花数，如图。关键是”第一行有一个自然数T，接下来T行数据，每行是一个数M“这个怎么写程序？求解,万分感谢。

读取数据个数 循环读取并判断输出

#include<stdio.h>  unsigned int pown(unsigned int x,unsigned int n) { 	unsigned int r=1; 	while(n) 	{ 		if(n&1)r*=x; 		x*=x; 		n>>=1; 	} 	return r; }  unsigned int nlen(unsigned int n) { 	unsigned int l=1; 	while(n/=10)++l; 	return l; }  unsigned char f(unsigned int n) { 	unsigned int x=n; 	unsigned int r=0; 	unsigned int l=nlen(n); 	while(x) 	{ 		r+=pown(x%10,l); 		x/=10; 	} 	return r==n; }  int main() { 	unsigned int T,n; 	scanf("%d",&T); 	while(T--) 	{ 		scanf("%d",&n); 		puts(f(n)?"Yes":"No"); 	} 	return 0; }

奔跑吧，参考：  #include <math.h> #include <stdio.h> int getn(int n) { 	int i = 0; 	do 	{ 		i++; 		n /= 10; 	} while (n); 	return i; } int is_na(int n) { 	int r = getn(n); 	int i, N, sum = 0; 	N = n; 	do 	{ 		sum += pow(n % 10, r); 		if (sum > N) return 0; 		n /= 10; 	} while (n); 	if (sum == N) return 1; 	else return 0; } int main()  { 	int i, n, N; 	scanf("%d", &N); 	i = 0; 	while (i < N) 	{ 		scanf("%d", &n); 		if (is_na(n)) printf("Yes\n"); 		else printf("No\n"); 		i++; 	} 	return 0; }


Question: 高分求C语言问题解决——关于TXT文件导入

引用 6 楼 zhangxiangDavaid 的回复:[quote=引用 4 楼 hitmajiahao 的回复:] ls的写的有点问题啊？？？？？求解决 也给分！！！！！！！！ C:\Users\Administrator\Desktop\东北赛\编写尝试\索引\solexa.c(12) : error C2065: 'null' : undeclared identifier C:\Users\Administrator\Desktop\东北赛\编写尝试\索引\solexa.c(12) : warning C4047: '==' : 'int ' differs in levels of indirection from 'char *' 把null改为NULL，就行了 [/quote] 谢谢斧正！

见你的另一帖子，我的回复

引用 4 楼 hitmajiahao 的回复:ls的写的有点问题啊？？？？？求解决 也给分！！！！！！！！ C:\Users\Administrator\Desktop\东北赛\编写尝试\索引\solexa.c(12) : error C2065: 'null' : undeclared identifier C:\Users\Administrator\Desktop\东北赛\编写尝试\索引\solexa.c(12) : warning C4047: '==' : 'int ' differs in levels of indirection from 'char *' 把null改为NULL，就行了

大写字母部分只包含字母：ACGT?

急死我了 我QQ598505282 在线等!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


Question: 关于几个字符串的表达str，&str，&str【0】的问题

引用 5 楼 cao_julians 的回复:[quote=引用 4 楼 qq_27872797 的回复:] 還是不能理解怎麼通過strcpy(&str[0],&str[1])的複製，來去掉大寫字母的str[0]...... 把从&str [1]开始的串（自然不含首字符了）复制到str处，即除首字符外全部字符左移一个位置，首字符自然没了[/quote]+1

引用 4 楼 qq_27872797 的回复:還是不能理解怎麼通過strcpy(&str[0],&str[1])的複製，來去掉大寫字母的str[0]...... 把从&str [1]开始的串（自然不含首字符了）复制到str处，即除首字符外全部字符左移一个位置，首字符自然没了

引用 2 楼 iyomumx 的回复:谁写的破代码 引用char *strcpy( char *dest, const char *src ); Copies the character string pointed to by src, including the null terminator to the character array whose first element is pointed to by dest. The behavior is undefined if the dest array is not large enough. The behavior is undefined if the strings overlap.  代碼是教科書上的...汗... 上面那段strcpy的英文是說strcpy(&str[0], &str[1]);裡的兩個參數輸入的&str[0]和&str[1]是兩個指針，然後strcpy運行時是對兩個指針所指向的字符串進行操作的意思？

三种表达相等 理解strcpy的含义……


Question: C语言指针的问题

[code=c//第11章第9题 //花我好多天，主要是没有深入思考  //1. 失败程序  光标在闪，却无法输入了。  //when i == 0,pt1 = pt1 + i;making mistake!!!   #include <stdio.h> #include <string.h> const int N = 100; void space_delete (char * pt1);  int main (void) { 	char pt[N]; 	gets(pt); 	 	while (*pt) 	{ 	   space_delete (pt); 	   puts(pt);        	   gets(pt); 	    	      //读取\n 之前的内容，加上‘\0’，丢弃\n  	}                   	     //所以在一行只输入回车，gets读取空字符  	printf("Bye!\n");  	 	return 0; }  void space_delete (char * pt1)   { 	int i; 	char * temp ; 	 	while (*pt1)   	{                 	    //strlen（）与sizeof（)的不同  		temp = pt1; 	    if (*temp == ' ') 		   { 		       while (*temp != '\0')             	           { 		         *temp = *(temp + 1);    //这是一种算法？似乎做过相同的事.  		         temp++;                 //并不改变pt1指向的地址      			   } 	       } 	    if (*pt1 == ' ') 		   ; 		else 		   pt1++;   	   	 	} 	 } ][/code] 自己慢慢写的，看了答案的。

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

我还需要努力啊

引用 11 楼 sholber 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是赵4老师写到日志文件中一步一步分析出来的。  提醒：再牛×的老师也无法代替赵4老师自己领悟和上厕所！ 嘎嘎~~

引用 4 楼 ShenTensen 的回复://第11章第9题  //刚刚是参考答案，这个是我写的，可是运行不了，不知道为什么 #include <stdio.h> #include <string.h> const int N = 50; void space_delete (char * pt);  int main (void) { 	char pt[N]; 	gets(pt); 	 	while (*pt) 	{ 	   space_delete (pt); 	   puts(pt);        	   gets(pt); 	    	      //读取\n 之前的内容，加上‘\0’，丢弃\n  	}                   	     //所以在一行只输入回车，gets读取空字符  	printf("Bye!\n");  	 	return 0; }  void space_delete (char * pt)   { 	int i,j; 	char * temp ; 	j = strlen(pt) + 1; 	 	while (*pt)   	{                 	    //strlen（）与sizeof（)的不同，此时pt1是数组还是字符串  	    i = 0;  		temp = pt; 	    while (*temp == ' ' )            //(pt1[i] == ' ') 		   { 			   		      *temp = *(temp + 1);     // wrong: pt1[i + 1] 		      temp++;                  //是否改变pt1指向的值  		      i++; 		       		   } 		    		pt = pt + i;            } 	     puts(pt);  //此处打印空行  	 } 修改如下：  //第11章第9题  //刚刚是参考答案，这个是我写的，可是运行不了，不知道为什么 #include <stdio.h> #include <string.h> //const int N = 50; #define N 50 void space_delete(char * pt); int main(void) { 	char pt[N]; 	gets(pt);  	while (*pt) 	{ 		space_delete(pt); 		puts(pt); 		gets(pt);  		//读取\n 之前的内容，加上‘\0’，丢弃\n  	} 	//所以在一行只输入回车，gets读取空字符  	printf("Bye!\n");  	return 0; } void space_delete(char * pt) { 	int i, j; 	char *temp; 	j = strlen(pt) + 1; 	while (*pt) 	{ 		//strlen（）与sizeof（)的不同，此时pt1是数组还是字符串  		i = 1; 		temp = pt; 		//while (*temp == ' ')            //(pt1[i] == ' ') 		//{ 		//	*temp = *(temp + 1);     // wrong: pt1[i + 1] 		//	temp++;                  //是否改变pt1指向的值  		//	i++; 		//} 		if (' ' == *temp) 		{ 			while (*(temp + i) && ' ' == *(temp + i)) i++;   //找到下一个不是空格的字符 			while (*temp = *(temp + i)) temp++;   //移动 		} 		//pt = pt + i; 		pt++; 	} 	//puts(pt);  //此处打印空行  }

我明白的是:改变的是pt指向的地址里的值，并不改变pt指向的地址。

可这个是指针。能告诉我程序运行时为什么不能输入了吗？

可这个是指针。

如果你理解以下代码为何不能达到预期的目的，那么s被修改不会影响orig的值这个事实也应该是显而易见的 void swap(int a, int b) {     int temp;     temp = a;     a = b;     b = temp; }

其实就是不懂为什么orig指向字符串开头。orig的地址被传给s，既然s指向'\0',那为何orig不指向'\0'?

//本代码是把字符串中的空格字符去掉 #include <stdio.h> #define LEN 81 int drop_space(char * s); int main(void) { 	char orig[LEN];  	while (gets(orig) && orig[0] != '\0') 	{ 		drop_space(orig); 		//orig仍指向字符串的开头，当然不会为空行 		puts(orig);    //在被调函数中s指向了\o,此处为何可以继续打印一整行，而不是空行？  	} 	puts("Bye!"); 	return 0; } int drop_space(char * s) { 	int ct = 0;    //ct有何用？ //没用 	char * pos; 	while (*s)     /* or while (*s != '\0') */ 	{ 		if (*s == ' ') 		{ 			pos = s; 			do 			{ 				*pos = *(pos + 1);   //pt[i] = pt[i + 1]                				pos++; 			} while (*pos); 		} 		else 			s++;    //改变了s的地址，直到指向最后的\0  	} 	//   此处 puts(s); 为空行 //s指向了'\0'，当然是空行                         /*将s返回到被调函数，此时s指向‘\0',为何orig仍指向字符串的开头，*/                         /*因为orig与s不是同一个字符串吗？将orig传参给s } //为何主函数打印的不是个空行？？

注释如下：  //本代码是把字符串中的空格字符去掉 #include <stdio.h> #define LEN 81 int drop_space(char * s); int main(void) { 	char orig[LEN];  	while (gets(orig) && orig[0] != '\0') 	{ 		drop_space(orig); 		//orig仍指向字符串的开头，当然不会为空行 		puts(orig);    //在被调函数中s指向了\o,此处为何可以继续打印一整行，而不是空行？  	} 	puts("Bye!"); 	return 0; } int drop_space(char * s) { 	int ct = 0;    //ct有何用？ //没用 	char * pos; 	while (*s)     /* or while (*s != '\0') */ 	{ 		if (*s == ' ') 		{ 			pos = s; 			do 			{ 				*pos = *(pos + 1);   //pt[i] = pt[i + 1]                				pos++; 			} while (*pos); 		} 		else 			s++;    //改变了s的地址，直到指向最后的\0  	} 	//   此处 puts(s); 为空行 //s指向了'\0'，当然是空行 } //为何主函数打印的不是个空行？？


Question: 鼠标点击拖动


Question: clamav有直接扫描内存的函数吗？


Question: 如何快速简便的找出一个数的所有因子

查表法

我用最原始的方法做是超时的

#include<stdio.h> #include<time.h>  unsigned int getbadness(unsigned int n) { 	unsigned int prime_divisors[7][2]={0};	// 保存质因数及其个数,prime_divisors[i][0]为质因数,prime_divisors[i][1]为其个数 	unsigned int prime_divisors_length=0;	// ps的有效长度 	unsigned int i; 	unsigned int divisors_num=1;			// 用于计算因数个数(包括n自身) 	unsigned int sum=0;						// 用于计算因数的和 	unsigned int n_bak=n;  	// 以下为试除法求n的质因数分解 	// 试除 2 	if(!(n&1)) 	{ 		prime_divisors[prime_divisors_length][0]=2; 		while(!(n&1)) 		{ 			++prime_divisors[prime_divisors_length][1]; 			n>>=1; 		} 		divisors_num*=prime_divisors[prime_divisors_length][1]+1; 		++prime_divisors_length; 	} 	// 试除 3 	if(!(n%3)) 	{ 		prime_divisors[prime_divisors_length][0]=3; 		while(!(n%3)) 		{ 			++prime_divisors[prime_divisors_length][1]; 			n/=3; 		} 		divisors_num*=prime_divisors[prime_divisors_length][1]+1; 		++prime_divisors_length; 	} 	for(i=1;n>1;++i) 	{ 		if((6*i-1)*(6*i-1)>n) 		{ 			prime_divisors[prime_divisors_length][0]=n; 			prime_divisors[prime_divisors_length++][1]=1; 			divisors_num<<=1; 			break; 		} 		// 试除 6i-1 		if(!(n%(6*i-1))) 		{ 			prime_divisors[prime_divisors_length][0]=6*i-1; 			while(!(n%prime_divisors[prime_divisors_length][0])) 			{ 				++prime_divisors[prime_divisors_length][1]; 				n/=prime_divisors[prime_divisors_length][0]; 			} 			divisors_num*=prime_divisors[prime_divisors_length][1]+1; 			++prime_divisors_length; 		} 		// 试除 6i+1 		if(!(n%(6*i+1))) 		{ 			prime_divisors[prime_divisors_length][0]=6*i+1; 			while(!(n%prime_divisors[prime_divisors_length][0])) 			{ 				++prime_divisors[prime_divisors_length][1]; 				n/=prime_divisors[prime_divisors_length][0]; 			} 			divisors_num*=prime_divisors[prime_divisors_length][1]+1; 			++prime_divisors_length; 		} 	}  	// 以下为求除n自身以外的因数的和 	for(i=0;i<divisors_num-1;++i) 	{ 		unsigned int divisor=1,j,ii=i,k; 		for(j=0;ii;ii/=prime_divisors[j++][1]+1) 		{ 			k=ii%(prime_divisors[j][1]+1); 			while(k--)divisor*=prime_divisors[j][0]; 		} 		sum+=divisor; 	}  	// 返回因数和与n的差的绝对值 	if(sum>n_bak)return sum-n_bak; 	else return n_bak-sum; }  int main() { 	unsigned int i; 	clock_t c=clock(); 	for(i=2;i<1000000;++i) 		getbadness(i); 	printf("time:%lfs\n",(double)(clock()-c)/CLOCKS_PER_SEC); 	return 0; } 时间 1.086763s 可以吗

应该注意到 Divisor Function(1到n中所有能整除n的整数之和)为积性函数，即对于两互质的整数p,q有f(pq) = f(p) f(q)，应尽可能利用这一点，缓存f(n)的值以备将来计算f(kn)使用  代码仅供参考： #include <stdio.h> #include <stdlib.h>  #define MAX_N 1000000  typedef long long LL;  LL table[MAX_N] = {0, 1};  LL sod(int n) { 	if (table[n] != 0) return table[n]; 	int p, q, c; 	for (p = 2; p < n / 2; p++) 	{ 		if ( n % p == 0 ) break; 	} 	if (n % p != 0) 	{ 		table[n] = 1 + n; 		return table[n]; 	} 	else 	{ 		int pn = p; 		LL sum = 1 + p; 		while ((q = n / pn) % p == 0) 		{ 			pn *= p; 			sum += pn; 		} 		table[pn] = sum; 		table[n] = table[pn] * sod(q); 		return table[n]; 	} }  LL badness_of(int n) { 	LL ret = sod(n) - 2 * n; 	if (ret < 0) ret = -ret; 	return ret; }  int main(void) { 	int start, end, badness, n = 1; 	while(scanf("%d%d%d", &start, &end, &badness) == 3) 	{ 		if ((start == 0) && (end == 0) && (badness == 0)) 		{ 			break; 		} 		int count = 0, i; 		for (i = start; i <= end; i++) 		{ 			count += badness_of(i) <= badness; 		} 		printf("Test %d: %d\n", n++, count); 	} 	return 0; }

奔跑吧，参考：  #include <math.h> #include <stdio.h> int sum_factor(int n) { 	int i, sum; 	sum = 1; 	for (i = 2; i <= n / 2; i++) 	{ 		if (0 == n % i) sum += i; 	} 	return sum; } int count(int start, int end, int badness) { 	int i, gap, sumf, res; 	sumf = res = 0; 	for (i = start; i <= end; i++) 	{ 		sumf = sum_factor(i); 		if (sumf >= i) gap = sumf - i; 		else gap = i - sumf; 		if (-badness <= gap && gap <= badness) res++; 	} 	return res; } int main()  { 	int i = 1; 	int start, end, badness; 	while (scanf("%d%d%d", &start, &end, &badness)) 	{ 		getchar(); 		if (0 == start && 0 == end && 0 == badness) break; 		printf("Test %d: %d\n", i, count(start, end, badness)); 		i++; 	} 	return 0; }


Question: 求汉字笔画，排序

应该没有这样的头文件


Question: return 无法跳出 void 定义的递归函数

写递归函数之前首先确定 1.终结条件 2.递归关系 3.递归实体  如果摸不清递归调用过程，可以使用自底向上建树的方式模拟

知道错误了！谢谢大家！~

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

想真正精通C，请看下面的视频： http://edu.51cto.com/lecturer/user_id-5402097.html

rreturn 处加断点看运行到了没有

return 会结束当前函数调用，将控制权就给上一级调用


Question: 这段C语言程序有什么问题？

引用是C++的语法。 在C语言中使用指针 void   initlist(SqList   *L);

这是C++代码


Question: 在一个已知的字符串中查找最长单词，假定字符串中只含字母和空格，空格用来分隔不同单词。（C语言）

#include<stdio.h> #include<string.h> #include<malloc.h>  // 用来保存多个字符串的结构 typedef struct { 	size_t len; 	char *str[0]; } Strings;  int main() { 	char teststring[] = "a bc defg hij klmn op"; //测试字符串 	Strings* maxlength_strings=NULL; // 用来保存多个字符串 	size_t maxlength = 1; // 最大长度 	size_t wordcount = 1;         // 统 	char* p = teststring;         // 计 	while (p = strpbrk(p, " "))   // 单 	{							 // 词 		++wordcount;			  // 总 		++p;					  // 个 	}							 // 数 	maxlength_strings = (Strings*)calloc(1,sizeof(Strings) + sizeof(char*)*wordcount); 	if (maxlength_strings) 	{ 		// strtok 用于分割字符串，详见http://en.cppreference.com/w/c/string/byte/strtok 		for (p = strtok(teststring, " "); p; p = strtok(NULL, " ")) 		{ 			size_t len = strlen(p); 			if (len > maxlength) // 如果更长，则重置maxlength_strings 			{ 				maxlength = len; 				maxlength_strings->len = 1; 				maxlength_strings->str[0] = p; 			} 			else if (len == maxlength) // 如果与最长的同样长，则添加到maxlength_strings 				maxlength_strings->str[maxlength_strings->len++] = p; 		} 		{ 			size_t i; 			for (i = 0; i < maxlength_strings->len; ++i) // 输出maxlength_strings里的所有字符串 				puts(maxlength_strings->str[i]); 		} 		free(maxlength_strings); 	} 	return 0; }输出：defg klmn

C语言里有字符串分割函数：char *strtok( char *strToken, const char *strDelimit );具体用法你可以自己看看，至于找最长字符串你可以自己想想，自己想出来也比较有意思

修改如下：  #include<stdio.h> #include<string.h> int main(void) { 	char str[] = "I love you baby"; 	char *words[256]; 	char *p; 	int i = 0, j; 	for (p = strtok(str, " "); p; p = strtok(NULL, " ")) 	{ 		words[i++] = p; 	} 	int len = 0, pos; 	for (j = 0; j<i; j++) 	{ 		if (strlen(words[j]) > len) 		{ 			len = strlen(words[j]); 			pos = j; 		} 	} 	printf("max length word is \"%s\", len=%d\n", words[pos], len); 	return 0; } //max length word is "love", len=4

哈哈,我来个思路简单的..

引用 6 楼 yxwsbobo 的回复:你们敢不敢简单直白点,做了好多无用功.. 你来一个简单的

你们敢不敢简单直白点,做了好多无用功..

#include <stdio.h>   int main() {     char str[]="this is a book with other and me tomrrow";      char* p;     char* q;     char* index;     int len=0;     for(p=q=str;*p;)     { 	    for(;*p!=' '&&*p;p++); 	    if(p-q>len) 	    { 		    len=p-q; 		    index=q; 	    } 	    p++; 	    q=p;     }     for(;*index!=' '&&*index;index++)     { 	    printf("%c",*index);     }     return 0; }

有bug，修改：  for(p=strtok(str, " "); p; p=strtok(NULL, " ")) {       words[i++]=p;      }

奔跑吧， 参考：  #include<stdio.h> #include<string.h> int main(void) {     char str[]="I love you baby";     char *words[256];     char *p;     int i=0, j;     for(p=str; p=strtok(NULL, " "); )     {         words[i++]=p;          }     int len=0, pos;     for(j=0; j<i; j++)     {         if(strlen(words[j]>len)         {              len=strlen(words[j]);              pos=j;         }     }     printf("max length word is %s, len=\n", words[pos], len);     return 0; }


Question: C语言网Online Judge系统支持语言和编译说明

围观


Question: 几个C语言的难题

分析的很透彻，写得也很好，学习了。建议发东西时就那些序号都删除，我还想了半天哦

1. printf的返回值是打印的字符个数 我们从最内一层函数调用开始解析： printf("%d", i);    //43,返回2 printf("%d", 2);    //2,返回1 printf("%d", 1);    //1,返回1 故输出4321  2.m=0,n=2  //分析已经很透彻  3.运行试试


Question: 《求帮助》Problem A: 小明的积木

解方程 起始为s，项数为x，输入n 则有(s+x)*x =2n==> x=-s+sqrt(s^2+8n)/2,验证x是不是整数，从1枚举到n/2

这个算法我试了一下 行不通额


Question: 毕业设计 求给点意见，一个web服务器的实现

引用 楼主 flagsbody 的回复:毕业设计自己选了“web服务器的实现”的题目,,系统linux  语言 c/c++   现阶段完成了下面几个功能： 1 静态页面 2 动态页面 cgi 3 支持php ，perl 脚本语言  其实就是在mini_httpd基础上修改的...  展示时，在浏览器输入几个网址，就展示完了，好像吸引不了老师...  第一次检查，老师说太简单了，要添加点功能..来点什么数据分析，挖掘等等....  求各位前辈 给点意见，在web服务器的基础上添加一点功能， 在答辩上能撑点场的......拜托了....  httpd怎么做数据分析、挖掘啊？求科普

度娘的意见很中肯，可以请教之

搜“web 服务器代码 linux c”


Question: 关闭文件时，文件指针要不要free（fp），fp指针在程序中只用了一次

no malloc no free

不用，这有OS负责后续处理


Question: 下了个国密算法sm2的c语言版怎么也运行不出，想求运行成功的大神指导下。

将错误信息中出现的标识符放在百度里面搜一下，看其在哪个.lib中，然后在本地硬盘上搜索该.lib,如果没有，在网上搜索相关库或模块下载安装，然后将其所在目录填写到“附加依赖库所在目录”中，将其名字添加到“附加依赖库”中，重新连接。 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项

你没有加载运行时库

先写几个空函数

我是从论坛这边下载的，看到评论说下了可以运行的，就想问一下，

错误提示如上，另我已经安装了openssl头文件


Question: C语言中，怎么读取一个灰度（仅含黑白二色）位图的各个像素灰度值矩阵，并进行替换，输出替换后灰度矩阵所表示的位图

再供参考： Bitmap::SetPixel Method  --------------------------------------------------------------------------------  The SetPixel method sets the color of a specified pixel in this bitmap.  Syntax  Status SetPixel(          INT x,     INT y,     const Color &color ); Parameters  x [in] int that specifies the x-coordinate (column) of the pixel.  y [in] int that specifies the y-coordinate (row) of the pixel.  color [in] Reference to a Color object that specifies the color to set.  Return Value  If the method succeeds, it returns Ok, which is an element of the Status enumeration.  If the method fails, it returns one of the other elements of the Status enumeration.     Remarks  Depending on the format of the bitmap, GetPixel might not return the same value as was set by SetPixel. For example, if you call SetPixel on a Bitmap object whose pixel format is 32bppPARGB, the RGB components are premultiplied. A subsequent call to GetPixel might return a different value because of rounding. Also, if you call SetPixel on a Bitmap whose color depth is 16 bits per pixel, information could be lost in the conversion from 32 to 16 bits, and a subsequent call to GetPixel might return a different value.  Example   The following example creates a Bitmap object based on a JPEG file. The code draws the bitmap once unaltered. Then the code calls the SetPixel method to create a checkered pattern of black pixels in the bitmap and draws the altered bitmap.   Show Example  VOID Example_SetPixel(HDC hdc)  {    Graphics graphics(hdc);     // Create a Bitmap object from a JPEG file.    Bitmap myBitmap(L"Climber.jpg");     // Draw the bitmap.    graphics.DrawImage(&myBitmap, 0, 0);     // Create a checkered pattern with black pixels.    for (UINT row = 0; row < myBitmap.GetWidth(); row += 2)    {       for (UINT col = 0; col < myBitmap.GetHeight(); col += 2)       {          myBitmap.SetPixel(row, col, Color(255, 0, 0, 0));       }    }     // Draw the altered bitmap.    graphics.DrawImage(&myBitmap, 200, 0); } Method Information  Stock Implementation gdiplus.dll  Header Declared in Gdiplusheaders.h, include gdiplus.h  Import library gdiplus.lib  Minimum availability GDI+ 1.0  Minimum operating systems Windows 98/Me, Windows XP, Windows 2000, Windows NT 4.0 SP6   See Also  Color, Bitmap::GetPixel, Image, Using Images, Bitmaps, and Metafiles, Images, Bitmaps, and Metafiles  --------------------------------------------------------------------------------

仅供参考：#include <iostream> #include <fstream> #include <string> #include <windows.h> #include <gdiplus.h> #pragma comment(lib, "gdiplus.lib")  using namespace std; using namespace Gdiplus;  int main() {     GdiplusStartupInput gdiplusstartupinput;     ULONG_PTR gdiplustoken;     GdiplusStartup(&gdiplustoken, &gdiplusstartupinput, NULL);      wstring infilename(L"1.jpg");     string outfilename("color.txt");      Bitmap* bmp = new Bitmap(infilename.c_str());     UINT height = bmp->GetHeight();     UINT width  = bmp->GetWidth();     cout << "width " << width << ", height " << height << endl;      Color color;     ofstream fout(outfilename.c_str());      for (UINT y = 0; y < height; y++)     for (UINT x = 0; x < width ; x++) {             bmp->GetPixel(x, y, &color);             fout << x << "," << y << ";"                  << (int)color.GetRed()   << ","                  << (int)color.GetGreen() << ","                  << (int)color.GetBlue()  << endl;     }      fout.close();      delete bmp;     GdiplusShutdown(gdiplustoken);     return 0; }


Question: 求解一个算法问题

引用 1 楼 zhao4zhong1 的回复:仅供参考：//给出12个随机数,分成三组求和,每组的个数不定,要求求出来的三个数之间相差最小,最完美的情况是三个数相等. #include <stdlib.h> #include <stdio.h> #include <time.h> #include <math.h> #include <limits.h> int i,j,k; int g[12][3]={//可能的分组大小     { 1, 1,10},     { 1, 2, 9},     { 1, 3, 8},     { 1, 4, 7},     { 1, 5, 6},     { 2, 2, 8},     { 2, 3, 7},     { 2, 4, 6},     { 2, 5, 5},     { 3, 3, 6},     { 3, 4, 5},     { 4, 4, 4}, }; int n[12]; int m[12]; int f[12];//当前最小时各数 int g1,g2,g3;//1,2,3组可分配的个数 int n1,n2,n3;//1,2,3组已分配的个数 int f1,f2;//当前最小时1,2组的个数 int s1,s2,s3;//123组的和 int d;//1-2,2-3,3-1组中各数和之间差的绝对值之和 int dmin=INT_MAX;//保存当前d的最小值 void swap(int *pi1,int *pi2) {     int t;     t=*pi1;*pi1=*pi2;*pi2=t; } void test() {     s1=0;     for (i=0;i<g1;i++) s1=s1+n[i];     s2=0;     for (i=g1;i<g1+g2;i++) s2=s2+n[i];     s3=0;     for (i=g1+g2;i<12;i++) s3=s3+n[i];     d=abs(s1-s2)+abs(s2-s3)+abs(s3-s1);     if (d<dmin) {         dmin=d;         f1=g1;         f2=g2;         for (i=0;i<12;i++) f[i]=n[i];         printf("(");         for (i=0;i<g1;i++) printf("%2d,",n[i]);         printf(")  (");         for (i=g1;i<g1+g2;i++) printf("%2d,",n[i]);         printf(")  (");         for (i=g1+g2;i<12;i++) printf("%2d,",n[i]);         printf(") %4d\n",dmin);     } else {         printf("(");         for (i=0;i<g1;i++) printf("%2d,",n[i]);         printf(")  (");         for (i=g1;i<g1+g2;i++) printf("%2d,",n[i]);         printf(")  (");         for (i=g1+g2;i<12;i++) printf("%2d,",n[i]);         printf(") %4d\n",d);     } } void main() {     srand(time(NULL));     for (i=0;i<12;i++) m[i]=rand()%100;     for (i=0;i<12;i++) printf("%2d,",m[i]);     printf("\n");     for (i=1;i<12;i++) {         for (j=0;j<i;j++) {             if (m[i]>m[j]) swap(&m[i],&m[j]);//冒泡排序从大到小         }     }     for (i=0;i<12;i++) printf("%2d,",m[i]);     printf("\n");     for (k=0;k<12;k++) {//在12种分组方法中         //取第i种分组方法         g1=g[k][0];         g2=g[k][1];         g3=g[k][2];         printf("%2d-%2d,%2d,%2d\n",k,g1,g2,g3);         //将从大到小12个数双向轮流分配到三个组中         n1=0;         n2=0;         n3=0;         for (j=0;j<12;j++) {             switch (j%6) {             case 0:         redo:                 if (n1<g1) {                     n[n1]=m[j];                     n1++;                     break;                 }             case 1:                 if (n2<g2) {                     n[g1+n2]=m[j];                     n2++;                     break;                 }             case 2:                 if (n3<g3) {                     n[g1+g2+n3]=m[j];                     n3++;                     break;                 }             case 3:                 if (n3<g3) {                     n[g1+g2+n3]=m[j];                     n3++;                     break;                 }             case 4:                 if (n2<g2) {                     n[g1+n2]=m[j];                     n2++;                     break;                 }             case 5:                 if (n1<g1) {                     n[n1]=m[j];                     n1++;                     break;                 }             default:goto redo;             }         }         test();     }     printf("---------------------------------------------------\n");     g1=f1;     g2=f2;     for (i=0;i<12;i++) n[i]=f[i];     printf("(");     for (i=0;i<g1;i++) printf("%2d,",n[i]);     printf(")  (");     for (i=g1;i<g1+g2;i++) printf("%2d,",n[i]);     printf(")  (");     for (i=g1+g2;i<12;i++) printf("%2d,",n[i]);     printf(") %4d\n",dmin); }     我忘记说明了。。。这个用户是有优劣等级的。。。就是这里想不明白了，怎么约束各个个体之间的能力差异然后得到最佳分配。

好似“任务分配问题”，看看能不能抽象成这个问题，用匈牙利算法解决


Question: 求余和与操作的互换

一，仅当size是2的N次方时，两个运算结果相同，等效。  二，当除数为2的N次方时，整除运算结果的余数是被乘数的低N位，商是被乘数的剩余高位，相当于在被乘数的低N位处截取低N位，  三，2的N次方减1的结果是得到低N 位为全1的屏蔽字，按位与任一整数的结果是该整数的低N位  四，效率是后一个高，位运算快  五，高效程序的奥秘……我记得是这个书名，是关于位运算的最佳书籍

纠正“对2幂求模运算，本质也就是屏蔽低位，保留高位”-》对2幂求模运算，本质也就是屏蔽高位，保留低位

两种等价，只在SIZE是2的幂才成立 size -1一般称为掩码，当size是2的幂时，减1，就形成一个低位是1，高位是0的掩码，比如01000 - 1 = 00111 对2幂求模运算，本质也就是屏蔽低位，保留高位

w - r 值是0xffffffe0   0xffffffe0  % 0x4000 = 0x3fe0 0x4000 -1=0x3ffff   0xffffffe0&0x3ffff = 0x3fe0   凑巧而已，你把size 定义成0x4003肯定不行。


Question: 新手求帮助

试试重启vs


Question: linux c程序 ctrl＋ｃ不能结束的原因

引用 3 楼 zhao4zhong1 的回复:检查是否资源泄漏的办法之一： 在任务管理器 进程 查看 选择列 里面选择：内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍，越多越好，比如1000000次甚至无限循环，记录以上各数值，再隔至少一小时，越长越好，比如一个月，再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加，则铁定有对应资源的资源泄漏！  Linux下可以用top命令。  我有用top命令查看过，cpu和memory没有什么问题， 但没有试过循环执行。  你的意见很值得参考，谢谢！

引用 2 楼 u010868023 的回复:在你的程序里 应该是有捕捉处理sigint的函数，看看是否卡在释放资源的那里  是有捕捉处理sigint的函数，如果是卡在释放资源的处理上， 20分钟以内和以后的处理没有任何差别， 20分钟内的话可以正常结束程序，这是我不能理解的地方。

引用 1 楼 cjqpker 的回复:你程序有捕获Ctrl C信号么，捕获之后自己做清理工作，然后退出程序。 遇到过一些程序Ctrl C当时不能退出，过个几秒钟就可以了。  有捕获到，但就是不能退出。

设置信号处理函数 void sighandle(int sig) {      printf("捕获到信号%d", sig);      /*释放资源*/       exit(0); }   int main() {     .....     signal(SIGINT, sighandle);  //设置信号处理函数     ..... }

在你的程序里 应该是有捕捉处理sigint的函数，看看是否卡在释放资源的那里

你是不是安装自己的信号处理程序了？cc信号，默认操作是终结进程，如果自行安装了处理程序，那由用户负责处理


Question: 麻烦看看这个小程序

应该是t=d+1，我看错了

1、你的函数的返回值应该是t=d+j 2、函数内的循环范围可以缩小，只要i<=number/2即可

引用 3 楼 ilikehigame 的回复:[quote=引用 楼主 jzx_606 的回复:] 【问题描述】 输入2 个正整数m 和n(m≥1,n≤1 000),输出m ~n 之间的所有完数,完数就是因子和与它本身相等的数｡要求定义并调用函数factorsum(number),它的功能是返回number 的因子和｡ 下面是我写的程序 #include<stdio.h> int factorsum( int number); int main(void) { 	 	int m,n,i; 	 	printf("Input m: "); 	scanf("%d",&m); 	printf("Input m: "); 	scanf("%d",&m); 	printf("Input n: "); 	scanf("%d",&n); 	 	for (i=m;i<=n;i++) 	{ if (factorsum(i)==i) 		printf("%5d",i);} 		return 0;} 		 		int factorsum(int number) 		{ 			int j,d=0,t ; 			 			for (j=2;j<=number-1;j++){ 				if (number%j==0) d=d+j;} 				t=j+1; 				return t; 			}   程序不会输出结果为什么    #include<stdio.h> #include<windows.h> int factorsum( int number); int main(void) { 	int m,n; 	printf("Input m: "); 	scanf("%d",&m); 	printf("Input n: "); 	scanf("%d",&n);	 	for (int i=m;i<=n;i++) 	{ 		if (factorsum(i)==i) 			printf("%5d\n",i); 	}	 	system("pause"); 	return 0; }  int factorsum(int number) { 	int d=0 ;	 	for (int j=1;j<number;j++) 	{ 		if (number%j==0) 			d=d+j; 	} 	return d; } [/quote]  在factorsum函数中，1是number的自然因子，不必求。 另在（number/2，number）----不包括number/2 和number----中没有number的因子，循环范围可以缩小 Int.  d=1; For(int  i=2; i<=number/2;  i++)

引用 楼主 jzx_606 的回复:【问题描述】 输入2 个正整数m 和n(m≥1,n≤1 000),输出m ~n 之间的所有完数,完数就是因子和与它本身相等的数｡要求定义并调用函数factorsum(number),它的功能是返回number 的因子和｡ 下面是我写的程序 #include<stdio.h> int factorsum( int number); int main(void) { 	 	int m,n,i; 	 	printf("Input m: "); 	scanf("%d",&m); 	printf("Input m: "); 	scanf("%d",&m); 	printf("Input n: "); 	scanf("%d",&n); 	 	for (i=m;i<=n;i++) 	{ if (factorsum(i)==i) 		printf("%5d",i);} 		return 0;} 		 		int factorsum(int number) 		{ 			int j,d=0,t ; 			 			for (j=2;j<=number-1;j++){ 				if (number%j==0) d=d+j;} 				t=j+1; 				return t; 			}   程序不会输出结果为什么    #include<stdio.h> #include<windows.h> int factorsum( int number); int main(void) { 	int m,n; 	printf("Input m: "); 	scanf("%d",&m); 	printf("Input n: "); 	scanf("%d",&n);	 	for (int i=m;i<=n;i++) 	{ 		if (factorsum(i)==i) 			printf("%5d\n",i); 	}	 	system("pause"); 	return 0; }  int factorsum(int number) { 	int d=0 ;	 	for (int j=1;j<number;j++) 	{ 		if (number%j==0) 			d=d+j; 	} 	return d; }

修改如下：  #include<stdio.h> int factorsum(int number); int main(void) { 	int m, n, i; 	printf("Input m: "); 	scanf("%d", &m); 	printf("Input n: "); 	scanf("%d", &n); 	for (i = m; i <= n; i++) 	{ 		if (factorsum(i) == i) 			printf("%5d", i); 	} 	return 0; } int factorsum(int number) { 	//int j, d = 0, t; 	int i, d = 0; 	for (i = 1; i <= number - 1; i++) { 		if (number%i == 0) d = d + i; 	} 	//t = j + 1; 	return d; }

for (j=2;j<=number-1;j++)这里j 应该从1开始，还有返回d 不是j+1


Question: 用mingw 编译，总是出现链接错误，提示找不到符号

终于找到原因了，把编译用的命令gcc -lwinmm -L. -lvisa32 test.c -o test.exe改为gcc test.c -o test.exe -lwinmm -L. -lvisa32就可以了，但是为什么呢？以前都是用的第一种格式，都没问题

#include <mmsystem.h>   /**  * @file demo002.c  *   * 使用编译命令  * gcc -o demo002.exe demo002.c -lwinmm  */  #include <windows.h> #include <mmsystem.h>  #include <stdio.h>  int main(void) { 	DWORD dwTicks; 	 	dwTicks = timeGetTime(); 	printf("%u\n", dwTicks); 	 	return 0; }

看了mmsystem.h文件里面，timeGetTime函数的定义是DWORD WINAPI timeGetTime(void);，这是mingw自带的，没有改动过。

用绝对路径也不行

你的头文件不对吧，mingw的定义是 DWORD WINAPI timeGetTime(void);，前面没有WINMMAPI，不会链接imp_

pragma写绝对路径呢


Question: 《C和指针》书上的课后习题看完了答案了都 不知道题意，求说明

引用 7 楼 zhangxiangDavaid 的回复:[ 如何行不通  函数的形参是字符数组，按书中的答案对字符数组中的一个元素进行位运算为什么能得到预期的结果？  按照 我自己的想法是这样写的。看到书中的答案我怀疑自己理解错了。  void set_bit(char bit_array[], unsigned bit_number) { 	bit_array[bit_number - 1] = '1'; } void clear_bit(char bit_array[], unsigned bit_number) { 	bit_array[bit_number - 1] = '0'; } void assign_bit(char bit_array[], unsigned bit_number, int value) { 	if (value) 		bit_array[bit_number - 1] = '1'; 	else 		bit_array[bit_number - 1] = '0'; } int test_bit(char bit_array[], unsigned bit_number) { 	return (bit_array[bit_number - 1] != '0'); }

引用 8 楼 wbx779139218 的回复:测试数据（只给出一个byte大小的测试，其余同）：  char bit = 0xf0;           //即bit为1111 0000  set_bit(bit,2);              //即bit为1111 0100 clr_bit(bit,6);               //即bit为1011 0100 assign_bit(bit,0,1);    //即bit为1011 0101 assign_bit(bit,0,0);    //即bit为1011 0100 int a = test_bit(bit,5); //即a为1  这样会有错吧，bit本身是字符型，而函数形参要求的是字符数组

引用 6 楼 xiongtaaaab 的回复:[quote=引用 5 楼 zhangxiangDavaid 的回复:] [quote=引用 3 楼 xiongtaaaab 的回复:] 换一个问法，书中说的函数第一个参数里内应该是什么内容？？？ 第一个参数char bit_array[]是字符数组，如第一个函数：  void set_bit(char bit_array[], unsigned bit_number) { 	bit_array[character_offset(bit_number)] |= 		1 << bit_offset(bit_number); }  把指定的bit位设置为1，如2个字节的字符数组  第二列的数字是bit位的下标，第一列是各个bit位的内容、 调用set_bit(bit_array, 2);后的效果是：  [/quote]  本来我也是这样理解的自己写出来的代码也可以用，可是书上答案的代码，这样测试行不通啊[/quote] 如何行不通

引用 5 楼 zhangxiangDavaid 的回复:[quote=引用 3 楼 xiongtaaaab 的回复:] 换一个问法，书中说的函数第一个参数里内应该是什么内容？？？ 第一个参数char bit_array[]是字符数组，如第一个函数：  void set_bit(char bit_array[], unsigned bit_number) { 	bit_array[character_offset(bit_number)] |= 		1 << bit_offset(bit_number); }  把指定的bit位设置为1，如2个字节的字符数组  第二列的数字是bit位的下标，第一列是各个bit位的内容、 调用set_bit(bit_array, 2);后的效果是：  [/quote]  本来我也是这样理解的自己写出来的代码也可以用，可是书上答案的代码，这样测试行不通啊

理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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

引用 3 楼 xiongtaaaab 的回复:换一个问法，书中说的函数第一个参数里内应该是什么内容？？？ 第一个参数char bit_array[]是字符数组，如第一个函数：  void set_bit(char bit_array[], unsigned bit_number) { 	bit_array[character_offset(bit_number)] |= 		1 << bit_offset(bit_number); }  把指定的bit位设置为1，如2个字节的字符数组  第二列的数字是bit位的下标，第一列是各个bit位的内容、 调用set_bit(bit_array, 2);后的效果是：

怎么老是提示403，什么爬虫，要输验证码，输了也没用，是chrome的问题吗？？

换一个问法，书中说的函数第一个参数里内应该是什么内容？？？

第一个参数是字符数组，用来存放所有的位。没看答案前理解数组中应该放‘0’或者‘1’  可现在我都不知道他的第一个参数里面该放什么，怎么单步调试呢？


Question: 我有个长度很大的一维数组怎么排序？

确实hi下标的原因 汗   引用 楼主 dadaobiancheng 的回复:是这样的  因为编程要求，我先是声明了一个3列动态二维数组s[m][3],接下来是要根据s[i][3],就是第三列的数据对整个二维数组进行降序排序。我试验了一下倘若数据m比较小就可以实现排序，如果m比较大时，就不行了，更不要谈350000了 代码如下： MAX_LINES即为s的行数 谢谢各位 #define MAX_LINES 302 #include "stdlib.h" #include "stdio.h"  int main() {     ///order 	   int (*s)[3]; 	int i,j; 	int n; 	int tempg;    int tempx;    int tempy;    n=MAX_LINES;      s=(int(*)[3])malloc(n*3*sizeof(int));   for(i=0;i<MAX_LINES-1;i++)  //   {s[i][1]=i;s[i][2]=i+1;s[i][3]=i; printf("%d\n",s[i][3]);   }    for(i = 0; i <MAX_LINES-2;i++){   for(j=i;j<MAX_LINES-1;j++){ 	  //printf("%d\n",j);    if(s[i][3] < s[j][3])    {        	      tempx=s[i][1];            tempy=s[i][2];         	tempg= s[i][3]; 				s[i][1] = s[j][1]; 			    s[i][2] =s[j][2]; 				s[i][3] = s[j][3]; 			   s[j][1]=tempx; 				s[j][2]=tempy; 				s[j][3]=tempg; }     }   } for(i=0;i<MAX_LINES-1;i++){ 	 printf("%d\n",s[i][3]); }   free(s);   return 0; }

应该是s[i][0],s[i][1],s[i][2]而不是s[i][1],s[i][2],s[i][3]第三列是s[i][2]。 另外C语言里有个排序函数qsort 另附参考代码#include<stdio.h> #include<time.h> #include<stdlib.h>  int comp(const void * a,const void * b) { 	return (*(int(*)[3])b)[2]-(*(int(*)[3])a)[2]; // 这里表示降序 }  int main() { 	size_t count,i,j; 	int (*datas)[3]=NULL; 	clock_t cl; 	scanf("%zu",&count); 	datas=(int(*)[3])malloc(count*sizeof(int[3])); 	if(NULL==datas) 	{ 		fputs("内存不足",stderr); 		return 1; 	}  	srand(time(NULL)); 	for(i=0;i<count;++i) 		for(j=0;j<3;++j) 			datas[i][j]=rand(); // 生成随机数据  	cl=clock(); 	qsort(datas,count,sizeof(int[3]),comp); // 快速排序 	cl=clock()-cl;  	for(i=1;i<count;++i) 		if(datas[i][2]>datas[i-1][2]) // 如果后者大于前者，则排序有错误。 			break; 	if(i==count) 		puts("排序正确"); 	else 		puts("排序错误");  	printf("time:%lf\n",(double)cl/CLOCKS_PER_SEC); // 排序时间  	free(datas); 	return 0; }

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

什么叫做根据第三列数据排序？


Question: 结构体对齐

引用 楼主 lgbxyz 的回复:老生常谈了, 但是下面这个程序在ubuntu下得到结果是24,40 ,人生观被颠覆了, 哪个高手给详细总结下,网上搜的都差不多,都不对啊   #include <stdio.h> #include <string.h>  typedef union { 	char a; 	int b[5]; 	long c; }Format;  typedef struct { 	long d; 	Format e; 	char f; }Data;   int main(void) { 	Data h; 	memset(&h, 0, sizeof(Data));  	h.d = ~0; 	h.e.b[0] = ~0;// 0x12345678; 	h.e.b[1] = ~0;//0x3456789A; 	h.e.b[2] = ~0;//0x56789ABC; 	h.e.b[3] = ~0;//0x789ABCDE; 	h.e.b[4] = ~0;//0x9ABCDEF0; 	h.f = ~0;//'Z'; 	printf("%lu, %lu\n", sizeof(Format), sizeof(Data)); 	return 0; } 这个问题主要跟计算机储存单位word的大小有关系， 在32位系统中一个word是4个字节，所以sizeof(Format)的大小是 4*5=20，sizeof(Data)的大小是4+20+4=28；而在64位系统中一 个word是8个字节，所以sizeof(Format)的大小是24（8*3，最接近 5*4=20的存储值），sizeof(Data)的大小是8+24+8=40。   这里需要考虑结构体边界对齐要求，若如下定义： typedef struct { 	Format e; 	char d; 	char f; }Data; 则在32位系统下sizeof(Data)的值为20+4=24，64位下则是20+8=28； 同时需要考虑软件是多少位，如我系统64位，但软件是32位，则结果 符合32位系统结果

仅供参考：#include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 // //A1.a 0 //A1.b 4 //A1.c 17 // //A2.a 0 //A2.b 4 //A2.c 18 // //A4.a 0 //A4.b 4 //A4.c 20 // //A8.a 0 //A8.b 4 //A8.c 24 // //A16.a 0 //A16.b 4 //A16.c 24 // //

引用 1 楼 cjqpker 的回复:我在win7下以及Ubuntu 14 下跑出来都是20,28  支持。

我在win7下以及Ubuntu 14 下跑出来都是20,28


Question: 蒸烤箱的温度实时监测系统

谢谢你啊，现在正在找资料

下位机直接上传温度数据 上位机读取并输出 没了

在百度搜“温度实时监测 C源代码”


Question: 突然发现我竟然输不出根号2，你确定你会？？？？

已解决。   自己的盲点还很多     谢谢  你的回答对我的帮助很大

double a; a=sqrt(2.0);


Question: 定义字符串数组时，缺少'\0'所带来的输出影响，求解，有图如下

首先，谢谢各位的解答， 其次我还有个问题，就是现在我知道了%s是是输出遇到‘\0'，但是为什么它是逆着到上一个字符串变量的’\0'才输出，而不是下一个。 PS：我知道我定义的num3不是个字符串变量

好厉害的感觉~

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

引用 3 楼 u011737099 的回复:char a[] = {'a','b'};  char b[] = {'b','c'};  char c[] = {'a','b'};  printf("%d,%d,%d\n",strlen(a),strlen(b),strlen(c)); 三个结果不一样，而且都不是2  strlen()只有在遇到  '\0'  才结束，所以strlen(a)完全是未知的，  而你定义了数组的大小，它会默认填充0  “123456789”，这个作为一个字符串也会在末尾加上 '\0'

多余的元素被编译器自动填充为0，所以可以自动结束


Question: 函数指针传参问题

引用 1 楼 zhao4zhong1 的回复:#include <stdio.h> void func(unsigned char* a){     //函数内有一个变量b是unsigned int类型，该怎样通过形参a将其值传出去呢？     unsigned int b;      b=12345678;     *(unsigned int *)a=b; } int main() {     unsigned int bb;      func((unsigned char *)&bb);     printf("bb:%d\n",bb);     return 0; } //bb:12345678 //   十分感谢！！这里有个40分未结贴的帖子（http://bbs.csdn.net/topics/391022223），您去随便留个言，我把分给你，这里的20分我想分给其他人~

引用 4 楼 yangyunzhao 的回复:传出去还是传进来？感觉方向反了吧？传出去，这个函数会读.ini文件，把其内容传出去

有几种选择 1.返回值形式 unsigned int func(unsigned char* a) {         unsigned int b = 2;         return b; }  2.指针形式 void func(unsigned int* a) {         unsigned int b = 2;     *a = b; }  3.强转方式，前提是调用实参至少是unsigned int类型的地址，或者大小为sizeof（unsigned int）的字符数组 void func(unsigned char* a) {         unsigned int b = 2;     *（unsigned int *）a = b; } void test() {         int a;         func(&a); }

既然类型都不确定，还不如不要类型，免得误导大家。直接用void *

传出去还是传进来？感觉方向反了吧？

一楼正解

请注意1 L答案中 bb是 int， 只是强转成了unsigned char*，  不然会丢失数据。 要么是unsigned char 数组。


Question: 【求助】数据结构中，线性表求两个集合的并集

引用 4 楼 zhao4zhong1 的回复:是不是有人侵犯了本ID“仅供参考：”的专利啊？ 我以后改为“奔跑吧，参考”

是不是有人侵犯了本ID“仅供参考：”的专利啊？

仅供参考：  typedef struct node { 	int data; 	struct node *next; }Node; //用指定数组创建带头结点的链表 Node *create_list(int *arr, int n) { 	Node *head = malloc(sizeof(Node)); 	int i; 	Node *p = head; 	for (i = 0; i < n; i++) 	{ 		p->next = malloc(sizeof(Node)); 		p = p->next; 		p->data = arr[i]; 	} 	p->next = NULL; 	return head; } //对链表排序 void sort_list(Node *head) { 	Node *p1, *p2; 	int data; 	for (p1 = head->next; p1; p1 = p1->next) 		for (p2 = p1->next; p2; p2 = p2->next) 		{ 			if (p1->data > p2->data) 			{ 				data = p1->data; 				p1->data = p2->data; 				p2->data = data; 			} 		} } //打印链表 void print_list(Node *head) { 	Node *p = head->next; 	while (p) 	{ 		printf("%4d", p->data); 		p = p->next; 	} } Node *get_union(Node *head1, Node *head2) { 	Node *head = malloc(sizeof(Node)); 	Node *p1, *p2, *p; 	p1 = head1->next; 	p2 = head2->next; 	p = head; 	while (p1 && p2) 	{ 		if (p1->data < p2->data) 		{ 			p->next = malloc(sizeof(Node)); 			p = p->next; 			p->data = p1->data; 			p1 = p1->next; 		} 		else if (p1->data > p2->data) 		{ 			p->next = malloc(sizeof(Node)); 			p = p->next; 			p->data = p2->data; 			p2 = p2->next; 		} 		else 		{ 			p->next = malloc(sizeof(Node)); 			p = p->next; 			p->data = p1->data; 			p1 = p1->next; 			p2 = p2->next; 		} 	} 	while (p1) 	{ 		p->next = malloc(sizeof(Node)); 		p = p->next; 		p->data = p1->data; 		p1 = p1->next; 	} 	while (p2) 	{ 		p->next = malloc(sizeof(Node)); 		p = p->next; 		p->data = p2->data; 		p2 = p2->next; 	} 	p->next = NULL; 	return head; } void free_list(Node *head) { 	Node *p, *q;  	p = head; 	while (p) 	{ 		q = p->next; 		free(p); 		p = q; 	} } int main(void) { 	int arr1[] = { 2,4,5,6 }; 	int arr2[] = { 4,5,7,9 }; 	//创建链表 	Node *head1 = create_list(arr1, 4); 	Node *head2 = create_list(arr2, 4); 	//对链表排序 	sort_list(head1); 	sort_list(head2); 	printf("list1:\n"); 	print_list(head1); 	printf("\n"); 	printf("list2:\n"); 	print_list(head2); 	printf("\n"); 	//求并集 	Node *head = get_union(head1, head2); 	printf("list12:\n"); 	print_list(head); 	free_list(head1); 	free_list(head2); 	free_list(head); 	return 0; }

参考数据结构书籍


Question: 小白伸手：为指针分配好内存地址后，给这些内存赋值失败

GlobalAlloc的第一个参数可以改为GPTR，结构体应该不能直接=吧

眼拙，没有看到哪句为bi分配内存。

问题检测出来是调用函数时的出问题。debug了半天，不出bug了，但和期望不一样，bitmap显示为全黑，现在把源码贴出来。。。 ------------------------  int _tmain(int argc, _TCHAR* argv[]) { 	//Initiation&Declear 	_TCHAR* filename=_T("regenerate_original_picture.txt"); 	 HDC hDC; 	unsigned short *data =(unsigned short*)malloc(256); 	static unsigned short *ImageData[256][256][128]; 	BOOL SaveBmp(HBITMAP hBitmap, CString FileName); 	HBITMAP hBitmap; 	BITMAPINFO *bmi=(BITMAPINFO*)malloc(sizeof(BITMAPINFO)) ; 	unsigned short * pBits =(unsigned short*)malloc(256*256*2); 	memset( pBits, 0xf9, 256*256*2 );//pBits是内容// 一旦create了,就可以直接操控PB IT s这个指针,//*( PB IT s + xxxx ) = 255;  // 对某个像素赋值.  	 	//填装数据 	//FILE *pfile=_tfopen(filename,_T("rb"));//rb要用_T转换一下 	//for (int i = 0; i < 256; i++) 	//	for (int j = 0; j < 256; j++) 	//{  //      fread(data, 2, 128, pfile); 	//   //dosomething //pBits，data，memcpy; 	//   for (int k = 0; k < 128; k++) 	//   { 	//	   ImageData[i][j][k]=data; 	//	   data++; 	//   } 	//  data =(data-128); 	//} 	//	int x=1;//x是标示波段的 	//	for (int v = 0; v < 256; v++) 	//		for (int c = 0; c < 256; c++) 	//		{ 	//			memcpy( pBits,ImageData[v][c][x],1); 	//			pBits++; 	//		}  		 	//CreateDIBitmap创建的是设备相关位图句柄 - HBITMAP.  	//CreateDIBSection创建的是设备无关位图句柄 - HBITMAP.      //初始化BITMAPINFOHEADER结构的栏位 	bmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER) ; 	bmi->bmiHeader.biWidth = 256 ; 	bmi->bmiHeader.biHeight = 256 ; 	bmi->bmiHeader.biPlanes = 1 ; 	bmi->bmiHeader.biBitCount = 16 ; 	bmi->bmiHeader.biCompression = BI_RGB ; 	bmi->bmiHeader.biSizeImage = 256*256*16 ; 	bmi->bmiHeader.biXPelsPerMeter = 0 ; 	bmi->bmiHeader.biYPelsPerMeter = 0 ; 	bmi->bmiHeader.biClrUsed = 0 ; 	bmi->bmiHeader.biClrImportant = 0 ; 	printf("%d\n",GetLastError());     //在基本准备後，我们呼叫该函式： 	hDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL); 	hBitmap = CreateDIBSection (hDC, (BITMAPINFO *) bmi,DIB_RGB_COLORS, (void**)&pBits, NULL, 0) ; 	//HDC hd; 	//hBitmap = CreateDIBSection (hd, (BITMAPINFO *) bmi,DIB_RGB_COLORS, (void**)&pBits, NULL, 0) ; 	printf("%d\n",GetLastError()); 	SaveBmp(hBitmap,"bitmap"); 	return 0; }  -----------------------问题1 断点时，查看句柄，无法读取内存。  -----------------------问题2 bitmap全黑

加入检测语句检测GlobalAlloc和Globallock两个函数的返回值，可调用GetLastError以获得更多错误信息，有可能是分配失败或者传入GlobalAlloc的分配的字节数的参数为0导致的

检查一下 dwBmBitsSize 这个值 是多少就知道了。

检查一下GetObject有没有成功，

检测动态分配后的返回值是否为NULL，如果成功（非空）说明不是内存的事！从弹出来信息看，明显是操作空指针，导致的段错误

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

GlobalLock分配成功了？看错误信息怎么是个空指针呢？写入位置0x0000000000000000时发生了访问冲突了。 调试一下lpbi是不是应该是空指针了？  hDib分配内存这一步就没成功吧？

lpbi内存分陪成功了吗， 如果成功了两个结构体赋值还是有问题，那么就把结构体内的元素一个一个的赋值看看   BITMAPINFOHEADER LPBITMAPINFOHEADER 详解 http://www.cnblogs.com/lzlsky/archive/2012/08/16/2641698.html


Question: 哈夫曼树问题 程序运行出错 调试正常

崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

哈夫曼树 http://blog.csdn.net/zhangxiangdavaid/article/details/37696533

F5调试运行, 崩溃的时候, 点击弹出的窗口中的"调试"或者"中断"或者"重试".  正常情况下就会定位到错误的地方.


Question: 用C语言的CPP编一个程序，输入一个日期，然后显示一段话。

仅供参考：#include <afxdisp.h> #include <stdio.h> COleDateTime t; int main(int argc, char **argv) {     if (argc<2) {         printf("Usage:%s \"DateTimeStr\"\n",argv[0]);         return 2;     }     if (t.ParseDateTime(argv[1])) {         printf("\"%s\" is a valid DateTimeStr.\n",argv[1]);         printf("%s\n",t.Format("%Y-%m-%d %H:%M:%S"));         return 0;     } else {         printf("\"%s\" is a INVALID DateTimeStr!\n",argv[1]);         return 1;     } }

sanf("%d,%d,%d", &year, &month, &day); 输入的字符串里面不要加逗号 这样写 sanf("%d%d%d", &year, &month, &day);

引用 4 楼 qq_27144221 的回复:是输入日期，然后显示一段话，比如我输入5.25， 然后显示出今天我要干什么。 #include <stdio.h>   int main() {     int year = 0, month =0, day = 0;     printf("请输入年,月,日:");     sanf("%d,%d,%d", &year, &month, &day);     printf("日期：%d年%d月%d日\n", year, month, day);     printf("今天楼主应该学习基本的C语言语法，这么简单都不会\n“);     reurn 0; }

引用 2 楼 a30037338 的回复: #include <stdio.h>  int main() {     int year = 0, month =0, day = 0;     printf("请输入年,月,日:");     sanf("%d,%d,%d", &year, &month, &day);     printf("日期：%d年%d月%d日\n", year, month, day);     reurn 0; }  这样吗 引用 2 楼 a30037338 的回复: #include <stdio.h>  int main() {     int year = 0, month =0, day = 0;     printf("请输入年,月,日:");     sanf("%d,%d,%d", &year, &month, &day);     printf("日期：%d年%d月%d日\n", year, month, day);     reurn 0; }  这样吗 是输入日期，然后显示一段话，比如我输入5.25， 然后显示出今天我要干什么。

cpp不是c++的吗

看下你的源码


Question: 突然发现的这个问题  .一眼看不出来，运行错后也很难找到错误之处，等你来战？？

是啊，scanf()在输入字符的时候会把回车当成输入，相邻两个输入字符的scanf()需要在后一个scanf()加空格 scanf("%c",&a) scanf("  %c",&b)   引用 3 楼 kellen_ 的回复:解决了   是我的锅   把scanf和gets的不同没辨别清楚  解决方法是在%s后价格空格    希望大家别犯这个错误

比如输入：110 zgh m 10    就会发生如下结果，真是纳闷，为什么会跳过输入性别sex那一个scanf，


Question: 结构体指针的一点问题

p->epc = (char)coulmn_value[1];很显然类型不匹配啊，前面是数组首地址，可以约等于char* ，你后面本来是二级指针 ，用数组转换一个指针，前面就应该是char*而不是char，p->epc = (char *)coulmn_value[1];如果结构体改为char*，就要给它分配内存，p->epc = （char *）malloc(len);

把struct 里面的 epc 改为char *型编译不会报错 但是运行的时候会报Segmentation fault


Question: 用C语言怎么编写以下程序

不明白你想要说什么？这几个好像没什么内在的联系？

仅供参考：  //根据你的描述得到的正确输入 char input[4][6]=    //区分大小写 { 	"P", 	"F", 	"P+C", 	"P+C+F", }; int check(char *buf) { 	int i; 	for (i = 0; i < 4; i++) 	{ 		if (strcmp(input[i], buf) == 0) return 1; 	} 	return 0; } int main() { 	char buf[10]; 	printf("input:"); 	scanf("%s", buf); 	while (!check(buf)) 	{ 		printf("error,input again:"); 		scanf("%s", buf); 	}  	return 0; }

你是打算用MFC 还是用CPP做

因为你的条件较少, 简单点的做法就是几个if 语句就能搞得定了.  否则就是要分析一下了. P，P+C，P+C+F 这个分析如下.  必需要有P, 并且有F时必需要有C


Question: 我想用C语言写一个抢课的程序，请问要学些什么？

数据库，网络编程，linux/unix，一门编程语言，

还是用按键精灵判断屏幕内容吧，一下午就能写一个勤勤恳恳刷页面的小劳工。

网络编程，互斥同步机制

很多时候是知道有这一门课到时候就被抢完了～

引用 2 楼 paschen 的回复:要学的东西很多，而且不仅涉及到C语言，估计等你有这技术，你已经不需要这东西了。。+1，用学校内网抢课无压力

貌似听懂了楼主所说的，网上选课，楼主想弄个东西抢个好修的课！


Question: 用memset进行指针变量的初始化

unsigned short * pBits =(unsigned short*)memset( pBits, 0x24, 256*256*2 );//pBits是内容// 一旦create了,就可以直接操控PB IT s这个指针,     //*( PB IT s + xxxx ) = 255;  // 对某个像素赋值.   pBits都没有分配内存空间，初始化有何用？至于要分配都少空间，你应该清楚

先malloc，再memset


Question: sqlite3_exec()函数返回SQLITE_OK表示语句执行成功还是查询成功

引用 1 楼 yueyexianxwy 的回复:不知道为什么，明明数据库里面没有我要查找的数据，可是却ret = SQLITE_OK

callback的第二个参数是不是在没有数据的情况下也为1啊

成功不代表有数据啊

执行成功了。。。

我感觉返回SQLITE_OK是表示我的这个查询操作是对的，但并不是查询成功，不知道是不是这样


Question: C语言中整型数组的每个元素在内存中是如何存放的

引用 8 楼 QQ919769936 的回复:我用的是VS2013，好像找不到汇编窗口和堆栈窗口，只找到反汇编窗口，并行堆栈和调用堆栈窗口，怎么打开汇编窗口和堆栈窗口呀？ VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

这个应该是强制转换。。

引用 11 楼 QQ919769936 的回复:[quote=引用 10 楼 zhao4zhong1 的回复:] [quote=引用 8 楼 QQ919769936 的回复:] 我用的是VS2013，好像找不到汇编窗口和堆栈窗口，只找到反汇编窗口，并行堆栈和调用堆栈窗口，怎么打开汇编窗口和堆栈窗口呀？ VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。[/quote] 老师，我问的是怎么打开visual studio 2013的汇编窗口和堆栈窗口，不是VC++6.0[/quote] 我还真不信visual studio 2013中打开汇编窗口、堆栈窗口对应的热键Alt+8、Alt+7和VC++6.0不兼容！ 如果真不兼容，请直接找微软投诉！！

引用 10 楼 zhao4zhong1 的回复:[quote=引用 8 楼 QQ919769936 的回复:] 我用的是VS2013，好像找不到汇编窗口和堆栈窗口，只找到反汇编窗口，并行堆栈和调用堆栈窗口，怎么打开汇编窗口和堆栈窗口呀？ VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。[/quote] 老师，我问的是怎么打开visual studio 2013的汇编窗口和堆栈窗口，不是VC++6.0

还涉及一个大小端的问题 对于小端 内存中存储的 1 是逆序的按照  0x01 0x00 0x00 0x00存储   这里的数组arr内存数据是  0x01 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x03 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x05 0x00 0x00 0x00  所以strlen返回 1

原来如此，又涨知识了，多谢各位指点！！！

理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。）

size_t strlen ( const char * str );  int[]  被 强转时只取第一个字符

数组是存储在堆栈中，也就是先进后出的存储模式。 那个为什么返回是1，可以形象理解为：本来strlen是从头找道脚的，二数组的首地址是放到脚上的，strlen就只有从脚找到脚了，也就是一个单位，返回为1了

恩，就是存储方式是小端存储的原因，高位时存储在低位上的。和我们习惯是按顺序写其实是大段存储了

0x开头的都是十六进制的数，如0xffff，表示为机器码（二进制）： 11 11 11 11 11 11 11 11(B),   也就是表示方式不一样，一个十六进制可表示为四位二进制


Question: union问题

1 0000 1010 = 256 + 10

你需要先研究大端模式，小端模式。 现在你的电脑是小端模式的，字节在内存中排列顺序是这样的  union { 	int i; 	char x[2]; }a;  int main() { 	//a.x[0] = 10; 	//a.x[1] = 1; 	a.i = 1; 	int i = 0; 	int arr[32] = {}; 	for(i; i < 31; ++i) 	{ 		if(a.i & (1 << i)) 			arr[i] = 1; 	} 	for(i = 0; i < 31; ++i) 		printf("%d ", arr[i]); 	 	if(a.x[0]) 		printf("小端模式\n"); 	else 		printf("大端模式\n"); 	return 0; }

理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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  仅供参考：#include <stdio.h> #include <stdlib.h> char buf[17]; union U {   unsigned short int aa;   struct {     unsigned int bb:7;//(bit 0-6)     unsigned int cc:6;//(bit 7-12)     unsigned int dd:3;//(bit 13-15)   }; } u; void main() {                 //bbbbbbbbbbbbbbbb                 //iiiiiiiiiiiiiiii                 //tttttttttttttttt                 //111111                 //5432109876543210                 //::::::::::::::::     u.aa=0xE07F;//1110000001111111     printf("bb==%d,cc==%d,dd==%d\n",u.bb,u.cc,u.dd);     u.bb=0x41;     u.cc=0x21;//dddccccccbbbbbbb     u.dd=5;   //1011000011000001     printf("aa==0x%04X==%016s(2)\n",u.aa,itoa(u.aa,buf,2)); } //bb==127,cc==0,dd==7 //aa==0xB0C1==1011000011000001(2)

我找到更好的回答了，来源于：http://www.2cto.com/kf/201402/278969.html 公用体公用一个内存区域sizeof(a)为共用体成员中长度最长的成员的size。即i int:             (|_|_|_|_|_|_|_|_|)(|_|_|_|_|_|_|_|_|)(|_|_|_|_|_|_|_|_|)(|_|_|_|_|_|_|_|_|) char x[2] :                                                     (|_|_|_|_|_|_|_|_|)(|_|_|_|_|_|_|_|_|)                   ^                                                                                ^                高地址                                                   低地址 分析： a.x[0] = 10 ========================>                          (|0|0|0|0|1|0|1|0|) a.x[1] = 1   ======================>     (|0|0|0|0|0|0|0|1|) 公用体公用sizeof(int)长度即4字节32为，则赋值后共用体内存为 a:              (|0|0|0|0|0|0|0|0|)(|0|0|0|0|0|0|0|0|)(|0|0|0|0|0|0|0|1|)(|0|0|0|0|1|0|1|0|) a.i 为4字节整型 则 i = 2^8 + 2^3 + 2^1 = 256 + 8 + 2 = 266


Question: C语言描点画图 求大神~~~

1 把far去掉，以前的模型 2 只是画线吗？直接用DC的不 行吗

#define far/去掉 试试 (graphics.lib 这鬼东西不是 16 位的么 - - ... 有GDI/DirectX不用玩这鬼玩意干什么)


Question: （HELP）关于acm上提交代码会出现Runtime Error怎么处理

逐字逐句深刻理解题意，是做任何题目的基本功。

#define MaxSize 100 题目上说的是字符串长度不超过20000


Question: vs2013编译c程序，出现无法启动程序“.exe”。系统找不到指定文件

本贴结！ 问题出在编译出错，需要把scanf替换成scanf_s，把程序错误修改掉就可以啦~

引用 18 楼 a30037338 的回复:[quote=引用 16 楼 u013409439 的回复:] 这个问题我也是问了度娘说是更安全，防止溢出之类的，就是不知其所以然~  scanf("%s", buf); //如果输入1234567890，buf只读取1，后面的部分会还在输入缓冲区当中。 下一次scanf的时候， 可能读到的就是2， 而不是你想输入的值  scanf_s("%s",buf,5);  //输入abcdefg， 还有buf只取5位，之后清除输入缓冲区 scanf_s("%d",&a, 1);  //下一次在输入不会读取到上一次的残留字符[/quote] 还是不太明白

[quote=引用 22 楼 erlian1992 的回复:] 如果以前没有问题，就是你写代码错了，仔细检查一遍，如果是刚有一直出现这个问题，就是兼容性问题，也可能是安装VS2013时少了一些组件，你可以重新卸载干净重新安装。[/quote  不是，就是scanf与scanf_s的问题。

把void main 改成int main试一下

scanf可以用的，应该是你哪里写错了

引用 17 楼 u013409439 的回复:[quote=引用 14 楼 kellen_ 的回复:]  你输入的时候可能两个数中间用的不是" , "，而是空格，   如果不是这个原因，你看看我写的这个，仅供参考； 大神是用什么编译软件写的？[/quote] 先说明下我是个3流大学的菜鸟  嘿嘿   我用的是一个不太严的   叫  cfree

引用 16 楼 u013409439 的回复:这个问题我也是问了度娘说是更安全，防止溢出之类的，就是不知其所以然~  scanf("%s", buf); //如果输入1234567890，buf只读取1，后面的部分会还在输入缓冲区当中。 下一次scanf的时候， 可能读到的就是2， 而不是你想输入的值  scanf_s("%s",buf,5);  //输入abcdefg， 还有buf只取5位，之后清除输入缓冲区 scanf_s("%d",&a, 1);  //下一次在输入不会读取到上一次的残留字符

引用 14 楼 kellen_ 的回复: 你输入的时候可能两个数中间用的不是" , "，而是空格，   如果不是这个原因，你看看我写的这个，仅供参考； 大神是用什么编译软件写的？

引用 13 楼 a30037338 的回复:[quote=引用 12 楼 u013409439 的回复:] 但是我调试的时候没有错误啊，那是为什么呢？为什么不能用呢？我敲的是书上的例子。 那就用 scanf_s ， vs自己搞了一套更 “安全” 的函数。 char buf[5]={'\0'}; int a; scanf("%s", buf); //如果输入1234567890，后面的部分会被写到别的空间上去。  //以上代码如果用scanf_s,第二行应改为 scanf_s("%s, %d",buf,5, &a, 1); //表示最多读取4个字符，因为buf[4]要放'\0'[/quote] 这个问题我也是问了度娘说是更安全，防止溢出之类的，就是不知其所以然~

引用 12 楼 u013409439 的回复:但是我调试的时候没有错误啊，那是为什么呢？为什么不能用呢？我敲的是书上的例子。 那就用 scanf_s ， vs自己搞了一套更 “安全” 的函数。 char buf[5]={'\0'}; int a; scanf("%s", buf); //如果输入1234567890，后面的部分会被写到别的空间上去。  //以上代码如果用scanf_s,第二行应改为 scanf_s("%s, %d",buf,5, &a, 1); //表示最多读取4个字符，因为buf[4]要放'\0'

引用 4 楼 fly_dragon_fly 的回复:下面提示不能使用scanf但是我调试的时候没有错误啊，那是为什么呢？为什么不能用呢？我敲的是书上的例子。

引用 5 楼 hnwyllmm 的回复:那不是写着编译失败吗？ 但是我调试的时候没有错误啊，那是为什么呢？

、 引用 2 楼 u011004037 的回复:编译出错了好吧, 好好看看下面的提示行不? 但是我调试的时候没有错误啊，那是为什么呢？

#pragma warning(disable:4996) ...

引用 6 楼 a30037338 的回复:编译报错了， 不一定是scanf的问题， 还有可能是使用了未初始化的变量   [quote=引用 5 楼 hnwyllmm 的回复:] 猛地一看， 你和楼主像兄弟， 仔细一看， 情侣装[/quote] 我靠，还真没注意到

编译报错了， 不一定是scanf的问题， 还有可能是使用了未初始化的变量   引用 5 楼 hnwyllmm 的回复: 猛地一看， 你和楼主像兄弟， 仔细一看， 情侣装

那不是写着编译失败吗？


Question: 新手求帮忙看下这段代码的数据溢出问题，没有C币理解下（我是在CodeBlock10.05下运行的）

这个算法流程的执行过程

问题是什么，描述一下


Question: 基于SM2算法的证书签名问题

将待签名数据用SM2签名后，将得到的数据只要按证书结构加到最后面的“签名数据”处组成新的一组数据，就是证书了，证书是不能用了签名的。


Question: 打印英文时出现乱码  但可以打印中文

仅供参考：#pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <windows.h> wchar_t a2w[256]={ 0x0020,0x263a,0x263b,0x2665,0x2666,0x2663,0x2660,0x2022, 0x25d8,0x25cb,0x25d9,0x2642,0x2640,0x266a,0x266b,0x263c, 0x25ba,0x25c4,0x2195,0x203c,0x00b6,0x00a7,0x25ac,0x21a8, 0x2191,0x2193,0x2192,0x2190,0x221f,0x2194,0x25b2,0x25bc, 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, 0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f, 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, 0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f, 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, 0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f, 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, 0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f, 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, 0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f, 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, 0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x2302, 0x00c7,0x00fc,0x00e9,0x00e2,0x00e4,0x00e0,0x00e5,0x00e7, 0x00ea,0x00eb,0x00e8,0x00ef,0x00ee,0x00ec,0x00c4,0x00c5, 0x00e9,0x00e6,0x00c6,0x00f4,0x00f6,0x00f2,0x00fb,0x00f9, 0x00ff,0x00d6,0x00dc,0x00a2,0x00a3,0x00a5,0x20a7,0x0192, 0x00e1,0x00ed,0x00f3,0x00fa,0x00f1,0x00d1,0x00aa,0x00ba, 0x00bf,0x2310,0x00ac,0x00bd,0x00bc,0x00a1,0x00ab,0x00bb, 0x2591,0x2592,0x2593,0x2502,0x2524,0x2561,0x2562,0x2556, 0x2555,0x2563,0x2551,0x2557,0x255d,0x255c,0x255b,0x2510, 0x2514,0x2534,0x252c,0x251c,0x2500,0x253c,0x255e,0x255f, 0x255a,0x2554,0x2569,0x2566,0x2560,0x2550,0x256c,0x2567, 0x2568,0x2564,0x2565,0x2559,0x2558,0x2552,0x2553,0x256b, 0x256a,0x2518,0x250c,0x2588,0x2584,0x258c,0x2590,0x2580, 0x03b1,0x00df,0x0393,0x03c0,0x03a3,0x03c3,0x00b5,0x03c4, 0x03a6,0x0398,0x03a9,0x03b4,0x221e,0x03c6,0x03b5,0x2229, 0x2261,0x00b1,0x2265,0x2264,0x2320,0x2321,0x00f7,0x2248, 0x00b0,0x2219,0x00b7,0x221a,0x207f,0x00b2,0x25a0,0x00ff, }; extern "C" HWND WINAPI GetConsoleWindow(); void HideTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = FALSE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } void ShowTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = TRUE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } int main() {     HWND  hwnd;     HDC   hdc;     HFONT hfont;     wchar_t ws[256];     unsigned char s[256];     int i;       system("color F0");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hfont = CreateFont(16,  0, 0, 0, 0, 0, 0, 0, 0           , 0, 0, 0, 0, "Lucida Console");     SelectObject(hdc,hfont);     TextOutW(hdc,10,10,L"你好",2);     for (i=0;i<256;i++) s[i]=i;     for (i=0;i<256;i++) ws[i]=a2w[s[i]];     TextOutW(hdc,10, 40,ws    ,32);     TextOutW(hdc,10, 80,ws+ 32,32);     TextOutW(hdc,10,120,ws+ 64,32);     TextOutW(hdc,10,160,ws+ 96,32);     TextOutW(hdc,10,200,ws+128,32);     TextOutW(hdc,10,240,ws+160,32);     TextOutW(hdc,10,280,ws+192,32);     TextOutW(hdc,10,320,ws+224,32);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     getch();     system("color 07");     system("cls");     ShowTheCursor();     return 0; }

当前终端窗口的编码为GBK，如果printf("c"),就可以打印'c' 如果我把终端窗口设置为utf-8, printf("%c%c%c%c%c\n", b, a, a, a, b)正常，但printf("你好！")就会乱码 怎样才能同时都打印正确没有乱码呢？

接上，这个是运行结果


Question: 如何将一个函数中的局部变量用指针调用到另一个函数中去

引用 9 楼 zdlhsq 的回复:！！！要是定义了全局变量，要怎么实现在上一个函数里运算，下一个函数里调用上一个函数运算的值。！！！  赵老师已经给了这个问题和答案了. 全局变量即是全局的,  你的上一个函数可以把运算结果保存到这个全局变量中, 下一个函数就可以使用这个全局变量得到上一个函数运算的值.  我把赵老师的代码给你注释下  #include <stdio.h> int g_var;   //全局变量 定义 void fun1() {  gvar++;   //fun1中计算修改了全局变量, 相当于你计算了一个值, 保存在全局变量中了. } void fun2() {  gvar*=2;  //第二个函数中直接使用这个全局变量, 它不但使用这上一个函数的计算结果, 自己也会计算并保存一个值到全局变量中 } int main() {  g_var=1;  fun1();  //执行完这个, g_var = 2;  内部自加1了  fun2();  //执行完这个函数  g_var = 4;    内部使用上个函数计算结果2, 然后2*2=4  printf("%d\n",g_var);  //这里会输出4  return 0; }

函数里用局部指针, 局部指针返回

请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George

引用 16 楼 zdlhsq 的回复:感谢两位的指导，明白了，不过我采用了#15楼的方法。 引用 8 楼 zhao4zhong1 的回复:使用全局变量不会麻烦死人的。 不使用全局变量也不会爽死人的。  在今后的峥嵘岁月中，用心体会我这两句话。

感谢两位的指导，明白了，不过我采用了#15楼的方法。

在外部定义，然后作为这两个函数的参数。

引用 8 楼 zhao4zhong1 的回复:使用全局变量不会麻烦死人的。 不使用全局变量也不会爽死人的。   要是定义了全局变量，要怎么实现在上一个函数里运算，下一个函数里调用上一个函数运算的值呢？

引用 4 楼 xiaohuh421 的回复:既然是局部变量, 那就不要想了,  这是危险的, 结果是不可预知的.  可以是局部静态变量,全局变量等等  ！！！要是定义了全局变量，要怎么实现在上一个函数里运算，下一个函数里调用上一个函数运算的值。！！！

使用全局变量不会麻烦死人的。 不使用全局变量也不会爽死人的。

这么一个程序各种goto，真是醉了，要么加static了return，要么全局变量

静态局部变量作用域受到限制， 搞一个全局变量。  为什么到处充满了goto

同一文件可以static，否则只能全局，这种变量在小程序无所谓，程序大了就要小心

全局变量吧..

引用 10 楼 zdlhsq 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] 使用全局变量不会麻烦死人的。 不使用全局变量也不会爽死人的。   要是定义了全局变量，要怎么实现在上一个函数里运算，下一个函数里调用上一个函数运算的值呢？[/quote] #include <stdio.h> int g_var; void fun1() {  gvar++; } void fun2() {  gvar*=2; } int main() {  g_var=1;  fun1();  fun2();  printf("%d\n",g_var);  return 0; }

如果要使用的变量比较多，建议封装起来做成一个struct，然后定义一个全局的结构体实例，至于是不是static是你的需求而定，这样操作起来就比较方便了。

函数内部的局部变量，在函数调用返回时，就已经无效了，返回指针当然可以访问，但是无意义了！ 原因：x86下，每次函数调用，都要在栈上生成一个新的栈帧，局部变量就在此栈帧中进行分配，当函数返回时，此栈帧就要撤销。 假设A call B, 从B中返回一个局部变量的指针p，然后A call C,那么p可能就指向了函数C的局部变量，因为B返回后再调C，栈帧就重新分配给C了

你定义为全局变量 ，在任何一个子函数中都可以使用了。


Question: uva10106高精度乘法老是WA感觉没错啊

两个255位十进制正整数相乘，最大可得255*2，即510位十进制正整数。

没细看算法，不过memset显然错了。应该是  memset(a,0,sizeof(a)); 或者  memset(a,0,255 * sizeof(int));  还有，你确定255和505够用？数组稍微定义的大一点没啥坏处


把 p->epc = (char)coulmn_value[1]; 改为 strcpy（p->epc，coulmn_value[1]）;

Windows： 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  Linux： 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

把struct 里面的 epc 改为char *型的会报Segmentation fault


Question: linux下从末尾读取文件

仅供参考：#include <stdio.h> FILE *f; int c; long offset; char ln[100]; void main() {     f=fopen("a.txt","rb");//必须用b方式打开，否则文件当前读位置会受\x0d \x0a \x1a等字符的干扰     fseek(f,-1,SEEK_END);//倒数最后一个字节之前     while (1) {         c=fgetc(f);         if ('\n'==c) {             offset=ftell(f);//记住当前位置，即刚读字符后面             fgets(ln,100,f);             printf("%s",ln);             fseek(f,offset-2,SEEK_SET);//回到刚才读位置之前一个位置，即c所在位置之前一个位置         } else             if (fseek(f,-2,SEEK_CUR)) {//回到刚才读位置之前一个位置，即c所在位置之前一个位置失败，说明已读到文件开头                 fseek(f,0,SEEK_SET);                 fgets(ln,100,f);//读文件第一行内容                 printf("%s",ln);                 break;             }     }     fclose(f); }

引用 4 楼 wangzuxi 的回复:如果行数不是很多，就把所有行读到一个二维数组中，反向遍历这个二维数组就可以了。  +1

如果行数不是很多，就把所有行读到一个二维数组中，反向遍历这个二维数组就可以了。

如果不是写程序的话，可以考虑使用工具

fopen指向文件末尾，反向扫描换行符，提取整行

搜“tail命令“及其对应的源代码。


Question: 帮忙看下哪里错了？

#include<stdio.h> #include<math.h> int main() { int a,n; double all=0; while(scanf("%d,%d",&a,&n)!=EOF) { all = (pow(10,n+1)-10-9*n) / 81.0; printf("%f\n",all*a); } return 0; }

下面是我自己写的一个程序，已经运行过了没什么问题，你可以参考一下 #include<stdio.h> #include<stdlib.h>  int f(int a,int n) { 	int sum; 	if(n==1) 		return a; 	else  		return f(a,n-1)*10+a;	 } int main() { 	int a,n; 	int sum[20],i,j; 		for(j=0;scanf("%d%d",&a,&n)!=EOF;j++) 		{ 			sum[j]=0; 			for(i=1;i<=n;i++) 				sum[j]+=f(a,i); 		} 	for(i=0;i<j;i++) 		printf("%d\n",sum[i]); 	return 0; }

如果考虑到n可能会非常大，应该使用一些高精度算法 #include <stdio.h> #include <stdlib.h>  void Normalize(int * arr, int len) {     int i;     for (i = 0; i < len - 1; i++)     {         arr[i + 1] += arr[i] / 10;         arr[i] %= 10;     } }  int main(void) { 	int a, n, *arr;     while (scanf("%d%d", &a, &n) == 2)     {         arr = (int*)malloc((n + 1) * sizeof(int));         int i = 0, t = n;         for (i = 0; i < n; i++)         {             arr[i] = a * t--;         }         arr[i] = 0;         Normalize(arr, n + 1);         while (arr[i] == 0) i--;         do         {             printf("%d", arr[i]);         } while (i-- > 0);         printf("\n");         free(arr);     } 	return 0; }

是不是结果超出最大表示值了~

int a, n; 	int sum = 0, curVal;  	while(scanf_s("%d%d",&a,&n) == 2) 	{ 	    sum = 0; 		curVal = 0;  		while ( n-- > 0 ) 		{ 		    curVal = curVal * 10 + a; 			sum += curVal;  		} 		printf( "%d ", sum ); 	}

额。。。。老师，貌似跟我的题没关系啊

仅供参考：#include <stdio.h> #include <string.h> #define MAXLEN 1000 char a1[MAXLEN]; char a2[MAXLEN]; static int v1[MAXLEN]; static int v2[MAXLEN]; static int v3[MAXLEN]; int i,j,n,L,z; void main(void) {     scanf("%d",&n);     for (j=0;j<n;j++) {         scanf("%s%s",a1,a2);          L=strlen(a1);         for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';          L=strlen(a2);         for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';          for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];          for (i=0;i<MAXLEN;i++) {             if (v3[i]>=10) {                 v3[i+1]+=v3[i]/10;                 v3[i]=v3[i]%10;             }         }          printf("Case %d:\n", j+1);         printf("%s + %s = ", a1, a2);          z=0;         for (i=MAXLEN-1;i>=0;i--) {             if (z==0) {                 if (v3[i]!=0) {                     printf("%d",v3[i]);                     z=1;                 }             } else {                 printf("%d",v3[i]);             }         }         if (z==0) printf("0");          printf("\n");     } } //Sample Input //3 //0 0 //1 2 //112233445566778899 998877665544332211 // //Sample Output //Case 1: //0 + 0 = 0 //Case 2: //1 + 2 = 3 //Case 3: //112233445566778899 + 998877665544332211 = 1111111111111111110


Question: underfined reference to 'pthread_create'

-lpthread 是在链接的时候加

把make的输出都贴出来吧，楼主问个问题，干嘛还藏着掖着！

引用 2 楼 a30037338 的回复:cc  -c  $^  -o  $@  -I  ./include  -lpthread  多了一个-l 应该是一个大写的 ‘i’

LD_LIBRARY_PATH -L（lib目录） -l（lib名称）


Question: 这个题输出为什么是9和10

哪个调用先入栈本来就是随机的。也只有小学生才会在printf里使用函数调用。完全不了解底层的工作机制。

汪国真刚逝世了，留下了一些诗篇； 谭浩强逝世的时候，不知道能不能将++,--带进坟墓。

引用 6 楼 william7_138 的回复:[quote=引用 3 楼 lin5161678 的回复:] [quote=引用 1 楼 william7_138 的回复:] 这个和printf函数参数入栈的顺序有关，参数入栈的顺序是从右至左的，所以先运行的my(5)，再运行的my(4)，因此count被初始化为了5，故输出9和10。解释是错的  入栈顺序和 哪一个my函数先调用没什么关系   [/quote] 这里，会先将5入栈，然后运行my函数，然后将my函数的返回值入栈，接下来调用my(4)，最后将字符串入栈，然后调用printf，printf的调用约定是__cdecl，函数调用堆栈的操作是调用者处理的，所以printf支持可变参数列表。以下是反汇编代码 	printf("%d\n%d\n",my(4),my(5)); 0041142E  push        5     00411430  call        my (411091h)  00411435  add         esp,4  00411438  mov         esi,esp  0041143A  push        eax   0041143B  push        4     0041143D  call        my (411091h)  00411442  add         esp,4  00411445  push        eax   00411446  push        offset string "%d\n%d\n" (41573Ch)  0041144B  call        dword ptr [__imp__printf (4182BCh)]  00411451  add         esp,0Ch  00411454  cmp         esi,esp  00411456  call        @ILT+325(__RTC_CheckEsp) (41114Ah) [/quote]  你没看懂我说什么 我说入栈顺序和哪一个my先调用没关系 从右向左入栈 和 调用my 函数的顺序 不是一回事  你看到的汇编只是一个巧合 刚刚好 入栈顺序和 调用my 函数顺序一致                             裘宗燕：C/C++ 语言中的表达式求值  经常可以在一些讨论组里看到下面的提问：“谁知道下面C语句给n赋什么值？” m = 1; n = m+++m++;  最近有位不相识的朋友发email给我，问为什么在某个C++系统里，下面表达式打印出两个4，而不是4和5： a = 4; cout << a++ << a; C++ 不是规定 << 操作左结合吗？是C++ 书上写错了，还是这个系统的实现有问题？  要弄清这些，需要理解的一个问题是：如果程序里某处修改了一个变量（通过赋值、增量/减量操作等），什么时候从该变量能够取到新值？有人可能说，“这算什么问题！我修改了变量，再从这个变量取值，取到的当然是修改后的值！”其实事情并不这么简单。  C/C++ 语言是“基于表达式的语言”，所有计算（包括赋值）都在表达式里完成。“x = 1;”就是表达式“x = 1”后加表示语句结束的分号。要弄清程序的意义，首先要理解表达式的意义，也就是： 1）表达式所确定的计算过程； 2）它对环境（可以把环境看作当时可用的所有变量）的影响。如果一个表达式（或子表达式）只计算出值而不改变环境，我们就说它是引用透明的，这种表达式早算晚算对其他计算没有影响（不改变计算的环境。当然，它的值可能受到其他计算的影响）。如果一个表达式不仅算出一个值，还修改了环境，就说这个表达式有副作用（因为它多做了额外的事）。a++ 就是有副作用的表达式。这些说法也适用于其他语言里的类似问题。  现在问题变成：如果C/C++ 程序里的某个表达式（部分）有副作用，这种副作用何时才能实际体现到使用中？  为使问题更清楚，我们假定程序里有代码片段“...a[i]++ ... a[j] ...”，假定当时i与j的值恰好相等（a[i] 和a[j] 正好引用同一数组元素）；假定a[i]++ 确实在a[j] 之前计算；再假定其间没有其他修改a[i] 的动作。在这些假定下，a[i]++ 对 a[i] 的修改能反映到 a[j] 的求值中吗？注意：由于 i 与 j 相等的问题无法静态判定，在目标代码里，这两个数组元素访问（对内存的访问）必然通过两段独立代码完成。现代计算机的计算都在寄存器里做，问题现在变成：在取 a[j] 值的代码执行之前，a[i] 更新的值是否已经被（从寄存器）保存到内存？如果了解语言在这方面的规定，这个问题的答案就清楚了。  程序语言通常都规定了执行中变量修改的最晚实现时刻（称为顺序点、序点或执行点）。程序执行中存在一系列顺序点（时刻），语言保证一旦执行到达一个顺序点，在此之前发生的所有修改（副作用）都必须实现（必须反应到随后对同一存储位置的访问中），在此之后的所有修改都还没有发生。在顺序点之间则没有任何保证。对C/C++ 语言这类允许表达式有副作用的语言，顺序点的概念特别重要。  现在上面问题的回答已经很清楚了：如果在a[i]++ 和a[j] 之间存在一个顺序点，那么就能保证a[j] 将取得修改之后的值；否则就不能保证。  C/C++语言定义（语言的参考手册）明确定义了顺序点的概念。顺序点位于： 1. 每个完整表达式结束时。完整表达式包括变量初始化表达式，表达式语句，return语句的表达式，以及条件、循环和switch语句的控制表达式（for头部有三个控制表达式）； 2. 运算符 &&、||、?: 和逗号运算符的第一个运算对象计算之后； 3. 函数调用中对所有实际参数和函数名表达式（需要调用的函数也可能通过表达式描述）的求值完成之后（进入函数体之前）。 假设时刻ti和ti+1是前后相继的两个顺序点，到了ti+1，任何C/C++ 系统（VC、BC等都是C/C++系统）都必须实现ti之后发生的所有副作用。当然它们也可以不等到时刻ti+1，完全可以选择在时段 [t, ti+1] 之间的任何时刻实现在此期间出现的副作用，因为C/C++ 语言允许这些选择。  前面讨论中假定了a[i]++ 在a[i] 之前做。在一个程序片段里a[i]++ 究竟是否先做，还与它所在的表达式确定的计算过程有关。我们都熟悉C/C++ 语言有关优先级、结合性和括号的规定，而出现多个运算对象时的计算顺序却常常被人们忽略。  看下面例子：(a + b) * (c + d) fun(a++, b, a+5) 这里“*”的两个运算对象中哪个先算？fun及其三个参数按什么顺序计算？对第一个表达式，采用任何计算顺序都没关系，因为其中的子表达式都是引用透明的。第二个例子里的实参表达式出现了副作用，计算顺序就非常重要了。少数语言明确规定了运算对象的计算顺序（Java规定从左到右），C/C++ 则有意不予规定，既没有规定大多数二元运算的两个对象的计算顺序（除了&&、|| 和 ，），也没有规定函数参数和被调函数的计算顺序。在计算第二个表达式时，首先按照某种顺序算fun、a++、b和a+5，之后是顺序点，而后进入函数执行。  不少书籍在这些问题上有错（包括一些很流行的书）。例如说C/C++ 先算左边（或右边），或者说某个C/C++ 系统先计算某一边。这些说法都是错误的！一个C/C++ 系统可以永远先算左边或永远先算右边，也可以有时先算左边有时先算右边，或在同一表达式里有时先算左边有时先算右边。不同系统可能采用不同的顺序（因为都符合语言标准）；同一系统的不同版本完全可以采用不同方式；同一版本在不同优化方式下，在不同位置都可能采用不同顺序。因为这些做法都符合语言规范。在这里还要注意顺序点的问题：即使某一边的表达式先算了，其副作用也可能没有反映到内存，因此对另一边的计算没有影响。  回到前面的例子：“谁知道下面C语句给n赋什么值？” m = 1; n = m++ +m++; 正确回答是：不知道！语言没有规定它应该算出什么，结果完全依赖具体系统在具体上下文中的具体处理。其中牵涉到运算对象的求值顺序和变量修改的实现时刻问题。对于： cout << a++ << a; 我们知道它是 (cout.operator <<(a++)).operator << (a); 的简写。先看外层函数调用，这里需要算出所用函数（由加下划线的一段得到），还需要计算a的值。语言没有规定哪个先算。如果真的先算函数，这一计算中出现了另一次函数调用，在被调函数体执行前有一个顺序点，那时a++的副作用就会实现。如果是先算参数，求出a的值4，而后计算函数时的副作用当然不会改变它（这种情况下输出两个4）。当然，这些只是假设，实际应该说的是：这种东西根本不该写，讨论其效果没有意义。  有人可能说，为什么人们设计 C/C++时不把顺序规定清楚，免去这些麻烦？  C/C++ 语言的做法完全是有意而为，其目的就是允许编译器采用任何求值顺序，使编译器在优化中可以根据需要调整实现表达式求值的指令序列，以得到效率更高的代码。像Java那样严格规定表达式的求值顺序和效果，不仅限制了语言的实现方式，还要求更频繁的内存访问（以实现副作用），这些可能带来可观的效率损失。应该说，在这个问题上，C/C++和Java的选择都贯彻了它们各自的设计原则，各有所获（C/C++ 潜在的效率，Java更清晰的程序行为），当然也都有所失。还应该指出，大部分程序设计语言实际上都采用了类似C/C++的规定。  讨论了这么多，应该得到什么结论呢？C/C++ 语言的规定告诉我们，任何依赖于特定计算顺序、依赖于在顺序点之间实现修改效果的表达式，其结果都没有保证。程序设计中应该贯彻的规则是：如果在任何“完整表达式”（形成一段由顺序点结束的计算）里存在对同一“变量”的多个引用，那么表达式里就不应该出现对这一“变量”的副作用。否则就不能保证得到预期结果。注意：这里的问题不是在某个系统里试一试的问题，因为我们不可能试验所有可能的表达式组合形式以及所有可能的上下文。这里讨论的是语言，而不是某个实现。总而言之，绝不要写这种表达式，否则我们或早或晚会某种环境中遇到麻烦。  后记：去年参加一个学术会议，看到有同行写文章讨论某个C系统里表达式究竟按什么顺序求值，并总结出一些“规律”。从讨论中了解到某“程序员水平考试”出了这类题目。这使我感到很不安。今年给一个教师学习班讲课，发现许多专业课教师也对这一基本问题也不甚明了，更觉得问题确实严重。因此整理出这篇短文供大家参考。  后后记：4年多过去了，许多新的和老的教科书仍然在不厌其烦地讨论在C语言里原本并无意义的问题（如本文所指出的）。希望学习和使用C语言的人不要陷入其中。 更多 30

引用 3 楼 lin5161678 的回复:[quote=引用 1 楼 william7_138 的回复:] 这个和printf函数参数入栈的顺序有关，参数入栈的顺序是从右至左的，所以先运行的my(5)，再运行的my(4)，因此count被初始化为了5，故输出9和10。解释是错的  入栈顺序和 哪一个my函数先调用没什么关系   [/quote] 这里，会先将5入栈，然后运行my函数，然后将my函数的返回值入栈，接下来调用my(4)，最后将字符串入栈，然后调用printf，printf的调用约定是__cdecl，函数调用堆栈的操作是调用者处理的，所以printf支持可变参数列表。以下是反汇编代码 	printf("%d\n%d\n",my(4),my(5)); 0041142E  push        5     00411430  call        my (411091h)  00411435  add         esp,4  00411438  mov         esi,esp  0041143A  push        eax   0041143B  push        4     0041143D  call        my (411091h)  00411442  add         esp,4  00411445  push        eax   00411446  push        offset string "%d\n%d\n" (41573Ch)  0041144B  call        dword ptr [__imp__printf (4182BCh)]  00411451  add         esp,0Ch  00411454  cmp         esi,esp  00411456  call        @ILT+325(__RTC_CheckEsp) (41114Ah)

引用 2 楼 cocodada 的回复:静态变量只初始化一次，，printf先运行my(5)之后就已经初始化count为5，再运行my(4)时，并不初始化count，仍然为5 我的代码运行是没有问题的，我是调试的时候看的反汇编，确实是先将5入栈，然后运行my函数，再将4入栈，再次运行my，那么请问，你认为my函数是在什么时候运行的？

代码是错的 未定义行为 结果没有意义  楼主去看置顶帖吧

引用 1 楼 william7_138 的回复:这个和printf函数参数入栈的顺序有关，参数入栈的顺序是从右至左的，所以先运行的my(5)，再运行的my(4)，因此count被初始化为了5，故输出9和10。解释是错的  入栈顺序和 哪一个my函数先调用没什么关系


Question: 如何用C语言实现文本里面关键字的替换

直接用shell不好吗？sed -e 's/[我你他谁]/\*/g' -e 's/朋友/\*\*/g' 1.txt sed -e 's/[我你他谁]/\*/g' -e 's/朋友/\*\*/g' -e 's/[^\*]//g' 1.txt | wc -L

边读边处理，重点注重宽字符的处理

额。。一边读取文件，判断字符进行转换不就ok啦

那天，那个人看见那个人的那个把那个人的那个给那个了！

//定义“我”“你”“他”“谁”“朋友”为关键字，导入一个文本1.txt，文本内容为： //我和你是朋友，你和他是朋友，但是我不知道他是谁。 //要求将关键字替换为星号（*），输出： //*和*是**，*和*是**，但是*不知道*是*。 //并输出*号的个数 #include <stdio.h> #include <string.h> #include <locale.h> char k[5][5]={"我","你","他","谁","朋友"}; FILE *f; char ln[256]; int n,L,i,j; int main() {     setlocale(LC_ALL,"chs");     f=fopen("1.txt","r");     if (NULL==f) {         printf("Can not open file 1.txt!\n");         return 1;     }     fgets(ln,256,f);     fclose(f);     n=0;     L=strlen(ln);     for (i=0;i<L;i+=2) {         for (j=0;j<5;j++) {             if (0==strncmp(ln+i,k[j],strlen(k[j]))) break;         }         if (j<4) {             printf("*");             n++;         } else if (j<5) {             printf("**");             n+=2;             i+=2;         } else {             printf("%.2s",ln+i);         }     }     printf("%d\n",n);     return 0; } //*和*是**，*和*是**，但是*不知道*是*。 //11 //

仅供参考：#include <stdio.h> #include <string.h> char s[256]; char *p; int r,n,i; int main() {     while (1) {         printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXXXXX\":\n");         fgets(s,256,stdin);         if ('\n'==s[0]) break;         p=s;         while (1) {             p=strstr(p,"%20");             if (p) {                 memmove(p+1,p+3,strlen(p)-3+1);                 p[0]=' ';             } else break;         }         p=s;         while (1) {             p=strstr(p,"你懂得");             if (p) {                 memmove(p+6,p+6,strlen(p)-6+1);                 for (i=0;i<6;i++) p[i]='X';             } else break;         }         printf("%s",s);     }     return 0; } //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //abcdefg%20helloworld%20something.pdf //abcdefg helloworld something.pdf //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //这是测试文字你懂得，在这个你懂的地方，就得做你懂得的事 //这是测试文字XXXXX，在这个你懂的地方，就得做XXXXX的事 //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //


Question: 服务器端如何区分UDP,TCP 给客户端返回数据？

引用 3 楼 zhao4zhong1 的回复:“直接在各个命令处理分支，处理完成后，直接调用TCP/UDP的发送，把结果直接送给PC。。。” 如果是多线程处理的话，楼主和你的同事们就准备受死吧。 告诉你可能的一种死法： 线程1发送“ABCD” 线程2发送"abcd" 接收方收到“AaBCbcDd”

引用 7 楼 wanyeye 的回复:[quote=引用 6 楼 my_live_123 的回复:] 服务器设计的时候就订好采用何种协议了吧！目前绝大多数都是TCP，用UDP的不多了吧！过程非常像，socket和connect的参数好像有区别 如果同时存在，可以检测报文的协议字段进行区分。但是话又说回来了，同时存在应该是两个服务器进程，不可能是同一个服务器进程服务两种协议吧？！  我们所谓的服务器，其实就是基于ARM跑linux的设备，当作一个服务器。  设备要与PC等控制端交互.... [/quote] 那应该属于驱动开发的范畴

引用 6 楼 my_live_123 的回复:服务器设计的时候就订好采用何种协议了吧！目前绝大多数都是TCP，用UDP的不多了吧！过程非常像，socket和connect的参数好像有区别 如果同时存在，可以检测报文的协议字段进行区分。但是话又说回来了，同时存在应该是两个服务器进程，不可能是同一个服务器进程服务两种协议吧？！  我们所谓的服务器，其实就是基于ARM跑linux的设备，当作一个服务器。  设备要与PC等控制端交互....

区分 udp 与 tcp  的 fd . 1).  1楼 2).  记录  udp  的 fd, 接收/发送数据时判断处理... 3).  用 read() / write() 函数 操作 fd ,  udp/tcp 通吃

1L +1,   什么时候用TCP,什么时候用UDP这个应该是设计的时候就规定好了吧， 不然为什么要搞两种协议。 如果没有规定，那么这个设计好凌乱

getsockopt SO_TYPE 可以获取socket类型，比如SOCK_RAW，SOCK_STREAM，SOCK_DGRAM等等。

引用 3 楼 zhao4zhong1 的回复:“直接在各个命令处理分支，处理完成后，直接调用TCP/UDP的发送，把结果直接送给PC。。。” 如果是多线程处理的话，楼主和你的同事们就准备受死吧。  我是不想死的，我坚持过我的意见，不建议这么干的，但是，同事年纪大，资格老，老大信他多一点， 既然这样，我就妥协了，任何事情总得有人的先妥协，哪怕以后发现我的建议是对的...   所以现在，我选了一个比较折中的办法，让老大拉人进项目中，整个项目我还负责其他部分的工作，借口工作内容多，没精力... 不要到最后，被你一语成谶了，，我成替罪羊了，所有问题都成了我的问题。。。


Question: C语言中有使用两个字符串的连接字符串，而不改变原字符串的吗？

引用 19 楼 zhao4zhong1 的回复:[quote=引用 18 楼 lin5161678 的回复:] [quote=引用 17 楼 zhao4zhong1 的回复:] [quote=引用 16 楼 Turntogo 的回复:] 不用缓冲区，还不要改变两个源字符串，这是不可能的。 5楼难道不是一个反例吗？[/quote]输出缓冲也是缓冲 [/quote] 但这个输出缓冲不是专为这两个字符串设置的，你写任何输出都要用到这个输出缓冲。 所以说这绝对是一个反例。[/quote] 不要只针对我这句话，你要看楼主的要求，楼主的要求是连接起来还要使用它（难道所谓的使用仅仅是显示出来吗），你这样有法使用吗？其实楼主自己在括号里提到的不想使用的方法是一个非常可行的方法。希望楼主不要怕麻烦。

你的需求不可实现

引用 16 楼 Turntogo 的回复:不用缓冲区，还不要改变两个源字符串，这是不可能的。 5楼难道不是一个反例吗？

不用缓冲区，还不要改变两个源字符串，这是不可能的。

引用 18 楼 lin5161678 的回复:[quote=引用 17 楼 zhao4zhong1 的回复:] [quote=引用 16 楼 Turntogo 的回复:] 不用缓冲区，还不要改变两个源字符串，这是不可能的。 5楼难道不是一个反例吗？[/quote]输出缓冲也是缓冲 [/quote] 但这个输出缓冲不是专为这两个字符串设置的，你写任何输出都要用到这个输出缓冲。 所以说这绝对是一个反例。

引用 17 楼 zhao4zhong1 的回复:[quote=引用 16 楼 Turntogo 的回复:] 不用缓冲区，还不要改变两个源字符串，这是不可能的。 5楼难道不是一个反例吗？[/quote]输出缓冲也是缓冲

引用 5 楼 zhao4zhong1 的回复:printf("%s%s\n",str1,str2);//这个绝对不需要申请新的内存！ 相由心生……

引用 4 楼 zhangxiangDavaid 的回复:[quote=引用 3 楼 mbctb 的回复:] [quote=引用 1 楼 zhangxiangDavaid 的回复:] 仅供参考  int main() { 	char *s1 = "abc"; 	char *s2 = "1234"; 	int n = strlen(s1) + strlen(s2) + 1; 	char *s = malloc(sizeof(char)*n); 	strcpy(s, s1); 	strcpy(s + strlen(s1), s2); 	free(s); 	return 0; }  这个不是我需要的，这个是申请一个新内存，然后把两个字符分别复制过去。  我需要的是简洁的方式。用到两个字符串的合字符串，而不改变它们本身。[/quote]  开什么玩笑，你想合并s1、s2，却又不想s1或s2，这难道不需要申请新的内存吗？否则合并后的字符串放哪儿呢？ [/quote] +10086.

引用 14 楼 Minikinfish 的回复:[quote=引用 13 楼 lin5161678 的回复:] [quote=引用 1 楼 zhangxiangDavaid 的回复:] 仅供参考  int main() { 	char *s1 = "abc"; 	char *s2 = "1234"; 	int n = strlen(s1) + strlen(s2) + 1; 	char *s = malloc(sizeof(char)*n); 	strcpy(s, s1); 	strcpy(s + strlen(s1), s2); 	free(s); 	return 0; } strcat被你吃了[/quote]  strcpy(s + strlen(s1), s2);，，，，这个需要strcat吗？[/quote]strcat(s, s2) 专门用来实现 strcpy(s + strlen(s1), s2)  你说需不需要?

引用 13 楼 lin5161678 的回复:[quote=引用 1 楼 zhangxiangDavaid 的回复:] 仅供参考  int main() { 	char *s1 = "abc"; 	char *s2 = "1234"; 	int n = strlen(s1) + strlen(s2) + 1; 	char *s = malloc(sizeof(char)*n); 	strcpy(s, s1); 	strcpy(s + strlen(s1), s2); 	free(s); 	return 0; } strcat被你吃了[/quote]  strcpy(s + strlen(s1), s2);，，，，这个需要strcat吗？

引用 1 楼 zhangxiangDavaid 的回复:仅供参考  int main() { 	char *s1 = "abc"; 	char *s2 = "1234"; 	int n = strlen(s1) + strlen(s2) + 1; 	char *s = malloc(sizeof(char)*n); 	strcpy(s, s1); 	strcpy(s + strlen(s1), s2); 	free(s); 	return 0; } strcat被你吃了

既然没有就算了，只能用上面那位网友的方法。

引用 4 楼 zhangxiangDavaid 的回复:[quote=引用 3 楼 mbctb 的回复:] [quote=引用 1 楼 zhangxiangDavaid 的回复:] 仅供参考  int main() { 	char *s1 = "abc"; 	char *s2 = "1234"; 	int n = strlen(s1) + strlen(s2) + 1; 	char *s = malloc(sizeof(char)*n); 	strcpy(s, s1); 	strcpy(s + strlen(s1), s2); 	free(s); 	return 0; }  这个不是我需要的，这个是申请一个新内存，然后把两个字符分别复制过去。  我需要的是简洁的方式。用到两个字符串的合字符串，而不改变它们本身。[/quote]  开什么玩笑，你想合并s1、s2，却又不想s1或s2，这难道不需要申请新的内存吗？否则合并后的字符串放哪儿呢？ [/quote] 我就是想问：有什么函数，能自己创建缓冲区，再把两个字符串起来，把地址返回给调用者。

引用 9 楼 Minikinfish 的回复:[quote=引用 8 楼 my_live_123 的回复:] sprintf(buff, "%s%s", str1, str2); 然后buff收尾加个0  这个有必要加0吗？[/quote]  A terminating null character is automatically appended after the content.  记不住了，谢谢提醒

引用 8 楼 my_live_123 的回复:sprintf(buff, "%s%s", str1, str2); 然后buff收尾加个0  这个有必要加0吗？

引用 3 楼 mbctb 的回复:[quote=引用 1 楼 zhangxiangDavaid 的回复:] 仅供参考  int main() { 	char *s1 = "abc"; 	char *s2 = "1234"; 	int n = strlen(s1) + strlen(s2) + 1; 	char *s = malloc(sizeof(char)*n); 	strcpy(s, s1); 	strcpy(s + strlen(s1), s2); 	free(s); 	return 0; }  这个不是我需要的，这个是申请一个新内存，然后把两个字符分别复制过去。  我需要的是简洁的方式。用到两个字符串的合字符串，而不改变它们本身。[/quote]  开什么玩笑，你想合并s1、s2，却又不想s1或s2，这难道不需要申请新的内存吗？否则合并后的字符串放哪儿呢？

引用 1 楼 zhangxiangDavaid 的回复:仅供参考  int main() { 	char *s1 = "abc"; 	char *s2 = "1234"; 	int n = strlen(s1) + strlen(s2) + 1; 	char *s = malloc(sizeof(char)*n); 	strcpy(s, s1); 	strcpy(s + strlen(s1), s2); 	free(s); 	return 0; }  这个不是我需要的，这个是申请一个新内存，然后把两个字符分别复制过去。  我需要的是简洁的方式。用到两个字符串的合字符串，而不改变它们本身。

你连起来的字符串肯定需要地址存放 新建str缓存 strcat(strcpy(str,str1),str2);


Question: cout,printf输出的结果不一致

http://bbs.csdn.net/topics/390676437 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  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对应的汇编并单步执行观察相应内存和寄存器变化。）

改了一下格式符，出来这个  			for(int x = 0;x<3;x++) 			{ 				cout<<detaNEU[x][0]<<endl; 		     	printf("%g\n",detaNEU[x][0]);  			}             /*  输出结果 		4.07571         8.09323e-318         3.1305         2.12281e-314         10.7046         4.2448e-314*/

引用 3 楼 zhangxiangDavaid 的回复:确实看不出问题  看了好久，不知道从哪里下手了

确实看不出问题

引用 1 楼 zhangxiangDavaid 的回复:从输出结果看，哪一个是对的呢？ cout的是对的

从输出结果看，哪一个是对的呢？


Question: c语言

仅供参考：  int table[10][5] = { 	{1, 0}, 	{1, 1}, 	{4, 4, 8, 6, 2}, 	{4, 9, 7, 1, 3}, 	{2, 6, 4}, 	{1, 5}, 	{1, 6}, 	{4, 9, 3, 1, 7}, 	{4, 4, 2, 6, 8}, 	{2, 1, 9}, }; int main(void) { 	int res, n, N; 	printf("Input N:"); 	scanf("%d", &N); 	n = N % 10;    //n记录N的个位数大小 	if (N == 1) res = 1; 	else res = table[n][(N - 2) % table[n][0] + 1]; 	printf("the result is %d\n", res); 	return 0; }

a^N的最后一位数字不是4个一循环的吗？直接a^(N%4)不就可以了吗，没必要打表的吧。


Question: gcc 参数问题

gcc -v  --help

gcc编译器针对平台和cpu,编译参数都可能会有不同,比如在linux+x86,linux+mips,os+x86,交叉编译器 linux+arm,ios+arm等等.... 所以还是需要自己取查查帮助把

可man gcc 可查到一些，你上帖中提到的有些查不到。


Question: 哪位大哥知道在VC的基于对话框的程序中实现对当前实例的数据库的备份与还原啊，本人水平很菜，求具体步骤。。

使用方法     如何创建数据库备份 (Transact-SQL) 创建数据库备份   执行 BACKUP DATABASE 语句以创建数据库备份，同时指定：  要备份的数据库的名称。   数据库备份将写入的备份设备。  指定（可选）：  INIT 子句，通过它可以重写备份媒体，并在备份媒体上将该备份作为第一个文件写入。如果没有现成的媒体头，备份过程将自动写入一个。   SKIP 和 INIT 子句，通过它们可以在备份媒体中仍然存在未失效的备份，或在媒体本身的名称与备份媒体中的名称不匹配时重写备份媒体。   FORMAT 子句，通过它可以在第一次使用媒体时对备份媒体进行完全初始化，并覆盖任何现有的媒体头。  如果已经指定了 FORMAT 子句，则不需要指定 INIT 子句。    重要  当使用 BACKUP 语句的 FORMAT 子句或 INIT 子句时，一定要十分小心，因为它们会破坏以前存储在备份媒体中的所有备份。   示例 下例将整个 MyNwind 数据库备份到磁带上：  USE MyNwind GO BACKUP DATABASE MyNwind    TO TAPE = '\\.\Tape0'    WITH FORMAT,    NAME = 'Full Backup of MyNwind' GO   请参见  sp_addumpdevice  数据库备份  追加备份集  差异数据库备份  备份 master 数据库  删除数据库  还原 model、msdb 和 distribution 数据库  重写备份媒体  BACKUP  减少恢复时间  事务日志备份  初始化备份媒体  ©1988-2000 Microsoft Corporation。保留所有权利。

我是说怎么添加代码，请说的详细点

写存贮过程,  在程序里调用


Question: 计算N阶方阵合法结果的数量（N>=2）

多谢四楼，这样的解决办法尚可行。。return n*(n-1)*(n-1)/2*((2*n-3)*aFun(n-2) + (n-2)*(n-2)*aFun(n-3));

http://oeis.org/A001499 鉴于这个数字增长极快，建议打表

艹，晕了！穷举法吧

n*(n-1)/2 * n!/2


Question: 数据结构舞伴问题OJ提交上去一直是Runtme error，是什么问题

static char A[10000],B[1000],E1,E2; 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。


Question: 求助 求助

求最大公约数用欧几里德算法。 另附参考代码:#include<iostream> #include<set> using namespace std; inline unsigned int gcd(unsigned int a,unsigned int b,unsigned int curMax) { 	unsigned int t; 	while(b>curMax) 	{ 		t=a; 		a=b; 		b=t%b; 	} 	return b?0:a;	// b不为0表示a与b的最大公约数小于等于curMax }  int main() { 	unsigned int curMax, //用于存放最大的最大公约数 		T,n,a,gcdVal; 	set<unsigned int> aset; //用于存放a1-an 	set<unsigned int>::iterator it; 	cin>>T; 	for(unsigned int i=1;i<=T;++i) 	{ 		cin>>n; 		curMax=1; 		while(n--) 		{ 			cin>>a; 			if(a>curMax)	// 过滤掉小于等于curMax的数，因为一个数的最大公约数不会大于其本身，所以此值与其它值的最大公约数不会大于curMax 			{ 				for(unsigned int x:aset) 				{ 					gcdVal=gcd(a,x,curMax);	// 用欧几里德算法求最大公约数 					if(gcdVal) 						curMax=gcdVal; 				} 				for(it=aset.begin();it!=aset.end()&&*it<=curMax;++it); 				aset.erase(aset.begin(),it);	// 删去小于等于curMax的数，理由同30行 				aset.insert(a); 			} 		} 		cout<<"Case #"<<i<<": "<<curMax<<endl; 	} 	return 0; }

哎     来人解决啊

没人会吗，帮帮忙啊


Question: 文本结束符EOF与Ctrl+z的那点事

引用 11 楼 zhao4zhong1 的回复:[quote=引用 9 楼 jusll 的回复:] [quote=引用 7 楼 zhao4zhong1 的回复:] 看一万遍标准、解释、例子、…… 不如看一遍对应处理的源代码； 看一万遍对应处理的C源代码 不如单步调试一遍对应处理的源代码； 单步调试一万遍对应处理的C源代码 不如单步调试一遍对应处理的C源代码对应的汇编指令。 如果我想单步调式对应处理的C源代码对应的汇编指令，怎么搞？用一个汇编器，把C源代码转为汇编指令吗？求赐教，简单说一下流程。谢谢了。[/quote] 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对应的汇编并单步执行观察相应内存和寄存器变化。） [/quote] 谢谢指教！

引用 10 楼 gzwgyfgpf 的回复:vc6.0调试的时候会出现汇编指令，你可以试试 我用Code::Blocks，不过还是有汇编窗口的，跟VC6相似，谢谢。

引用 9 楼 jusll 的回复:[quote=引用 7 楼 zhao4zhong1 的回复:] 看一万遍标准、解释、例子、…… 不如看一遍对应处理的源代码； 看一万遍对应处理的C源代码 不如单步调试一遍对应处理的源代码； 单步调试一万遍对应处理的C源代码 不如单步调试一遍对应处理的C源代码对应的汇编指令。 如果我想单步调式对应处理的C源代码对应的汇编指令，怎么搞？用一个汇编器，把C源代码转为汇编指令吗？求赐教，简单说一下流程。谢谢了。[/quote] 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对应的汇编并单步执行观察相应内存和寄存器变化。）

vc6.0调试的时候会出现汇编指令，你可以试试

引用 7 楼 zhao4zhong1 的回复:看一万遍标准、解释、例子、…… 不如看一遍对应处理的源代码； 看一万遍对应处理的C源代码 不如单步调试一遍对应处理的源代码； 单步调试一万遍对应处理的C源代码 不如单步调试一遍对应处理的C源代码对应的汇编指令。 如果我想单步调式对应处理的C源代码对应的汇编指令，怎么搞？用一个汇编器，把C源代码转为汇编指令吗？求赐教，简单说一下流程。谢谢了。

引用 7 楼 zhao4zhong1 的回复:看一万遍标准、解释、例子、…… 不如看一遍对应处理的源代码； 看一万遍对应处理的C源代码 不如单步调试一遍对应处理的源代码； 单步调试一万遍对应处理的C源代码 不如单步调试一遍对应处理的C源代码对应的汇编指令。 ，谢谢赐教！

引用 4 楼 zhao4zhong1 的回复:VS IDE中，在不明白的符号getchar上点鼠标右键，选转到定义。 恩，谢谢。

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

引用 1 楼 user-4 的回复:http://blog.csdn.net/cxyol/archive/2006/03/18/628324.aspx 你看下这篇文章估计就懂了！ 链接已看过了，长知识了，不过好像对EOF、Ctrl+z介绍的不多。 我在c primer plus,第五版，P192找到一种说法：       要对减胖输入文件尾信号，需要一种键入EOF字符的方式。不，您不能简单地键入字母E、O、F，而且也不能只键入-1（键入-1会传送两个字符：一个连字符和数字1）。正确的方法是您必须知道您系统的要求。在大多数Unix系统上，在一行的开始键入Ctrl+D会导致传送尾信号，许多微型计算机系统将一行的开始位置键入的Ctrl+Z识别为文件尾信号，还有一些则是把任意位置的Ctrl+Z解释成文件尾信号。 很明显，这里的情况因该是第二种第二种情况（上面标红），当Ctrl+z不是在一行的开始位置时，系统就当做控制字符处理，ascii码为26. 还是很感谢。

好的，我去瞅瞅。

回复等加分。


Question: KMP算法的C语言实现问题，希望大神来指点下。

KMP http://blog.csdn.net/zhangxiangdavaid/article/details/35569257

网上现成的资料很多，自行搜索

第一个第三个二楼的链接都解答了，第二个只要在int naiveStringMatching(const char* T, const char* P) 程序基础上再编写个程序调用，使T指针向后移动naiveStringMatching的返回值 就可以找出所有的匹配串


Question: 键盘过滤驱动只响应键盘，其他都死机了，为什么


Question: makefile

没个目录下写一个子makefile，然后不指定目标文件，利用make的潜规则，自动编译成源文件同名的目标文件，在上层makefile中调用各个子makefile

搜“跟我一起写makefile”

谢谢，顺便问一下 make 时候出现 undefined reference to 'pthread_create' 但是，我头文件加了，编译的时候-lpthread也加了，问什么还会出现这样的错误  makefile 中这句话如下： cc  -c  $^  -o  $@  -I  ./include  -lpthread

SRC := $(wildcard src/*.c) OBJ := $(patsubst src/%.c,obj/%.o,$(SRC))  这样基本就OK了，添加.c文件也不需要修改Makefile


Question: 怎么用C中的文件操作函数删除一部分数据？

所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。

仅供参考：  /*1.dat Tom 15 98.3 Jim 14 99.5 Lyli 15 89.0 David 15 80.8 */ int main(void) { 	FILE *f, *nf; 	if (NULL == (f = fopen("1.dat", "rb"))) 	{ 		fprintf(stderr, "Can not open file 1.dat"); 		return 1; 	} 	if (NULL == (nf = fopen("11.dat", "wb"))) 	{ 		fprintf(stderr, "Can not create file 11.dat"); 		fclose(f); 		return 1; 	} 	char name[20]; 	char Name[20]; 	int year; 	double grade; 	int r; 	printf("input the delete name string:"); 	scanf("%20s", name); 	while (1) 	{ 		r = fscanf(f, "%s%d%lf\n", Name, &year, &grade); 		if (3 == r) 		{ 			if (strcmp(name, Name) == 0) continue; 			fprintf(nf, "%s %d %lg\n", Name, year, grade); 		} 		else break; 	} 	fclose(f); 	fclose(nf); 	return 0; }

OK  解决了  可以在重新写入数据的时候换成“wb+”模式，这样原文件已有的数据会被删除。然后重新开始添加记录


Question: TC30的多文件编译

C++必须要有函数原型，C语言可选  写在头文件里, 包含头文件

引用 1 楼 zhao4zhong1 的回复:偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。文不对题啊大哥，，，而且这个问题这么做也找不出问题啊


Question: 请问这个程序中为什么要设一个二维数组

str[4][100]就是用来存放四个字符串的 str[0] --- str[3] getchar可以等待用户输入，而不是程序到这里就退出了