Question: 导入文字坐标，生成图片

仅供参考#pragma comment(lib,"gdi32") #include <windows.h> #include <stdio.h>  int main() {     const DWORD uWidth = 18 + 17 * 256, uHeight = 18 + 17 * 128;      PBITMAPINFO pbmi = (PBITMAPINFO) LocalAlloc (LPTR, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2);     pbmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER);     pbmi->bmiHeader.biWidth = uWidth;     pbmi->bmiHeader.biHeight = uHeight;     pbmi->bmiHeader.biPlanes = 1;     pbmi->bmiHeader.biBitCount = 1;     pbmi->bmiHeader.biSizeImage = ((uWidth + 31) & ~31) / 8 * uHeight;     pbmi->bmiColors[0].rgbBlue = 0;     pbmi->bmiColors[0].rgbGreen = 0;     pbmi->bmiColors[0].rgbRed = 0;     pbmi->bmiColors[1].rgbBlue = 255;     pbmi->bmiColors[1].rgbGreen = 255;     pbmi->bmiColors[1].rgbRed = 255;      HDC hDC = CreateCompatibleDC (0);     void * pvBits;     HBITMAP hBitmap = CreateDIBSection (hDC, pbmi, 0, &pvBits, NULL, 0);     SelectObject (hDC, hBitmap);     HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体"); //  HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, SHIFTJIS_CHARSET, 0, 0, 0, 0, "宋体");     SelectObject (hDC, hFont);     BitBlt (hDC, 0, 0, uWidth, uHeight, NULL, 0, 0, WHITENESS);      char c[4];     int i, j;     for (i = 128; i < 256; i++) {         sprintf (c, "%02X", i);         TextOut (hDC, 1, (i - 127) * 17 + 1, c, 2);     }     for (j = 0; j < 256; j++) {         sprintf (c, "%02X", j);         TextOut (hDC, (j + 1)* 17 + 1, 1, c, 2);     }     for (i = 128; i < 256; i++) {         for (j = 0; j < 256; j++) {             c[0] = (char) i;             c[1] = (char) j;             TextOut (hDC, (j + 1) * 17 + 1, (i - 127) * 17 + 1, c, 2);         }     }     for (i = 0; i < 130; i++) {         MoveToEx (hDC, 0, i * 17, NULL);         LineTo (hDC, uWidth, i * 17);     }     for (j = 0; j < 258; j++) {         MoveToEx (hDC, j * 17, 0, NULL);         LineTo (hDC, j * 17, uHeight);     }      BITMAPFILEHEADER bmfh;     bmfh.bfType = *(PWORD) "BM";     bmfh.bfReserved1 = 0;     bmfh.bfReserved2 = 0;     bmfh.bfOffBits = sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2;     bmfh.bfSize = bmfh.bfOffBits + pbmi->bmiHeader.biSizeImage;      HANDLE hFile = CreateFile ("goal.bmp", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);     if (hFile != INVALID_HANDLE_VALUE) {         DWORD dwWritten;         WriteFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER), &dwWritten, NULL);         WriteFile (hFile, pbmi, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2, &dwWritten, NULL);         WriteFile (hFile, pvBits, pbmi->bmiHeader.biSizeImage, &dwWritten, NULL);          CloseHandle (hFile);     }      DeleteObject (hFont);     DeleteObject (hBitmap);     DeleteDC (hDC);     LocalFree (pbmi);      return 0; }


Question: 新手小问题  书上的的问题没答案！还带想不出来的！只能求助大家了！

循环密码吧 小写字母 c = ( c - ‘a'  + 4) %26 + 'a';  大写字母 c = ( c - ‘A'  + 4) %26 + 'A';

引用 楼主 u014497083 的回复:将“China”译成密码。 加密规则是：用原来的字母后面的第四个字母代替原来的字母 （提示：设5个字符型变量，存放5个字符，经运行使各 ASCII 码增4，在输出）  z后面第四个字母是什么？

引用 1 楼 zhao4zhong1 的回复:char s[]="China"; char d[6]; int i; for (i=0;i<5;i++) d[i]=s[i]+4; d[5]=0; printf("%s\n",d); ++

++  引用 1 楼 zhao4zhong1 的回复:char s[]="China"; char d[6]; int i; for (i=0;i<5;i++) d[i]=s[i]+4; d[5]=0; printf("%s\n",d);


Question: 在Linux环境下怎么用C播放音乐

参考http://blog.sina.com.cn/s/blog_75df0af40100pgrs.html  引用 楼主 letingoo 的回复:在做一个实验的时候想加入背景音乐，求助怎么用C放音乐

用gstreamer也行


Question: c99下for 打印不出来？

引用 2 楼 caozhy 的回复:pow是浮点运算，有累进误差，不要用等号比较，不然可能出现问题。  你应该用两数相减取绝对值小于一个很小的数的办法来比较相等。   牛X，按你说的一试就行了，大神。膜拜！！！

LZ的环境，原始的提示信息。

你这种问题闲的蛋疼， 自己给自己挖坑， 有意思吗？


Question: 求大神指导，c语言写递归下降构造器

LEX+YACC FLEX+BISON


Question: 求大神指导，c语言写递归下降构造器

可以非常容易地将tail recursion式的递归改造成非递归式；一般来说，大部份的递归函数不太容易转换成非递归表达。 递归与非递归的矛与盾：pros and cons  这个课题很好！

写具体的，我看不懂啊

LEX+YACC FLEX+BISON


Question: 字符串长度疑问：strlen和sizeof 问题，求高手解答

数组还包含了/0的

strlen 得到字符个数 不包括'\0' sizeof是变量内存大小

LZ小白

引用 16 楼 mymtom 的回复:画个图比较清楚嘛  char *str="ac23";                      --------------------- 0x01234567   |-----> |0x61|0x63|0x32|0x33|              |       ---------------------              |       |0x00|..............|              |       ---------------------              |       ...              |       str              |       --------------------- 0xnnnnnnnn   --------|0x01|0x23|0x45|0x67|                       ---------------------    char str[]="ac23";                       str                      --------------------- 0xnnnnnnnn           |0x61|0x63|0x32|0x33|                       ---------------------                      |0x00|..............|                      ---------------------                      ...  求教此图？

引用 16 楼 mymtom 的回复:画个图比较清楚嘛  char *str="ac23";                      --------------------- 0x01234567   |-----> |0x61|0x63|0x32|0x33|              |       ---------------------              |       |0x00|..............|              |       ---------------------              |       ...              |       str              |       --------------------- 0xnnnnnnnn   --------|0x01|0x23|0x45|0x67|                       ---------------------    char str[]="ac23";                       str                      --------------------- 0xnnnnnnnn           |0x61|0x63|0x32|0x33|                       ---------------------                      |0x00|..............|                      ---------------------                      ...  这个完美

char  *p = "1234"; char q[] = "1234"; strlen(p) = 4;//遇'\0'结束 sizeof(p) = 4;//计算指针的大小  strlen(q) = 4;//遇'\0'结束 sizeof(q) = 5;//计算数组的大小，占5字节，包括'\0'

说strlen 遇到'\0'就结束的都是

strlen 是对‘\0’结尾的字符串求长度 sizeof 是对对象或者类型求大小

引用 13 楼 linux_hsylar 的回复:[quote=引用 楼主 onion2007 的回复:] 代码1： char *str="ac23";   //首先 str是个字符指针，它指向的是代码区中字符常量“ac23”，它在程序中在栈中占用4个字节（在32位系统中是4个字节，64位系统中是8个字节）； printf("strlen = %i\nsizeof = %i\n",strlen(str),sizeof(str));  //用strlen（str)获取的是str指向的字符串的有效个数是4，但是“ac23”里面的字符个数是5，末尾有个'\0'(每个字符串都有）；                                                                                //用sizeofstr)编译器会把理解为获取str这个指针变量的大小（当然上面已经说了，在32位系统中是4个字节，64位系统中是8个字节）；  结果：strlen =4             sizeof =4  代码2： char str[]="ac23";   //这个是数组，数组比较特殊，编译器处理方式ac23传入到a（它是数组的首地址）指向的堆空间（5个char字符，包括最后一个'\0'); printf("strlen = %i\nsizeof = %i\n",strlen(str),sizeof(str));//strlen没有区别，但是sizeof（数组名）获取的是数组的大小，是5个char类型； 结果：strlen =4             sizeof =5  为啥不一样？ 数组如果当形参的话，你在函数内部使用sizeof（数组名）获取的是数组名的大小（32位系统下为4,64位系统下是8）；[/quote]  引用 13 楼 linux_hsylar 的回复:[quote=引用 楼主 onion2007 的回复:] 代码1： char *str="ac23";   //首先 str是个字符指针，它指向的是代码区中字符常量“ac23”，它在程序中在栈中占用4个字节（在32位系统中是4个字节，64位系统中是8个字节）； printf("strlen = %i\nsizeof = %i\n",strlen(str),sizeof(str));  //用strlen（str)获取的是str指向的字符串的有效个数是4，但是“ac23”里面的字符个数是5，末尾有个'\0'(每个字符串都有）；                                                                                //用sizeofstr)编译器会把理解为获取str这个指针变量的大小（当然上面已经说了，在32位系统中是4个字节，64位系统中是8个字节）；  结果：strlen =4             sizeof =4  代码2： char str[]="ac23";   //这个是数组，数组比较特殊，编译器处理方式ac23传入到a（它是数组的首地址）指向的堆空间（5个char字符，包括最后一个'\0'); printf("strlen = %i\nsizeof = %i\n",strlen(str),sizeof(str));//strlen没有区别，但是sizeof（数组名）获取的是数组的大小，是5个char类型； 结果：strlen =4             sizeof =5  为啥不一样？ 数组如果当形参的话，你在函数内部使用sizeof（数组名）获取的是数组名的大小（32位系统下为4,64位系统下是8）；[/quote]  完美补充~~

引用 楼主 onion2007 的回复:代码1： char *str="ac23";   //首先 str是个字符指针，它指向的是代码区中字符常量“ac23”，它在程序中在栈中占用4个字节（在32位系统中是4个字节，64位系统中是8个字节）； printf("strlen = %i\nsizeof = %i\n",strlen(str),sizeof(str));  //用strlen（str)获取的是str指向的字符串的有效个数是4，但是“ac23”里面的字符个数是5，末尾有个'\0'(每个字符串都有）；                                                                                //用sizeofstr)编译器会把理解为获取str这个指针变量的大小（当然上面已经说了，在32位系统中是4个字节，64位系统中是8个字节）；  结果：strlen =4             sizeof =4  代码2： char str[]="ac23";   //这个是数组，数组比较特殊，编译器处理方式ac23传入到a（它是数组的首地址）指向的堆空间（5个char字符，包括最后一个'\0'); printf("strlen = %i\nsizeof = %i\n",strlen(str),sizeof(str));//strlen没有区别，但是sizeof（数组名）获取的是数组的大小，是5个char类型； 结果：strlen =4             sizeof =5  为啥不一样？ 数组如果当形参的话，你在函数内部使用sizeof（数组名）获取的是数组名的大小（32位系统下为4,64位系统下是8）；

引用 3 楼 zhao4zhong1 的回复:谁说sizeof可以求字符串长度来着？出来受死！

3Q！ 我明白了！  引用 8 楼 starytx 的回复:strlen函数是计算字符个数（遇到结束符'\0'结束）。 sizeof操作符中不同的东西，返回的数值不同。如果里边是一个指针，那就是计算指针的大小，32位系统一般都是4.如果是一个数组名，就是计算数组占得内存空间。你的例子中那个数组有4个字符(一个字符占1个字节，sizeof(char)=1)+隐含的结束符'\0'=5

谢谢你！ strlen遇到‘\0’结束，所以它是统计\0’之前字符个数； 而sizeof是变量占内存大小，指针变量占内存就是4，而数组则是受数组元素个数影响！ 3Q! 引用 1 楼 xihu1364 的回复:strlen遇到‘\0’结束 sizeof是变量内存大小   如你举例： 代码1：  char *str="ac23";   printf("strlen = %i\nsizeof = %i\n",strlen(str),sizeof(str));  //这里的strlen是“ac23”字符的长度，其实这个字符串是包含‘\0’的                                                 //而sizeof是计算str这个指针的大小   指针大小就是4 结果：strlen =4             sizeof =4    代码2：  char str[]="ac23"; printf("strlen = %i\nsizeof = %i\n",strlen(str),sizeof(str));//这里的sizeof是计算数组的大小  数组大小就是5  因为该数组的成员           //包含 str[0] = 'a', str[1] = 'c', str[2] = '2', str[3] = '3', str[4] = '\0' 所以是5个 //你可以在试试 str[] = "abcd123"长一点的字符串试试  结果：strlen =4             sizeof =5

