Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 急急急   C/C++字符串与整型异或运算

回复:
user: user-1
content: 1.第一步： c^a = 1110 ^ 0011 = 1101 = 13; 2. 第二步：~（c^a）= 1111 1111 1111 0010; 因为补码是负数。对应的原码为为补码取反+1<符号位不动>。结果为：1000 0000 0000 1110，为-14； 3. 第三步：~（c^a）<<4 = 1000 0000 1110 0000; 结果-224

user: user-2
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-3
content: 楼主应该是打算写char a=14;的吧？char a='14';会编译出错。  详细解答过程：

user: user-4
content: 引用 3 楼 xpdavis 的回复:[quote=引用 2 楼 u012421456 的回复:] 又见到这种写法了 char a='14'; 这算是单个字符吗 这样写，首个字符有效，就是'1'[/quote] 哦，谢谢啊  楼主清楚这几个运算符的含义吗

user: user-5
content: 引用 2 楼 u012421456 的回复:又见到这种写法了 char a='14'; 这算是单个字符吗 这样写，首个字符有效，就是'1'

user: user-4
content: 又见到这种写法了 char a='14'; 这算是单个字符吗
user-0 提问: 字符串转换为二进制？？？

回复:
user: user-1
content: #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汉

user: user-2
content: 所有数据在内存中存储的时候都是二进制的（可以从一些计算精度问题看出），在输出的时候会根据输出函数的参数和类型选择如何解释这些二进制数据。

user: user-3
content: 电脑里都是按二进制存储的！  你是不是想将字符按二进制来显示？  在打印的时候把字符当整数输出就行了

user: user-4
content: 计算机存放数据都是以二进制存放的.  如果是想把那两个字的二进制码, 转换成字符串形式显示,  那就是需相当于计算一个整数的二进制显示.

user: user-5
content: 电脑里都是按二进制存储的呀！
user-0 提问: C语言题目

回复:
user: user-1
content: 引用 1 楼 qq_15033289 的回复:~(c^a) << 4   ; c 和a 异或  然后 在左移动 4 位  c^a = 1110 ^ 0011 = 1101 = 13; 1101 << 4 = 1101 0000 = 224; 最后再来个取反!   要是结果没错的话  应该就是  - 224  你结果对了，过程却是错的 。  理由： 你第二步是 <<  ， 这里错了， 由你的第二步得出1101 0000 ， ~ 取反操作，是得不到 -224的

user: user-2
content: 引用 2 楼 yongqingling 的回复:先将c提升成int，与a作位异或运算，得出后四位1101，再按位取反（~优先级高），得出后四位0010（其余为1），该数为负数，负数=绝对值的反码+1，即1110的反码+1，1110为14，算上符号，再左移4位，即相当于乘16，-14x16=-224  支持。

user: user-3
content: 你运行一次次就知道了 /*************************************************************************     > File Name: bit.c     > Author: Jukay     > Mail: hellojukay@gmail.com      > Created Time: 2014年10月23日 星期四 19时07分47秒  ************************************************************************/  #include<stdio.h> int main() { 	char c=14; 	int b; 	int a=3; 	b = ~ (c ^ a) << 4; 	printf("%d\n",b);  	return 0; } //-224

user: user-4
content: 这么多正解，楼主还是多看看位操作吧

user: user-5
content: 1.第一步： c^a = 1110 ^ 0011 = 1101 = 13; 2. 第二步：~（c^a）= 1111 1111 1111 0010; 因为补码是负数。对应的原码为为补码取反+1<符号位不动>。结果为：1000 0000 0000 1110，为-14； 3. 第三步：~（c^a）<<4 = 1000 0000 1110 0000; 结果-224

user: user-6
content: 引用 5 楼 zhao4zhong1 的回复:理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  授之以渔～

user: user-7
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-8
content: 先将c提升成int，与a作位异或运算，得出后四位1101，再按位取反（~优先级高），得出后四位0010（其余为1），该数为负数，负数=绝对值的反码+1，即1110的反码+1，1110为14，算上符号，再左移4位，即相当于乘16，-14x16=-224

user: user-9
content: ~(c^a) << 4   ; c 和a 异或  然后 在左移动 4 位  c^a = 1110 ^ 0011 = 1101 = 13; 1101 << 4 = 1101 0000 = 224; 最后再来个取反!   要是结果没错的话  应该就是  - 224

user: user-10
content: 按照优先级来运算。。。

user: user-11
content: 问一下，楼主知道这几个运算符的含义吗？~、^、<< char c = 14
user-0 提问: C语言头文件

回复:
user: user-1
content: 引用 1 楼 user-8 的回复:printf之类的库函数，都已经早就编译好了，保存在某个库里面。链接的时候不再需要源代码，直接把库链接上就行了。 点赞！

user: user-2
content: 引用 1 楼 user-8 的回复:printf之类的库函数，都已经早就编译好了，保存在某个库里面。链接的时候不再需要源代码，直接把库链接上就行了。

user: user-3
content: 引用 1 楼 user-8 的回复:printf之类的库函数，都已经早就编译好了，保存在某个库里面。链接的时候不再需要源代码，直接把库链接上就行了。 +1

user: user-4
content: .cpp编译进lib库中了。

user: user-5
content: 具体到VC6，CRT库为MSVCRT.lib和MSVCRTD.lib

user: user-6
content: 引用 楼主 u014291969 的回复:C语言中头文件只是声明一些变量和函数在另外一个源文件中编写其定义，但为什么写程序时可以包含如stdio.h的头文件却不用加载stdio.c源文件，是因为编译开发环境在编译时把源文件编译进去了吗？ 对于C库，编译器都是自动链接的

user: user-7
content: 现在的编译器（IDE）都是默认把这些库函数的定义在进行编译时自动链接了 具体de可以去搜一下相关内容，应该能解惑的

user: user-8
content: printf之类的库函数，都已经早就编译好了，保存在某个库里面。链接的时候不再需要源代码，直接把库链接上就行了。
user-0 提问: C语言自定义头文件

回复:
user: user-1
content: 会报错吧，当前头文件只在当前源文件展开

user: user-2
content: 应该会报错吧！！

user: user-3
content: 那这要看你编译谁了

user: user-4
content: 楼主如果指的是函数指针，即A函数的参数是B函数，那么这个函数指针类型声明成跟所引用的函数类型一样即可 如果楼主指的不是函数指针，而是A函数内调用了B函数，其它文件只想用A不想用B，那么A函数声明即可，B函数可以文件内部 声明

user: user-5
content: 声明一个函数时引用一个未在本头文件声明的函数？ 这个怎么这么乱的表达 函数声明不一定非要在头文件里面，如果你某个单元要调用某个函数，在调用之前声明一下就可以了

user: user-6
content: 假如你定义的头文件叫H1文件，定义的函数是F1，F1引用函数F2，F2在C2文件中被定义。  那么F2不能是static函数。并且，假如F2的函数声明在H2头文件中，H1需要include H2。
user-0 提问: linux下一段openssl C代码 运行时出现段错误吐核core（dump）

回复:
user: user-0
content: 在第一次调用ret=DH_generate_parameters_ex(d1,64,DH_GENERATOR_2,NULL);时出现错误

user: user-0
content: 究竟是什么原因
user-0 提问: 求助c语言

