Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C调用mysql 存储过程的问题

回复:
user: user-1
content: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令
user-0 提问: 有高手指点一下，为什么C代码下extern "C"引用C++代码一直报错！！！！

回复:
user: user-1
content: extern "C"{ //宣布这里是C代码区域，写的函数都是，C那个样子的,缺省调用约定是cdecl，也不会有函数重载这种东西。 //类，名空间的定义，当然也不会有，不过 在此区域外部定义的一切。 //在此区域内部的函数中,可以使用。 //PS:C++缺省调用约定是 stdcall //stdcall // cdecl 返回值通过寄存器传递，32BITS X86 是 char,short,int,(long?)，void*,==>  eax,  //long long(__int64), ===>edx:eax   ,float,double===> 浮点寄存器堆栈存放 // //参数用堆栈传递，参数从右向左入栈 //参数尺寸 char,short,int,(long?),void*===> int //float,double ===>double //函数名，前面加下划线 后加 @ 加 参数长度  _fun@N      n是数字，表示参数总长度。 //被调用者（callee）清栈32BITS Windoes X86 用 ret N 指令 N 就是函数名字中的数字， //所以,即使编译成库代码，也可以获得参数长度  // //--------------------------------- // cdecl 返回值通过寄存器传递，32BITS Windoes X86 是 char,short,int,(long?)，void*,==>  eax,  //long long(__int64), ===>edx:eax   ,float,double===> 浮点寄存器堆栈存放 // //参数用堆栈传递，参数从右向左入栈 //参数尺寸 char,short,int,(long?),void*===> int //float,double ===>double //函数名，前面加下划线  //调用者（caller）清栈，32BITS Windoes X86 ，一般add esp，n 这种指令。 // ｝  extern "C" int add(int x,int y){ return x + y ; //这个函数是C 式样的，返回值和参数最好不要有类类型。 //否则，没有必要定义为extern "C" //此函数编译成 cdecl 函数 函数名编译成 _add }  extern "C" __stdcall int fun(int x,int y){ 	return x + y; //标准调用约定，是C++采用的调用约定,也希望编译成 C 式样的 函数名 编译成 _fun@8 ，8 是参数字节数 extern "C" int x=0;  // x 编译成 _x

user: user-1
content: extern "C"{  //一般只是一些函数，偶尔可以有一些变量。 //一般不会有，类，名空间的定义，更不会有继承。  }

user: user-1
content: extern "C"{  //一般只是一些函数，偶尔可以有一些变量。  }  extern "C"; extern "C++" 这两种用法只在C++ 中会有，C 中是不会有的。  extern "C" ;可以写函数，编译成.lib,.dll供 C 调用； 也可以写函数声明，导出动态库的函数,供C++调用

user: user-2
content: c++是向前的， 反了

user: user-3
content: extern "C" 是调用C代码，C中无法调用c++

user: user-4
content: ｃ　是　ｃ＋＋　的子集

user: user-5
content: extern "C" 是让C++调用C用的，你用反了吧
user-0 提问: C语言倒水问题

回复:
user: user-1
content: 一个最基本的深度搜索或广度搜索，加已遍历状态来剪枝。 借助stl的话，代码可能就20行。

user: user-2
content: 用程序，暂时还没想到如何写。

user: user-2
content: 要4升，直接用4升杯。  倒2升的方法： 　　10升水，倒入3升杯；再把这3升倒入4升。 　　再从10升杯中，把水倒入3升杯；再把3升中的水倒入4升杯，4升杯满时，就是2升和4升的了。

user: user-3
content: m剩下（m-(n-m)）上面打错了

user: user-3
content: 规律是这样，一个m杯一个n杯倒x升水(m<n,x<n)； m%n==x? 2m%n==x? 3m%n==x? 举个例子，2m%n若等于x,即  n-m（n剩下n-m），然后 m-(n-m) m剩下（n-(n-m)） 不过对于迅速判断能否倒出x，还没想到好方法

user: user-4
content: 坐等高手提供思路，，，

user: user-5
content: 提一个较简单的方法，先灌满10升水杯，把10升水杯的水倒满3升水杯，再把3升水杯的水倒到4升水杯中，然后把10升水杯的剩余的水继续倒满3升水杯中，这时10升水杯的水就只剩下4升

user: user-6
content: 坚决消灭领会副.

user: user-0
content: 大哥！我就是这么问呢！

user: user-7
content: 额,想了一下,只能写出一个很复杂,占用很多RAM的穷举法. 有没有什么巧妙一点的方法,得出所有结果

user: user-5
content: 编程语言只是实现的手段，楼主先要考虑好整体思路，具体是如何操作，而不是语言本身。
user-0 提问: 有什么SDK/API的书吗？

回复:
user: user-1
content: 套接字的话从unix/linux开始学起吧，所谓一通百通，全身轻松。

user: user-2
content: 参考http://blog.csdn.net/21aspnet/article/details/6694485  引用 6 楼 u012419374 的回复:[quote=引用 2 楼 max_min_ 的回复:] 学些Linux网络编程！   图形的学习Qt吧 夸平台 不像MFC太局限！ 学C语言网络编程有什么好的书吗[/quote]

user: user-0
content: 引用 2 楼 max_min_ 的回复:学些Linux网络编程！   图形的学习Qt吧 夸平台 不像MFC太局限！ 学C语言网络编程有什么好的书吗

user: user-3
content: 个人觉得，研究linux核心吧！当然如果需要在window上开饭，你还是需要端它的碗——API

user: user-4
content: 《Windows API编程》 挺具有代码性的

user: user-2
content: 《Windows API编程》（http://product.china-pub.com/25130#ml）比较符合你的需求。 另外《Windows API开发详解》（http://product.china-pub.com/55442）也可以参考一下。 有激情的话，还可以研究一下《Windows环境下32位汇编语言程序设计》（http://product.china-pub.com/3768243）。   引用 楼主 u012419374 的回复:看完了windows程序设计第五版后想继续学SDK编程，但是实在不想学MFC  买了本王艳平的windows程序设计第二版，看着挺不错的，但是看到第五章居然开始讲MFC了....  就没什么纯SDK的书吗，  我想学钩子和套接字编程等等实用性强的东西

user: user-5
content: 学些Linux网络编程！   图形的学习Qt吧 夸平台 不像MFC太局限！

user: user-6
content: windows核心编程，windows网络编程 还是多动手练练吧，比看书强...
user-0 提问: 【C语言】有关gcc优化和全局变量的疑惑

回复:
user: user-1
content: 一般选离自己最近的变量

user: user-2
content: 这个应该和GCC参数有关！就像你说的那样，优化了！全局变量都是放在data段中，是容的不得重复的！

user: user-0
content: 也就是说：两个int a;都是声明，那声明与定义的具体区别呢？网上有说 “声明一个变量意味着向编译器描述变量的类型，但并不为变量分配存储空间。 定义一个变量意味着在声明变量的同时还要为变量分配存储空间。”  这句话我怎么认为不对呢  #include <stdio.h> #include "fun.h"   int a; int main(void) {     printf("[main] &a = %p\n", &a);      fun();       printf("[main] &a = %p\n", &a);     printf("[main] a = 0x%X\n", a); }  结果： [main] &a = 0x804a01c [fun1] &a = 0x804a01c [fun1] a = 0xFF [main] &a = 0x804a01c [main] a = 0xFF 第一条printf的&a是有地址的啊？

user: user-3
content: 要加上 -Wredundant-decls选项才会警告，默认是关闭的：  gcc -Wredundant-decls -o main main.c fun.c  引用 楼主 js_xj 的回复:现有文件main.c  fun.c  fun.h，编译环境ubuntu10.10，gcc-4.4.3。 main.c  #include <stdio.h> #include "fun.h"  int a; int main(void) { 	fun();  	printf("[main] &a = %p\n", &a); 	printf("[main] a = 0x%X\n", a); }  fun.c  #include <stdio.h> #include "fun.h"  int a; void fun(void) { 	a = 0xff;  	printf("[fun] &a = %p\n", &a); 	printf("[fun] a = 0x%X\n", a); }  fun.h  #ifndef _FUN__H #define _FUN__H  void fun(void);  #endif   编译：gcc -o main main.c fun.c(无警告无错) 执行：./main 结果： [fun] &a = 0x804a01c [fun] a = 0xFF [main] &a = 0x804a01c [main] a = 0xFF  请问：定义了两个全局变量a，为什么在连接的过程中，连接器没有报重复定义的错呢？ ps:我是看了《C陷阱与缺陷》书 “【第4章 连接】 4.2声明与定义”做的实验。

user: user-4
content: #include <stdio.h> #include <stdlib.h>  int a= 2; int a; int main() {     printf("%d\n",a);     printf("Hello world!\n");     return 0; } 可以通过编译 #include <stdio.h> #include <stdlib.h>  int a; int a = 2; int main() {     printf("%d\n",a);     printf("Hello world!\n");     return 0; } 也可以通过编译 #include <stdio.h> #include <stdlib.h>  int a = 5 ; int a = 4; int main() {     printf("%d\n",a);     printf("Hello world!\n");     return 0; } 错误不可以通过编译 说明int a; 在作为全局变量的时候  只有在用与赋值的时候 才是真正意义上的定义  所以不会报重复定义

user: user-4
content: 因为这是俩个int a是声明   #include <stdio.h> #include <stdlib.h>  int a; int a; int main() {     printf("Hello world!\n");     return 0; } 可以通过编译 不报错 是因为编译器给优化掉了吧
user-0 提问: 请教这个错误怎么处理：error C2040: “int”与“char [256]”的间接寻址级别不同

回复:
user: user-1
content: 提示烂了点！

user: user-2
content: 或者a=SETBIT3(a)

user: user-2
content: 很明显噻，自己辛苦算完喽，然后自己又把它扔了！它只是一个表达式，算出结果是个临时值，没有直接体现到a中去，  最起码也得：a|=(1<<3)

user: user-0
content: 回复ls几位： 1. 源代码有错，根本不能置位 正确代码如下： #define SETBIT3(a)  (a=a|(1<<3))  2. 源代码保存为c可以正常编译和执行，保存为cpp不能正常编译，会出现如上错误  3. 谢谢ls几位了~

user: user-3
content: 改个变量名 把a换成别的变量名试试

user: user-3
content: 把主函数放到最后去 你这个程序就这三句话 是没问题的 是可以编译通过的 你试试这个程序 #include <stdio.h> #include <stdlib.h>  #define SETBIT3(a)  (a|(1<<3))   int a = 0;   int main() {     SETBIT3(a);       printf("\n");     return 0; } 这说明你的程序 有别的地方错误 或者你是用VC 或者C++ 的环境吧

user: user-4
content: 所给出的代码片断没什么问题的。  引用 楼主 lllgyt327 的回复:　　Windows C; 　　出错代码： 　　#define SETBIT3(a)  (a|(1<<3)) 	int a=0; 　　SETBIT3(a); 　　错误提示： 　　error C2040: “a”: “char”与“char [256]”的间接寻址级别不同 　　error C2296: “|”: 非法，左操作数包含“char [256]”类型   -------------------  谢谢各位   --------------------------------
user-0 提问: C语言有没有从文件中读取一行字符串的方法

回复:
user: user-1
content: char* a; gets(a); 这就OK了！

user: user-2
content: 引用 11 楼 AnYidan 的回复:The input and output functions, types, and macros defined in <stdio.h>http://en.cppreference.com/w/c/io 总能找到合适你的函数

user: user-3
content: The input and output functions, types, and macros defined in <stdio.h>

user: user-0
content: 上面的几个没看明白要求，是C语言，getline是C++的好不

user: user-4
content: fgets是符合C语言最好的方法。  引用 楼主 nabasasun 的回复:C语言，用传统的方法，谢谢！  以换行符作为结尾，并记录行号。  把得到的字符串存放在char数组中。

user: user-5
content: fgets 可以 fscanf 更好[如果只需要获取行数 使用fscanf可以不考虑缓冲区大小的问题]

user: user-6
content: fgets()就可以  FILE *fp; char str[256]; fgets(str, 256, fp); 意思为从fp中读一行，放入str中  记录行号的话，设定个量计数就行了

user: user-7
content: getline有C++版本和linux下的C版本。 标准C函数：char *fgets(char *buf, int bufsize, FILE *stream);

user: user-8
content: ssize_t getline(char **lineptr, size_t *n, FILE *stream);

user: user-9
content: getline()

user: user-10
content: 仅供参考#include <stdio.h> #include <string.h> #define MAXLEN 1000 char ln[MAXLEN]; FILE *f; int i,z; int b,n,L; int main(int argc,char **argv) {     if (argc<2) {         printf("Usage:%s fullpathfilename.ext\nget total blank/non-blank/total linenumbers.\n",argv[0]);         return 1;     }     f=fopen(argv[1],"r");     if (NULL==f) {         printf("Can not open file [%s]!\n",argv[1]);         return 2;     }     z=0;     b=0;     n=0;     L=0;     while (1) {         if (NULL==fgets(ln,MAXLEN,f)) break;         L=strlen(ln);         if ('\n'==ln[L-1]) {             if (0==z) {                 for (i=0;i<L-1;i++) {                     if (!(' '==ln[i] || '\t'==ln[i])) break;                 }                 if (i<L-1) z=1;//当前行不是空行             }             if (0==z) b++; else n++;             z=0;         } else {             if (0==z) {                 for (i=0;i<L;i++) {                     if (!(' '==ln[i] || '\t'==ln[i])) break;                 }                 if (i<L) z=1;//当前行不是空行             }         }     }     fclose(f);     if (L>0 && '\n'!=ln[L-1]) {         if (0==z) b++; else n++;//最后一行末尾无'\n'也计算     }     printf("File:[%s] total blank/non-blank/total linenumbers is %d/%d/%d\n",argv[1],b,n,b+n);     return 0; }

user: user-11
content: c的getline是扩展吧，win下貌似木有，按6楼说的用fgets为妥...

user: user-12
content: getline是C++的  6楼说的函数不错 不过似乎不能判断行
user-0 提问: strtok函数实现一直出现写入冲突问题

回复:
user: user-0
content: 纠正一下，9楼说的初始化是正确的

user: user-0
content: 多谢各位！是这个问题，已解决！

user: user-0
content: 引用 3 楼 JiMoKuangXiangQu 的回复:这里的判断应该是这样写吧： if (/***/str == NULL) str = sstr;      if (/***/str == NULL) return NULL; 其他地方没看，呵呵。 你说的对，谢谢

user: user-1
content: if(*str == NULL) /////         str = sstr;     if(*str == NULL) /////         return NULL;  确实基础还要加强啊.  你这里是相判断指针, 应该用 str == NULL, *str表示对指针解引用了.  注意同定义指定变量时的*加以区别.

user: user-2
content: 先把基础打好吧！

user: user-3
content: char *str ="asdf,dsgfsd,dsfhs";字符串内存是不能修改的  可以动态分配或者用数组搞定

user: user-4
content: 这里的判断应该是这样写吧： if (/***/str == NULL) str = sstr;      if (/***/str == NULL) return NULL; 其他地方没看，呵呵。

user: user-5
content: int main(){ char *str ="asdf,dsgfsd,dsfhs"; *str = '\0'; return 0; }  一定出错的 char *str 为只读的不可写

user: user-6
content: char *str ="asdf,dsgfsd,dsfhs"; 改用数组的

user: user-0
content: 引用 10 楼 dkhghj 的回复:[quote=引用 9 楼 guokefly 的回复:] static char *sstr ; static char *s1, *s2; 初始化赋NULL 同建议， 打好基础 这里不能初始化吧，因为每一次调用是在前一次的sstr，s1上进行处理，第一次除外 确实要好好打基础[/quote] s1可以不使用static，去掉s2

user: user-0
content: 引用 9 楼 guokefly 的回复:static char *sstr ; static char *s1, *s2; 初始化赋NULL 同建议， 打好基础 这里不能初始化吧，因为每一次调用是在前一次的sstr，s1上进行处理，第一次除外 确实要好好打基础

user: user-7
content: static char *sstr ; static char *s1, *s2; 初始化赋NULL 同建议， 打好基础
user-0 提问: c.h.cpp文件包含问题

回复:
user: user-1
content: 我想你大概把“结构名”和变量名搞错了 //c2.h struct  { int a; }integer; 这是定义一个变量，integer已经是一个变量了，如果要把integer作为结构名的话你应该这样写  //c2.h struct integer  { int a; };

user: user-0
content: 三种都试了，编译都没通过。大神，帮忙再看看！

user: user-2
content: 1) c3.cpp从项目中移除 2）c3.cpp 中 添加  #include "c2.h" main.cpp 中 #include "c3.cpp" 替换为 void print(integer item); 3)c3.cpp 中 void print(integer item) 改为  inline  void print(integer item)

user: user-3
content: #include "c3.cpp" 这样不好  你建个c3.h,吧定义都写进去，然后 #include "c3.h"

user: user-4
content: 你这些所谓的头文件定义是很混乱的，但这不是你出错的主要问题，你把struct类的申明和定义搞混了，应该是  struct integer; { int a; }  但是这样修改之后应该还是编译不过的，这就是你这些头文件的问题了，比如在c3.cpp  void print(integer item) { item.a=1; printf("%d", item.a); }  你要知道这是个cpp文件，是要进行编译的，那么integer printf是哪里来的？这里肯定会报错，那么叫他认识不就行了，前面给他加个#include “c1.h”，#include “c2.h”这样对吗？还是不对，为啥又说你你重复定义了。。。总之问题是相当的多，而且基本上是不可能修正的。 模块化编程的大体方法：  #ifndef __TEXT_H__ #define __TEXT_H__ //你要在别处用的函数体或者变量 #endif  这样定义的好处是你可以重复的包含此文件，而只被加载一次，之后在.c 或.cpp文件中实现函数原型，最后在你想要调用该函数的地方加上上面定义的头文件即可！ 另外使用extern关键字也可以进行外部函数或变量的引用。

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

user: user-0
content: 谢谢！这个问题解决了！  //t1.cpp void print() {}  //t2.cpp #include "t1.cpp" int main() { }  出现这个错误："void __cdecl print(void)" (?print@@YAXXZ) already defined in t1.obj 请问大神，这个怎么解决，我需要利用t1.cpp中的代码 谢谢！

user: user-6
content: void print(integer item) { item.a=1; printf("%d", item.a); }  放进main.cpp
user-0 提问: 嵌套的N层循环

回复:
user: user-1
content: 二楼代码动态内存申请大小有点问题，应更正下：  //depth表示循环嵌套层数，n表示每层循环的取值个数即[1, n] void func(int depth, int n) {     int cur = 0;     int *tab = (int *)malloc(depth * sizeof(int));     for (*tab = 0; cur >= 0; ) {         ++tab[cur];         if (tab[cur] <= n) {             if (cur == depth - 1) {                 int i;                 for (i = 0; i < depth; ++i) {                     printf("%d ", tab[i]);                 }                 printf("\n");             } else {                 tab[++cur] = 0;             }         } else {             --cur;         }     }     free(tab); }

user: user-2
content: 引用 2 楼 hello_world000 的回复: //depth表示循环嵌套层数，n表示每层循环的取值个数即[1, n] void func(int depth, int n) {     int cur = 0;     int *tab = (int *)malloc(n * sizeof(int));     for (*tab = 0; cur >= 0; ) {         ++tab[cur];         if (tab[cur] <= n) {             if (cur == depth - 1) {                 int i;                 for (i = 0; i < depth; ++i) {                     printf("%d ", tab[i]);                 }                 printf("\n");             } else {                 tab[++cur] = 0;             }         } else {             --cur;         }     }     free(tab); }   这个算法楼主可以参考一下。

user: user-1
content: //depth表示循环嵌套层数，n表示每层循环的取值个数即[1, n] void func(int depth, int n) {     int cur = 0;     int *tab = (int *)malloc(n * sizeof(int));     for (*tab = 0; cur >= 0; ) {         ++tab[cur];         if (tab[cur] <= n) {             if (cur == depth - 1) {                 int i;                 for (i = 0; i < depth; ++i) {                     printf("%d ", tab[i]);                 }                 printf("\n");             } else {                 tab[++cur] = 0;             }         } else {             --cur;         }     }     free(tab); }

user: user-3
content: 根本取决于你要解决的算法，用迭代取代递归是完全没有问题的，只是你所归纳的嵌套N层循环太过牵强了。  引用 楼主 ws0308 的回复:问题在这里http://bbs.csdn.net/topics/220017714 实现嵌套N层循环，不用递归。其中6楼的伪代码好像很厉害的样子，但是还没看懂。。。 有没有哪位大牛按照哪种思路写成可执行的程序，就以下面的3层循环为例吧  #include <stdio.h> int main(int argc, char *argv[]) {     int a,b,c;     for (a=1;a<=5;a++)         for (b=1;b<=;b++)             for (c=1;c<=5;c++)                 printf("%d %d %d\n", a,b,c);     return 0; }

user: user-4
content: http://www.codeproject.com/Articles/418776/How-to-replace-recursive-functions-using-stack-and
user-0 提问: 文本文件添加字符串的问题

回复:
user: user-1
content: 将数据存入到CString对象cs中 CString cs=...; cs.ReverseFind()//使用之，由后向前查找空格字符 cs.Insert()//在查的位置上，插入你希望的字串

user: user-2
content: 思路是先把文本文件里的东西读出来 保存 按空格分隔掉 起始处特殊处理下 定义一个长的数组 大一点 char key[1024];  之后strcat(key,"hello") 在strcat 你分隔的  写个循环 debug下 就解决了吧 之后再写入进文本ok

user: user-3
content: step1.计算原始串的长度 step2.统计字符串中0的个数 step3.算出加入hello后新串的长度，动态开辟新的内存 step4.循环截取原串中的字串，以此将hello和各个字串追加到新的内存中

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

回复:
user: user-0
content: p1=&(p->data[n]); p2=&(p->data[p->length]); 这样就ok了 感谢答复

user: user-1
content: *p是赋值，不是赋地址！ 像上面那样改改就没问题了！

user: user-2
content: *p1=(p->data[n]); *p2=(p->data[p->length]);   或者  p1=&(p->data[n]); p2=&(p->data[p->length]);

user: user-3
content: 33 34 行 不用取地址符！ *p1=(p->data[n]); *p2=(p->data[p->length]);

user: user-0
content: 忘了加一个头文件 #include<stdio.h>
user-0 提问: 二叉树的先序问题。，

回复:
user: user-1
content: 二叉树的先序是ABCFHIDGJE ,中序是AHIFCJGDEB.   可以排出来，是这样一棵树          A                      B                        F           C          H                    I            D         G   E       J

user: user-1
content: 引用 2 楼 zdnexus 的回复:我也觉得是的、前序是A，中序又是A。蛋疼嗄 这个有没有问题，不知道  前序是A，中序又是A，是没有问题的，根节点A 只有一个子树，还是右子树。

user: user-0
content: 我也觉得是的、前序是A，中序又是A。蛋疼嗄

user: user-2
content: http://www.cnblogs.com/zhangchaoyang/articles/2008434.html 你的题好像出错了
user-0 提问: 链接库问题

回复:
user: user-1
content: 解决办法是就是#1楼说的.

user: user-1
content: 一般都不去包含.cpp文件, 因为.cpp文件往往都是独立的编译单元, include的文件在编译时会被展开.  你包含了.cpp文件, 那么.cpp文件也会在这里被展开. 这样你的t1.cpp中的函数就会在两个编译单元中都有了实体, 链接器链接的时候就不能决定用哪个, 就会报已经定义了.

user: user-2
content: 楼上办法是其一   其实可以放在一个源文件里的～

user: user-3
content: //t1.h void print();  //t1.cpp #include "t1.h" void print() {}  //main.cpp #include "t1.h" int main() { return 0; }
user-0 提问: 程序编译运行问题

回复:
user: user-1
content: 伪代码是为了让人容易理解，但不能在机器上运行的。

user: user-2
content: 你需要将伪代码改写成C标准程序，那样才可以在编译器中运行的

user: user-3
content: ++  引用 1 楼 lelieven 的回复:那个是伪码，要按照C语言的标准修改一下！

user: user-4
content: 《数据结构C语言版》

user: user-5
content: 单步调试！ 根据编译的错误一步一点的调试！ 调试代码是程序员的基本技能的啊

user: user-6
content: 那个是伪码，要按照C语言的标准修改一下！
user-0 提问: 这问题有谁见过吗！！！求帮助！！

回复:
user: user-1
content: #include<stdio.h> #include<io.h> int exists(char *filename){     return (access(filename, 0) == 0);  } int main () {     char oldname[80],newname[80];     printf("File to rename: ");     gets(oldname);     printf("New name: ");     gets(newname);     if(exists(oldname)){      if (rename(oldname,newname) == 0)         printf("Renamed %s to %s.\n",oldname,newname);     else         perror("rename");     } }

user: user-0
content: 无法编译通过。。。。。。。。。疼死我了。这个程序是要实现一个重命名的功能!!!!

user: user-2
content: 首先 你写个程序连个返回值都不写 这也太不负责了  #include <stdio.h> int main(void) { char oldname[80], newname[80]; /* prompt for file to rename and new name */ printf("File to rename: "); gets(oldname); printf("New name: "); gets(newname); /* Rename the file */ if (rename(oldname, newname) == 0) printf("Renamed %s to %s.\n", oldname, newname); else perror("rename"); return 0; } 执行过程： File to rename: D:\\in.dat New name: G:\\in.dat Renamed D:\\in.dat to G:\\in.dat. 这样就实现了in.dat从D盘移动到G盘。

user: user-1
content: 写个exists 函数吧。 BCB 的例子：  #include <io.h>   int file_exists(char *filename);   int main(void)  { 	printf("Does NOTEXIST.FIL exist: %s\n", 			 file_exists("NOTEXISTS.FIL") ? "YES" : "NO"); 	return 0;  }   int file_exists(char *filename)  {    return (access(filename, 0) == 0);  }  你的程序的修改：  #include<stdio.h> #include<io.h> int exist(char *filename){     return (access(filename, 0) == 0);  } int main () {     char oldname[80],newname[80];     printf("File to rename: ");     gets(oldname);     printf("New name: ");     gets(newname);     if(exists(oldname)){      if (rename(oldname,newname) == 0)         printf("Renamed %s to %s.\n",oldname,newname);     else         perror("rename");     } }

user: user-3
content: 用absolute path.

user: user-4
content: 改成绝对路径不行么

user: user-5
content: #include<stdio.h> #include<io.h> int exist(char *filename) {    return (access(filename, 0) == 0); } int main() {     char oldname[_MAX_PATH],newname[_MAX_PATH];     printf("File to rename: ");fflush(stdout);     gets(oldname);     printf("New name: ");fflush(stdout);     gets(newname);     if (exists(oldname) && !exists(newname)) {         if (rename(oldname,newname) == 0)             printf("Renamed %s to %s.\n",oldname,newname);             return 0;         else             perror("rename");             return 2;     }     return 1; }
user-0 提问: 想象一个应用场景,应用返回函数(*foo[])()形式

回复:
user: user-1
content: State pattern算一个？

user: user-0
content: 引用 1 楼 user-2 的回复:函数指针数组  应用返回函数(*foo[])()形式--- 指的是什么呢？  是让我写一个函数，以一个 函数指针数组 为返回值 么？

user: user-0
content: 应用返回函数(*foo[])()形式--- 指的是什么呢？  是让我写一个函数，以一个 函数指针数组 为返回值 么？

user: user-2
content: 函数指针数组
user-0 提问: 奇偶排序，怎么一直是错误的输出结果？

回复:
user: user-1
content: 引用 4 楼 zhang5476499 的回复:[quote=引用 1 楼 qq523176585 的回复:]     for(int i=0;i<n;i++)     {         printf("%d  ",a[i]);     }  你这个n没有定义啊，应该是length改了之后也不是正确的输出，难道是我的理解错误了？[/quote]   为什么我这边可以，不要用VC6.0编译，不支持在函数后面定义新的变量

user: user-0
content: 引用 1 楼 qq523176585 的回复:for(int i=0;i<n;i++)     {         printf("%d  ",a[i]);     }  你这个n没有定义啊，应该是length改了之后也不是正确的输出，难道是我的理解错误了？

user: user-0
content: 引用 2 楼 user-2 的回复:学会debugdubeg了一下午。。。。。。。。。

user: user-2
content: 学会debug

user: user-1
content: for(int i=0;i<n;i++)     {         printf("%d  ",a[i]);     }  你这个n没有定义啊，应该是length
user-0 提问: windows SDK如何判定某个键被长按？

回复:
user: user-1
content: 思路参考《编译原理》中的词法分析和有限状态自动机。

user: user-0
content: 我想知道思路

user: user-1
content: Setting a Breakpoint on a Message Received by a Windows Function You can set message breakpoints to stop the debugger when a particular WndProc function message is received.  Note   Message breakpoints work only on x86- or Pentium-based systems.  To set a breakpoint on a message   From the Edit menu, click Breakpoints.  The Breakpoints dialog box appears.  Click the Messages tab.   In the Break At WndProc text box, type the name of the Windows function.  If you are setting a breakpoint during a debug session, the list contains the exported functions in your project.   In the Set One Breakpoint For Each Message To Watch list box, select the message.   To set another breakpoint, press ENTER, and then repeat steps 3 and 4.  The Breakpoints list displays the currently active breakpoints.  Click OK to set the breakpoints.  Note If you interrupt execution while Windows or other system code is running, the results can be unpredictable.

user: user-1
content: 学会使用Spy++

user: user-0
content: 放到计时器消息下也会卡，但是没那么厉害了。

user: user-0
content: 怎么没人回答？
user-0 提问: linux c 有没有哪个查找字符串的函数

回复:
user: user-1
content: google 很有效

user: user-2
content: http://man.chinaunix.net/develop/c&c++/linux_c/default.htm 参考一下，常用的linux c函数。

user: user-3
content: ++  引用 1 楼 user-6 的回复:strstr函数算不算： 函数描述： 包含文件：string.h 函数名: strstr 函数原型：extern char *strstr(char *str1, char *str2); 功能：从字符串str1中查找是否有字符串str2，如果有，从str1中的str2位置起，返回str1中str2起始位置的指针，如果没有，返回null。 返回值：返回该位置的指针，如找不到，返回空指针。

user: user-4
content: STRSTR Section: Linux Programmer's Manual (3 ) Updated: 2005-04-05  --------------------------------------------------------------------------------    NAME strstr - locate a substring    SYNOPSIS #include <string.h>  char *strstr(const char *haystack, const char *needle);  #define _GNU_SOURCE  #include <string.h>  char *strcasestr(const char *haystack, const char *needle);     DESCRIPTION The strstr() function finds the first occurrence of the substring needle in the string haystack. The terminating `\0' characters are not compared.  The strcasestr() function is like strstr(), but ignores the case of both arguments.     RETURN VALUE These functions return a pointer to the beginning of the substring, or NULL if the substring is not found.    BUGS Early versions of Linux libc (like 4.5.26) would not allow an empty needle argument for strstr(). Later versions (like 4.6.27) work correctly, and return haystack when needle is empty.    CONFORMING TO The strstr() function conforms to ISO 9899. The strcasestr() function is a non-standard extension.    SEE ALSO index(3), memchr(3), rindex(3), strchr(3), strcasecmp(3), strpbrk(3), strsep(3), strspn(3), strtok(3)  --------------------------------------------------------------------------------

user: user-5
content: http://blog.csdn.net/max_min_go/article/details/9292101 参考下博客里的strstr函数 如果想不改变地址的话，自己额外保存一份就好了！

user: user-6
content: strstr函数算不算： 函数描述： 包含文件：string.h 函数名: strstr 函数原型：extern char *strstr(char *str1, char *str2); 功能：从字符串str1中查找是否有字符串str2，如果有，从str1中的str2位置起，返回str1中str2起始位置的指针，如果没有，返回null。 返回值：返回该位置的指针，如找不到，返回空指针。
user-0 提问: sscanf 如何提取字符串

回复:
user: user-1
content: 没有慧眼，难以识珠啊。

user: user-2
content: 上面的例子不是用正则表达式一起弄好了吗？何来一个字符一个字符的？给了这么好的例子都不试一下？  引用 3 楼 aaadddzxc 的回复:必须要一个一个字符弄 不可以直接提取到字符串里面么？

user: user-0
content: 必须要一个一个字符弄 不可以直接提取到字符串里面么？

user: user-0
content: 引用 4 楼 turingo 的回复:上面的例子不是用正则表达式一起弄好了吗？何来一个字符一个字符的？给了这么好的例子都不试一下？  引用 3 楼 aaadddzxc 的回复:必须要一个一个字符弄 不可以直接提取到字符串里面么？ 我只是觉得太麻烦了，我自己写了个 还是用自己的把！

user: user-2
content: ++  引用 1 楼 zhao4zhong1 的回复://3 xxxx "ggasdasd221aad" "sfsef123123" //sscanf 如何提取上面的字符串， 只提取 引号里面的内容！ #include <stdio.h> #define MAXS 10 char s[]="3 xxxx \"ggasdasd221aad\" \"sfsef123123\""; char *p; char d[MAXS][40]; int i,n,r; int main() {     p=s;     i=0;     while (1) {         r=sscanf(p,"\"%39[^\"]\"%n",d[i],&n);         if (1==r) {             i++;             if (i>=MAXS) break;             p+=n;         } else if (0==r) {             p++;         } else break;     }     n=i;     for (i=0;i<n;i++) {         printf("d[%d]==[%s]\n",i,d[i]);     }     return 0; } //d[0]==[ggasdasd221aad] //d[1]==[sfsef123123] //

user: user-1
content: //3 xxxx "ggasdasd221aad" "sfsef123123" //sscanf 如何提取上面的字符串， 只提取 引号里面的内容！ #include <stdio.h> #define MAXS 10 char s[]="3 xxxx \"ggasdasd221aad\" \"sfsef123123\""; char *p; char d[MAXS][40]; int i,n,r; int main() {     p=s;     i=0;     while (1) {         r=sscanf(p,"\"%39[^\"]\"%n",d[i],&n);         if (1==r) {             i++;             if (i>=MAXS) break;             p+=n;         } else if (0==r) {             p++;         } else break;     }     n=i;     for (i=0;i<n;i++) {         printf("d[%d]==[%s]\n",i,d[i]);     }     return 0; } //d[0]==[ggasdasd221aad] //d[1]==[sfsef123123] //
user-0 提问: C语言中类型转换的一点困惑，希望各位大大能给予帮助

回复:
user: user-1
content: 20分你们都抢啊  看来新手变成老鸟是需要很久很久的

user: user-2
content: 你只要知道char 类型的变量范围即可，超出范围会发生截断。看如下代码。  int i = -2;     unsigned int j = 1;     if(i + j > 0)     {         printf("%d\n",i + j);             printf("%0x",i + j);        }

user: user-1
content: #include <stdio.h>  int main() {    char ch1 = 0X8F;     char ch2 = 0X8F;     if(ch1 == (char)0X8F) //结果为假     {       printf("OK\n");     }     if(ch2 == (char)0X8F) //结果为真     {      printf("NO\n");      }   return 0; } 输出OK      NO 不加强制转化char 会默认为int 类型 然而0x8f 正好超出了char的数值范围 所以比较为假啊

user: user-3
content: char 可能是signed char，也可能是unsigned char。这个取决于你的编译器 如果是signed char ，8位的话取值范围是-128..127 而unsigned char 的取值范围是0..255 0x8f已经超过127了

user: user-0
content: 改正一下： unsigned char ch2 = 0X8F;
user-0 提问: 多线程与Libxml2 同时调用xmlReadFile报错

回复:
user: user-1
content: http://blog.csdn.net/Gavin_Han/article/details/1795032

user: user-0
content: 刚使用Libxml2没多久，对于支不支持多线程这块不了解，想问一下Libxml2支持多线程吗？

user: user-2
content: xmlReadFile如果不支持多线程，就要加cristal section, mutex, event等方法。

user: user-3
content: 不明白是什么歌情况~
user-0 提问: [一事不明]scanf和fgets的深层次的东西

回复:
user: user-1
content: 可以通过调试找到原因，再谈解决办法。

user: user-2
content: 坚决消灭领会副  .

user: user-3
content: 仅供参考#include <stdio.h> #include <string.h> #define MAXLEN 1000 char ln[MAXLEN]; FILE *f; int i,z; int b,n,L; int main(int argc,char **argv) {     if (argc<2) {         printf("Usage:%s fullpathfilename.ext\nget total blank/non-blank/total linenumbers.\n",argv[0]);         return 1;     }     f=fopen(argv[1],"r");     if (NULL==f) {         printf("Can not open file [%s]!\n",argv[1]);         return 2;     }     z=0;     b=0;     n=0;     L=0;     while (1) {         if (NULL==fgets(ln,MAXLEN,f)) break;         L=strlen(ln);         if ('\n'==ln[L-1]) {             if (0==z) {                 for (i=0;i<L-1;i++) {                     if (!(' '==ln[i] || '\t'==ln[i])) break;                 }                 if (i<L-1) z=1;//当前行不是空行             }             if (0==z) b++; else n++;             z=0;         } else {             if (0==z) {                 for (i=0;i<L;i++) {                     if (!(' '==ln[i] || '\t'==ln[i])) break;                 }                 if (i<L) z=1;//当前行不是空行             }         }     }     fclose(f);     if (L>0 && '\n'!=ln[L-1]) {         if (0==z) b++; else n++;//最后一行末尾无'\n'也计算     }     printf("File:[%s] total blank/non-blank/total linenumbers is %d/%d/%d\n",argv[1],b,n,b+n);     return 0; }

user: user-4
content: fgets 和scanf %s 的区别至于会不会读取 空白字符  引用我可以确认输入缓冲区是木有东东的 那么 你这句确认 很不可靠

user: user-5
content: 我也觉的不是fputs的问题。。。能不能 贴代码看看

user: user-6
content: fgets很好用，应该不是它的问题。  引用 楼主 u012373530 的回复:我今天写函数的时候，问题简化为，我定义了一个char name[20]={}; 然后用fgets(name,20,stdin);一开始是可以获得输入的。后来继续写的时候，多用了几次，居然出现了问题，直接跳过了这条语句，获得的是空值.......  我可以确认输入缓冲区是木有东东的....  后来我一生气，把用到fgets的地方全部换成 scanf("%s",name);顺利的通过了。  我就有疑问了，为什么会出现这种情况？fgets在什么时候会出现bug？

user: user-0
content: 引用 6 楼 mujiok2003 的回复:可以通过调试找到原因，再谈解决办法。 我调试过了，在它的前一句和后一句都打印一句，都能顺利输出..... 在执行它之前我也清空了输入缓冲区......还是照样跳过了。  算了，不鸟它了。
user-0 提问: 真不知是哪错啦啊。。。。。

回复:
user: user-1
content: max = min = * p; 	while ( p < p1 + n ) 	{ 		if ( * p > max ) 		{ 			max = * p; 			pmax = p; 		} 		p ++; 	} 	temp = * pmax; 人脑执行，输入为 9 0 1 2 3 4 5 6 7 8的时候*p = 9 max =9,然后你这个if 永远不会进入也就是*p > max不会满足，pmax指针为野指针，到*pmax就出错，将if (*p > max)修改为if (*p >= max)
user-0 提问: shell  如何让某个命令在一秒钟执行20次

回复:
user: user-1
content: The AT command schedules commands and programs to run on a computer at a specified time and date. The Schedule service must be running to use the AT command.  AT [\\computername] [ [id] [/DELETE] | /DELETE [/YES]] AT [\\computername] time [/INTERACTIVE]     [ /EVERY:date[,...] | /NEXT:date[,...]] "command"  \\computername     Specifies a remote computer. Commands are scheduled on the                    local computer if this parameter is omitted. id                 Is an identification number assigned to a scheduled                    command. /delete            Cancels a scheduled command. If id is omitted, all the                    scheduled commands on the computer are canceled. /yes               Used with cancel all jobs command when no further                    confirmation is desired. time               Specifies the time when command is to run. /interactive       Allows the job to interact with the desktop of the user                    who is logged on at the time the job runs. /every:date[,...]  Runs the command on each specified day(s) of the week or                    month. If date is omitted, the current day of the month                    is assumed. /next:date[,...]   Runs the specified command on the next occurrence of the                    day (for example, next Thursday).  If date is omitted, the                    current day of the month is assumed. "command"          Is the Windows NT command, or batch program to be run.  Windows 的at 命令； at应该是unix 的命令；那么linux 应该也有。 Windows 的at 命令不过是抄袭一下，照猫画狗而已。

user: user-2
content: 一般很少有指令执行20次 会超过1秒的 当然不排除特殊情况 那就只能用多线程方式同时执行 当不超过1秒 可以完成20次的时候 问题是 你要在这1秒内20次是平均执行的 还是只要在这1秒内执行完20次就结束就可以   取当前时间 time_start  time_end  While（time_end - time_start >=1秒 && count <= 20） { 取当前时间time_end;     计算执行一次的时间   if(一次时间是否小于 20分之1){    执行一次 ;    count++ } else{    一次执行时间为 20分之1 的几倍    启动倍数线程  }    } 这个可以实现的

user: user-1
content: at 命令，可以定时执行一些命令吧。

user: user-3
content: 命令不能并发执行的话就只能一个接一个依次执行，可并发的话可以用多线程或者简单点，在命令后加个 &，让命令进入后台执行，迅速开启20个命令

user: user-4
content: 循环执行, 如果单个命令完成的时间过长, 那么可以用20个线程同时执行这个命令.

user: user-5
content: for /L %%i in (1,1,20) do start 某个命令
user-0 提问: 求各位编程大神帮助，最近有个小程序设计不懂

回复:
user: user-0
content: 谢谢兄弟，想问一下兄弟，能不能给个完整版的程序代码

user: user-1
content: 想要代码吗？

user: user-2
content: 词法分析知道吧？  现将字符串弄成一个单词一个单词的，然后，在一个单词一个单词的进行显示。    LPCTSTR lpszBuffer = _T("abc aaa bbb if else and some words"); int nPos =0;  TCHAR GetNextChar()  //获取下一个字符 {     return lpszBuffer[ nPos ++ ]; }  BOOL IsSep( TCHAR ch ) // 判断是不是分隔符 {     static LPCTSTR szSep[] = _T(" \t\r\n,.;!:-+....................");     for( LPCTSTR lpSep = szSep; *lpSep; ++ lpSep )     {          if( *lpSep == ch )               return TRUE;     }     return FALSE; }  CString GetNextWords() // 获取下一个单词 {     CString token;     TCHAR ch;     BOOL bInwords = FALSE;      while(( ch = GetNextChar()) != _T('\0'))     {          if( bInwords )          {              if( IsSep( ch ))                  return token;              else                  token += ch;          }          else          {               token = ch;               return token;          }      }      return token; }  void DrawWords( CDC * pDC, CString str, int xPos, int yPos, int nWidth ) {       CRect rc( xPos, yPos, 0, 0 );       pDC->DrawText( str, DT_SIGNLELINE | DT_CALCRECT );       if( rc.right > nWidth )       {            rc.top += g_nLineHeight; //行高  换行            rc.left = 0;       }       pDC->DrawText( str, DT_SINGLELINE ); }  在需要显示的地方：   // other code....   CString str = GetNextWord();   while( ! str.IsEmpty())       DrawWord( str, x, y, right );   // other code....

user: user-3
content: 先找本c语言的书 看看先
user-0 提问: rand()问题

回复:
user: user-0
content: 是其他代码错了

user: user-1
content: 可能是0啊，随机数而已！

user: user-2
content: #include <stdio.h> #include <stdlib.h>  int main() {     int a,b;     srand((unsigned)time(0));     a=rand()%100;     b=rand()%100;     printf("%d,%d\n",a,b);     return 0; } codeblocks运行正常，从未出现0

user: user-3
content: 用法没有问题，b不会一直为0的，估计是你其它代码段的问题，或者是看错了。  引用 楼主 u011779380 的回复:srand((unsigned)time(0)); a=rand()%100; b=rand()%100;  b怎么总是等于0
user-0 提问: 关于getchar函数

回复:
user: user-1
content: 不是所有字符的ASCLL值都在0~127，比如按着Ctr键再按其他字符。

user: user-0
content: 引用 8 楼 lm_whales 的回复:如果输入 0~127 之间 的字符，返回的int 自然就在0~127之间了、 不过键盘可以输入 超过127的字符，可能还有附加信息。  其他比如EOF 明白了，谢过

user: user-0
content: 引用 7 楼 EmptyMind 的回复: 不是所有字符的ASCLL值都在0~127，比如按着Ctr键再按其他字符。 哦。。懂了，谢过

user: user-2
content: 如果输入 0~127 之间 的字符，返回的int 自然就在0~127之间了、 不过键盘可以输入 超过127的字符，可能还有附加信息。  其他比如EOF

user: user-0
content: 引用 4 楼 lm_whales 的回复:int getchar(); getchar(); 的返回值本来就是int  int fgetc(FILE *); fgetc 也是返回int  所有读取单个字符的函数都是返回int putchar();的参数也是int  我明白，我这样说，通过getchar读入一个字符，返回是int型，返回的int型数据肯定是在0～127之间吧？

user: user-0
content: 我明白官网的解释。。。现在对于书上的解释不理解，比如您能给出主题贴第一种情况的例子么？

user: user-2
content: int getchar(); getchar(); 的返回值本来就是int  int fgetc(FILE *); fgetc 也是返回int  所有读取单个字符的函数都是返回int putchar();的参数也是int

user: user-3
content: http://www.cplusplus.com/reference/cstdio/getchar/

user: user-0
content: 我知道，返回的是读入字符的ASCII码（要转换成整形），既然读入的是字符，那其对应的ASCII码又怎么会截断呢？ 有截断的例子么？

user: user-4
content: getchar读取的是字符，返回的是整型数值。  引用 楼主 longjuanfeng0000 的回复:c陷阱与缺陷84页如下描述  #include <stdio.h> int main() {     char c;    /* 改成：int c 就正确了 */        while( ( c = getchar() ) != EOF )     {         putchar( c );     }        return 0; } getchar函数在一般情况下返回的是标准输入文件中的下一个字符，当没有输入时返回EOF（一个在头文件stdio.h中被定义的值，不同于任何一个字符，一般C语言实现定义为-1）。这个程序乍一看似乎把标准输入复制到标准输出，实则不然。      原因在于程序中的变量c被声明为char类型，而不是int类型。这意味着c无法容下所有可能的字符，特别是，可能无法容下EOF。因此，最终结果存在以下几种可能： 1）某些合法的输入在被截断后，使得c的取值和EOF相同；这时程序将在文件复制的中途终止； 2）c根本不可能取到EOF这个值；这时程序陷入死循环； 3）程序表面上似乎能够正常工作，但完全是因为巧合。尽管函数getchar的返回结果在赋值给char类型的变量c时会发生“截断”操作，尽管while语句中比较运算的操作数不是函数getchar的返回值，然而令人惊讶地是许多编译器对上述表达式的实现并不正确。这些编译器确实对函数getchar的返回值做了截断处理，并把低端直接部分赋给了变量c。但是，它们在比较表达式中并不是比较c与EOF，而是比较getchar函数的返回值与EOF，编译器如果采取这种做法，上面的例子程序看上去就能够“正常”运行了。    我的疑问： 1、对于合法输入会不会出现溢出，因为getchar是按照char型字符数据来读入数据的，怎么会出现截断？ 2、没有截断自然也就永远取不到EOF，最终的结果不就是一个死循环么？
user-0 提问: memcpy()将多个buffer顺序存至一块内存遇到的问题

回复:
user: user-1
content: 引用 5 楼 u012241033 的回复:[quote=引用 4 楼 mujiok2003 的回复:] 记得检查start + offset < 10240 感谢您能提供宝贵的代码！谢谢您else if的提示！ 数据已经可以整包送上去了！ 因为下位机发的包大小确定，如果我把代码写成下面这样，是否可以不用检查溢出了呢？ [/quote]   m_pPackBuffer[start + offset]不能越界，因为start+offset在递增。

user: user-0
content: 引用 4 楼 mujiok2003 的回复:记得检查start + offset < 10240 感谢您能提供宝贵的代码！谢谢您else if的提示！ 数据已经可以整包送上去了！ 因为下位机发的包大小确定，如果我把代码写成下面这样，是否可以不用检查溢出了呢？ 			if (nPacketCount < 20) 			{ 				m_pPackBuffer[start + offset] = pBuffer; 				offset = offset + 512; 				nPacketCount ++ ;//分包计数 			} 			//if (nPacketCount = 20) 			else if (nPacketCount = 20) 			{ 				if (m_hParentHwnd) 				{ 					::PostMessage(m_hParentHwnd, WM_SHOW_IMG, (WPARAM)offset, (LPARAM)m_pPackBuffer[start]); 				} 				start = 0; 				offset = 0; 				m_pPackBuffer[start + offset] = pBuffer; 				offset = offset + 512; 				nPacketCount = 1; 			}

user: user-1
content: 引用 3 楼 mujiok2003 的回复:LONG lBufferSize = pDevice->m_nInBufferSize; UCHAR* pBuffer = new UCHAR[lBufferSize]; memset(pBuffer, 0, lBufferSize*sizeof(UCHAR));//初始化数组 LONG lDataLen = lBufferSize; UCHAR* m_pPackBuffer[10240]; static long start = 0; static long offset = 0;   if (nPacketCount < 20) { 	m_pPackBuffer[start + offset] = pBuffer; 	++offset; 	nPacketCount ++ ;//分包计数 } //if (nPacketCount = 20) else if (nPacketCount = 20) { 	if (m_hParentHwnd) 	{ 		::PostMessage(m_hParentHwnd, WM_SHOW_IMG, (WPARAM)offset, (LPARAM)m_pPackBuffer[start]); 	} 	start = offset; 	offset = 0; 	m_pPackBuffer[start + offset] = pBuffer; 	++offset; 	nPacketCount = 1; }  记得检查start + offset < 10240

user: user-1
content: LONG lBufferSize = pDevice->m_nInBufferSize; UCHAR* pBuffer = new UCHAR[lBufferSize]; memset(pBuffer, 0, lBufferSize*sizeof(UCHAR));//初始化数组 LONG lDataLen = lBufferSize; UCHAR* m_pPackBuffer[10240]; static long start = 0; static long offset = 0;   if (nPacketCount < 20) { 	m_pPackBuffer[start + offset] = pBuffer; 	++offset; 	nPacketCount ++ ;//分包计数 } //if (nPacketCount = 20) else if (nPacketCount = 20) { 	if (m_hParentHwnd) 	{ 		::PostMessage(m_hParentHwnd, WM_SHOW_IMG, (WPARAM)offset, (LPARAM)m_pPackBuffer[start]); 	} 	start = offset; 	offset = 0; 	m_pPackBuffer[start + offset] = pBuffer; 	++offset; 	nPacketCount = 1; }

user: user-0
content: 引用 1 楼 zhuben775 的回复:*m_pPackBuffer = *m_pPackBuffer + lDataLen;  你这是啥啊？应该是 m_pPackBuffer = m_pPackBuffer + lDataLen; 不过注意保存原始指针  另外 PostMessage不是阻塞函数，你后面紧接着就清空指针，很危险，应该用sendmessage 谢谢您的指点！但是在我的定义中 LONG lBufferSize = pDevice->m_nInBufferSize; 	UCHAR* pBuffer = new UCHAR[lBufferSize]; 	memset(pBuffer, 0, lBufferSize*sizeof(UCHAR));//初始化数组 	LONG lDataLen = lBufferSize; 	UCHAR* m_pPackBuffer[10240];  如果改成您说的那样，会提示error C2440: '=' : cannot convert from 'UCHAR **' to 'UCHAR *[10240]'

user: user-2
content: *m_pPackBuffer = *m_pPackBuffer + lDataLen;  你这是啥啊？应该是 m_pPackBuffer = m_pPackBuffer + lDataLen; 不过注意保存原始指针  另外 PostMessage不是阻塞函数，你后面紧接着就清空指针，很危险，应该用sendmessage

user: user-3
content: 请记住，凡是消息缓冲，必然会发生“饿死”或“撑死”两种异常。
user-0 提问: C中定义链表的问题

回复:
user: user-1
content: C 加struct list 才是一种类型。  struct alist{     int a;     struct alist *next; };   C++ ,alist 就是struct alist 都是类型名。 另外 C++标准库有个 list 模板 所以，一般类型定义，不要定义成list 这样的名字。  你把你的程序，分别存为 .c ,.cpp 用C，C++编译器分别编译一下，看看。 C一般不能通过，C++一般可以通过。  C++ ，struct,union,class ,enum 类型定义后，不需要加struct,union,class ,enum 等 类型关键字 就是类型名字。  C一般必须加类型名，才是一个完整的类型名字。

user: user-2
content: 建议用typedef 将 struct list定义为自定义类型 list ，就会更有通用性，只写 list 即可； 如果不这样，就不具有通用性，而且也不符合ANSI中C语言结构体的定义，若使用code::blocks等IDE编译时就会出错，因为IDE不认识list，只有用struct list，IDE才认识。  #include <stdio.h> #include <stdlib.h>  typedef struct list{ 	int a; 	struct list *next; }list;  struct list * node() { 	return (list *)malloc(sizeof(list)); }  int main() { 	list *l = node(); 	return 0; }

user: user-3
content: 应该是编译器版本问题，，

user: user-3
content: #include<stdio.h> #include<stdlib.h>  struct list{ 	int a; 	list *next; };  list * node() { 	return (list *)malloc(sizeof(list)); }  int main() { 	 	list *l = node();  	return 0; }  刚试过，加不加struct在VS2008中均编译通过
user-0 提问: 共用体，枚举和位域

回复:
user: user-1
content: 引用 7 楼 u011741688 的回复:[quote=引用 6 楼 zhao4zhong1 的回复:] 计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。）  老师 怎么每次都一样？？？[/quote] 图灵机，怎么信息处理都用它？ 冯诺依曼体系结构，怎么还不升级啊？ DNA，怎么生物都有啊？ ……？  道生一，一生二，二生三，三生万物。

user: user-2
content: 接触的多的时候，这些知识会慢慢用上。

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。）  老师 怎么每次都一样？？？

user: user-1
content: 计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-3
content: 底层开发里常用来定义变量，union和共同体在VC++里常见到

user: user-4
content: 在底层的编程中常用

user: user-5
content: 在底层的编程中都常用， c 语言中最常用的操作符可能是 =,书上讲的多吗？

user: user-6
content: 位域用的极少，枚举经常用，共用体用的不多。  引用 楼主 u011741688 的回复:为什么书里讲解共用体，枚举和位域就那几页。只讲了怎么定义及调用。请问是不是基本上不用，它们的作用书上讲的也很少？请它们的主要作用在哪里？呵呵！！理解差，详细下哈！！谢谢。。

user: user-7
content: 共用体（联合）就是将不同的数据类型让他们使用同一块内存区域，一个用途是节约内存，另一个用途是可以非常奇妙的做一个类型转换。比如： union _Chinesecode {     char code[ 2 ];     word wcode; };  _Chinesecode you; strcpy_without_0 ( you.code, "你" ); printf you.wcode;   枚举就是列出一些常量。效果就跟#define似的。  位域纯粹是为了节约内存，就是在同一个32位数中，再分成不同的区域，如果不是特别需求，已经不推荐使用了。因为访问速度比较慢。CPU会一下读取整个32位/64位数据。
user-0 提问: 新手求助~~~ 看看程序错在哪儿~ 为什么功能实现不了

回复:
user: user-1
content: List L;//这个定义不对吧

user: user-2
content: 参数需要传入指针或者引用才可以修改值，请传入list *L 或者 list &L

user: user-3
content: 错误太多，几乎无从下手

user: user-4
content: void Insert(int x,List L,positon P) Insert() 和主函数调用的时候不一样吧？参数是不是没给？ 还要就是最好用指针做形式参数来改变表吧。

user: user-5
content: 参数要用list* L才行，list L相当于是局部变量的内容在修改，函数退出后对实参无任何影响。  引用 楼主 u012397131 的回复:建立一线性表，从键盘输入四个元素，然后插入一元素，成为一个有五个元素的新表，并输出这个新表~ #include<stdio.h> #include<stdlib.h> struct List { 	int data; 	int size; }; typedef struct List *list;  struct Position { 	int Element;         struct Position *Next;  }; typedef struct Position *positon;  void Insert(int x,List L,positon P) { 	positon TmpCell; 	TmpCell=(positon)malloc(sizeof(struct Position)); 	if(TmpCell=NULL) 	    printf("Out of space!"); 	TmpCell->Element=x; 	TmpCell->Next=P->Next; 	P->Next=TmpCell; } void print(list L) {  	int i;         for(i=0;i<L->size;i++)  		printf("%d\t",L->data); } int main() { 	int x; 	List L; 	L.size=5; 	printf("请输入表中的4个数据：");         for(int i=0;i<4;i++) 		scanf("%d",&L.data); 	printf("按顺序输入想要在某一插入的数值和位置：");         scanf("%d",&x); 	void Insert();         void print(list L); 	return 0; }
user-0 提问: 线程完全没有运行怎么办

回复:
user: user-1
content: 没有wait? windows开线程需要waitforsingleobject，等待线程终止后在注销句柄等东西

user: user-2
content: pthread_create(&pro_thread, &attr, pro_main,NULL); 返回值是什么 确定创建成功了吗

user: user-3
content: pthread_create(&pro_thread, &attr, pro_main,NULL);  sleep(1000); 或者用 pthread_join函数 pthread_attr_destroy(&attr);
user-0 提问: c中的 动态数组 与进阶的 结构体动态创建 问题

回复:
user: user-1
content: 都是running-time是产生的，理论上没有问题，要考虑的是效率和碎片

user: user-0
content: 哦原来是我误解了 开始的 char *colname[n]; 其实是定义了n个指针，并没有为他分配内存，而直到运行到了 for（i = 0; i < n; i++） {    colname[i] = (char*)malloc(sizeof(a.colname[i]) * sizeof(char));  } 的时候，才真正为其分配了内存，接着就可以对colname[i]中放对应的字符了。 strcat(colname[i], a[i].colname);  引用 1 楼 turingo 的回复:都是可以动态分配的，n1可以是变量，可以：  colname = (char*)malloc(n1 * sizeof(char)); ... a = (struct sample1*)malloc(n2 * sizeof(struct sample1));   [quote=引用 楼主 InSpirit1 的回复:] struct sample1 {																			//定义结构体变量，并分配64组 	char tabname[64]; 	char value[64]; 	char expression[64]; }; 	struct sample1 a[256] = {NULL};	   //初始化为0  char colname[4096] = "";				 char value[4096] = ""; .....                                      //赋值a[i].tabname,a[i].value的过程 .....                                      // .....                                      // for(int i = 0; i < n; i++)                 //字符串拼接 { 	strcat(colname, a[i].colname); 	strcat(colname, ","); 	strcat(value, "'"); 	strcat(value, a[i].value); 	strcat(value, "',"); }  这是我程序的大致结构。 1、由于定义的char数组为4096太多了，我想将其优化为动态数组，我看用malloc和free可实现。 网上的例子都将colname = (char*)malloc(n1 * sizeof(char));中的n1当成已知量，而我的n1是变量，每次循环大小不一样，能否贴个类似的例子给我参考下 2、如何将结构体定义的struct sample1 a[256]也设置成动态内存，而不是固定的256组？[/quote]

user: user-2
content: 可以是动态的阿！这就是处理动态数据的一个比较好的办法阿！ 你只要你传进去对应的需要分配的参数的实际大小就好了！

user: user-3
content: 都是可以动态分配的，n1可以是变量，可以：  colname = (char*)malloc(n1 * sizeof(char)); ... a = (struct sample1*)malloc(n2 * sizeof(struct sample1));  引用 楼主 InSpirit1 的回复:struct sample1 {																			//定义结构体变量，并分配64组 	char tabname[64]; 	char value[64]; 	char expression[64]; }; 	struct sample1 a[256] = {NULL};	   //初始化为0  char colname[4096] = "";				 char value[4096] = ""; .....                                      //赋值a[i].tabname,a[i].value的过程 .....                                      // .....                                      // for(int i = 0; i < n; i++)                 //字符串拼接 { 	strcat(colname, a[i].colname); 	strcat(colname, ","); 	strcat(value, "'"); 	strcat(value, a[i].value); 	strcat(value, "',"); }  这是我程序的大致结构。 1、由于定义的char数组为4096太多了，我想将其优化为动态数组，我看用malloc和free可实现。 网上的例子都将colname = (char*)malloc(n1 * sizeof(char));中的n1当成已知量，而我的n1是变量，每次循环大小不一样，能否贴个类似的例子给我参考下 2、如何将结构体定义的struct sample1 a[256]也设置成动态内存，而不是固定的256组？
user-0 提问: 请教这题怎么做

回复:
user: user-1
content: int is_white(int ch) {     if(ch == ' ' || ch == '\n' || ch == '\r' || ch == '\v' || ch == '\t' || ch == '\f')           return 1;     else           return 0;       } void deblank(char string[]) {      char *src;      char *dst;      char str[100] = {0};      char ch;      /*      **set two pointers to begining of the string      **,then move to 2nd character in the string      */      src = string;      dst = str;      /*      **Examine the string from the source string      */      while((ch = *src++) != '\0')      {                if(is_white(ch))                {                     if(src == string || !is_white(*(dst-1)))/*空格出现在串首或者它的前一个字符不是空格则存储为空格*/                             *dst++ = ' ';                           }                else                            *dst++ = ch;      }      *dst = '\0';      printf("%s\n",str);           } 这是两个函数，当然也可以归纳为一个函数，用这两个函数就能满足你的条件了，主函数我就没写了

user: user-1
content: 你自己写的这个不是统计有多少个空格么，而且其中有错误
user-0 提问: select后recv的问题

回复:
user: user-1
content: 引用 5 楼 hepeizhong2010 的回复:我用select指定超时时间来检测状态。在我select返回大于0时，说明描述符已经就绪了，那我recv应该能得到数据，可是为什么recv错误，错误代码10035，无法立即完成一个非阻止性套接字操作。而我等待一段时间再recv就能得到数据，我的问题就在这里。  select函数用法就写错了 改成这样！ select(clientC+1, &r, 0, 0, &timeout);

user: user-2
content: 《TCP-IP详解卷二：实现》

user: user-0
content: 我用select指定超时时间来检测状态。在我select返回大于0时，说明描述符已经就绪了，那我recv应该能得到数据，可是为什么recv错误，错误代码10035，无法立即完成一个非阻止性套接字操作。而我等待一段时间再recv就能得到数据，我的问题就在这里。

user: user-0
content: 引用 2 楼 max_min_ 的回复: int select(int nfds, fd_set *readfds, fd_set *writefds,            fd_set *exceptfds, struct timeval *timeout);  //能说下你select是要干啥呢? //1 如果当成sleep作用的话，前面都设置空 //2 如果是监听套接字的话，第一个参数是监听的套接值+1 select(clientC+1, &r, 0, 0, &timeout); 是这样的，我想用select做recv的超时，我得到select的返回值为1，可是马上recv的话返回的是-1.

user: user-3
content: 1. socket 编程要检查返回值 2. 学会查函数的原型--google

user: user-1
content: int select(int nfds, fd_set *readfds, fd_set *writefds,            fd_set *exceptfds, struct timeval *timeout);  //能说下你select是要干啥呢? //1 如果当成sleep作用的话，前面都设置空 //2 如果是监听套接字的话，第一个参数是监听的套接值+1 select(clientC+1, &r, 0, 0, &timeout);

user: user-4
content: ret = select(0, 0, &r, 0, &timeout); 的第二个参数是rd, 第三个参数是wd 第四个参数是ed, 你第三个参数应该放在第二个参数上： ret = select(0, &r, 0, 0, &timeout);
user-0 提问: 求助，有关C函数的初级问题

回复:
user: user-0
content: 问题已解决，但其中原理是什么呢？

user: user-1
content: 引用 4 楼 u012373530 的回复:scanf ("%lf%lf",&a,&b); 你这里的"%lf%lf"不是以逗号隔开的，所以你输入应该以空格隔开，比如输入： 5.55555   6.666666 或者你把"%lf%lf"改为"%lf,%lf" 支持&同意这种观点 或者将scanf ("%lf%lf",&a,&b);改为scanf ("%lf,%lf",&a,&b);,控制台输入方式同楼主的截图所示。

user: user-2
content: printf() double 格式用 %f

user: user-3
content: 前后格式对应起来就好

user: user-4
content: scanf ("%lf%lf",&a,&b); 你这里的"%lf%lf"不是以逗号隔开的，所以你输入应该以空格隔开，比如输入： 5.55555   6.666666 或者你把"%lf%lf"改为"%lf,%lf"

user: user-5
content: 想怎么输入都行的话，参考下面： #include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-6
content: 引用 1 楼 turingo 的回复:输入的时候把逗号改为空格。  [quote=引用 楼主 k91191 的回复:] 我编写了这样一段代码想要返回两个数的的最小值： #include <stdio.h> double min (double x,double y); int main (void) { 	double a,b,c; 	scanf ("%lf%lf",&a,&b); 	printf ("a=%lf,b=%lf\n",a,b);         c=min (a,b); 	printf ("%lf\n",c); 	return 0; }  double min (double x,double y) {           if (x<y)      return x;       else       return y; }  结果却是： 为什么b和最终结果都为0.000000[/quote] 狗哥正解啊

user: user-7
content: 输入的时候把逗号改为空格。  引用 楼主 k91191 的回复:我编写了这样一段代码想要返回两个数的的最小值： #include <stdio.h> double min (double x,double y); int main (void) { 	double a,b,c; 	scanf ("%lf%lf",&a,&b); 	printf ("a=%lf,b=%lf\n",a,b);         c=min (a,b); 	printf ("%lf\n",c); 	return 0; }  double min (double x,double y) {           if (x<y)      return x;       else       return y; }  结果却是： 为什么b和最终结果都为0.000000