其实这个问题可以自行百度的

strlen是计算字符有效输入长度，如果定义cahr a[10]={'1','2','3','4','5'}，用strlen(a)后是返回5的。 sizeof是变量内存大小

strlen是字符串长度，或者说字符数组中，字符'\0'所在的下标。 sizeof是对象所占的内存大小。注意：指针的大小是指针本身的大小，而不是，指针指向内容的大小。

sizeof一个指针永远是4 sizeof一个数组是数组长度


Question: Debug Error

判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #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; }

越界了，注意点

引用 12 楼 mujiok2003 的回复:[quote=引用 8 楼 easypal 的回复:] 我刚刚在linux下编译通过, 也能正常运行.  这或许是microsoft的BUG. 有趣  越界访问，行为未定义。[/quote]  好专业

引用 8 楼 easypal 的回复:我刚刚在linux下编译通过, 也能正常运行.  这或许是microsoft的BUG. 有趣  越界访问，行为未定义。

pp = (char **)malloc(10);   --->      pp = (char **)malloc(10 * sizeof(char*));

引用 7 楼 user-4 的回复:[quote=引用 4 楼 easypal 的回复:] [quote=引用 3 楼 user-4 的回复:] while (*p && *p != ' ') p++;  兄弟, 我的代码是在 free(pp) 报错的[/quote]  看错了,是pp[c] = 0;此时c=2 pp2 = pp2 + 4*3; 因此越界了[/quote]   引用 7 楼 user-4 的回复:[quote=引用 4 楼 easypal 的回复:] [quote=引用 3 楼 user-4 的回复:] while (*p && *p != ' ') p++;  兄弟, 我的代码是在 free(pp) 报错的[/quote]  看错了,是pp[c] = 0;此时c=2 pp2 = pp2 + 4*3; 因此越界了[/quote]  哦. 你说的对.

在vs2012里, 只要malloc的大小大于 strlen(w) 就不会报.

引用 4 楼 easypal 的回复:[quote=引用 3 楼 user-4 的回复:] while (*p && *p != ' ') p++;  兄弟, 我的代码是在 free(pp) 报错的[/quote]  看错了,是pp[c] = 0;此时c=2 pp2 = pp2 + 4*3; 因此越界了

引用 5 楼 user-4 的回复:[quote=引用 4 楼 easypal 的回复:] [quote=引用 3 楼 user-4 的回复:] while (*p && *p != ' ') p++;  兄弟, 我的代码是在 free(pp) 报错的[/quote]   你呆吗?上面的循环终止条件不对,c的增长是不可预计的[/quote]   你确定? 你仔细看看.  我调试了下, pp 在malloc后和free前的值都没变.

引用 4 楼 easypal 的回复:[quote=引用 3 楼 user-4 的回复:] while (*p && *p != ' ') p++;  兄弟, 我的代码是在 free(pp) 报错的[/quote]   你呆吗?上面的循环终止条件不对,c的增长是不可预计的

引用 3 楼 user-4 的回复:while (*p && *p != ' ') p++;  兄弟, 我的代码是在 free(pp) 报错的

while (*p && *p != ' ') p++;

引用 1 楼 user-4 的回复:兄弟,越界了  c <= 2. 怎么会越界?

兄弟,越界了


引用 10 楼 wx7864566 的回复:[quote=引用 9 楼 skyliuxu 的回复:] [quote=引用 7 楼 wx7864566 的回复:] [quote=引用 6 楼 skyliuxu 的回复:] [quote=引用 5 楼 wx7864566 的回复:] 你自己写个函数,穿个开关不就行了 我就是想知道背后的原因[/quote]  原因告诉你了 ,结贴吧[/quote] 问题没解决啊[/quote] 你这样使用本来就是错的,怎么解决[/quote] 好吧，受教了，谢谢你的热心解答哈

引用 9 楼 skyliuxu 的回复:[quote=引用 7 楼 wx7864566 的回复:] [quote=引用 6 楼 skyliuxu 的回复:] [quote=引用 5 楼 wx7864566 的回复:] 你自己写个函数,穿个开关不就行了 我就是想知道背后的原因[/quote]  原因告诉你了 ,结贴吧[/quote] 问题没解决啊[/quote] 你这样使用本来就是错的,怎么解决

引用 7 楼 wx7864566 的回复:[quote=引用 6 楼 skyliuxu 的回复:] [quote=引用 5 楼 wx7864566 的回复:] 你自己写个函数,穿个开关不就行了 我就是想知道背后的原因[/quote]  原因告诉你了 ,结贴吧[/quote] 问题没解决啊

编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E

引用 6 楼 skyliuxu 的回复:[quote=引用 5 楼 wx7864566 的回复:] 你自己写个函数,穿个开关不就行了 我就是想知道背后的原因[/quote]  原因告诉你了 ,结贴吧

引用 5 楼 wx7864566 的回复:你自己写个函数,穿个开关不就行了 我就是想知道背后的原因

你自己写个函数,穿个开关不就行了

引用 3 楼 wx7864566 的回复:#include 不要写在函数体内 NDEBUG不就是用来控制assert是否有效的么？不这样的话，我怎么让最后三个assert生效呢？ 另外，按照这里的错误提示，__cplusplus是生效的，但我明确是.c文件了啊？

#include 不要写在函数体内

引用 1 楼 wx7864566 的回复:以下是assert.h的内容  /*** *assert.h - define the assert macro * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       Defines the assert(exp) macro. *       [ANSI/System V] * *       [Public] * ****/  #include <crtdefs.h>  #undef  assert  #ifdef  NDEBUG  #define assert(_Expression)     ((void)0)  #else  #ifdef  __cplusplus extern "C" { #endif  _CRTIMP void __cdecl _wassert(_In_z_ const wchar_t * _Message, _In_z_ const wchar_t *_File, _In_ unsigned _Line);  #ifdef  __cplusplus } #endif  #define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )  #endif  /* NDEBUG */    #undef NDEBUG //取消定义  #include <assert.h> //assert定义  int main(void)  {          int a = 0;           assert(1);          assert(a == 0);          assert(a != 1);  #define NDEBUG  #include <assert.h>          assert(a == 0);          assert(a != 1);  #undef NDEBUG   //取消定义  #include <assert.h> //定义          assert(a == 0);          assert(a != 1);          assert(0);          return 0;  }   在最后一次包含assert.h的时候由于取消定义了NDEBUG,所辖下面的预处理操作被包含在main函数体中,这是错误的.  #undef  assert  #ifdef  NDEBUG  #define assert(_Expression)     ((void)0)  #else  #ifdef  __cplusplus extern "C" {                     //在main函数中extern "C" 语法错误. #endif 那怎么解决呢？是编译器设置的问题？


Question: 寻找众数的程序修正

大概这么做就可以了 1）计数--可以像计数排序那样计数（知道范围整形），也可以先排序后计数（任何类型数据） 2）求最大计数。 2）求有几个并列的最大计数。

[quote=引用 1 楼 turingo 的回复:] 类似于这样：  count = 0; ... for() {     if(array[i] == number) count++; } ... if(count == 0) return 0; if(count == 1) return 1; return -1;  我不大明白，count 用于记各个数字出现的次数且到下一个新数字是就被重设为1； 这个判断的意义在哪呢？