回复:
user: user-0
content: #include <stdio.h>  #include <stdlib.h>  #include <time.h>  #include <string.h>  #pragma warning (disable:4996)  void poweronlogger(void);  void loginpassword(int argc, char*argv[]);  void wrong(void);  void multiply(void);  int main(int argc, char *argv[])  {  if (argc == 1)  {  multiply();  }  else if ((strcmp(argv[1], "POL")) == 0)  {  poweronlogger();  }  else if ((strcmp(argv[1], "LPU")) == 0)  {  loginpassword(argc, argv);  }  else  {  wrong();  }  }  void wrong(void)  {  puts("wrong");  getch();  exit(0);  }  void poweronlogger(void)  {  time_t rawtime;  time(&rawtime);  struct tm* nowtime = localtime(&rawtime);  FILE*fp;  fp = fopen("log", "a+");  fprintf(fp, "%d-%d-%d %d:%d:%d\n", nowtime->tm_year + 1900, nowtime->tm_mon + 1, nowtime->tm_mday, nowtime->tm_hour, nowtime->tm_min, nowtime->tm_sec);  fclose(fp);  system("attrib log +s +h +a");  }  void loginpassword(int argc, char*argv[])  {  if ((strcmp(argv[2], "C8MG2")) == 0)  {  int day;  if (argc == 3)  {  time_t nowtime;  time(&nowtime);  struct tm * timeinfo = localtime(&nowtime);  day = timeinfo->tm_wday;  if (day == 0)  day = 7;  }  else if (argc == 4)  {  if ((strcmp(argv[3], "1")) == 0)  {  time_t nowtime;  time(&nowtime);  struct tm * timeinfo = localtime(&nowtime);  day = timeinfo->tm_wday;  day++;  }  else  {  wrong();  }  }  else if (argc == 5)  {  if ((strcmp(argv[3], "2")) == 0)  {  day = atoi(argv[4]);  if (day<1 || day>7)  {  wrong();  }  }  else  {  wrong();  }  }  else  {  wrong();  }  char systemtion[100];  sprintf(systemtion, "net.exe USER %%USERNAME%% key%d", day);  system(systemtion);  }  }  void multiply(void)  {  int a = 0;  int b = 0;  int c = 0;  int d = 0;  srand((unsigned)time(NULL));  while (1)  {  a = rand() % 90 + 11;  b = rand() % 90 + 11;  d = a * b;  printf("%d×%d=", a, b);  scanf("%d", &c);  (c == d) ? puts("Correct!") : puts("Wrong!");  getch();  fflush(stdin);  }  }

user: user-0
content: 有什么问题啊

user: user-0
content: 在main中的第二个if判断里面的poweronlogger();生成不了文本，如果把poweronlogger();放到第一个if判断中就可以生成
user-0 提问: windows socket TCP 客户端 如何设置非阻塞？

回复:
user: user-1
content: 非阻塞connect返回-1且errno==EINPROGRESS代表连接正在异步建立，你需要观察write事件的发生并getsockopt检查error。

user: user-0
content: 问题源码在此（求找错） #include <stdlib.h>    #include <stdio.h>   #include <winsock2.h>   #pragma comment(lib,"ws2_32.lib") #define SERVER_PORT 2012  void main()   {   	WORD wVersionRequested;   	WSADATA wsaData;   	int ret;   	SOCKET sClient;  	struct sockaddr_in saServer;    	BOOL fSuccess = TRUE;    	//WinSock初始化   	wVersionRequested = MAKEWORD(2, 2);  	ret = WSAStartup(wVersionRequested, &wsaData);  	if(ret!=0)   	{   		printf("WSAStartup() failed!\n");   		return;   	}   	if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)   	{   		WSACleanup();    		printf("Invalid WinSock version!\n");   		return ;   	}    	sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);   	if (sClient == INVALID_SOCKET)   	{   		WSACleanup();   		printf("socket() failed!\n");   		return ;   	}                                          //去掉这两句便是可以以阻塞方式连通的客户端代码！！！！（加上这两句设置非阻塞就不行） 	int iMode = 1;  	int iasd=ioctlsocket(sClient,FIONBIO,(u_long FAR*) &iMode); 	 	saServer.sin_family = AF_INET;    	saServer.sin_port = htons(SERVER_PORT);  	saServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");    	int nn=SOCKET_ERROR; 	//连接服务器 	while(1) 	{ 		nn = connect(sClient, (struct sockaddr *)&saServer, sizeof(saServer)); 		int i=GetLastError(); 		printf("客户端未连接上！%d\n",i); 		Sleep(1000);  		while(nn==0) 		{ 			printf("客户端已连接！\n"); 			Sleep(1000); 		} 	} 	closesocket(sClient); 	WSACleanup();    	return ;   }

user: user-0
content: 服务端accept返回>0的值, 我客户端用的是GetLastError() 回复的是10056，connect()返回却是-1

user: user-2
content: 没有见过非阻塞的方式,理解中阻塞是因为发送和接收函数,服务器端的监听函数造成的阻塞  具体的方式我忘记了,好像也要判定是否接收到吧  关注

user: user-3
content: int WSAGetLastError(void);  得到出错的原因。
user-0 提问: 求看一个程序，

回复:
user: user-1
content: 楼主先要弄明白一个问题： aaa中aa出现一次还是两次。

user: user-2
content: #include <stdio.h> #include <string.h> #define maxLen 100  int main(){   char s1[maxLen], s2[maxLen], *p=s1;   int cnt=0,len;   printf("%d\n",len);   printf("input str s1:");   gets(s1);   printf("input str s2:");   gets(s2);   len=strlen(s2);   while((p=strstr(p,s2))!=NULL){     cnt++;     p+=len;     printf("%s\n",p);   }   printf("total cnt:%d\n",cnt);   return 0; }

user: user-3
content: C中字符串是用字符数组或字符指针表示的

user: user-3
content: 同一楼问，楼主什么意思啊？ 还有，你说输入字符串，那输入的时候为什么scanf中是%d？而且为何还要加上\n，\n在这儿属于非输入控制符 关于scanf，可以看看这个——http://blog.csdn.net/u012421456/article/details/18501309

user: user-4
content: 楼主到底是什么意思啊，是求s1在s2中出现了多少次吗？
user-0 提问: c语言 读取并显示图像

回复:
user: user-1
content: 用库的话，看懂API，能调用就行。

user: user-2
content: GDI+ CXImage OpenCV ImageMagick ……

user: user-3
content: 也可以借助于opencv

user: user-4
content: 二楼正解。。。

user: user-5
content: 如果只用c语言的文件打开函数，必须自己解码 但是只用c语言，你也显示不了图片吧  如果你用GDI+ 接口， 它会帮你解码的
user-0 提问: 为什么运行这个程序时只单单显示一个数据

回复:
user: user-1
content: 引用 7 楼 qq_21327741 的回复:为什么要加空格呢不必一定是空格，也可以使\n\t之类的，作用是分开数据，不然就都一起输出了，比如你想分别输出1到9，会输出123456789，加空格或其他的，就会是1  2 3 4、、、、这样就能知道是几个数据了。

user: user-2
content: #include <stdio.h> int main() {  	int i,a[10];     for(i=0;i<=9;i++)//  注意，正确使用c语言的语法  去掉 for 后面的分号，这样才能进入循环。       	a[i]=i;     for(i=9;i>=0;i--)       printf("%d ",a[i]);// 你这个显示的不是一个数据，是一串数据，没有控制输出格式的原因导致。 	  // 加个 空格  或者  \n   就可以控制输出格式了。        return 0; }

user: user-0
content: 为什么要加空格呢

user: user-3
content: 一开始，for后面都有分号，则循环在这儿没意义 上面是把i的值赋给了a[i]，i的值为一个垃圾数字（没有初始化） 去掉分号以后  引用 7 楼 qq_21327741 的回复:为什么要加空格呢 这还用问吗，不加空格等你输出的数字就会连在一起，你觉得看起来方便吗

user: user-4
content: #include <stdio.h> void main() {  int i,a[10];    for(i=0;i<=9;i++)      a[i]=i;    for(i=9;i>=0;i--)       printf("%d\n",a[i]); } 楼主加油，多多看看书啊

user: user-5
content: 引用 4 楼 u013072501 的回复:#include <stdio.h> void main() {  int i,a[10];    for(i=0;i<=9;i++)      a[i]=i;      for(i=9;i>=0;i--)       printf("%d ",a[i]);//这里%d后面没空格或其他的，当然就连在一起了 }+1,还是层主好

user: user-1
content: #include <stdio.h> void main() {  int i,a[10];    for(i=0;i<=9;i++)      a[i]=i;      for(i=9;i>=0;i--)       printf("%d ",a[i]);//这里%d后面没空格或其他的，当然就连在一起了 }

user: user-1
content: #include <stdio.h> void main() {  int i,a[10];    for(i=0;i<=9;i++)      a[i]=i;    for(i=9;i>=0;i--)       printf("%d       ",a[i]); } 汗，你没空格之类的，当然就在一起输出了啊

user: user-0
content: 去掉；结果还是一样

user: user-6
content: 循环后面的‘；’号是谁告诉你用的？
user-0 提问: C/C++ 调用delphi DLL

回复:
user: user-0
content: 用MFC的程序去加载却出现这种情况：

user: user-0
content: 引用 1 楼 cs290473786 的回复:安装delphi的环境就好了。 安装完也是一样会崩的。

user: user-1
content: 安装delphi的环境就好了。
user-0 提问: c

回复:
user: user-1
content: EOF定义在头文件<stdio.h>，是一个整型数。其具体数值是什么并不重要，只要它与任何char类型的值都不相同即可。这里使用符号常量，可以确保程序不需要依赖于其对应的任何特定的数值。

user: user-2
content: 是一个宏，其实就是-1，他表示遇到文件结尾.scanf()函数返回成功赋值的数据项数，读到文件末尾出错时则返回EOF。

user: user-3
content: EOF 是流，文件等的结束标志。 如果是命令行输入的数据，可以用Ctrl +Z来结束。

user: user-4
content: 文件结束符（end of file）。在windows和dos中靠Ctrl+z送出，unix中靠Ctrl+d送出

user: user-5
content: End of File

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

user: user-7
content: http://zh.wikipedia.org/wiki/%E6%AA%94%E6%A1%88%E7%B5%90%E5%B0%BE

user: user-8
content: 可以结贴了。。。

user: user-9
content: EOF楼主可以自行百度，就是一个文件结尾的标志。文件内容中读取到EOF就说明到了文件结尾。

user: user-10
content: End Of File  其实就是一个流，文件等 的结尾标志， scanf 返回 EOF, 说明已经读到文件(stdin 流)末尾了, 没有数据了!
user-0 提问: 如何输入任意个字符。并统计其中各种类型字符的个数啊。求程序

回复:
user: user-0
content: 嗯嗯，好的，谢谢您

user: user-1
content: #include <stdio.h> #include <string.h> #include <stdlib.h>  int count[256];//ascii字符我记得只有这么多个   int main() { 	char str[1000]; 	int len,i; 	memset(count,0,sizeof(count)); 	gets(str); 	len = strlen(str); 	for(i=0;i<=len;i++) 		count[str[i]]++; 	for (i=0;i<=len;i++) 	{ 		if (count[str[i]]) 		{ 			printf("%c %d\n",str[i],count[str[i]]); 			count[str[i]]=0; 		} 	} 	return 0; }  最后一个行是一个空字符，所以打印不出来
user-0 提问: 新手问eof

回复:
user: user-1
content: scanf返回匹配的个数，可能=0，也可能小于0，一旦<0那么你就要ferror或者feof检查是不是发生了读错误或者读到末尾。  一般来说,scanf按行匹配，一旦一行不匹配，那么后面也不好读了，所以建议是fgets读一行到内存，然后sscanf去匹配，这样sscanf返回的匹配个数一定是>=0的，如果不符合预期也可以继续fgets下一行。

user: user-2
content: scanf遇到EOF，函数结束，返回成功扫描的参数的个数。 getchar是输入什么，返回什么；输入回车，返回回车，输入EOF，返回EOF。 Windows下不输入^D，那么一直就没有EOF；除非输入^D。

user: user-3
content: getchar（）函数，你如是回车是不会停止的，要想停止输入，只有用ctrl + d 或者 ctrl + z

user: user-4
content: 1.scanf()如果有文件输入的情况返回的是个数 ，没有的情况返回-1；  2.3. 按ctrl + Z 结束

user: user-5
content: 二楼。。。。

user: user-6
content: 这是指的你输入一个文件结束符，在windows控制台底下，就是Ctrl+Z或者F6，有别于其它正常的字符输入

user: user-0
content: 引用 1 楼 r_Jimy 的回复:scanf返回EOF时，说明遇到异常或文件结束符，这时scanf并不保证所有数据都已经读全了，需要进行异常处理 你在windows下创建一份空白文档，它的内容其实占0字节，并没有一个EOF,当输入源是文档时，系统会自动加EOF  对于getchar: 1.在linux的stty raw模式中，输入什么就直接扔getchar，不缓存 2.一般情况下，控制台输入的内容先扔缓存，按回车之后表明输入结束，getchar才从缓存中取数据返回 读到EOF结束符如果EOF前有其它数据，这个EOF表示是这些数据的结束,之后输入的任何数据都不要让getchar读，而非本次输 入的结束，只有前面没有数据的EOF才算是一次输入的结束，这样的EOF可以起到如下作用： 因为回车符也算一个字符，一次输入结束有时不打算把回车符计算进去，比如，第一次输入123，第二次输入时，我们希望从123之后 接着输入abc，而非另起一行，这时，如果输入123回车，再输入abc回车，得到的是 123 123 abc abc 所以这时应该输入123EOF回车，然后输入abc回车，得到的是 123EOF 123abc abc  如果一个文档中输入abc 那么实际储存的是abc和eof？ 那么scanf比如转换说明符是3个%c 那么最终返回的是不是3？可是没有读取错误时 难道不是eof作为结尾使scanf结束的嘛？如果真的扫描到了 那么不是说扫描到文章结尾或者错误应该返回eof吗？假如这都不返回eof 那eof就不能没有错误而返回了啊？难道说只有一个eof的文件才会既没出错 还返回eof？  如果回车代表输入的结束 而不代表getchar执行的结束 那么在getchar执行时 用户输入了多个字符 那么回车会显示在键盘缓冲区的第一个字符 可是之后缓冲区里还有东西 不会等待用户重新输入 而getchar又没有结束后再次执行去再次显示在键盘缓冲区的下一个字符来移除键盘缓冲区以使用户重新输入 这是种什么情况？难道说用户不能输入 程序一直显示着第一个字符 而且getchar又不退出？

user: user-7
content: scanf返回EOF时，说明遇到异常或文件结束符，这时scanf并不保证所有数据都已经读全了，需要进行异常处理 你在windows下创建一份空白文档，它的内容其实占0字节，并没有一个EOF,当输入源是文档时，系统会自动加EOF  对于getchar: 1.在linux的stty raw模式中，输入什么就直接扔getchar，不缓存 2.一般情况下，控制台输入的内容先扔缓存，按回车之后表明输入结束，getchar才从缓存中取数据返回 读到EOF结束符如果EOF前有其它数据，这个EOF表示是这些数据的结束,之后输入的任何数据都不要让getchar读，而非本次输 入的结束，只有前面没有数据的EOF才算是一次输入的结束，这样的EOF可以起到如下作用： 因为回车符也算一个字符，一次输入结束有时不打算把回车符计算进去，比如，第一次输入123，第二次输入时，我们希望从123之后 接着输入abc，而非另起一行，这时，如果输入123回车，再输入abc回车，得到的是 123 123 abc abc 所以这时应该输入123EOF回车，然后输入abc回车，得到的是 123EOF 123abc abc

user: user-8
content: CTRL  + C  CTRL: + D 返回的是底层EOF  scanf 输入后遇到 \n 即可

user: user-9
content: Enter，Ctrl+Z，Enter
user-0 提问: 32位win7 驱动共享内存的问题

回复:
user: user-1
content: 看不懂啊~~~~下载哦=

user: user-2
content: 用WinDbg双机调试 或用WinDbg在虚拟机中调试

user: user-0
content: 程序中就是依次调用了以下函数： BufferMdl = IoAllocateMdl(devExt->RecvCommonBufferBase, 4096*DESC_NUMBERS, FALSE, FALSE, NULL);	  MmBuildMdlForNonPagedPool(BufferMdl);//初始化MDL页码数组 MmProbeAndLockPages(BufferMdl,KernelMode,IoWriteAccess); pMdlUserAddr = (PULONG)MmMapLockedPagesSpecifyCache(BufferMdl, UserMode, MmNonCached, NULL, FALSE, NormalPagePriority); 然后MmMapLockedPagesSpecifyCache就出错了，求大神赐教，小弟不胜感激。
user-0 提问: why it do ont work?

回复:
user: user-1
content: int min(int aryy[],int n) {     int i;     int    min =0;     for(i=0; i < n; i++)         min =MIN(min,aryy[i]);     return min; } int max(int aryy[],int n) {     int i;     int max =0;     for(i=0; i < n; i++)         max =MIN(max,aryy[i]);     return max; } 都调用的是MIN(max,aryy[i]);，而你的 max和min初始化均为0，你传入的数组中的值都大于0，肯定只返回0…… 还有你的int MAX(int A,int B){return (A>B)?A:B; } int MIN(int A,int B){return (A<B)?A:B; }这些A、B都应该用小括号括起来，还有注意命名规范问题！！！