类似于这样：  count = 0; ... for() {     if(array[i] == number) count++; } ... if(count == 0) return 0; if(count == 1) return 1; return -1;  引用 楼主 keroooo 的回复:int number = array[0]; int mode = number; int count = 1; int countMode = 1;  for (int i=1; i<size; i++) {       if (array[i] == number)        { // count occurrences of the current number          countMode++;       }       else       { // now this is a different number             if (count > countMode)              {                   countMode = count; // mode is the biggest ocurrences                   mode = number;             }            count = 1; // reset count for the new number            number = array[i];   } }  这是关于寻找众数的一个小片段，但是只能处理存在一个众数的情况，若是众数不止一个，需要返回 -1，求修正


Question: 求幂取模+ceil()

原题链接：http://acm.nyist.net/JudgeOnline/problem.php?pid=723


Question: 新人！自学中！高手勿喷！谢谢！

对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和 寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时 候。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

记住回车也是字符

应该系统把“enter”作为字符输入进去了，先输“123”回车再输“4567”回车，那么6个字符初始化的值应该是c1=1;c2=2;c3=3;c4="enter"（就是“\n”）;c5=4;c6=5;这样在输出的时候就是“1245”了，不过如果第一行输入的数字是5个的话，就是“c6=“enter””了，然后其他的都一样。你可以把所有的都输出一遍。这样方便理解。

不知道对你的问题理解是否正确哈 在你输入按回车的时候要考虑到回车也是字符的问题  但是由于回车在输出的时候看不到 所以往往会误导你    由于getchar的返回值其实是一个int类型  所以你可以定义俩个int类型的变量 接收getchar的返回值，或者直接把c5，c6改成int类型 然后把这俩个变量输出  这样便于你观察

谢谢了！  都说我是新手了！刚学一周！希望 大神不要介意！

建议LZ单步调试，查看输入后各变量的值， getchar()会接受一个字符，包括你按下的Enter键， 要弄清楚一点，查一查“回车、换行”，这个很多人都弄不明白

楼主的这几个帖子，还是输入输出的问题，建议还是好好看看书吧


Question: 字符串逆序函数，运行段错误，求解释！

末尾最好释放ch,虽然程序结束就自动回收了。但这是个好习惯。

#include <stdio.h> #include <string.h> #include <malloc.h>  #define BUFSIZE 100 char* reverse(char *str) {     int n = strlen(str);     char *temp = (char *) malloc(sizeof(str));     char *ch = temp;      while (*str) { 	str++;     }     str--;      while (n--) {         *(temp++) = *(str--);     }      return ch;  }  int main(int argc, char **argv) {     char str[BUFSIZE];      char *ch = NULL;     printf("enter:\n");     scanf("%s", &str);     /*      int n = strlen(str);      *      char temp;      *      int  i = 0;      *      *      for(i=0; i<n/2; i++){      *      temp = str[n-1-i];      *      str[n-1-i] = str[i];      *      str[i] = temp;      *      }      *      printf("%s\n",str);     */     ch = reverse(str);     printf("%s\n", ch);      return 0; }

修改后如下，第一申请动态内存就要释放。第二字符串要一'\0'结束，第三你str是个野指针，要先指向字符数组  #include <stdio.h> #include <string.h> #include <malloc.h>  char *reverse(char *str) { int n = strlen(str); char *temp = (char *)malloc(strlen(str)+1); char *ch = temp;  while(*str){ str++; } str--;  while(n--){  *temp++ = *str--; } *temp='\0'; return ch;  }  int main(int argc, char **argv) { char *str; char str1[50]; str=str1;  char *ch = NULL; printf("enter:\n"); scanf("%s",str); ch = reverse(str); printf("%s\n",ch); free(ch);  return 0; }

char *temp = (char *)malloc(sizeof(str)); 改为 char *temp = (char *)malloc(n+1); temp[n] = 0;

C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\STRREV.C /*** *strrev.c - reverse a string in place * *       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved. * *Purpose: *       defines _strrev() - reverse a string in place (not including *       '\0' character) * *******************************************************************************/  #include <cruntime.h> #include <string.h>  /*** *char *_strrev(string) - reverse a string in place * *Purpose: *       Reverses the order of characters in the string.  The terminating *       null character remains in place. * *Entry: *       char *string - string to reverse * *Exit: *       returns string - now with reversed characters * *Exceptions: * *******************************************************************************/  char * __cdecl _strrev (         char * string         ) {         char *start = string;         char *left = string;         char ch;          while (*string++)                 /* find end of string */                 ;         string -= 2;          while (left < string)         {                 ch = *left;                 *left++ = *string;                 *string-- = ch;         }          return(start); }   C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\WCSREV.C /*** *wcsrev.c - reverse a wide-character string in place * *       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved. * *Purpose: *       defines _wcsrev() - reverse a wchar_t string in place (not including *       L'\0' character) * *******************************************************************************/   #include <cruntime.h> #include <string.h>  /*** *wchar_t *_wcsrev(string) - reverse a wide-character string in place * *Purpose: *       Reverses the order of characters in the string.  The terminating *       null character remains in place (wide-characters). * *Entry: *       wchar_t *string - string to reverse * *Exit: *       returns string - now with reversed characters * *Exceptions: * *******************************************************************************/  wchar_t * __cdecl _wcsrev (         wchar_t * string         ) {         wchar_t *start = string;         wchar_t *left = string;         wchar_t ch;          while (*string++)                 /* find end of string */                 ;         string -= 2;          while (left < string)         {                 ch = *left;                 *left++ = *string;                 *string-- = ch;         }          return(start); }    C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\MBSREV.C /*** *mbsrev.c - Reverse a string in place (MBCS) * *       Copyright (c) 1985-1997, Microsoft Corporation.  All rights reserved. * *Purpose: *       Reverse a string in place (MBCS) * *******************************************************************************/  #ifdef _MBCS  #include <mtdll.h> #include <cruntime.h> #include <string.h> #include <mbdata.h> #include <mbctype.h> #include <mbstring.h>   /*** * _mbsrev - Reverse a string in place (MBCS) * *Purpose: *       Reverses the order of characters in the string.  The terminating *       null character remains in place.  The order of MBCS characters *       is not changed. * *Entry: *       unsigned char *string = string to reverse * *Exit: *       returns string - now with reversed characters * *Exceptions: * *******************************************************************************/  unsigned char * __cdecl _mbsrev(         unsigned char *string         ) {          unsigned char *start = string;         unsigned char *left  = string;         unsigned char c;          if ( _ISNOTMBCP )                 return _strrev(string);          _mlock(_MB_CP_LOCK);          /* first go through and reverse the bytes in MBCS chars */         while ( *string ) {                  if ( _ISLEADBYTE(*string++) ) {                         if ( *string ) {                                 c = *string;                                 *string = *(string - 1);                                 *(string - 1) = c;                                 string++;                         }                         else /* second byte is EOS */                                 break;                 }         }          /* now reverse the whole string */         string--;         while ( left < string ) {                 c = *left;                 *left++ = *string;                 *string-- = c;         }          _munlock(_MB_CP_LOCK);         return ( start ); }  #endif  /* _MBCS */

一个简单的问题，用指针指来指去，很容易弄错额， 指针这玩意就是一把双刃剑， # include <stdio.h> # include <string.h>  void reverse(char *Dest, const char *Source);  int main() { 	char s1[20], s2[20];  	printf("input:"); 	scanf("%s", s1); 	 	reverse(s2, s1); 	printf("reverse:%s\n", s2);  	return 0; }  void reverse(char *Dest, const char *Source) { 	int i, n; 	if (Dest != NULL && Source != NULL) 	{ 		n = strlen(Source); 		Dest[n] = '\0';  		for (i = 0; i < n; i++) 			Dest[i] = Source[n - i - 1];  	} }


Question: 汇编语言数组过程排序问题，求大神解答

引用 13 楼 fetag 的回复:[quote=引用 12 楼 zhao4zhong1 的回复:] [quote=引用 10 楼 bbs2241 的回复:] 膜拜个毛毛，写的一坨一坨的 重点在6楼。[/quote] 重点个毛啊，大大的一坨翔~~ 都尼玛什么年代了，寄存器都是  rax 了，你个二货还在那 ax 呢~~[/quote] 你以为管理你银行账号的代码也早就从AX升级到了rax了吗？但我猜恰恰相反。

引用 10 楼 bbs2241 的回复:膜拜个毛毛，写的一坨一坨的 重点在6楼。

引用 12 楼 zhao4zhong1 的回复:[quote=引用 10 楼 bbs2241 的回复:] 膜拜个毛毛，写的一坨一坨的 重点在6楼。[/quote] 重点个毛啊，大大的一坨翔~~ 都尼玛什么年代了，寄存器都是  rax 了，你个二货还在那 ax 呢~~

引用 3 楼 zhao4zhong1 的回复:[quote=引用 1 楼 fetag 的回复:] 那个整天吹汇编的赵教主呢？这时候咋装死了呢~~ 仅供膜拜： void ReadPointN(addr,fp,n,mode)     DWORD addr;     FILE *fp;     WORD n,mode; {     WORD nb1;     BYTE addrh;      if (mode==1) {         fread((BYTE *)addr,1,n,fp);     } else {         asm {             PUSH    ES             PUSH    DI             PUSH    CX             PUSH    AX             PUSH    BX             LES DI,addr             MOV CX,ES             MOV BX,DI       //CX:BX=addr             MOV addrh,CL             MOV AX,n             DEC AX             ADD AX,BX             JNC RPN1        //<64K?              MOV AX,BX             NEG AX             MOV nb1,AX      //bytes number to 64K             JMP RPN2         }         RPN1:         asm {             POP BX             POP AX             POP CX             POP DI             POP ES         }         ((BYTE *)(&addr))[2]=0x00;         if (addrh!=oldaddrh) {             asm {                 XOR BX,BX                 MOV DL,addrh                 MOV AL,incpage                 MUL DL                 MOV DX,AX                 MOV AX,0x4F05                 INT 0x10             }             oldaddrh=addrh;         }         fread((BYTE *)addr,1,n,fp);         asm {             JMP RPN9         }          RPN2:         asm {             POP BX             POP AX             POP CX             POP DI             POP ES         }         ((BYTE *)(&addr))[2]=0x00;         if (addrh!=oldaddrh) {             asm {                 XOR BX,BX                 MOV DL,addrh                 MOV AL,incpage                 MUL DL                 MOV DX,AX                 MOV AX,0x4F05                 INT 0x10             }         }         fread((BYTE *)addr,1,nb1,fp);         addr+=nb1;         ((BYTE *)(&addr))[2]=0x00;         asm {             XOR BX,BX             MOV DL,addrh             INC DL             MOV AL,incpage             MUL DL             MOV DX,AX             MOV AX,0x4F05             INT 0x10         }         oldaddrh=addrh+1;         fread((BYTE *)addr,1,n-nb1,fp);          RPN9:     } } //------------------------------------------------------- void SetPointNW(addr,cw,n,mode)     DWORD addr;     WORD cw,n,mode; {     WORD nb1;      if (mode==1) {         asm {             PUSH    ES             PUSH    DI             PUSH    CX             PUSH    AX             LES DI,addr             MOV CX,n             MOV AX,cw             REP STOSW             POP AX             POP CX             POP DI             POP ES         }     } else {         asm {             PUSH    ES             PUSH    DI             PUSH    CX             PUSH    AX             PUSH    BX             PUSH    DX             LES DI,addr             MOV CX,ES             MOV BX,DI       //CX:BX=addr             MOV AX,0xA000             MOV ES,AX             MOV AX,n             SHL AX,1             DEC AX             ADD AX,BX             JC  SPNWZ       //<64K?             JMP SPNW1         }         SPNWZ:         asm {             MOV AX,BX             NEG AX             MOV nb1,AX      //bytes number to 64K             PUSH    CX              CMP CL,oldaddrh             JE  SPNW3              PUSH    BX             XOR BX,BX             MOV DL,CL             MOV AL,incpage             MUL DL             MOV DX,AX             MOV AX,0x4F05             INT 0x10             POP BX         }         SPNW3:         asm {             MOV DI,BX             MOV AX,nb1             TEST    AX,1             JZ  SPNW2       //(nb1 % 2)==0?              SHR AX,1             MOV CX,AX             MOV AX,cw             REP STOSW             STOSB             POP CX          //DI==0             INC CL              MOV oldaddrh,CL             XOR BX,BX             MOV DL,CL             MOV AL,incpage             MUL DL             MOV DX,AX             MOV AX,0x4F05             INT 0x10              MOV AX,n             SHL AX,1             SUB AX,nb1             SHR AX,1             MOV CX,AX             MOV AX,cw             XCHG    AH,AL             REP STOSW             STOSB             JMP SPNW9         }         SPNW2:         asm {             SHR AX,1             MOV CX,AX             MOV AX,cw             REP STOSW             POP CX          //DI==0             INC CL              MOV oldaddrh,CL             XOR BX,BX             MOV DL,CL             MOV AL,incpage             MUL DL             MOV DX,AX             MOV AX,0x4F05             INT 0x10              MOV AX,n             SHL AX,1             SUB AX,nb1             SHR AX,1             MOV CX,AX             MOV AX,cw             REP STOSW             JMP SPNW9         }         SPNW1:         asm {             CMP CL,oldaddrh             JE  SPNW4              MOV oldaddrh,CL             PUSH    BX             XOR BX,BX             MOV DL,CL             MOV AL,incpage             MUL DL             MOV DX,AX             MOV AX,0x4F05             INT 0x10             POP BX         }         SPNW4:         asm {             MOV DI,BX             MOV CX,n             MOV AX,cw             REP STOSW         }         SPNW9:         asm {             POP DX             POP BX             POP AX             POP CX             POP DI             POP ES         }     } } //------------------------------------------------------- void SetPointN(addr,c,n,mode)     DWORD addr;     WORD c,n,mode; {     WORD nb1;      if (mode==1) {         asm {             PUSH    ES             PUSH    DI             PUSH    CX             PUSH    AX             LES DI,addr             MOV CX,n             MOV AX,c             REP STOSB             POP AX             POP CX             POP DI             POP ES         }     } else {         asm {             PUSH    ES             PUSH    DI             PUSH    CX             PUSH    AX             PUSH    BX             PUSH    DX             LES DI,addr             MOV CX,ES             MOV BX,DI       //CX:BX=addr             MOV AX,0xA000             MOV ES,AX             MOV AX,n             DEC AX             ADD AX,BX             JNC SPN1        //<64K?              MOV AX,BX             NEG AX             MOV nb1,AX      //bytes number to 64K             PUSH    CX              CMP CL,oldaddrh             JE  SPN3              PUSH    BX             XOR BX,BX             MOV DL,CL             MOV AL,incpage             MUL DL             MOV DX,AX             MOV AX,0x4F05             INT 0x10             POP BX         }         SPN3:         asm {             MOV DI,BX             MOV CX,nb1             MOV AX,c             REP STOSB             POP CX          //DI==0             INC CL              MOV oldaddrh,CL             PUSH    BX             XOR BX,BX             MOV DL,CL             MOV AL,incpage             MUL DL             MOV DX,AX             MOV AX,0x4F05             INT 0x10             POP BX              MOV AX,n             SUB AX,nb1             MOV CX,AX             MOV AX,c             REP STOSB             JMP SPN9         }         SPN1:         asm {             CMP CL,oldaddrh             JE  SPN4              MOV oldaddrh,CL             PUSH    BX             XOR BX,BX             MOV DL,CL             MOV AL,incpage             MUL DL             MOV DX,AX             MOV AX,0x4F05             INT 0x10             POP BX         }         SPN4:         asm {             MOV DI,BX             MOV CX,n             MOV AX,c             REP STOSB         }         SPN9:         asm {             POP DX             POP BX             POP AX             POP CX             POP DI             POP ES         }     } } //------------------------------------------------------- void SetPoint(addr,c,mode)     DWORD addr;     WORD c,mode; {     BYTE addrh;      if (mode==1) {         *((BYTE *)addr)=c;     } else {         addrh=((BYTE *)(&addr))[2];         if (addrh!=oldaddrh) {             asm {                 XOR BX,BX                 MOV DL,addrh                 MOV AL,incpage                 MUL DL                 MOV DX,AX                 MOV AX,0x4F05                 INT 0x10             }             oldaddrh=addrh;         }         ((BYTE *)(&addr))[2]=0x00;         *((BYTE *)addr)=c;     } } [/quote]  跟我问的问题有毛线关系？膜拜个毛毛

xchg eax,ecx                     ;swap                    ; mov  edx,[ebx]                    ; mov [ebx],[ebx+4]                     ;mov [ebx+4],edx 1、 xchg之后， 没有将寄存器值回写。 2、 指针不对，那是因为写时越界了，楼主单步跟吧。  3、 如下代码越界啦。    cmp ecx,10             jg  endFirstWhile   ;大于10则结束

4楼代码完成于 90-04-27 12:09:40

我的天。。。。。。好长一段。。。

再供膜拜CODE   SEGMENT     'CODE'        ASSUME     CS:CODE, DS:CODE, ES:CODE, SS:CODE EndFlag    DB      0 Int9Enter  PROC   FAR     STI     PUSH    BP     PUSH    AX     PUSH    BX     PUSH    CX     PUSH    DX     PUSH    SI     PUSH    DI     PUSH    DS     PUSH    ES     PUSH    CS     POP ES     CLD         MOV AX, 0F000h         MOV DS, AX         MOV SI, 0FFFEH         CMP BYTE PTR [SI], 0FCH ;PC/AT?     PUSH    CS     POP DS         JNZ $PCXT1         MOV CS:BYTE PTR PCAT,  01         MOV AL, 0ADH                       ;Select 8042 for Scan-Code         CALL SetKey         CLI         XOR CX, CX     $J1:         IN  AL, 64H                       ;Test 8042 Ready?         LOOPNZ   $J1         IN  AL, 60H         ;Get  Scan-Code         STI         CMP AL, 0FEH         JZ  $J2             ;Jmp To Control Char         CMP AL, 0FAH         JNZ $J3 $J2:    JMP $Exit1 ;    $PCXT1:     IN  AL,60H      ;Get PC/XT Scan-Code     $J3:     ;D7=0  - Down    1  - Up     CMP AL,1    ;[ESC] KEY     JZ  $End     CALL    ShowCode     CALL    Music     JMP $Exit1 $End:   MOV BYTE PTR CS:EndFlag,-1 ;    $Exit1:     CALL    AllowKey     POP ES     POP DS     POP DI     POP SI     POP DX     POP CX     POP BX     POP AX     POP BP     CLI     IRET ; PCAT      DB    0       ;0 - PC/XT   1 - PC/AT HEX    DB '0123456789ABCDEF' Int9Enter ENDP ; ; SetKey  PROC    NEAR     PUSH    AX     CLI     SUB CX, CX   $SET:     IN  AL, 64H     TEST    AL, 02     LOOPNZ  $SET     POP AX     OUT 64H,    AL     STI     RET SetKey   ENDP ; ; AllowKey PROC   NEAR     CLI     MOV AL, 20H     OUT 20H,    AL     CMP CS:BYTE PTR PCAT,00     JZ  $PCXT2     MOV AL, 0AEH     CALL    SetKey     RET ;    $PCXT2:     IN  AL, 61H     MOV AH, AL     OR  AL, 80H     OUT 61H,    AL     XCHG    AH, AL     OUT 61H,    AL     RET AllowKey ENDP ; ShowCode    PROC     PUSH    AX     PUSH    AX     MOV CL,4     SHR AL,CL     XOR BH,BH     MOV BL,AL     MOV AL,CS:HEX[BX]     MOV AH,0EH     INT 10H     POP AX     AND AL,0FH     XOR BH,BH     MOV BL,AL     MOV AL,CS:HEX[BX]     MOV AH,0EH     INT 10H     MOV AX,0E08H     INT 10H     MOV AX,0E08H     INT 10H     POP AX     RET ShowCode    ENDP ; Music   PROC    NEAR     XOR AH,AH     CMP AL,_AL     JNE $NEW     JMP Loc_84 $NEW:   MOV _AL,AL     TEST    AL,80H     JNZ $Up     CALL    KeyPush     MOV BX,AX     MOV KeyDownTbl[BX],-1 ; $Down:  SHL AX,1     MOV BX,AX     MOV AX,OFFSET CS:ToneTbl     ADD BX,AX     MOV CX,OFFSET CS:ToneTbl     CMP BX,CX     JGE Loc_79 Loc_78:     MOV BX,TblLen-2     ADD BX,AX     JMP Loc_80 Loc_79:     MOV CX,TblLen-4     ADD CX,AX     CMP BX,CX     JG  Loc_78 Loc_80:     MOV AL,0B6H     OUT 43H,AL      ; port 43H, 8253 wrt timr mode     MOV AX,2870H     MOV DX,12H     DIV WORD PTR CS:[BX]     OUT 42H,AL      ; port 42H, 8253 timer 2 spkr     MOV AL,AH     OUT 42H,AL      ; port 42H, 8253 timer 2 spkr     IN  AL,61H      ; port 61H, 8255 port B, read     OR  AL,3     OUT 61H,AL      ; port 61H, 8255 B - spkr, etc     JMP Loc_84 ; $Up:    AND AL,7FH     MOV BX,AX     MOV KeyDownTbl[BX],0 Loc_81: CALL    KeyPop     CMP SI,OFFSET KeyStack-1     JE  $Off     MOV BX,AX     CMP KeyDownTbl[BX],0     JE  Loc_81     CALL    KeyPush     JMP $Down $Off:   INC KeySP     IN  AL,61H      ; port 61H, 8255 port B, read     AND AL,0FCH     OUT 61H,AL      ; port 61H, 8255 B - spkr, etc Loc_84:     MOV CX,8 LocLoop_85:     LOOP    LocLoop_85     RET ; ToneTbl DB  42H, 0, 45H, 0, 4AH, 0     DB  4EH, 0, 53H, 0, 57H, 0     DB  5DH, 0, 62H, 0, 68H, 0     DB  6EH, 0, 75H, 0, 7CH, 0     DB  83H, 0, 8BH, 0, 93H, 0     DB  9EH, 0, 0A5H, 0, 0AFH, 0     DB  0B9H, 0, 0C4H, 0, 0D0H, 0     DB  0DCH, 0, 0E9H, 0, 0F7H, 0     DB  6, 1, 16H, 1, 26H, 1     DB  38H, 1, 4AH, 1, 5EH, 1     DB  73H, 1, 88H, 1, 9FH, 1     DB  0B8H, 1, 0D2H, 1, 0EEH, 1     DB  0BH, 2, 2AH, 2, 4BH, 2     DB  6EH, 2, 93H, 2, 0BAH, 2     DB  0E4H, 2, 10H, 3, 3EH, 3     DB  70H, 3, 0A5H, 3, 0DCH, 3     DB  18H, 4, 56H, 4, 98H, 4     DB  0F0H, 4, 28H, 5, 76H, 5     DB  0CAH, 5, 22H, 6, 80H, 6     DB  0E3H, 6, 4BH, 7, 0BAH, 7 TblLen  EQU $-ToneTbl KeyDownTbl  DB  80H DUP(0) KeyStack    DB 100 DUP(?) KeySP   DW  KeyStack _AL DB  0 Music   ENDP ; KeyPush PROC     MOV SI,KeySP     MOV BYTE PTR [SI],AL     INC SI     MOV KeySP,SI     RET KeyPush ENDP KeyPop  PROC     MOV SI,KeySP     DEC SI     MOV AL,BYTE PTR [SI]     MOV KeySP,SI     RET KeyPop  ENDP ; ; START   PROC     PUSH    CS     POP DS     MOV AX,3509H     INT 21H     MOV AX,ES     MOV WORD PTR OldInt9+2,AX     MOV WORD PTR OldInt9,BX     MOV AX,2509H     MOV DX,OFFSET Int9Enter     INT 21H ; WaitINT9:     CMP BYTE PTR CS:EndFlag,0     NOP     JZ  WaitINT9 ; Quit:   MOV DX,WORD PTR OldInt9     MOV AX,WORD PTR OldInt9+2     MOV DS,AX     MOV AX,2509H     INT 21H     MOV AX,4C00H     INT 21H OldInt9 DD  ? START   ENDP ; CODE    ENDS     END START

引用 1 楼 fetag 的回复:那个整天吹汇编的赵教主呢？这时候咋装死了呢~~ 仅供膜拜： void ReadPointN(addr,fp,n,mode)     DWORD addr;     FILE *fp;     WORD n,mode; {     WORD nb1;     BYTE addrh;      if (mode==1) {         fread((BYTE *)addr,1,n,fp);     } else {         asm {             PUSH    ES             PUSH    DI             PUSH    CX             PUSH    AX             PUSH    BX             LES DI,addr             MOV CX,ES             MOV BX,DI       //CX:BX=addr             MOV addrh,CL             MOV AX,n             DEC AX             ADD AX,BX             JNC RPN1        //<64K?              MOV AX,BX             NEG AX             MOV nb1,AX      //bytes number to 64K             JMP RPN2         }         RPN1:         asm {             POP BX             POP AX             POP CX             POP DI             POP ES         }         ((BYTE *)(&addr))[2]=0x00;         if (addrh!=oldaddrh) {             asm {                 XOR BX,BX                 MOV DL,addrh                 MOV AL,incpage                 MUL DL                 MOV DX,AX                 MOV AX,0x4F05                 INT 0x10             }             oldaddrh=addrh;         }         fread((BYTE *)addr,1,n,fp);         asm {             JMP RPN9         }          RPN2:         asm {             POP BX             POP AX             POP CX             POP DI             POP ES         }         ((BYTE *)(&addr))[2]=0x00;         if (addrh!=oldaddrh) {             asm {                 XOR BX,BX                 MOV DL,addrh                 MOV AL,incpage                 MUL DL                 MOV DX,AX                 MOV AX,0x4F05                 INT 0x10             }         }         fread((BYTE *)addr,1,nb1,fp);         addr+=nb1;         ((BYTE *)(&addr))[2]=0x00;         asm {             XOR BX,BX             MOV DL,addrh             INC DL             MOV AL,incpage             MUL DL             MOV DX,AX             MOV AX,0x4F05             INT 0x10         }         oldaddrh=addrh+1;         fread((BYTE *)addr,1,n-nb1,fp);          RPN9:     } } //------------------------------------------------------- void SetPointNW(addr,cw,n,mode)     DWORD addr;     WORD cw,n,mode; {     WORD nb1;      if (mode==1) {         asm {             PUSH    ES             PUSH    DI             PUSH    CX             PUSH    AX             LES DI,addr             MOV CX,n             MOV AX,cw             REP STOSW             POP AX             POP CX             POP DI             POP ES         }     } else {         asm {             PUSH    ES             PUSH    DI             PUSH    CX             PUSH    AX             PUSH    BX             PUSH    DX             LES DI,addr             MOV CX,ES             MOV BX,DI       //CX:BX=addr             MOV AX,0xA000             MOV ES,AX             MOV AX,n             SHL AX,1             DEC AX             ADD AX,BX             JC  SPNWZ       //<64K?             JMP SPNW1         }         SPNWZ:         asm {             MOV AX,BX             NEG AX             MOV nb1,AX      //bytes number to 64K             PUSH    CX              CMP CL,oldaddrh             JE  SPNW3              PUSH    BX             XOR BX,BX             MOV DL,CL             MOV AL,incpage             MUL DL             MOV DX,AX             MOV AX,0x4F05             INT 0x10             POP BX         }         SPNW3:         asm {             MOV DI,BX             MOV AX,nb1             TEST    AX,1             JZ  SPNW2       //(nb1 % 2)==0?              SHR AX,1             MOV CX,AX             MOV AX,cw             REP STOSW             STOSB             POP CX          //DI==0             INC CL              MOV oldaddrh,CL             XOR BX,BX             MOV DL,CL             MOV AL,incpage             MUL DL             MOV DX,AX             MOV AX,0x4F05             INT 0x10              MOV AX,n             SHL AX,1             SUB AX,nb1             SHR AX,1             MOV CX,AX             MOV AX,cw             XCHG    AH,AL             REP STOSW             STOSB             JMP SPNW9         }         SPNW2:         asm {             SHR AX,1             MOV CX,AX             MOV AX,cw             REP STOSW             POP CX          //DI==0             INC CL              MOV oldaddrh,CL             XOR BX,BX             MOV DL,CL             MOV AL,incpage             MUL DL             MOV DX,AX             MOV AX,0x4F05             INT 0x10              MOV AX,n             SHL AX,1             SUB AX,nb1             SHR AX,1             MOV CX,AX             MOV AX,cw             REP STOSW             JMP SPNW9         }         SPNW1:         asm {             CMP CL,oldaddrh             JE  SPNW4              MOV oldaddrh,CL             PUSH    BX             XOR BX,BX             MOV DL,CL             MOV AL,incpage             MUL DL             MOV DX,AX             MOV AX,0x4F05             INT 0x10             POP BX         }         SPNW4:         asm {             MOV DI,BX             MOV CX,n             MOV AX,cw             REP STOSW         }         SPNW9:         asm {             POP DX             POP BX             POP AX             POP CX             POP DI             POP ES         }     } } //------------------------------------------------------- void SetPointN(addr,c,n,mode)     DWORD addr;     WORD c,n,mode; {     WORD nb1;      if (mode==1) {         asm {             PUSH    ES             PUSH    DI             PUSH    CX             PUSH    AX             LES DI,addr             MOV CX,n             MOV AX,c             REP STOSB             POP AX             POP CX             POP DI             POP ES         }     } else {         asm {             PUSH    ES             PUSH    DI             PUSH    CX             PUSH    AX             PUSH    BX             PUSH    DX             LES DI,addr             MOV CX,ES             MOV BX,DI       //CX:BX=addr             MOV AX,0xA000             MOV ES,AX             MOV AX,n             DEC AX             ADD AX,BX             JNC SPN1        //<64K?              MOV AX,BX             NEG AX             MOV nb1,AX      //bytes number to 64K             PUSH    CX              CMP CL,oldaddrh             JE  SPN3              PUSH    BX             XOR BX,BX             MOV DL,CL             MOV AL,incpage             MUL DL             MOV DX,AX             MOV AX,0x4F05             INT 0x10             POP BX         }         SPN3:         asm {             MOV DI,BX             MOV CX,nb1             MOV AX,c             REP STOSB             POP CX          //DI==0             INC CL              MOV oldaddrh,CL             PUSH    BX             XOR BX,BX             MOV DL,CL             MOV AL,incpage             MUL DL             MOV DX,AX             MOV AX,0x4F05             INT 0x10             POP BX              MOV AX,n             SUB AX,nb1             MOV CX,AX             MOV AX,c             REP STOSB             JMP SPN9         }         SPN1:         asm {             CMP CL,oldaddrh             JE  SPN4              MOV oldaddrh,CL             PUSH    BX             XOR BX,BX             MOV DL,CL             MOV AL,incpage             MUL DL             MOV DX,AX             MOV AX,0x4F05             INT 0x10             POP BX         }         SPN4:         asm {             MOV DI,BX             MOV CX,n             MOV AX,c             REP STOSB         }         SPN9:         asm {             POP DX             POP BX             POP AX             POP CX             POP DI             POP ES         }     } } //------------------------------------------------------- void SetPoint(addr,c,mode)     DWORD addr;     WORD c,mode; {     BYTE addrh;      if (mode==1) {         *((BYTE *)addr)=c;     } else {         addrh=((BYTE *)(&addr))[2];         if (addrh!=oldaddrh) {             asm {                 XOR BX,BX                 MOV DL,addrh                 MOV AL,incpage                 MUL DL                 MOV DX,AX                 MOV AX,0x4F05                 INT 0x10             }             oldaddrh=addrh;         }         ((BYTE *)(&addr))[2]=0x00;         *((BYTE *)addr)=c;     } }

膜拜个毛毛，写的一坨一坨的

换成move试试

那个整天吹汇编的赵教主呢？这时候咋装死了呢~~

lea  eax,array      //这个取的地址跟一开始开辟的不同，所以数组地址传到过程变量也就不对了，求解答啊。这个数组经过过//城调用还是没变化的输出了  改为 mov eax,offset array 或者 将array改名为my_array 再试试。

引用 7 楼 u010085340 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] [quote=引用 1 楼 fetag 的回复:] 那个整天吹汇编的赵教主呢？这时候咋装死了呢~~ 仅供膜拜： …… [/quote]  跟我问的问题有毛线关系？膜拜个毛毛[/quote] 我和fetag打口水仗呢！你可以不理或围观。


Question: tcc-0.9.26 ：在网上看到《用C语言采用模拟DFA(确定性有限自动机)算法编写一个扫描器》将里面的代码编译报错

纠正上帖： 在记事本里面打开q.csv,另存为，编码选Unicode。再试试。  对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

引用 3 楼 dynamic_Tiger 的回复:谢谢你 还想咨询一下 上段程序通过了编译 但是执行“wprintf”后面的汉字显示都是乱码 请问该如何处理？ 项目属性里面设置字符集使用“多字节字符集”试试。

参考《编译原理》中的词法分析和有限状态自动机。

仅供参考// 有如下字符串，分隔符是 '","' 即双引号逗号双引号，是3个字符，不是一个逗号，也就是逗号分隔双引号包含的CSV格式 // "123","ab,cd","GG"GG","你好","100","99987","","PPP" // 双引号内也可能含有逗号和双引号 // // 双引号内的内容表示字段,例子共8个字段，双引号内的内容可能什么也没有，比如倒数第二个字段 // 这8个字段的内容分别是 123   ab,cd   GG"GG  你好  100  99987 NULL  PPP // 汉字编码是GBK,文件q.csv里面有两行"123","ab,cd","GG"GG","你好","100","99987","","PPP" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> #define MAXF 100     //每行最多字段数 #define MAXC 20      //每字段最多字符数 #define MAXW 3000    //每行最多字符数 #define MAXL 1000000 //最多行数 wchar_t str[MAXW]; int s,i,n; wchar_t c; wchar_t d[MAXF][MAXC]; wchar_t *p; FILE *f; int ln; int parse() {     wprintf(L"第%d行:",ln+1);     wprintf(L"%s\n",str);     s=0;     i=0;     n=0;     while (1) {         c=str[i];         switch (s) {         case 0:             if (c==0) goto SHOW;             if (c==L'\"') {                 s=1;                 p=str+i+1;             } else {                fwprintf(stderr,L"第%d行第%d个字符处格式错误！期望双引号。\n",ln+1,i);                 return 1;             }         break;         case 1:             if (c==0) {                fwprintf(stderr,L"第%d行第%d个字符处格式错误！期望双引号。\n",ln+1,i);                 return 1;             }             if (c==L'\"' && (str[i+1]==L',' || str[i+1]==0)) {                 if ((str+i)-p>MAXC-1) fwprintf(stderr,L"第%d行第%d个字段多于%d的字符被忽略。\n",ln+1,n+1,MAXC-1);                 wcsncpy(d[n],p,__min((str+i)-p,MAXC-1));d[n][MAXC-1]=0;                 n++;                 if (n>=MAXF) {                    fwprintf(stderr,L"第%d行多于%d的字段被忽略。\n",ln+1,MAXF);                     goto SHOW;                 }                 if (str[i+1]==0) goto SHOW;                 if (str[i+1]==L',') {                     i++;                     s=0;                 }             }         break;         }         i++;     } SHOW:     wprintf(L"第%d行:",ln+1);     wprintf(L"%d个字段",n);     for (i=0;i<n;i++) {         wprintf(L"[%s]",d[i]);     }     wprintf(L"\n");     return 0; } int main() {     _wsetlocale(LC_ALL,L"chs");     f=_wfopen(L"q.csv",L"r");     if (NULL==f) {         fwprintf(stderr,L"打开文件q.csv失败！\n");         return 1;     }     ln=0;     while (1) {         if (NULL==fgetws(str,MAXW,f)) break;         if (L'\n'==str[wcslen(str)-1]) {             str[wcslen(str)-1]=0;         } else {             fwprintf(stderr,L"第%d行太长！(>%d个字符)\n",ln+1,MAXW);             break;         }         parse();         ln++;         if (ln>=MAXL) {            fwprintf(stderr,L"多于%d的行被忽略。\n",MAXL);             break;         }     }     fclose(f);     return 0; } //第1行:"123","ab,cd","GG"GG","你好","100","99987","","PPP" //第1行:8个字段[123][ab,cd][GG"GG][你好][100][99987][][PPP] //第2行:"123","ab,cd","GG"GG","你好","100","99987","","PPP" //第2行:8个字段[123][ab,cd][GG"GG][你好][100][99987][][PPP]


Question: c语言数据库编程，往oracle中插入一条数据，编译过不去

引用 2 楼 pan3633330 的回复:[quote=引用 1 楼 user-1 的回复:]  varchar yw_gxsj[20] = asctime(timenow_t); 改成 varchar yw_gxsj[20]; strcpy(yw_gxsj, asctime(timenow_t));  多谢哥们，已经能编译了 还能告诉我为什么要这样使用啊？ [/quote] char*不能直接赋值给char[]，类型不同

引用 1 楼 user-1 的回复:varchar yw_gxsj[20] = asctime(timenow_t); 改成 varchar yw_gxsj[20]; strcpy(yw_gxsj, asctime(timenow_t));  多谢哥们，已经能编译了 还能告诉我为什么要这样使用啊？


Question: C语言--将HTML文本导入一个程序 然后通过这个程序把这个HTML里包涵的点输出到EXCEL中

仅供参考，尽管是VB6： Private Function StrFormat(s As String) As String On Error Resume Next Dim Buf As String Dim StrTemp As String Dim c As String Dim i As Long Dim j As Long Dim k As Long Dim L As Long     Buf = s     Do         L = InStr(1, Buf, "<style", vbTextCompare)         If L > 0 Then             k = InStr(L + 6, Buf, "</style>", vbTextCompare)             If k > 0 Then                 Buf = Left(Buf, L - 1) + Mid(Buf, k + 8)             Else                 Buf = Left(Buf, L - 1)                 Exit Do             End If         Else             Exit Do         End If     Loop     Do         L = InStr(1, Buf, "<script", vbTextCompare)         If L > 0 Then             k = InStr(L + 7, Buf, "</script>", vbTextCompare)             If k > 0 Then                 Buf = Left(Buf, L - 1) + Mid(Buf, k + 9)             Else                 Buf = Left(Buf, L - 1)                 Exit Do             End If         Else             Exit Do         End If     Loop     Buf = Replace(Buf, "&", "&")     Buf = Replace(Buf, """, Chr(34)) '替换成双引号     Buf = Replace(Buf, "<", "<")     Buf = Replace(Buf, ">", ">")     Buf = Replace(Buf, " ", "")     Buf = Replace(Buf, "<", " <")     Buf = Replace(Buf, ">", "> ")     Buf = Replace(Buf, " ", "")     Buf = Replace(Buf, Chr(26), " ")     Buf = Replace(Buf, Chr(10), " ")     Buf = Replace(Buf, Chr(9), " ")     Buf = Replace(Buf, Chr(13), " ")     Buf = LTrim(Buf)     Buf = RTrim(Buf)     '您可加入其他替换     StrTemp = ""     For i = 1 To Len(Buf)         c = Mid(Buf, i, 1)         Select Case c             Case "<"                 If i <> 1 Then                     StrTemp = StrTemp & Mid(Buf, j + 1, i - j - 1)                 End If             Case ">"                 j = i         End Select     Next i     L = Len(StrTemp)     Do         Buf = Replace(StrTemp, "  ", " ")         i = Len(Buf)         If i = L Then Exit Do         L = i         StrTemp = Buf     Loop     StrFormat = Buf End Function

要求必须用C语言来做吗？ C 应该也有相应的类库吧，具体不了解。 但是这种处理文件的工作，用脚本比如  python  之类的搞起来肯定更方便。  python 肯定有现成的操作 xml 和 excel 的库,而且不用你自己处理字符串细节。


Question: VC编程，C语言，scanf,printf问题

谁先谁后都没关系，重要的是你的格式、变量、实际输入顺序需要能对应起来

printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

引用第三种：for(i=0;i<1;i++)   //name不放最后                   {                       printf("Input the number,name,and three scores of the %dth student:\n",i+1);                       scanf("%d,%s,%d,%d,%d",&a[i].num,a[i].name,&a[i].score[0],&a[i].score[0],&a[i].score[0]);                    }  输入的时候，第二部分接收的内容为bao,78,79,90，后面的3个输入整形等于没有初始化 建议你改成   printf("Input the number,name,and three scores of the %dth student:\n",i+1);                       scanf("%d,%d,%d,%d,%s",&a[i].num,&a[i].score[0],&a[i].score[0],&a[i].score[0],a[i].name);  把名字放在最后面

别沉啊！！！！！！！！！1

%d的输入可以以“，”或者空格 或者回车来区分，但%s 不能以“，”区分，你的输入中，第一个参数传递给%d，遇到“，”正确传递，但是第二个传值是%s，“，”会被当做该参数的内容一并传递，一直到遇到回车符 %s才赋值结束 你分开打印就会发现%s内容保存的内容了


Question: C语言问题

回复4楼：改了逻辑运算符后还不行，不懂你在后面说的。。。。。。求指点

引用 3 楼 u012514171 的回复:怎么感觉还是一样的乱，你手打的吧？ astyle自动整理c,c++,java源代码格式命令行工具源代码。 用astyle --help查看使用帮助。 http://download.csdn.net/detail/zhao4zhong1/5605415

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

怎么感觉还是一样的乱，你手打的吧？

这样看太累了，帮你引用下代码块，给下面的人看 #include<stdio.h> #include<math.h> #define  E  0.00001 typedef struct { double x; double y; }point; typedef struct{ point p1; point p2; }center; double distance(point a,point b); center cluster(point* p,int i); point cen(point* p,int i,int t); center part(point* p,int i,point p1,point p2); int main() { point arr[4]={{1,2},{2,4},{2,7},{3,8}}; center c=cluster(arr,4); printf("%f,%f\n%f,%f",c.p1.x ,c.p1.y,c.p2.x,c.p2.y); return 0; } center cluster(point* p,int i) { point a, b,a0,b0; int n=(i*(i-1))/2; double max=0; int x=0; double d[n];  double e1,e2; center c0;  for(int m=0;m<i-1;m++) for(int n=1;n<i;n++) { d[x]=distance(p[m],p[n]); if(d[x]>max) {  max=d[x]; a=p[m];// 把距离最远的点付给a,b  b=p[n]; } x++; } do { a0=a; b0=b; c0=part(p,i,a,b); a=c0.p1 ; b=c0.p2; e1=distance(a0,a); e2=distance(b0,b); }while((e1>E)|(e2>E)); center c={a,b}; return c; } //求两点之间距离函数  double distance(point a,point b) {  double dte;  dte=sqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y));  return dte; } //聚为两类  center part(point* p,int i,point p1,point p2) { point arr1[i]; point arr2[i]; int t1=0; int t2=0; for(int n=0;n<i;n++) { if(distance(p1,p[n]) < distance(p2,p[n])) { arr1[n]=p[n]; t1++; }  else { arr2[n]=p[n]; t2++; } }	 p1=cen(arr1,i,t1); p2=cen(arr2,i,t2); center c={p1,p2}; return c; } //求中心点函数  point cen(point* p,int i,int t) { point pt; double X=0;   double Y=0; for(int n=0;n<i;n++) { X+=p[n].x; Y+=p[n].y; } pt.x =X/t; pt.y =Y/t; return pt; }

初始化？ 猜测，没见到具体数据。。。。。

引用 5 楼 zhao4zhong1 的回复:[quote=引用 3 楼 u012514171 的回复:] 怎么感觉还是一样的乱，你手打的吧？ astyle自动整理c,c++,java源代码格式命令行工具源代码。 用astyle --help查看使用帮助。 http://download.csdn.net/detail/zhao4zhong1/5605415[/quote]十分感谢！


Question: 求解数据结构OrderInsert（ev，en，cmp）怎么理解

插入排序（要插入的值，已排好序的数组的元素个数，比较函数） 我猜。

有奖竟猜开始...

你是让我们理解这些缩写词的意义吗？ OrderInsert: 有序插入？ ev: element value, 元素值？ en: element node 元素结点？ cmp: compare 比较  你的英文缩写常识好不好呀？

他这个是教材上截取的（数据结构严蔚敏P67)。代表EventList,Event,compare


Question: 关于自己实现atoi遇到的问题？

好了，谢谢 少了一个分号 int Ret_Integer = 0； 谢谢

谢谢 但是我加了那句还是报错 ，同样的错误，是为什么啊？求救

int myatoi(char* str)   {     int Ret_Integer = 0     while（*str）     {     Ret_Integer = Ret_Integer* 10+ (*str++ - '0');     }       return Ret_Integer;   }

请教一下大家


Question: Debug Assertion Failed!请大家帮忙解决。

问题已经解决了，是因为我定义 的文件夹为test.dat，在程序前半部分： if((fp=fopen("f:\\test.dat","w"))==NULL) 但是在程序后面却只写了 fp=fopen("test","r"); 把这一句改为 fp=fopen("test.dat","r"); 就ok了。

看看fp是否为null。 我猜你目录下没有test这个文件。

引用 8 楼 Saleayas 的回复:fp=fopen("test","r"); _assert(fp); if(!fp) { ERROR.... } 什么意思呢？弄不明白，求指教。

_TSCHAR * __cdecl _fgetts (         _TSCHAR *string,         int count,         FILE *str         ) {     FILE *stream;     _TSCHAR *pointer = string;     _TSCHAR *retval = string;     int ch;      _VALIDATE_RETURN(( string != NULL ) || ( count == 0 ), EINVAL, NULL);     _VALIDATE_RETURN(( count >= 0 ), EINVAL, NULL);     _VALIDATE_RETURN(( str != NULL ), EINVAL, NULL);  你的 fp 是没有打开，为 NULL。

引用 4 楼 zhao4zhong1 的回复:崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。不是很懂啊，请求实际操作指教。能不能帮我修改调试？

引用 3 楼 Symfund 的回复: fp=fopen("test","r"); memset(str, 100, '\0'); // 加上这句试试看！ fgets(str,100,fp); printf("%s\n",str); fclose(fp);  你的意思是清零啊，但是没有解决问题，而且清零函数也没写对，应该是menset(str,'\0',100);不过这里不是请不清零的问题呐。

引用 1 楼 user-5 的回复:这个可以自己设单步调式撒设置了单步调式，可是仍然不知道怎么改，错误在这几行： fp=fopen("test","r");         fgets(str,100,fp);         printf("%s\n",str);         fclose(fp); 求指教。

这个可以自己设单步调式撒


Question: 新手学习数据结构时，顺序栈实现时运行总是停止工作，编译又没有错误，求大神解释一下

嗯，谢谢了，因为只简单学过c++，数据结构又是c语言版的，所以有时候转不过来，还是得多练习，多谢了

以下的用法不正确，且S没有分配空间，结果难料： SqStack *S; InitStack(SqStack S); 应该改为： SqStack S; InitStack(&S);  另外学数据结构的时候，一定要多去调试，尤其是单步调试。


Question: 结构体名字可以和这个结构体的变量名一样吗？

谢谢 楼上诸位大神

语法上可以，编译器能分辨处who是who； 但是人觉得别扭，所以实践中不推荐。

觉得别扭就不要这样了。

可以 因为 struct A 和 A 是两个不同的东西

可以，C,C++都可以，只是这种用法很别扭。 类型名，和变量名同名，读代码会有一种混乱的感觉。 虽然有人推荐这种用法，不过不常用。

建议这样的方式来命名：  typedef struct {     int x;     int y; }point_t;  point_t point;  引用 楼主 u013539260 的回复:struct pn544_dev *pn544_dev = dev_id;  请大家帮我看看这句，可以这么用？怎么看着很别扭啊。

可以 名称空间不同不会冲突

我试验了一下。竟然可以，好吧，不过个人不推荐这样做。。。不过这样用也省去了一些命名的烦恼。。。  #include<stdio.h>  struct pn544_dev{	//一般性定义结构体 	char a; };	  typedef struct {		//定义一个数据类型 	char a; }pn545_dev; int main() {  	struct pn544_dev *dev_id; 	//struct pn544_dev *pn544_dev = dev_id;	//这个可以，我最初猜想是因为数据类型不同，可是下面的一句，打破了我的猜想。 	struct pn544_dev pn544_dev;	//这个也是可以，可见不是数据类型的愿因 	pn544_dev.a='a'; 	putchar(pn544_dev.a);  	pn545_dev pn545_dev;		//这个竟然也可以，即使用typedef声明了数据类型，竟然也可以同名。 	pn545_dev.a= 'b' 	putchar(pn545_dev.a); 	return 0; }

struct struct [tag] { member-list } [declarators];  [struct] tag declarators;  The struct keyword defines a structure type and/or a variable of a structure type. See Anonymous Structures and Unsized Array in a Structure for more information.  A structure type is a user-defined composite type. It is composed of "fields" or "members" that can have different types.  In C++, a structure is the same as a class except that its members are public by default.  Using a Structure  In C, you must explicitly use the struct keyword to declare a structure. In C++, this is unnecessary once the type has been defined.  You have the option of declaring variables when the structure type is defined by placing one or more comma-separated variable names between the closing brace and the semicolon.  For related information, see class, union, and enum.  Example 1  struct PERSON              // Declare PERSON struct type {    int   age;              // Declare member types    long  ss;    float weight;    char  name[25]; } family_member;           // Define object of type PERSON     struct PERSON sister;   // C style structure declaration    PERSON brother;         // C++ style structure declaration     sister.age  = 13;       // assign values to members    brother.age =  7; Structure variables can be initialized. The initialization for each variable must be enclosed in braces.  Example 2  struct POINT            // Declare POINT structure {    int x;               // Define members x and y    int y; } spot = { 20, 40 };    // Variable spot has                         //     values x = 20, y = 40 struct POINT there;     // Variable there has POINT type struct CELL             // Declare CELL bit field {    unsigned character  : 8;  // 00000000 ????????    unsigned foreground : 3;  // 00000??? 00000000    unsigned intensity  : 1;  // 0000?000 00000000    unsigned background : 3;  // 0???0000 00000000    unsigned blink      : 1;  // ?0000000 00000000 } screen[25][80];       // Array of bit fields


Question: C语言读文件的问题

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了  “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

feof Tests for end-of-file on a stream.  int feof( FILE *stream );  Function Required Header Compatibility  feof <stdio.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  The feof function returns a nonzero value after the first read operation that attempts to read past the end of the file. It returns 0 if the current position is not end of file. There is no error return.  Parameter  stream  Pointer to FILE structure  Remarks  The feof routine (implemented both as a function and as a macro) determines whether the end of stream has been reached. When end of file is reached, read operations return an end-of-file indicator until the stream is closed or until rewind, fsetpos, fseek, or clearerr is called against it.  Example  /* FEOF.C: This program uses feof to indicate when  * it reaches the end of the file FEOF.C. It also  * checks for errors with ferror.  */  #include <stdio.h> #include <stdlib.h>  void main( void ) {    int  count, total = 0;    char buffer[100];    FILE *stream;     if( (stream = fopen( "feof.c", "r" )) == NULL )       exit( 1 );     /* Cycle until end of file reached: */    while( !feof( stream ) )    {       /* Attempt to read in 10 bytes: */       count = fread( buffer, sizeof( char ), 100, stream );       if( ferror( stream ) )      {          perror( "Read error" );          break;       }        /* Total up actual bytes read */       total += count;    }    printf( "Number of bytes read = %d\n", total );    fclose( stream ); }   Output  Number of bytes read = 745   Error Handling Routines |  Stream I/O Routines  See Also   clearerr, _eof, ferror, perror

放弃使用feof吧。直接用fread的返回值作为是否读取完毕的判断。  因为feof是要等到别的读函数读取，发现没有数据了，才有用的。比如说，你用fread读取最后一个数据，此时，因为fread还能读取到数据，所以feof还不能判断到了文件尾。等下一次fread读取时，发现没有了数据了，此时feof才能检查出来。而当fread没有读取到数据时，并不修改buff参数。所以就出现了楼主说的读取两次的现象。

[quote=引用 2 楼 zhao4zhong1 的回复:] [code=c]不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 对此，还是不是太理解，为何非要 b=fgetc(f);之后才判断feof(f)，而读入的b就不起作用了

不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

while(!feof(f)) {   fread(...); }   改成   for(;;){   fread(....);   if(feof(f)) break;   // using the read data  }   每一个IO操作都要检查是否成功（判断函数返回值，判断流状态）


Question: 运算符优先级问题

未定义行为 结果没意义 这样写的错误的 PS 我说是错误的 没说 编译会Error

//C++ Operators //  Operators specify an evaluation to be performed on one of the following: //    One operand (unary operator) //    Two operands (binary operator) //    Three operands (ternary operator) //  The C++ language includes all C operators and adds several new operators. //  Table 1.1 lists the operators available in Microsoft C++. //  Operators follow a strict precedence which defines the evaluation order of //expressions containing these operators.  Operators associate with either the //expression on their left or the expression on their right;    this is called //“associativity.” Operators in the same group have equal precedence and are //evaluated left to right in an expression unless explicitly forced by a pair of //parentheses, ( ). //  Table 1.1 shows the precedence and associativity of C++ operators //  (from highest to lowest precedence). // //Table 1.1   C++ Operator Precedence and Associativity // The highest precedence level is at the top of the table. //+------------------+-----------------------------------------+---------------+ //| Operator         | Name or Meaning                         | Associativity | //+------------------+-----------------------------------------+---------------+ //| ::               | Scope resolution                        | None          | //| ::               | Global                                  | None          | //| [ ]              | Array subscript                         | Left to right | //| ( )              | Function call                           | Left to right | //| ( )              | Conversion                              | None          | //| .                | Member selection (object)               | Left to right | //| ->               | Member selection (pointer)              | Left to right | //| ++               | Postfix increment                       | None          | //| --               | Postfix decrement                       | None          | //| new              | Allocate object                         | None          | //| delete           | Deallocate object                       | None          | //| delete[ ]        | Deallocate object                       | None          | //| ++               | Prefix increment                        | None          | //| --               | Prefix decrement                        | None          | //| *                | Dereference                             | None          | //| &                | Address-of                              | None          | //| +                | Unary plus                              | None          | //| -                | Arithmetic negation (unary)             | None          | //| !                | Logical NOT                             | None          | //| ~                | Bitwise complement                      | None          | //| sizeof           | Size of object                          | None          | //| sizeof ( )       | Size of type                            | None          | //| typeid( )        | type name                               | None          | //| (type)           | Type cast (conversion)                  | Right to left | //| const_cast       | Type cast (conversion)                  | None          | //| dynamic_cast     | Type cast (conversion)                  | None          | //| reinterpret_cast | Type cast (conversion)                  | None          | //| static_cast      | Type cast (conversion)                  | None          | //| .*               | Apply pointer to class member (objects) | Left to right | //| ->*              | Dereference pointer to class member     | Left to right | //| *                | Multiplication                          | Left to right | //| /                | Division                                | Left to right | //| %                | Remainder (modulus)                     | Left to right | //| +                | Addition                                | Left to right | //| -                | Subtraction                             | Left to right | //| <<               | Left shift                              | Left to right | //| >>               | Right shift                             | Left to right | //| <                | Less than                               | Left to right | //| >                | Greater than                            | Left to right | //| <=               | Less than or equal to                   | Left to right | //| >=               | Greater than or equal to                | Left to right | //| ==               | Equality                                | Left to right | //| !=               | Inequality                              | Left to right | //| &                | Bitwise AND                             | Left to right | //| ^                | Bitwise exclusive OR                    | Left to right | //| |                | Bitwise OR                              | Left to right | //| &&               | Logical AND                             | Left to right | //| ||               | Logical OR                              | Left to right | //| e1?e2:e3         | Conditional                             | Right to left | //| =                | Assignment                              | Right to left | //| *=               | Multiplication assignment               | Right to left | //| /=               | Division assignment                     | Right to left | //| %=               | Modulus assignment                      | Right to left | //| +=               | Addition assignment                     | Right to left | //| -=               | Subtraction assignment                  | Right to left | //| <<=              | Left-shift assignment                   | Right to left | //| >>=              | Right-shift assignment                  | Right to left | //| &=               | Bitwise AND assignment                  | Right to left | //| |=               | Bitwise inclusive OR assignment         | Right to left | //| ^=               | Bitwise exclusive OR assignment         | Right to left | //| ,                | Comma                                   | Left to right | //+------------------+-----------------------------------------+---------------+

哦 好的 谢谢

请参考置顶贴，另外请不要这么写，没人知道结果是什么。。。


Question: 来高手解答,自动属性创建宏,宏模拟描述语言的研究....

蛋疼啊,

引用 1 楼 zhao4zhong1 的回复:Code Generation没用过

Code Generation


Question: 【小问题】如何使窗口全屏

引用 5 楼 u013643920 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] #include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {     PAINTSTRUCT ps;     HDC hdc;     HFONT hfont,ohfont;     RECT r;     COLORREF oc;      switch(message) {     case WM_CLOSE://按Alt+F4退出         PostQuitMessage(0);         break;     case WM_PAINT:         BeginPaint(hWnd, &ps);         hdc = ps.hdc; // the device context to draw in         GetClientRect(hWnd, &r); // Obtain the window's client rectangle         hfont = CreateFont(240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");         ohfont=SelectObject(hdc,hfont);         oc=SetTextColor(hdc,0x00C080FF);         SetBkMode(hdc, TRANSPARENT);         TextOut(hdc,r.left+r.right/2-720, r.top+r.bottom/2-120,"最短画图程序",12);         SelectObject(hdc,ohfont);         SetTextColor(hdc,oc);         DeleteObject(hfont);         EndPaint(hWnd, &ps);         break;     default:         return DefWindowProc(hWnd, message, wParam, lParam);     }     return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {     MSG msg             = {0};     WNDCLASS wc         = {0};     HBRUSH hbrh;     hbrh=CreateSolidBrush(0x00000000);     wc.lpfnWndProc      = WndProc;     wc.hInstance        = hInstance;     wc.hbrBackground    = hbrh;     wc.lpszClassName    = "minwindowsapp";     wc.hCursor          = LoadCursor(NULL,IDC_ARROW);     if( FAILED(RegisterClass(&wc)) ) return 1;      if(FAILED(CreateWindow(wc.lpszClassName,                         "Minimal Windows Application",                         WS_POPUP|WS_VISIBLE,                         0,                         0,                         GetSystemMetrics(SM_CXSCREEN),                         GetSystemMetrics(SM_CYSCREEN),                         0,                         0,                         hInstance,                         NULL)))         return 2;      while( GetMessage( &msg, NULL, 0, 0 ) > 0 ) {         DispatchMessage( &msg );     }     DeleteObject(hbrh);     return 0; } 好详细耶，请问这是属于MFC编程的内容吗？我大一才自学完谭浩强的C语言，所以这段代码我看不懂，不过很谢谢您，请问我能在自己的系统中找出这段代码吗？[/quote] 这个和MFC没关系，只是Win32 API

引用 1 楼 yuzhenxiong0823 的回复:这个如果你百度不出来，就无法全屏了....用赵老师的方法成功了~~~

引用 3 楼 zhao4zhong1 的回复:#include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {     PAINTSTRUCT ps;     HDC hdc;     HFONT hfont,ohfont;     RECT r;     COLORREF oc;      switch(message) {     case WM_CLOSE://按Alt+F4退出         PostQuitMessage(0);         break;     case WM_PAINT:         BeginPaint(hWnd, &ps);         hdc = ps.hdc; // the device context to draw in         GetClientRect(hWnd, &r); // Obtain the window's client rectangle         hfont = CreateFont(240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");         ohfont=SelectObject(hdc,hfont);         oc=SetTextColor(hdc,0x00C080FF);         SetBkMode(hdc, TRANSPARENT);         TextOut(hdc,r.left+r.right/2-720, r.top+r.bottom/2-120,"最短画图程序",12);         SelectObject(hdc,ohfont);         SetTextColor(hdc,oc);         DeleteObject(hfont);         EndPaint(hWnd, &ps);         break;     default:         return DefWindowProc(hWnd, message, wParam, lParam);     }     return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {     MSG msg             = {0};     WNDCLASS wc         = {0};     HBRUSH hbrh;     hbrh=CreateSolidBrush(0x00000000);     wc.lpfnWndProc      = WndProc;     wc.hInstance        = hInstance;     wc.hbrBackground    = hbrh;     wc.lpszClassName    = "minwindowsapp";     wc.hCursor          = LoadCursor(NULL,IDC_ARROW);     if( FAILED(RegisterClass(&wc)) ) return 1;      if(FAILED(CreateWindow(wc.lpszClassName,                         "Minimal Windows Application",                         WS_POPUP|WS_VISIBLE,                         0,                         0,                         GetSystemMetrics(SM_CXSCREEN),                         GetSystemMetrics(SM_CYSCREEN),                         0,                         0,                         hInstance,                         NULL)))         return 2;      while( GetMessage( &msg, NULL, 0, 0 ) > 0 ) {         DispatchMessage( &msg );     }     DeleteObject(hbrh);     return 0; } 好详细耶，请问这是属于MFC编程的内容吗？我大一才自学完谭浩强的C语言，所以这段代码我看不懂，不过很谢谢您，请问我能在自己的系统中找出这段代码吗？

引用 2 楼 zhao4zhong1 的回复:鼠标右键点左上角图标，属性、布局、窗口大小和窗口位置改改看。 或者按Alt+Enter键试试看。用第一种方法可以将窗口最大化时的属性调整，第二种方法可以使窗口全屏化，建议使用第一种方法。谢谢赵老师！（看大家都这么叫您，我也就这么叫喽）

这个如果你百度不出来，就无法全屏了....


Question: 关于C语言指针的问题

二楼的正解    郝斌的自学C语言也是这样写的

楼上正解！！

#include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2

LZ要多看书啊

楼上的就很清晰了，同意！

LZ要多看书啊 # include <stdio.h>  void swint(int *a, int *b);  int main() { 	int i = 2; 	int j = 3;  	printf("i = %d, j = %d\n", i, j);  	swint(&i, &j); 	printf("after swap:\n"); 	printf("i = %d, j = %d\n", i, j);  	return 0; }  void swint(int *a, int *b) { 	int tem;  	tem = *a; 	*a = *b; 	*b = tem; }


Question: C语言数据库写入数据有问题

引用 3 楼 zhao4zhong1 的回复:[quote=引用 2 楼 pan3633330 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] 先在查询分析器里面执行相应T-SQL语句成功后再在代码中使用。 insert into yw_test (xh,xm,xb,yx,ywcj,sxcj,yycj,zycj,hgbz,gxsj) vlaues('1234','李三','男','南京大学',94,93,92,91,'y','1990/2/12') 这个可以写进去 但是查询不到记录 这是为什么啊？[/quote]   Transact-SQL 参考     char 和 varchar 固定长度 (char) 或可变长度 (varchar) 字符数据类型。  char[(n)]  长度为 n 个字节的固定长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为 n 个字节。char 在 SQL-92 中的同义词为 character。  varchar[(n)]  长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度，而不是 n 个字节。所输入的数据字符长度可以为零。varchar 在 SQL-92 中的同义词为 char varying 或 character varying。  注释 如果没有在数据定义或变量声明语句中指定 n，则默认长度为 1。如果没有使用 CAST 函数指定 n，则默认长度为 30。  将为使用 char 或 varchar 的对象被指派数据库的默认排序规则，除非用 COLLATE 子句另外指派了特定的排序规则。该排序规则控制用于存储字符数据的代码页。  支持多语言的站点应考虑使用 Unicode nchar 或 nvarchar 数据类型以尽量减少字符转换问题。如果使用 char 或 varchar：   如果希望列中的数据值大小接近一致，请使用 char。   如果希望列中的数据值大小显著不同，请使用 varchar。  如果执行 CREATE TABLE 或 ALTER TABLE 时 SET ANSI_PADDING 为 OFF，则一个定义为 NULL 的 char 列将被作为 varchar 处理。   当排序规则代码页使用双字节字符时，存储大小仍然为 n 个字节。根据字符串的不同，n 个字节的存储大小可能小于 n 个字符。   请参见  CAST 和 CONVERT  COLLATE  排序规则  数据类型转换  数据类型  sp_dbcmptlevel  指定排序规则  使用 char 和 varchar 数据  使用 Unicode 数据  ©1988-2000 Microsoft Corporation。保留所有权利。 [/quote] 还能给解释下是什么原因，为什么写不进去，你给的参考资料我感觉对我解决问题的帮助不是很大，谢谢了啊

引用 2 楼 pan3633330 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 先在查询分析器里面执行相应T-SQL语句成功后再在代码中使用。 insert into yw_test (xh,xm,xb,yx,ywcj,sxcj,yycj,zycj,hgbz,gxsj) vlaues('1234','李三','男','南京大学',94,93,92,91,'y','1990/2/12') 这个可以写进去 但是查询不到记录 这是为什么啊？[/quote]   Transact-SQL 参考     char 和 varchar 固定长度 (char) 或可变长度 (varchar) 字符数据类型。  char[(n)]  长度为 n 个字节的固定长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为 n 个字节。char 在 SQL-92 中的同义词为 character。  varchar[(n)]  长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度，而不是 n 个字节。所输入的数据字符长度可以为零。varchar 在 SQL-92 中的同义词为 char varying 或 character varying。  注释 如果没有在数据定义或变量声明语句中指定 n，则默认长度为 1。如果没有使用 CAST 函数指定 n，则默认长度为 30。  将为使用 char 或 varchar 的对象被指派数据库的默认排序规则，除非用 COLLATE 子句另外指派了特定的排序规则。该排序规则控制用于存储字符数据的代码页。  支持多语言的站点应考虑使用 Unicode nchar 或 nvarchar 数据类型以尽量减少字符转换问题。如果使用 char 或 varchar：   如果希望列中的数据值大小接近一致，请使用 char。   如果希望列中的数据值大小显著不同，请使用 varchar。  如果执行 CREATE TABLE 或 ALTER TABLE 时 SET ANSI_PADDING 为 OFF，则一个定义为 NULL 的 char 列将被作为 varchar 处理。   当排序规则代码页使用双字节字符时，存储大小仍然为 n 个字节。根据字符串的不同，n 个字节的存储大小可能小于 n 个字符。   请参见  CAST 和 CONVERT  COLLATE  排序规则  数据类型转换  数据类型  sp_dbcmptlevel  指定排序规则  使用 char 和 varchar 数据  使用 Unicode 数据  ©1988-2000 Microsoft Corporation。保留所有权利。

引用 1 楼 zhao4zhong1 的回复:先在查询分析器里面执行相应T-SQL语句成功后再在代码中使用。 insert into yw_test (xh,xm,xb,yx,ywcj,sxcj,yycj,zycj,hgbz,gxsj) vlaues('1234','李三','男','南京大学',94,93,92,91,'y','1990/2/12') 这个可以写进去 但是查询不到记录 这是为什么啊？

先在查询分析器里面执行相应T-SQL语句成功后再在代码中使用。


Question: 有理数 数据类型 C语言

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

这代码风格、、、函数名全是中文， 变量名随便用，改错头疼，不如重写、、、 说几个问题，z和n没初始化就用了，报错， 不明白这是要做什么循环？？？ for(int i = t;i <= t;i--)


Question: c 的简单问题  新手 正自学c中  遇了个问题 求大神解释 谢谢！

scanf（"%f %f %f",&x1,&x2,&x3）；没有取地址

取地址符爱上对方撒

scanf格式字符串中别加标点

printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

这个问题你仔细看看应该可以自己找出来的，，， 还有，代码不规范啊，最好不要直接写main，要加上类型，像这样# include <stdio.h>  int main(void) { 	float x1, x2, x3; 	printf ("请输入三个数 x1, x2, x3:\n"); 	scanf ("%f %f %f", &x1, &x2, &x3); 	printf ("%f %f %f\n", x1, x2, x3); 	 	return 0; }  关于scanf，楼主可以看看这个——http://blog.csdn.net/u012421456/article/details/18501309

补充一点   没有报错


Question: 字符数组问题

看到帖子混点积分

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

我想，这些问题在任何一本C语言入门的书上都有讲解吧，不妨看看书，或者百度。

怎样定义和使用字符数组？ char a[10]; for (int i = 0; i < 10; i++)     a[i] = 'a' + i;  怎样为字符数组赋初值？ char a[10] = "abcdefg"; char a[10] = { 'a', 'b', 'c', };  可以直接把一个数组变量直接赋值给另一个数组变量吗？ 不行，请用循环处理  而这一切，请好好看书。

这个应该自己翻翻书。

发错了 是除法总跳不出循环 运行错误 //大数除以大数?????????????????/ int Div(char a[],char b[],char c[]) { 	int icmp,i,div=0,j; 	char d[LEN]; 	char *pA,*pD;  	memset(c,'\0',LEN); 	memset(d,'\0',LEN); 	if(Compare(b,d)==0) 		printf("错误：被除数为零"); 	icmp=Compare(a,b); 	if(icmp==-1) 	{ 	//	strcpy(c,a); 		memcpy(c,a,LEN); 		return div; 	} 	 	if(icmp==0) 	{ 		memset(c,'\0',LEN); 		div=1; 		return div; 	} 	 	do 	{ 		Sub(a,b,d); 		div++; 	//	strcpy(a,d); 		memcpy(a,d,LEN); 		j=Compare(d,b); 	}while(j>=0); //	strcpy(c,d); 	memcpy(c,d,LEN); 	return div;  }

#include <stdio.h> #define LEN 300 int Input(char a[]); void Print(char a[]);  void Sub(char a[],char b[],char c[]); int  Div(char a[],char b[],char c[]);//返回值为商，余数为c  int Compare(char a[],char b[]);   //输入一个大数 int Input(char a[]) { 	char s[LEN]; 	int i,l; 	if(scanf("%s",s)==0) 		return -1; //	memset(a,'\0',LEN); 	for(i=0;i<LEN;i++) 		a[i]=0; 	 	l=strlen(s); 	for(i=0;i<l;i++) 		a[i]=s[l-i-1]-'0'; 	return 0; 	 	 }  //输出一个大数 void Print(char a[]) { 	int i,j; 	for(i=LEN-1;i>=0;i--) 		if(a[i]!=0) 			break; 	for(j=i;j>=0;j--) 		printf("%d",a[j]); 	printf("\n"); } //仅实现大数减小数，假设a>b void Sub(char a[],char b[],char c[]) { 	int i,carry=0; 	for(i=0;i<LEN;i++) 		c[i]=0; 	for(i=0;i<LEN;i++) 	{ 		if(a[i]<b[i]) 		{ 			carry=1; 			c[i]=a[i]+10-b[i]; 			a[i+1]=a[i+1]-carry; 		} 		else 		{ 			carry=0; 			c[i]=a[i]-b[i]; 		} 			 	} } //大数乘以大数 void Mul(char a[],char b[],char c[]) { 	int i,j,k; 	for(i=0;i<2*LEN;i++) 		c[i]=0; 	for(i=0;i<LEN;i++) 	{ 		for(j=0;j<LEN;j++) 		{ 			c[i+j]+=a[j]*b[i]; 			 			if(c[i+j]>=10) 			{ 				c[i+j+1]+=c[i+j]/10; 				c[i+j]=c[i+j]%10; 			} 			 		} 	}  }  void main() { 	char a[LEN],b[LEN],c[LEN],d[2*LEN]; 	int i; 	int div; 	Input(a); 	Input(b); //	Sub(a,b,c); 	i=Compare(a,b); 	printf("%d\n",i); 	div=Div(a,b,c); 	printf("商是:%d\n",div); 	printf("余数是:"); 	Print(c); 这是我写的大数除以大数的程序，为什么不成功？是哪里错了呢？经常跳不出while循环 	  	//==========test============// //	char c1[10]={1,2,3,4,5,6,0}; //	char c2[10]={9,0,0,0,9}; //	Print(a); }

看书自己操作实践下了

引用 2 楼 turingo 的回复:char a[81]; char b[81];  memset(a, '\0', 81); memcpy(b, a, 81);  引用 楼主 dwj1297679792 的回复:怎样定义和使用字符数组？怎样为字符数组赋初值？可以直接把一个数组变量直接赋值给另一个数组变量吗？已解答！

“变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。


Question: 急求！VS2008 应用程序无法运行 并行配置不正确

求解~！谢谢大神s~!!

重装VS2008后问题消失

不明确，加入是的话怎么解决呢？谢谢~！重装VS可行吗？   引用 3 楼 zhao4zhong1 的回复:.maniest文件坏了？

试了，还是不行。。  引用 2 楼 user-2 的回复:管理员身份启动VS，再试试

.maniest文件坏了？

管理员身份启动VS，再试试


Question: 关于曼德博集合

真漂亮，回想起大学时tc写的分形程序了  上网搜搜吧，很多的。

在http://www.codeproject.com搜“Mandelbrot”

这个课题好，收藏了！

分形，多重宇宙，哈！


Question: 求助，脑袋晕了，求查找如下不长代码问题

--i，i--的区别：前者是i先减1再运算，后者相反没如果不需要加减操作下表只需要使用i

所以我说不要在判断条件中使用--操作，因为你这样写下来很乱，而且容易出现问题，且bug不易查找。 如果你基础扎实，并且代码经验丰富的话，推荐这样使用，因为可以减少很多代码量。 但是你在这里的--操作完全没有必要，增加了代码量，而且困扰了你自己。 #include <stdio.h> #define N 10 main() { 	float av, max = 0.0, min = 100.0, sum = 0, m; 	double a[N]; 	int i, j = 0; 	for (i = 0; i < N; i++) 	{ 		printf("please input %d=", i+1); 		scanf("%f", &m); 		if (m>max) max = m; 		if (m<min) min = m; 		sum += m; 		a[i] = m; 	} 	for (i = 0; i < N; i++) 	{ 		if (a[i] == max) 			printf("canceled %d's higest score %f\n", i+1, max);  		if (a[i] == min) 			printf("canceled %d's lowest score %f\n", i+1, min); 	} 	av = (sum - max - min) / 8; 	printf("Average score is %f\n", av); 	return 0; }

计算机组成原理→DOS命令→汇编语言→C语言（不包括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对应的汇编并单步执行观察相应内存和寄存器变化。）

引用 1 楼 Falleyes 的回复:不要在if判断中使用前置--，i为1进入判断，i就在判断中减1，但是判断不符合，跳到下一条判断，i再次减一，就在访问索引-1的元素了。 还是不懂... 是这里出现了问题了吗 for(i=1;i<=N;i++) {if (a[--i]==max) {printf("canceled %d's higest score %f\n",i,max); i++; 可能涉及到if的机理，至少表面上怎么看都是没有问题的。然而在debug，输入10个不等数据之后，程序陷入无限循环，一直不停输出“canceled -1‘s score ...".这里的-1搞不懂

引用 5 楼 Falleyes 的回复:比如这一个语块： for (i = 1; i <= N; i++) { //比如进入这里i为1         if (a[--i] == max) { //但是最大值并不是a[0]，而在此处的判断本身就会对i自减                              //所以此时i=0，并且判断为假，进入下一个if判断             printf("canceled %d's higest score %f\n", i, max);             i++;         }         if (a[--i] == min) { //进入if，此时i为0，而判断语句对i又做了一次自减得到i为-1                             //然后判断a[-1]，这时访问就已经出现错误                             //然后是否会出现你所说的一直cancel-1就要看你输入的数据                             //以及在索引-1处内存本身就存在的值             printf("canceled %d's lowest score %f\n", i, min);             i++;         }     } 懂了，终于发现了问题所在了，无论是不是最大，i 都会进行自减，谢谢了！

# include <stdio.h> # define N 10  int main() {     float av, max = 0.0, min = 100.0, sum = 0, m;     double a[N];     int i, j = 0;     for (i = 0; i < N; i++) {         printf("please input %d=", i + 1);         scanf("%f", &m);         if (m > max)             max = m;         if (m < min)             min = m;         sum += m;         a[i] = m;     }     for (i = 0; i < N; i++) {         if (a[i] == max) {             printf("canceled %d's higest score %f\n", i + 1, max);         }         if (a[i] == min) {             printf("canceled %d's lowest score %f\n", i + 1, min);         }     }     av = (sum - max - min) / 8;     printf("Average score is %f\n", av);      return 0; }

#include <stdio.h> #define N 10 main() { 	float           av, max = 0.0, min = 100.0, sum = 0, m; 	double          a[N]; 	int             i, j = 0; 	for (i = 1; i <= N; i++) { // 要养成下标从0开始的思考习惯，即for (i = 0; i < N; i++) 		printf("please input %d=", i); // 这里printf("please input %d = ", i + 1)，即可以输出1到10 		scanf("%f", &m); 		if (m > max) 			max = m; 		if (m < min) 			min = m; 		sum += m; 		a[--i] = m; // --就不需要了，即a[i] = m; 		// i++;就不需要了 	} 	for (i = 1; i <= N; i++) { // 这里也是一样，下标要从0开始，就不会到处出现--++，能不晕么？ 		if (a[--i] == max) { 			printf("canceled %d's higest score %f\n", i, max); 			i++; 		} 		if (a[--i] == min) { 			printf("canceled %d's lowest score %f\n", i, min); 			i++; 		} 	} 	av = (sum - max - min) / 8; 	printf("Average score is %f\n", av); 	return 0; }


Question: 中文汉字转成ascii码

引用 9 楼 zhangwuji154 的回复:同一个汉字,不同的编码,有不同的值 比如：啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

wchar

同一个汉字,不同的编码,有不同的值

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

你可能想表达：怎样将单字节编码的汉字转成unicode编码，这个还比较实际！

你将复数转成实数，有什么意义呢？

ascII 码范围是0-127的 汉字是多字节的。  ascii的范围不够表示汉字啊

引用 3 楼 ForestDB 的回复:LZ得先看点编码的只是。  有问题请指教

LZ得先看点编码的只是。

unsigned char tmp[100]; strcpy(tmp,"中文"); for(i=0;i<strlen(Tmp);i++) {    sprintf( buffer+i*2, "%2.2x", Tmp+i ); }  我是这么处理的， 得出的ascii 有问题。

你是问怎么当ascii码处理吧？中文是16位编码，直接当两个ascii码处理好了。如果转，中文信息不全丢了么。


Question: 这是一段C语言代码，我的预想和结果不同，虽然看了英文解释，但是还是没懂，求大神释疑，大家也可以先猜猜答案哈!英语解释后续给大家。

唉，一时大意，怎么跑这里来了，丢人了，不过感谢大家回复

随手搜索 哪怕是百度printf 你都能弄明白这个是输出结果是怎么回事  为什么就是不自己动手 非得别人喂你 少爷

有那么多基础的C语言教材，楼主都没读过吗？


Question: 段违例求解

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

没什么好说的，哪里越界了，自己用debugger跟踪一遍。