user: user-2
content: max =MIN(max,aryy[i]);应该改为max =MAX(max,aryy[i]);
user-0 提问: C代码如何高效读取格式化的文本？

回复:
user: user-1
content: 赵哥先fgets了一下，肯定会丢掉一行。  可以fgets+sscanf，其他都可以参考赵哥代码。

user: user-2
content: 引用 2 楼 zhao4zhong1 的回复://in.txt: //f(abc,甲)=丙 //f(a,乙)=戊 //f(48,丙)=戊 //f(阿3,丁)=乙 // //这是有规律的，框架就是： //f (*,*)=* #include <stdio.h> FILE *f; char ln[80]; char s1[40]; char s2[40]; char s3[40]; int i; int main() {     f=fopen("in.txt","r");     if (NULL==f) {         printf("Can not open file in.txt!\n");         return 1;     }     i=0;     while (1) {         if (NULL==fgets(ln,80,f)) break;         if (3==fscanf(f,"f(%39[^,],%39[^)])=%39[^\n]",s1,s2,s3)) {             printf("[%s],[%s],[%s]\n",s1,s2,s3);         } else {             printf("in.txt line %d format error:%s",i+1,ln);         }         i++;     }     fclose(f);     return 0; } //[abc],[甲],[丙] //[a],[乙],[戊] //[48],[丙],[戊] //[阿3],[丁],[乙] // 好赞好赞！！！

user: user-0
content: 看来得专题专问，我提的额外问题到其它地方文问去吧。此贴问题解决，结贴，谢谢赵哥和其他高手。

user: user-3
content: 纠正第25行： if (3==fscanf(f,"f(%39[^,],%39[^)])=%39[^\n]",s1,s2,s3)) { 应为 if (3==sscanf(ln,"f(%39[^,],%39[^)])=%39[^\n]",s1,s2,s3)) {

user: user-0
content: 现在明白了，高手真多啊。我以前只知道%d、%c、%s啊之类的，都是读到字符缓冲区里面自己用*p++=*q++慢慢搞。 还有两个问题： 1、如果文件里面输入的行里面有空格，那我获取到的s1、s2、s3是有空格的，那么，去掉字符串首尾的空白有现成的函数吗？没有的话，如何写代码才能让这个处理效率高一些？ 2、如果有些行后半部分跟着双斜线注释，那赵哥的代码应该如何改进才能得到s1、s2、s3？

user: user-4
content: 引用 4 楼 woshihuzi 的回复:谢谢2楼的高手，代码确实简洁高效。 不过，输出结果中，原来的第一行数据显示不出来： [a],[乙],[戊] [48],[丙],[戊] [阿3],[丁],[乙]  另外，请解释一下fscanf(f,"f(%39[^,],%39[^)])=%39[^\n]",s1,s2,s3))的含义好吗？让俺也知其所以然。  f(到，之间的字符放入s1，最多放入39个字符，后面类似。  ANSI C 标准向 scanf() 增加了一种新特性，称为扫描集(scanset)。 扫描集定义一个字符集合，可由 scanf() 读入其中允许的字符并赋给对应字符数组。 扫描集合由一对方括号中的一串字符定义，左方括号前必须缀以百分号。 例如，以下的扫描集使 scanf() 读入字符 A、B 和 C：     %[ABC]      使用扫描集时，scanf() 连续吃进集合中的字符并放入对应的字符数组，直到发现不在集合中的字符为止(即扫描集仅读匹配的字符)。返回时，数组中放置以 null 结尾、由读入字符组成的字符串。      用字符 ^ 可以说明补集。把 ^ 字符放为扫描集的第一字符时，构成其它字符组成的命令的补集合，指示 scanf() 只接受未说明的其它字符。

user: user-0
content: 谢谢2楼的高手，代码确实简洁高效。 不过，输出结果中，原来的第一行数据显示不出来： [a],[乙],[戊] [48],[丙],[戊] [阿3],[丁],[乙]  另外，请解释一下fscanf(f,"f(%39[^,],%39[^)])=%39[^\n]",s1,s2,s3))的含义好吗？让俺也知其所以然。

user: user-5
content: 看楼上代码。。。。

user: user-3
content: //in.txt: //f(abc,甲)=丙 //f(a,乙)=戊 //f(48,丙)=戊 //f(阿3,丁)=乙 // //这是有规律的，框架就是： //f (*,*)=* #include <stdio.h> FILE *f; char ln[80]; char s1[40]; char s2[40]; char s3[40]; int i; int main() {     f=fopen("in.txt","r");     if (NULL==f) {         printf("Can not open file in.txt!\n");         return 1;     }     i=0;     while (1) {         if (NULL==fgets(ln,80,f)) break;         if (3==fscanf(f,"f(%39[^,],%39[^)])=%39[^\n]",s1,s2,s3)) {             printf("[%s],[%s],[%s]\n",s1,s2,s3);         } else {             printf("in.txt line %d format error:%s",i+1,ln);         }         i++;     }     fclose(f);     return 0; } //[abc],[甲],[丙] //[a],[乙],[戊] //[48],[丙],[戊] //[阿3],[丁],[乙] //

user: user-6
content: 这种貌似用scanf就能搞定了
user-0 提问: 弱问C语言问题。。。。。。

回复:
user: user-1
content: 这段代码是实现什么功能呢？

user: user-1
content: 我也找半天，看来需要多多练习了！

user: user-2
content: 看来还需要继续多流些汗水

user: user-3
content: 细节问题。 再说了，编译器的报错提示都说了错误在第7行代码（尽管许多时候报的错的位置不准），难道楼主还检查不出来吗

user: user-4
content: printf("%d",b[i]);//是逗号才对

user: user-5
content: 做程序员主要是要做到：细心、心细。多写写代码，多锻炼就可以慢慢克服了。

user: user-6
content: 下载“适合程序员的键盘练习”，没事多练练以后就少丢人了。

user: user-0
content: 哎，对不起大家了，这个问题太丢人了

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

user: user-6
content: 关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

user: user-7
content: #include<stdio.h> int main() {        int b[2]={1,3};     int i,k=0;     b[k++]=9;     for(i=0;i<2;i++)     printf("%d",b[i]);    //.b[i]);     return 0; }
user-0 提问: fopen函数的a+参数对应open函数是哪几个模式的组合？

回复:
user: user-1
content: Valid characters for the mode string used in fopen and _fdopen correspond to oflag arguments used in _open and _sopen, as follows.  Characters in mode String Equivalent oflag Value for _open/_sopen   a _O_WRONLY | _O_APPEND (usually _O_WRONLY | _O_CREAT | _O_APPEND)  a+ _O_RDWR | _O_APPEND (usually _O_RDWR | _O_APPEND | _O_CREAT )  r _O_RDONLY  r+ _O_RDWR  w _O_WRONLY (usually _O_WRONLY | _O_CREAT | _O_TRUNC)  w+ _O_RDWR (usually _O_RDWR | _O_CREAT | _O_TRUNC)  b _O_BINARY  t _O_TEXT  c None  n None

user: user-2
content: 一查MSDN便知_O_RDWR | _O_APPEND | _O_CREAT
user-0 提问: 编译问题，求解答

回复:
user: user-1
content: 可以查看预编译的结果。

user: user-0
content: 上午没空，下午结贴

user: user-2
content: 看起来好像是指针类型搞错了的样子，在*&操作的时候出错

user: user-3
content: 同意楼上两位的看法

user: user-4
content: .h没有问题就是.c的问题呀, 写个简单的.c 包含 .h试试

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

user: user-6
content: 这样情况可能是某个地方的问题 引起连串的问题的， 自己多注意点就好

user: user-7
content: 4楼。。。。

user: user-0
content: 又检查了，可能是调用的2个头文件互相包含引起的，我把其中一个头文件调用另外一个头文件中的宏给自定义了，没有包含，报错就没了

user: user-8
content: 你检查没问题很可能是某些文件漏编译进去了，通常一些结构体定义或TYPEDEF没包含会出现难以 觉察的错误
user-0 提问: 请大家帮帮忙，我在主程序里面要调用的一个16进制转换2进制的程序，可是我不懂得怎么将这个转换后的2进制返回到我的主程序里面

回复:
user: user-0
content: 谢谢你啊，我现在把问题解决了，多谢！

user: user-0
content: 谢谢3楼的u010030181 ，可以这么热心的帮助我，但是我把程序运行了一下，发现有错误 这一行printf("%d\t", array[i]);  错误说是“ error C2109: 下标要求数组或指针类型”

user: user-0
content: 谢谢了，我会好好学习一下，楼上能不能再帮我看一下，把程序帮我改改，我是新手，指针学的不怎么好。

user: user-1
content: 在你的程序中进行的改写……其中你可以利用函数的返回值也可以把要赋值的东西传进去赋值……只是这个数组不知道要定义多大，大了浪费空间，小了肯定放不下……仅供参考！！！ #include <stdio.h>  char arrayLage[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; char arrayLittle[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};  int chartohex(char num) { 	for (int i =0; i< 16; i++) 	{ 		if (arrayLage[i] == num || arrayLittle[i] == num) 			return i;			 	} 	return -1; }  int sixten_two(char change[10],int number, int outarry[], int arryindex) {		 	int i,j; 	int result=0;  	int b[50]; 	static int p[30]; 	for(i=0;i<number;i++) 	{ 		int returnvalue = chartohex(change[i]); 		if (returnvalue != -1) 		{ 			b[i] = returnvalue; 		} 		else 		{ 			printf("传入的十六进制数有误"); 			return -1; 		} 	} 	 	for(j=number-1,i=1;j>=0;j--,i*=16) 	{ 		result +=b[j]*i; 	} 	 	for(j=0;result!=0;j++) 	{ 		outarry[j]=result%2; 		result=result/2;  	} 	return --j;	//记得减1  	/* 	for(i=j-1;i>=0;i--) 	{ 		printf("%d\t",outarry[i]); 		 	} 	*/ }  int main(void) { 	int array[30]= {0};	//定义你在程序要调用的数组，也就是你所谓的返回值  	  	int numbit = sixten_two("a",1, array, 30);//没有排除返回值为-1的情况  	for (int i = numbit; i >= 0; i--) 		printf("%d\t", array[i]);  	return 0; }

user: user-2
content: 没必要用那么多的case语句，方法用二楼的就行。至于C/C++的函数是不能返回一个数组的，只能返回一个数组的指针，你可以在主程序定义一个数组binary，然后传进这个数组来存储计算得来的二进制数，如：int sixten_two(char change[10],int number, char* binary);这样你把二进制数存到binary这个数组就好了。还有一个，记住计算得来的二进制数是倒序的。。。。 PS：初学的时候就养成良好命名各种变量名和函数名，如代表长度就用length，用number还以为是数字的意思。。。可以看一下google编程规范~

user: user-1
content: 引用 5 楼 lucczyn 的回复:谢谢3楼的u010030181 ，可以这么热心的帮助我，但是我把程序运行了一下，发现有错误 这一行printf("%d\t", array[i]);  错误说是“ error C2109: 下标要求数组或指针类型” 这个错误时你自己的程序中的吧？我在C-Free5和VC6均测试过，除了如果是.c程序要把for循环中的声明移到外面外（C++是可以直接在for里面声明定义的），你把自己写的程序贴上来就知道什么问题了……

user: user-3
content: int sixten_two(char change[10],int number) 增加输出参数 int sixten_two(char change[10],int number, char *pOut, int &iOut )

user: user-4
content: 个人觉得..if(change[i]<='9'&&change[i]>='0')    b[i]=change[i]-'0';   else if(change[i]<='F'&&change[i]>='A')   b[i]=change[i]-55;这样就可以了  如果  for(i=j-1;i>=0;i--)   {    printf("%d",p[number]);    return(p[i]);   } 在这个循环里面有一个return 则，for只执行一次，如果想要返回数组，p数组只是个局部数组，这个是行不通滴~~你可以搜一下  数组返回 ，希望对你有用
user-0 提问: 华为面试~~

回复:
user: user-0
content: 引用 3 楼 jiangbianxiumu 的回复:[quote=引用 2 楼 jiangbianxiumu 的回复:] 没这么复杂吧，直接模拟小时候学的除法的过程不就行了吗？ void fun(char *a){       int tmp=0;       while(*a!='\0'){              tmp=(tmp*10+(*a++)-'0')%10;       }       if(tmp==0) return 1;       else return 0; } 返回值改成int ； int fun(char *a){       int tmp=0;       while(*a!='\0'){              tmp=(tmp*10+(*a++)-'0')%10;       }       if(tmp==0) return 1;       else return 0; }[/quote]  嗯 是的 你的更简洁~~~

user: user-1
content: 看4楼。。。

user: user-2
content: 4楼的方法最简单直观。++

user: user-2
content: vs2010  num = (*input - '0') * 10 + (*++input - '0'); 我这里是先计算(*++input - '0')，然后才计算(*input - '0') * 10

user: user-2

user: user-0
content: 引用 1 楼 nickwu1220 的回复:函数错了。 你输入721试试。

user: user-3
content: 引用 3 楼 jiangbianxiumu 的回复:[quote=引用 2 楼 jiangbianxiumu 的回复:] 没这么复杂吧，直接模拟小时候学的除法的过程不就行了吗？ void fun(char *a){       int tmp=0;       while(*a!='\0'){              tmp=(tmp*10+(*a++)-'0')%10;       }       if(tmp==0) return 1;       else return 0; } 返回值改成int ； int fun(char *a){       int tmp=0;       while(*a!='\0'){              tmp=(tmp*10+(*a++)-'0')%10;       }       if(tmp==0) return 1;       else return 0; }[/quote]  看错了，对7取余数。 int fun(char *a){       int tmp=0;       while(*a!='\0'){              tmp=(tmp*10+(*a++)-'0')%7;       }       if(tmp==0) return 1;       else return 0; }

user: user-3
content: 引用 2 楼 jiangbianxiumu 的回复:没这么复杂吧，直接模拟小时候学的除法的过程不就行了吗？ void fun(char *a){       int tmp=0;       while(*a!='\0'){              tmp=(tmp*10+(*a++)-'0')%10;       }       if(tmp==0) return 1;       else return 0; } 返回值改成int ； int fun(char *a){       int tmp=0;       while(*a!='\0'){              tmp=(tmp*10+(*a++)-'0')%10;       }       if(tmp==0) return 1;       else return 0; }

user: user-3
content: 没这么复杂吧，直接模拟小时候学的除法的过程不就行了吗？ void fun(char *a){       int tmp=0;       while(*a!='\0'){              tmp=(tmp*10+(*a++)-'0')%10;       }       if(tmp==0) return 1;       else return 0; }

user: user-2
content: 函数错了。 你输入721试试。
user-0 提问: 求助！c语言二位动态数组读取图像

回复:
user: user-1
content: 这里补充一下，虽然&pointdatabuf[0][0]与pointdatabuf[0]造价，但如果pointdatabuf只是一级指针的话，pointdatabuf[0][0]是非法的，而pointdatabuf[0]是合法的。如果pointdatabuf是二级及以上的指针，那么这两个都是合法的。

user: user-1
content: 引用 6 楼 lei___lei 的回复:引用 3 楼 hhhhhhhhhhkkkkkkkkkk 的回复:你这样申请出来的内存每一行可能是不连续的，所以你在写的时候要一行一行的写，否则就是在写入了第一行，其他行都没有写。要不然你就用一维数组，然后申请sizof(char)*宽*高 的空间，写入时就可以一次全写入了。我试过按你的说法，直接使用一位数组，确实可以正确读取。可本意还是想通过分配好二位数组空间，以后就直接按pointdatabuf[i][j]的形式直接对图像的每一个像素点进行操作！还有一个问题啊：我测试过地址pointdatabuf与&pointdatabuf[0]的值是相同的，这是合理的。但是下面在分配完pointdatabuf[i]的内存空间后，我又测试了&pointdatabuf[0][0],按分析这个值应该和上面两个值相同才对，但测试结果显示不同，不知这是什么问题，能否给解释一下。非常感谢！ 晕，你那个pointdatabuf是这个内存区域的首地址，也就是pointdatabuf[0]处的地址。你对pointdatabuf[0]取地址(就是那个&号)，得到的地址就是pointdatabuf+0=pointdatabuf。所以pointdatabuf与&pointdatabuf[0]是等价的。相似的，pointdatabuf+n与&pointdatabuf[n]是等价的。 &pointdatabuf[0][0]=(pointdatabuf+0)[0]=pointdatabuf[0]。可以看出这个是地址上的值了，不再是地址了，所以与pointdatabuf、&pointdatabuf[0]不等价啊，从推导来看他是和pointdatabuf[0]等价。 另外，如果你非得用二维数组来读取，那么你把 fread(pointdatabuf,1,picturedatalength,fp_in); //将图像数据区数据暂存入缓冲区pointdatabuf中 改成  for(i=0;i<图像高;i++)    fread(pointdatabuf[i],1,图像宽,fp_in);  这个是伪代码，你把高和宽改一下就行了。

user: user-0
content: 引用 3 楼 hhhhhhhhhhkkkkkkkkkk 的回复:你这样申请出来的内存每一行可能是不连续的，所以你在写的时候要一行一行的写，否则就是在写入了第一行，其他行都没有写。要不然你就用一维数组，然后申请sizof(char)*宽*高 的空间，写入时就可以一次全写入了。我试过按你的说法，直接使用一位数组，确实可以正确读取。可本意还是想通过分配好二位数组空间，以后就直接按pointdatabuf[i][j]的形式直接对图像的每一个像素点进行操作！还有一个问题啊：我测试过地址pointdatabuf与&pointdatabuf[0]的值是相同的，这是合理的。但是下面在分配完pointdatabuf[i]的内存空间后，我又测试了&pointdatabuf[0][0],按分析这个值应该和上面两个值相同才对，但测试结果显示不同，不知这是什么问题，能否给解释一下。非常感谢！

user: user-0
content: 引用 2 楼 xpdavis 的回复:pointdatabuf=(char**)malloc( sizeof(char*)*bmpinfoheader.biHeight); 他这个是先按照高度来分配第一维，这样并没有什么问题的  非常感谢能够回答哈，但后来我又测试过，得到地址pointdatabuf与&pointdatabuf[0]的值是相同的，这是合理的。但是下面在分配完pointdatabuf[i]的内存空间后，我又测试了&pointdatabuf[0][0],按分析这个值应该和上面两个值相同才对，但测试结果显示不同，不知这是什么问题，能否给解释一下。非常感谢！

user: user-2
content: pointdatabuf=(char**)malloc( sizeof(char*)*bmpinfoheader.biHeight); 他这个是先按照高度来分配第一维，这样并没有什么问题的

user: user-3
content: pointdatabuf的大小应该是  一个像素占的字节数*图像长度*图像宽度   sizeof(char*)你这个是指针占的字节数，和像素没有什么关系。  你还是找个现成的读写bmp的c 代码来看吧，csdn上面很多。

user: user-1
content: 而且bmp的格式有点限制，你最好去网上看一下。

user: user-1
content: 你这样申请出来的内存每一行可能是不连续的，所以你在写的时候要一行一行的写，否则就是在写入了第一行，其他行都没有写。要不然你就用一维数组，然后申请sizof(char)*宽*高 的空间，写入时就可以一次全写入了。
user-0 提问: 《c primer plus》里面第11章的课后练习题第2题，自己编的感觉没错啊，为什么没有效果！！

回复:
user: user-0
content: 引用 5 楼 xiaodongnannan 的回复:按照你的题目要求，应该要先判断i<n吧 while(i<n||isspace(*(str+i-1))==NULL)  {         *(str+i)=getchar();         i++;   }不是~~关系运算符也用错了~~但是还是上面的大侠说的对~~

user: user-1
content: 按照你的题目要求，应该要先判断i<n吧 while(i<n||isspace(*(str+i-1))==NULL)  {         *(str+i)=getchar();         i++;   }

user: user-0
content: 引用 3 楼 user-2 的回复:[quote=引用 2 楼 pokerLee 的回复:] [quote=引用 1 楼 user-2 的回复:] 你判断的时候，i已经不是输入的那个位置了， 已经到下一个位置了。能详细些么？*str是首地址啊，i也从0开始的啊！求指点~~[/quote]          *(str+i)=getchar();         i++; ------ 你放在 第i个位置， 但是判断的时候，却去判断第i+1个[/quote]恩~~谢谢~~的确是~~我想再请教一下~~当第i-1为空白符的前一个字符时为什么没有判断出第i个是空白符~~求指教~~

user: user-2
content: 引用 2 楼 pokerLee 的回复:[quote=引用 1 楼 user-2 的回复:] 你判断的时候，i已经不是输入的那个位置了， 已经到下一个位置了。能详细些么？*str是首地址啊，i也从0开始的啊！求指点~~[/quote]          *(str+i)=getchar();         i++; ------ 你放在 第i个位置， 但是判断的时候，却去判断第i+1个

user: user-0
content: 引用 1 楼 user-2 的回复:你判断的时候，i已经不是输入的那个位置了， 已经到下一个位置了。能详细些么？*str是首地址啊，i也从0开始的啊！求指点~~

user: user-2
content: 你判断的时候，i已经不是输入的那个位置了， 已经到下一个位置了。
user-0 提问: 求助！用C语言定义动态二维数组读取图像问题

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:这个会爆掉吧， 而且这个貌似叫 二维指针吧 你为每一行 分配一个内存，你得每行按行 分别读一次啊。  为什么不一次 分配所有行的内存呢可以这样做的！只不过是问题有点特殊了，地址空间不连续，导致后面的数据读取出错！感谢答疑，分已给！！！

user: user-0
content: 引用 1 楼 user-1 的回复:这个会爆掉吧， 而且这个貌似叫 二维指针吧 你为每一行 分配一个内存，你得每行按行 分别读一次啊。  为什么不一次 分配所有行的内存呢 没有理解你的解释啊！我的本意是，这样分配的话，可以方便下面的处理直接按二维数组a[i][j]的形式直接对各像素点进行操作

user: user-0
content: 没有理解你的解释啊！我的本意是，这样分配的话，可以方便下面的处理直接按二维数组a[i][j]的形式直接对各像素点进行操作

user: user-1
content: 这个会爆掉吧， 而且这个貌似叫 二维指针吧 你为每一行 分配一个内存，你得每行按行 分别读一次啊。  为什么不一次 分配所有行的内存呢
user-0 提问: 编译不通过.VC6.求大神

回复:
user: user-1
content: 函数名max和函数中变量max的问题，参数上，ab是可以这样定义的

user: user-2
content: 引用 14 楼 u014485390 的回复:感觉a，b不算重复吧，形参实参怎能算重复？就是max函数里面又有max变量，这里错了吧 max这样定义可以的，只是这样风格不好，但是a b这样定义是不行的 早先C函数是这么定义的： int max(a, b) int a, b { ... } 后来都改成现在这样子 int max(int a, int b) { ... } 既然这里已经定义a b，那么函数体（花括号{}里面就不能再定义a b了）   引用 15 楼 u014485390 的回复:看来我也需要学习了 “也”字不妥，每个人都需要不断地学习，谢谢！

user: user-3
content: 看来我也需要学习了

user: user-3
content: 感觉a，b不算重复吧，形参实参怎能算重复？就是max函数里面又有max变量，这里错了吧

user: user-4
content: 把MAX里的a,b去掉就好了

user: user-5
content: 去掉MAX函数里面定义的a和b就行了，关于变量命名的，楼主要自己注意了    你可以把函数名大写啊，或者里面max换成maxab，这样看名字就大概知道这个变量是干什么的

user: user-6
content: 去掉a、b，并且还要把那个void换成int。

user: user-7
content: 楼上已给正确解释，去掉函数体里面的a,b。否则从main函数传递过来的参数值 没有作用

user: user-8
content: 在int max（int，int）中重定义a b

user: user-9
content: max函数内定义的a，b删掉就好了，LZ还得多加联系啊~

user: user-2
content: 回楼上，表这么激动，初学者嘛。不过这个可以这么用，编译没问题

user: user-10
content: 第一,     函数定义了a,b.函数中又定义一次a,b,自然重复了 第二,    函数名用max,函数中又定义一个变量名叫max   能不能用我没时间试.但我想不通的是,26个字母能组合数不清的串    你丫非要这么2B吗.不2B就彰显不出你的弱智吗?不2B你会死吗?

user: user-11
content: 在max函数中又重复定义了变量a和b,删除就可以了

user: user-2
content: 函数体内又定义了ab #include<stdio.h> #include<stdlib.h> int max(int a,int b) { int max; if(a>=b) max=a; else max=b; return (max); } void main() { int a,b,c; scanf("%d,%d",&a,&b); c=max(a,b); printf("%d",c); }

user: user-12
content: 二楼。。。。

user: user-10
content: 引用 4 楼 xpdavis 的回复:回楼上，表这么激动，初学者嘛。不过这个可以这么用，编译没问题  我知道他是初学,但你看见了,我是分开来回答的  因为初学所犯的问题,耐心回答是没关系的 可是,人的品行所犯的问题,不骂是改不过来的  因为同名可用就连最起码的避讳心态都没有的人 为人好不到那里去的 平时就是啥都无所谓的 也是不配学技术的 他们会用他们的作死态度来耽误你的时间.

user: user-13
content: 楼主这样定义变量时没有想过一样了会怎么样吗？最起码不该正常运行吧！函数内部定义的同名变量把传进函数的参数覆盖了 楼主认真看书啊！要找本好书看。
user-0 提问: error LNK2019: 无法解析的外部符号 _

回复:
user: user-1
content: 链接不到相关的库文件

user: user-2
content: 二楼。。。。

user: user-3
content: 引用 1 楼 user-4 的回复:设置库目录和库文件  support

user: user-4
content: 设置库目录和库文件
user-0 提问: 新人求解释。。。

回复:
user: user-1
content: 差别在有无返回值。

user: user-2
content: 函数返回值问题！看实际需求定义那种方式 多用下面，可以通过返回值确认函数是否调用成功

user: user-3
content: 二楼或三楼。。。

user: user-4
content: 第一个函数结束的时候不写return或者return; 第二个函数结束的时候需要 return一个int类型的值，比如return 0;

user: user-5
content: 第二个函数需要给出明确的返回值，第一个不需要
user-0 提问: 小白求问，从文件中读取数据并运算，按值传递或按引用传递（c语言）

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

user: user-2
content: 感觉LZ把printf当成scanf的样子。从文件获取数字的方法有很多，可以多尝试下

user: user-3
content: void swap(int *c, int *d) { int temp; printf("%d\t%d\n",*c,*d); temp=*c; *c=*d; *d=temp; printf("%d\t%d\n",*c,*d); }
user-0 提问: win7驱动的一个小问题

回复:
user: user-0
content: 感谢您的热心解答，我之前用WDK中的devcon工具安装驱动，解决了上述问题。

user: user-1
content: 用调试器(OD,WINDBG等)调试服务程序 To debug the initialization code of a service application, the debugger must be attached when the service is started. This is accomplished by creating a registry key:  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ProgramName   The ProgramName is the image file for the service application you are debugging. Do not specify a path. For example, the ProgramName might look like MyService.exe.  Under this key create a string data value called Debugger. The value of this string should be set to the full path of the debugger that will be used. For example,  c:\Debuggers\windbg.exe    In addition to setting this registry key, the service application must be marked as "interactive". This allows your service to interact with the desktop, and allows the debugger window to appear on your desktop.  This again requires modifying a registry key: you must bitwise-or the type entry for your service with 0x100 (this is the value for SERVICE_INTERACTIVE_PROCESS according to Winnt.h). The exact location and name of this registry entry varies. For example:  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyServiceKey   Finally, you need to adjust the service application timeout. Otherwise, the service application will kill the debugger within 20 seconds after starting. Adjusting the timeout involves setting an entry in the following registry key:  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control   Under this key, create a DWORD data value called ServicesPipeTimeout. Set this entry to the amount of time in milliseconds that you want the service to wait before timing out. For example, 60,000 is one minute, while 86,400,000 is 24 hours.  设置ServicesPipeTimeout后需要重启系统才生效  Now, when the service is started, the debugger will also start. When the debugger starts, it will stop at the initial process breakpoint, before the service has begun running. This allows you to set breakpoints or otherwise configure your debugging session to let you monitor the startup of your service. Another option is to place calls to the DebugBreak function in your service from the point at which you would like to break into the debugger. (For more information, see DebugBreak in the Platform SDK documentation.)  If your service is running with other services in a Service Host Process, you may need to isolate the service into its own Service Host Process.
user-0 提问: 有关自定义函数的c语言程序设计问题

回复:
user: user-1
content: 二楼。。。。

user: user-2
content: #include <stdio.h>  #define M 3 #define N 3  void fun(int (*p)[3], int* n) { 	int i = 0; 	int a[M*N]; 	for(i=0; i<(M*N); i++) 	{ 		a[i] = *((int *)p +i); 		printf("%d\n", a[i]);	 	} 	*n = M*N; 	 	return; } int main(void) { 	int a[M][N]={{1,2,3}, {4,5,6}, {7,8,9}}; 	int n; 	fun(a, &n); 	 	return 0; }

user: user-2
content: 我没看到一位数组啊

user: user-3
content: //自定义函数fan，该函数的功能是，将M行N列的二维数组中的数据，按行的顺序依次放到一维数组中，一维数组中数据的个数存放在形参n所指的存储单元中。 //例如：若二维数组中的数据是 //33 33 33 //44 44 44 //55 55 55 //则输出33 33 33 44 44 44 55 55 55 #include <stdio.h> #define MAXM 100 #define MAXN 100 int D2[MAXM][MAXN]; int D1[MAXM*MAXN]; int M,N,y,x; void fan(int *n) {//将M行N列的二维数组D2中的数据，按行的顺序依次放到一维数组D1中，一维数组中数据的个数存放在形参n所指的存储单元中     for (y=0;y<M;y++) {         for (x=0;x<N;x++) {             D1[y*N+x]=D2[y][x];         }     }     *n=M*N; } int main() {     int i,t;      while (1) {         printf("\nInput M(1..%d) N(1..%d):",MAXM,MAXN);fflush(stdout);         rewind(stdin);         if (2==scanf("%d%d",&M,&N)) {             if (1<=M && M<MAXM              && 1<=N && N<MAXN) break;         }     }     for (y=0;y<M;y++) {         for (x=0;x<N;x++) {             scanf("%d",&D2[y][x]);         }     }     fan(&t);     for (i=0;i<t;i++) printf("%d ",D1[i]);     printf("\n");     return 0; } // //Input M(1..100) N(1..100):3 3 //33 33 33 //44 44 44 //55 55 55 //33 33 33 44 44 44 55 55 55 //
user-0 提问: 数据结构！！！大问题

回复:
user: user-0
content: 谢谢……这个已经解决了

user: user-1
content: 1、C语言区分大小写 2、代码很多拼写错误 =================

user: user-0
content: 那个头文件要是删除了就出现很多错误，一楼的前面加了//不是变成了注释了吗？不好意思，刚刚才开始学线性表，不懂的地方请各位指教

user: user-2
content: 这个头文件要不要无所谓的

user: user-3
content: 问题解决了？

user: user-4
content: #include "stdafx.h"  是vc建的项目自带的预处理文件，你要是没有这个文件，就把它屏了。

user: user-5
content: #include "stdafx.h" 改为 //#include "stdafx.h"
user-0 提问: 数据结构中无向图的邻接矩阵表示

回复:
user: user-1
content: 楼上。。。。

user: user-2
content: 无向图包含顶点集和边集， vexs存的就是顶点集 arcs是二元组，存放顶点集中各点的关系
user-0 提问: ASCII BCD BIN转码通用函数

回复:
user: user-1
content: 仅供参考#include <stdio.h> #include <stdlib.h> #include <conio.h> unsigned int iv,i; unsigned char BCD[5];//定长10位BCD码 unsigned char sv[11]; void main() {     iv=123456789;//最大10位无符号正整数     //INT2BCD     sprintf(sv,"%010u",iv);     for (i=0;i<10;i+=2) {         BCD[i/2]=(sv[i]<<4)|(sv[i+1]&0x0F);     }     printf("BCD=%02x%02x%02x%02x%02x\n",BCD[0],BCD[1],BCD[2],BCD[3],BCD[4]);     //BCD2INT     for (i=0;i<10;i+=2) {         sv[i]='0'|(BCD[i/2]>>4);         sv[i+1]='0'|(BCD[i/2]&0x0F);     }     sscanf(sv,"%010u",&iv);     printf("iv=%010u\n",iv);     getch(); }
user-0 提问: 缓冲区溢出的问题，只能来这里问了

回复:
user: user-1
content: sizeof(code)==25 strlen(code)==24 要搞清楚二者的差别，因为字符串结束有个'\0' 复制的时候可以memcpy(a,code,25); 也可以strcpy(a,code) 或者 strncpy(sizeof(a),a,code)

user: user-2
content: 问题应该再这里，strcpy();如果我没搞错strcpy是遇到\0才结束的，你整个a里面没有\0自然就拷贝到a的外面去了。 建议以后尽量用strncpy，除非你能确保不会越界。  顺便吐槽下你这代码看的真难受……

user: user-3
content: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

user: user-4
content: http://security.stackexchange.com/questions/10404/why-do-i-get-cannot-find-bound-of-current-function-when-i-overwrite-the-ret-ad 这里有解释，我能力有限，看的不是很明白。

user: user-5
content: cout <<sizeof(code);  加上这句看看，你就知道code的size是25.

user: user-4
content: 我不是很明白 为什么要用 0x9090 这个特殊值呢？  从你的 ebp 寄存器中的值是：0xbfffedb8 而你的 shellcode 的地址是：0xbfffed30 两个地址相差 128+8 个字节，怎么去执行 shell code ?
user-0 提问: 这是一个16进制转2进制的程序，显示有错误，请各位大神帮忙看一下

回复:
user: user-1
content: 引用 3 楼 lucczyn 的回复:问题已经解决了，是我自己太粗心了，谢谢了 编译器的提示要仔细看啊，写的很清楚了

user: user-1
content: 新手写成这样也就算不错了。不过有些地方可以改进一下         for(number=0;;number++)         {          if(change[number]=='\0')          break;         } 这个循环我喜欢写成这样，仅供参考： for(number=0; change[number]!='\0';number++)      ; 其实直接用 number = strlen(change); 最省事。而且变量名用length可能比number更合适。    if(change[i]<='9'&&change[i]>='1') 我一般是把先写大于号再小于号，可能是习惯问题吧。   if(change[i]>='0'&&change[i]<='9')    b[i]=change[i]-'0';  用'0'比48可读性好一些，而且也不用去查ascii码表  那个巨大的switch可以改成这样   if(change[i]>='A'&&change[i]<='F')     b[i] = change[i] - 'A' + 10;   else if(change[i]>='a'&&change[i]<='f')     b[i] = change[i] - 'a' + 10;

user: user-0
content: 问题已经解决了，是我自己太粗心了，谢谢了

user: user-1
content: if(change[i]<='9'&&change[i]>='1')  应该是'0'不是'1'

user: user-1
content: void mian() 拼写错误 应该是main不是mian
user-0 提问: 这是野指针？

回复:
user: user-1
content: 第一个，指针是NULL，地址都没有，咋个赋值呀

user: user-2
content: 普通的对象变量比作装东西的抽屉，那么指针就是开某个抽屉的钥匙。 int *a=NULL;      // 这个只是拿出一个准备做钥匙的母版，比如只是一段金属条 你的意思是想通过这个还没成型的钥匙母版，来打开某个抽屉，换掉抽屉里的东西，这怎么可能呢？  int b;      //  一个装东西的抽屉   8     int *a=NULL;        // 同样只是一个钥匙母版，不能开任何抽屉  a=&b;                      // 这就好了，将钥匙母版做成了b抽屉的钥匙，可以打开b抽屉从而存取里边的东西了。

user: user-3
content: LZ只声明了一个指针变量，并没分配内存。

user: user-4
content: int *a = NULL; 既然指向NULL，NULL是定义的一个0地址，该地址不允许读写。  int *a = (int *)malloc(sizeof(int)); //该指针指向一个分配的地址 int *a = b; //该指针指向一个变量

user: user-5
content: 围观。。。。

user: user-6
content: 值传递,malloc个int变量赋值给a

user: user-7
content: int *a = (int *)calloc(sizeof(int));

user: user-0
content: 引用 2 楼 user-8 的回复:第一个指针穿进去，没有地址的 为NULL 第二个是指向了有效的地址 那要怎么写，现在每次都要写一个我不想要的b

user: user-0
content: 引用 1 楼 xpdavis 的回复:NULL就是0地址，不允许读写的 那怎么写好呢？怎么改变一个数字

user: user-8
content: 第一个指针穿进去，没有地址的 为NULL 第二个是指向了有效的地址

user: user-7
content: NULL就是0地址，不允许读写的
user-0 提问: 结构体里的string字符串赋值问题

回复:
user: user-1
content: 或者 char buf[1024]; scanf("%s", buf); employ[i].id = buf;

user: user-2
content: cin>>((char*)&unlock_person.id);

user: user-0
content: 引用 3 楼 xpdavis 的回复:cin>>employ[i].id;  试了，这样不行

user: user-1
content: cin>>employ[i].id;

user: user-0
content: 引用 1 楼 xpdavis 的回复:%s格式只能接受char *指针  结构体里的字符串怎么读终端呢？用cin也不行

user: user-1
content: %s格式只能接受char *指针
user-0 提问: 一道编程题没有思路，有急用，请大神帮帮忙

回复:
user: user-1
content: 3个循环，每个循环执行4次，必须4个字符都不一样方可输出，否则不输出，其实就是穷举

user: user-0
content: 引用 3 楼 amoyman 的回复:按题意，不是组合问题，而是排列了。 那就是这样：  char *p[4] =  {"HA","SQ","DJ","C10"}; for (int a = 0; a < 4; a++) {     for (int b = 0; b < 4; b++)     {         if (a == b) continue;         for (int c = 0; c < 4; c++)         {             if (a == c || b == c) continue;             printf("%s,%s,%s\n",p[a],p[b],p[c]);         }     } }  谢谢！

user: user-2
content: P(4, 3)的一个排列问题，不是组合问题。

user: user-3
content: 按题意，不是组合问题，而是排列了。 那就是这样：  char *p[4] =  {"HA","SQ","DJ","C10"}; for (int a = 0; a < 4; a++) {     for (int b = 0; b < 4; b++)     {         if (a == b) continue;         for (int c = 0; c < 4; c++)         {             if (a == c || b == c) continue;             printf("%s,%s,%s\n",p[a],p[b],p[c]);         }     } }

user: user-3
content: 这不就是 0，1，2，3四个数的组合问题吗 自己写的，别说我重复制造轮子哦  char *p[4] = {"HA","SQ","DJ","C10"}; for(int a = 0; a < 2; a++) {    for (int b = a + 1; b < 3; b++)   {     for (int c = b + 1; c < 4; c++)     {       printf("%s,%s,%s\n",p[a],p[b],p[c]);     }   } }

user: user-4
content: 你的问题就是求排列组合，把“红桃A、黑桃Q、方块J、草花10” 抽象为{A,Q,J,10} 然后参考如下算法: http://blog.csdn.net/jfcat/article/details/8785865
user-0 提问: 【求助】C语言扫描 白底铺黑芝麻的手机图片并得出芝麻的总数

回复:
user: user-1
content: 刚学图像处理？  1图片读取问题要解决，先学bmp格式的  2你的问题需要二值化图像，再求闭区间，一个芝麻的像素是一个闭区间。  http://download.csdn.net/detail/lovesmiles/1326376 这是一本比较老的书，vc图像处理，或者对你有用。

user: user-2
content: 这个应该用opencv。不过光编译opencv这个东东就跔足够头疼了。

user: user-3
content: 《学习OpenCV（中文版）》 编译链接调试OpenCV自带的相关例子代码。

user: user-4
content: 二值化，然后查找黑色连通域并计数
user-0 提问: 求助齿轮转动惯量的计算公式？？？

回复:
user: user-1
content: http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&ch=&tn=baiduhome_pg&bar=&wd=%E9%BD%BF%E8%BD%AE%E8%BD%AC%E5%8A%A8%E6%83%AF%E9%87%8F%E7%9A%84%E8%AE%A1%E7%AE%97%E5%85%AC%E5%BC%8F&rsv_spt=1

user: user-0
content: 那这个公式对么？？？

user: user-2
content: 引用 1 楼 zhao4zhong1 的回复:http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&ch=&tn=baiduhome_pg&bar=&wd=%E9%BD%BF%E8%BD%AE%E8%BD%AC%E5%8A%A8%E6%83%AF%E9%87%8F%E7%9A%84%E8%AE%A1%E7%AE%97%E5%85%AC%E5%BC%8F&rsv_spt=1    这样的问题居然不去百度，来这里问？

user: user-3
content: 用积分求啊，对于质点 I = m*r^2