Question: 用结构体数组实现学生管理系统

在int ret=scanf("%s%d%d",a[i].name,&a[i].num,&a[i].score);后边加个fflush(stdin);试试

引用 12 楼 cfjtaishan 的回复:[quote=引用 11 楼 yx_uu 的回复:] [quote=引用 9 楼 cfjtaishan 的回复:] [quote=引用 6 楼 yx_uu 的回复:] [quote=引用 4 楼 cfjtaishan 的回复:] 从你输入的格式来看，是你输入的数据和变量接收的数据类型不匹配导致的。 第一组输入的没问题，第二组，num是int怎么接收“ihf”呢。 scanf是格式化输入，所以你必须按照数据类型有格式的输入。  对啊，我知道这么输是错误的，输入错误数据是为了检测是否能够返回正确的ret值，但是你看，输入sojf ihf ishf的话，应该只有一个是正确格式的输入，返回1，结果运行出来是1 1 1，问题是为什么会返回三次呢？还有输入sjf sfj sof的话，运行结果是2 1 1，多出来的两次该怎么解释呢？是while循环有问题吗？但是整个运行的结果是正确的啊？ ,[/quote] 因为你输入的都是字符串，所以只与name匹配，三个字符串匹配3次[/quote] ？什么意思？输入的3个都是字符串，只有一个匹配上，就返回1嘛，多出的两个1是又在和后两个字符串匹配？[/quote] 对，这个可以打印一下name看一下，是不是匹配了。[/quote]  怎么感觉更懵逼了？

引用 11 楼 yx_uu 的回复:[quote=引用 9 楼 cfjtaishan 的回复:] [quote=引用 6 楼 yx_uu 的回复:] [quote=引用 4 楼 cfjtaishan 的回复:] 从你输入的格式来看，是你输入的数据和变量接收的数据类型不匹配导致的。 第一组输入的没问题，第二组，num是int怎么接收“ihf”呢。 scanf是格式化输入，所以你必须按照数据类型有格式的输入。  对啊，我知道这么输是错误的，输入错误数据是为了检测是否能够返回正确的ret值，但是你看，输入sojf ihf ishf的话，应该只有一个是正确格式的输入，返回1，结果运行出来是1 1 1，问题是为什么会返回三次呢？还有输入sjf sfj sof的话，运行结果是2 1 1，多出来的两次该怎么解释呢？是while循环有问题吗？但是整个运行的结果是正确的啊？ ,[/quote] 因为你输入的都是字符串，所以只与name匹配，三个字符串匹配3次[/quote] ？什么意思？输入的3个都是字符串，只有一个匹配上，就返回1嘛，多出的两个1是又在和后两个字符串匹配？[/quote] 对，这个可以打印一下name看一下，是不是匹配了。

引用 9 楼 cfjtaishan 的回复:[quote=引用 6 楼 yx_uu 的回复:] [quote=引用 4 楼 cfjtaishan 的回复:] 从你输入的格式来看，是你输入的数据和变量接收的数据类型不匹配导致的。 第一组输入的没问题，第二组，num是int怎么接收“ihf”呢。 scanf是格式化输入，所以你必须按照数据类型有格式的输入。  对啊，我知道这么输是错误的，输入错误数据是为了检测是否能够返回正确的ret值，但是你看，输入sojf ihf ishf的话，应该只有一个是正确格式的输入，返回1，结果运行出来是1 1 1，问题是为什么会返回三次呢？还有输入sjf sfj sof的话，运行结果是2 1 1，多出来的两次该怎么解释呢？是while循环有问题吗？但是整个运行的结果是正确的啊？ ,[/quote] 因为你输入的都是字符串，所以只与name匹配，三个字符串匹配3次[/quote] ？什么意思？输入的3个都是字符串，只有一个匹配上，就返回1嘛，多出的两个1是又在和后两个字符串匹配？

scanf并不是立即读取输入存放到变量中，而是先放到缓冲区，当按下回车键后，再对缓冲区进行处理。这是我在另一个帖子中看到的，觉得可以解决你的问题。

引用 6 楼 yx_uu 的回复:[quote=引用 4 楼 cfjtaishan 的回复:] 从你输入的格式来看，是你输入的数据和变量接收的数据类型不匹配导致的。 第一组输入的没问题，第二组，num是int怎么接收“ihf”呢。 scanf是格式化输入，所以你必须按照数据类型有格式的输入。  对啊，我知道这么输是错误的，输入错误数据是为了检测是否能够返回正确的ret值，但是你看，输入sojf ihf ishf的话，应该只有一个是正确格式的输入，返回1，结果运行出来是1 1 1，问题是为什么会返回三次呢？还有输入sjf sfj sof的话，运行结果是2 1 1，多出来的两次该怎么解释呢？是while循环有问题吗？但是整个运行的结果是正确的啊？ ,[/quote] 因为你输入的都是字符串，所以只与name匹配，三个字符串匹配3次

int main()  16 {  17     //struct array  18     st a[M];  19     //get student information  20     int i=0;  21     while(i<M)  22     {  23         //scanf会返回成功匹配的字符个数，int型  24         int ret=scanf("%s%d%d",a[i].name,&a[i].num,&a[i].score);  25 //      printf("%d\n",ret);  26         if(3!=ret)  27             break;  28         i++;  29     }  30     //search student  31     char buf[100];  32     printf("input search information:\n");  33     gets(buf);  34     for(i=0;i<M;i++)  35     {  36         if(0==strcmp(a[i].name,buf))  37         {  38             printf("information:%s,%d,%d\n",a[i].name,a[i].num,a[i].score);  39         }  40     }  41 }  为什么执行不到gets(buf)？  root@ubuntu:~/cc# ./a.out  aaa 122 12 bbb 223 234 ccc 234 43 s osjf os input search information: root@ubuntu:~/cc# vim struct_arr.c

引用 5 楼 fight_in_dl 的回复:int ret=scanf("%s%d%d",a[i].name,&a[i].num,&a[i].score);  %s格式字符串会将终端输入都作为字符串接收到a[i].name中。 解决办法是分开输入：  printf("please input name:\n"); scanf("%s",a[i].name);  printf("please input num:\n"); scanf("%d",&a[i].num);  printf("please input score:\n"); scanf("%d",&a[i].score); ”%s”不是遇到空格换行等转义字符不读入？ 我这里主要是为了获取正确输入的字符数返回ret来控制跳出循环，就说设置的最大值是输100个数据，但测试的时候输不了这么多，不想输的时候直接跳出来执行下一步，而不是直接Ctrl+c结束程序，不清楚为什么输错之后ret值会返回好几个？

引用 4 楼 cfjtaishan 的回复:从你输入的格式来看，是你输入的数据和变量接收的数据类型不匹配导致的。 第一组输入的没问题，第二组，num是int怎么接收“ihf”呢。 scanf是格式化输入，所以你必须按照数据类型有格式的输入。  对啊，我知道这么输是错误的，输入错误数据是为了检测是否能够返回正确的ret值，但是你看，输入sojf ihf ishf的话，应该只有一个是正确格式的输入，返回1，结果运行出来是1 1 1，问题是为什么会返回三次呢？还有输入sjf sfj sof的话，运行结果是2 1 1，多出来的两次该怎么解释呢？是while循环有问题吗？但是整个运行的结果是正确的啊？ ,

如果不用键盘输入，将数据存到文件中直接读取怎么办？重定向到文件吗？要怎么实现？

printf("%d\n",ret);  26         if(3!=ret)  27             break;  28         i++;  结果又是对的，，，，？？ root@ubuntu:~/cc# ./a.out  aaa 111 90 3 bbb 222 98 3 ccc s suh 1 root@ubuntu:~/cc# vim struct_arr.c

，，，，又试了下，怎么感觉越来越扯了？scanf返回的值有问题？ root@ubuntu:~/cc# ./a.out  sojf 394 33 3 sojf isj 29 1  sjf sfj sof 2 1 1 sojf osjf w9 1 1 1 398 hfu 89 2


Question: linux+epoll丢失连接问题

http://blog.csdn.net/zhao4zhong1/article/details/53078924 老司机找bug的十年心路历程

@赵4老师  解决了，是由于我客户端为了简便没有写日志，直接重定向导致的，我重写了客户端服务端，都打上了日志，抓包也都对了。 现在并发上去了，也没丢数据。 我去看看重定向为什么会引起打印不全。 谢谢了。

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

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include<fcntl.h> #include <netinet/in.h> #include <sys/socket.h> #include <arpa/inet.h> #include <sys/epoll.h> #include <unistd.h> #include <sys/types.h> #include<netinet/tcp.h> //IPPROTO_TCP #include<pthread.h> #include<semaphore.h> #include<time.h> #include <sys/resource.h> #define MAXBUF	    10240 //MAXBUF<=MAXSIZE，MAXBUF用循环read #define MAXSIZE     10240 #define LISTENQ    1000  #define FDSIZE      1000 #define EPOLLEVENTS 100 #define NTHREADS   4   typedef struct { 	int clifd; }recbuf;  typedef struct { 	recbuf *bufs; 	unsigned int max; 	unsigned int front; 	int rear; 	sem_t slots; 	sem_t mutex; 	sem_t items; }sbuf;  sbuf sbufs; int listenfd; int epollfd;  //创建套接字并进行绑定 static void *init_socket(void *arg); //设置socket连接为非阻塞模式 int set_nonblocking(int listenfd); //epoll static void do_epoll(); //写处理 static void do_write(int epollfd,int fd,char *buf); //添加事件 static void add_event(int fd,int state); //修改事件 static void modify_event(int fd,int state); //删除事件 static void delete_event(int fd,int state); //业务处理 static void *thread_do(); //sbuf初始化 static void sbuf_init(sbuf *sp, int n); //sbuf.bufs释放 static void sbuf_destroy(sbuf *sp); //sbuf插入可用连接 static void sbuf_insert(sbuf *sp, int clifd); //sbuf移除可用连接 static void sbuf_remove(sbuf *sp, int *clifd);  int main(int argc,char *argv[]) { 	int i; 	struct rlimit rl; 	pthread_t tid,tid_acc; 	rl.rlim_cur = 10240; 	rl.rlim_max = 10240; 	setrlimit(RLIMIT_NOFILE, &rl); 	getrlimit(RLIMIT_NOFILE, &rl); 	epollfd = epoll_create(FDSIZE); 	pthread_create(&tid_acc,NULL,init_socket,(void*)(argv[1])); 	sbuf_init(&sbufs,100); 	for(i = 0; i < NTHREADS; i++) 	{ 		pthread_create(&tid,NULL,thread_do,NULL); 	} 	do_epoll(); 	close(listenfd); 	sbuf_destroy(&sbufs); 	return 0; }  static void sbuf_init(sbuf *sp, int n) { 	int i; 	if((sp->bufs = (recbuf *)calloc(n,sizeof(recbuf))) == NULL) 	{ 		perror("calloc"); 		exit(1); 	}	 	sp->max = n; 	sp->front = sp->rear = 0; 	sem_init(&sp->slots,0,n); 	sem_init(&sp->mutex,0,1); 	sem_init(&sp->items,0,0); }  static void sbuf_destroy(sbuf *sp) { 	sem_destroy(&sp->slots); 	sem_destroy(&sp->mutex); 	sem_destroy(&sp->items); }  static void sbuf_insert(sbuf *sp, int clifd) { 	int tmp; 	sem_getvalue(&sp->slots,&tmp); 	sem_getvalue(&sp->items,&tmp); 	sem_wait(&sp->slots); 	sp->rear = (sp->rear >= sp->max)?0:sp->rear; 	sp->bufs[sp->rear++].clifd = clifd; 	delete_event(clifd,EPOLLIN); 	sem_post(&sp->items); }  static void sbuf_remove(sbuf *sp, int *clifd) { 	int tmp; 	int tmp1; 	 sem_getvalue(&sp->items,&tmp1); 	 sem_getvalue(&sp->slots,&tmp1); 	sem_wait(&sp->items); 	sem_wait(&sp->mutex); 	sp->front = tmp = (sp->front >= sp->max)?0:sp->front; 	sp->front++; 	sem_post(&sp->mutex); 	*clifd = sp->bufs[tmp].clifd; 	sem_post(&sp->slots); }  static void *thread_do() { 	char buf[MAXBUF]; 	int clifd; 	int nread,n,i,n1; 	pthread_detach(pthread_self()); 	while(1) 	{ 		sbuf_remove(&sbufs, &clifd); 		while(1){ 		n1 = n  = i = 0; 		while((nread = read(clifd,buf+n,MAXBUF-1)) > 0) 		{ 			n += nread; 			i = 1; 		}  		if (nread == -1 && errno != EAGAIN) 		{ 			perror("read error:"); 			close(clifd); 			break; 		} 		else if (i == 0) 		{ 			printf("client close.\n"); 			close(clifd); 			break; 		} 		printf("%s\n",buf); 		write(clifd, buf, strlen(buf)); 		}	  	} }  static void *init_socket(void *arg) { 	int  listenfd, opt = 1, port = atoi((char*)arg); 	struct sockaddr_in servaddr; 	int clifd; 	int val2 = 1460*2; 	int val1; 	struct sockaddr_in cliaddr; 	socklen_t  cliaddrlen = sizeof(struct sockaddr); 	socklen_t  cliaddrlen1 = sizeof(struct sockaddr); 	int val = 2,ret = 0; 	listenfd = socket(AF_INET,SOCK_STREAM,0); 	if (listenfd == -1) 	{ 		perror("socket error:"); 		exit(1); 	} 	bzero(&servaddr,sizeof(servaddr)); 	servaddr.sin_family = AF_INET; 	servaddr.sin_port = htons(port); 	servaddr.sin_addr.s_addr = INADDR_ANY; 	setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,(const void *)&opt,sizeof(opt));   	setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,(const void *)&opt,sizeof(opt));   	setsockopt(listenfd, SOL_SOCKET, SO_RCVBUF, &val2, sizeof(int)); 	setsockopt(listenfd, SOL_SOCKET, SO_SNDBUF, &val2, sizeof(int)); 	getsockopt(listenfd, SOL_SOCKET, SO_RCVBUF, &val1, &cliaddrlen1); 	getsockopt(listenfd, SOL_SOCKET, SO_RCVBUF, &val1, &cliaddrlen1); 	if (bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) == -1) 	{ 		perror("bind error: "); 		exit(1); 	} 	listen(listenfd,LISTENQ); 	while(1){ 		if((clifd = accept(listenfd,(struct sockaddr*)&cliaddr,&cliaddrlen)) > 0) 		{ 			set_nonblocking(clifd);		 			printf("accept a new client: %s:%d\n",inet_ntoa(cliaddr.sin_addr),cliaddr.sin_port); 			add_event(clifd,EPOLLIN); 		} 	} }  int set_nonblocking(int listenfd)  { 	int opts; 	opts = fcntl(listenfd, F_GETFL); 	if(opts < 0) { 		perror("fcntl(F_GETFL)\n"); 		return -1; 	} 	opts = (opts | O_NONBLOCK); 	if(fcntl(listenfd, F_SETFL, opts) < 0) { 		perror("fcntl(F_SETFL)\n"); 		return -1; 	} 	return 1; }  static void do_epoll() { 	struct epoll_event events[EPOLLEVENTS]; 	int ret,i; 	while(1) 	{ 		i = 0; 		ret = epoll_wait(epollfd,events,EPOLLEVENTS,2000); 		switch(4<ret){ 			case 1: 				for(i = 0; i< 5;){ 					sbuf_insert(&sbufs,events[i++].data.fd);	 					sbuf_insert(&sbufs,events[i++].data.fd);	 					sbuf_insert(&sbufs,events[i++].data.fd);	 					sbuf_insert(&sbufs,events[i++].data.fd);	 					sbuf_insert(&sbufs,events[i++].data.fd);	 				} 			case 0: 				for(; i< ret;){ 					sbuf_insert(&sbufs,events[i++].data.fd); 				} 				break; 		}  	} 	close(epollfd); }    static void do_write(int epollfd,int fd,char *buf) { 	int nwrite, datalen, n; 	n = datalen = strlen(buf); 	while(n > 0) 	{	 		nwrite = write(fd, buf + datalen - n, n); 		//printf("write to client:%d\n",nwrite); 		if (nwrite < n) 		{ 			if(nwrite == -1 && errno != EAGAIN){	 				perror("write error:"); 				close(fd); 				delete_event(fd,EPOLLOUT); 			} 			break; 		} 		n -= nwrite; 	}  }  static void add_event(int fd,int state) { 	struct epoll_event ev; 	ev.events = state|EPOLLET; 	ev.data.fd = fd; 	epoll_ctl(epollfd,EPOLL_CTL_ADD,fd,&ev); }  static void delete_event(int fd,int state) { 	struct epoll_event ev; 	ev.events = state|EPOLLET; 	ev.data.fd = fd; 	epoll_ctl(epollfd,EPOLL_CTL_DEL,fd,&ev); }  static void modify_event(int fd,int state) { 	struct epoll_event ev; 	ev.events = state|EPOLLET; 	ev.data.fd = fd; 	epoll_ctl(epollfd,EPOLL_CTL_MOD,fd,&ev); }


Question: 从TXT文本中读取数据（数值为0-9），将数据转换为指定字符后再写入文件，但程序结束时出时出现错误中断。为什么

fflush或fclose后，fprintf的内容才真正写到磁盘文件中。

引用 7 楼 zhao4zhong1 的回复:判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }   找到原因是str数组益出，但是为什么结果写进文件fp呢？ 	for (i = 0; i < HIGH; i++) 	{  		for (j = 0; j < WIND; j++) 		{  			fprintf(fp,"%c", str[i][j]); 			//fputc(str[i][j], fp); 		} 		fprintf(fp,"\n"); 	} 这方法不可行吗？还是fopen 打开文件只能执行一次，读取后要关闭了才能再进行写入？

可能访问str或者st时越界了

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

引用 4 楼 mk112255 的回复:[quote=引用 2 楼 paschen 的回复:] 可能访问str或者st时越界了 是在程序结束的时候弹出的，而且数组的内容无法写入文件f:\\map.txt内[/quote]  越界不一定直接崩溃，从你提示看，你的栈被破坏了，函数结束时检查程序被中断了下来  你可以单步跟踪程序运行，查看读到的变量是多少，观察分析原因

引用 4 楼 mk112255 的回复:[quote=引用 2 楼 paschen 的回复:] 可能访问str或者st时越界了 是在程序结束的时候弹出的，而且数组的内容无法写入文件f:\\map.txt内[/quote] str[i][j] = st[ch];这句ch是以%d读出来的，但是作为st的下标，可能已经越界了。 建议把ch打印出来，看看是否越界了。

引用 2 楼 paschen 的回复:可能访问str或者st时越界了 是在程序结束的时候弹出的，而且数组的内容无法写入文件f:\\map.txt内

读出来的ch比st的下标大会数组越界！可以查一下读到值


Question: 文件中读写数据结构lseek之后出现问题？

引用 楼主 linyimian7539 的回复:#include <string.h> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <sys/types.h>     #include <sys/stat.h>  typedef struct { 	int Id; 	int mathScore; 	int chScore; 	int enScore; 	int aveScore; 	char Name[32]; }STU;  int main() { 	STU stuInfo[2]; 	memset(stuInfo,0x00,sizeof(stuInfo)); 	 	int i; 	 	for(i=0; i<2; i++) 	{ 		printf("Please input one student's id name mathScore chScore enScore\n"); 		scanf("%d%d%d%d%s",&stuInfo[i].Id,&stuInfo[i].mathScore,&stuInfo[i].chScore,&stuInfo[i].enScore,&stuInfo[i].Name); 		stuInfo[i].aveScore = (stuInfo[i].mathScore+stuInfo[i].chScore+stuInfo[i].enScore)/3; 	} 	 	char *file = "f2.txt"; 	int fd = open(file,O_CREAT|O_WRONLY|O_APPEND,S_IREAD|S_IWRITE); 	 	int len = 0; 	for(i=0; i<2; i++) 	{ 		if(len = write(fd,&stuInfo[i],sizeof(stuInfo[i]))) 			printf("write len = %d\n",len); 	} 	close(fd); 	fd = open(file,O_CREAT|O_RDONLY,S_IREAD); 	//len = lseek(fd,0,SEEK_SET); 	//printf("lseek len = %d\n",len); 	memset(stuInfo,0x00,sizeof(stuInfo)); 	for(i=0; i<2; i++) 	{ 		if(len = read(fd,&stuInfo[i],sizeof(stuInfo[i]))) 			printf("read len = %d\n",len); 	} 	 	for(i=0; i<2; i++) 	{ 		stuInfo[i].aveScore = (stuInfo[i].mathScore+stuInfo[i].chScore+stuInfo[i].enScore)/3; 		printf("%d %s %d %d %d %d\n",stuInfo[i].Id,stuInfo[i].Name,stuInfo[i].mathScore,stuInfo[i].chScore,stuInfo[i].enScore,stuInfo[i].aveScore); 	} 	 	return 0; 	 } 上面是把一个数据结构写到文件中再读出来，这样是没问题的，但是如果把close(fd); 	fd = open(file,O_CREAT|O_RDONLY,S_IREAD);注释掉，将//len = lseek(fd,0,SEEK_SET); 	//printf("lseek len = %d\n",len);注释去掉之后，read的结果是-1，读不出来数据，请问大神这是什么问题，环境是在centos环境下编译运行。  除楼上们所说， 附一点： 学习最根本的东西才能降低下次犯错的可能性： http://blog.csdn.net/liigo/article/details/582231/ 或 baidu gdb调试

不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

已更新方式打开一个文件同时进行读写, 读写切换时需要调用干预函数fseek(), fsetpos(), or rewind()来重置文件指针位置. http://pubs.opengroup.org/onlinepubs/9699919799/functions/fopen.html When a file is opened with update mode ( '+' as the second or third character in the mode argument), both input and output may be performed on the associated stream.  However, the application shall ensure that output is not directly followed by input without an intervening call to fflush() or to a file positioning function (fseek(), fsetpos(), or rewind()), and input is not directly followed by output without an intervening call to a file positioning function, unless the input operation encounters end-of-file.

来个人看看呐

引用 10 楼 linyimian7539 的回复:[quote=引用 5 楼 cfjtaishan 的回复:] #include <string.h> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h>  typedef struct {     int Id;     int mathScore;     int chScore;     int enScore;     int aveScore;     char Name[32]; }STU;  int main() {     STU stuInfo[2];     memset(stuInfo,0x00,sizeof(stuInfo));      int i;      for(i=0; i<2; i++)     {         printf("Please input one student's id name mathScore chScore enScore\n");         scanf("%d%d%d%d%s",                 &stuInfo[i].Id,                 &stuInfo[i].mathScore,                 &stuInfo[i].chScore,                 &stuInfo[i].enScore,                 stuInfo[i].Name);         stuInfo[i].aveScore = (stuInfo[i].mathScore+stuInfo[i].chScore+stuInfo[i].enScore)/3;     }      char *file = "f2.txt";     int fd = open(file,O_CREAT|O_WRONLY|O_APPEND,S_IREAD|S_IWRITE);      int len = 0;     for(i=0; i<2; i++)     {         if((len = write(fd,&stuInfo[i],sizeof(stuInfo[i]))) > 0)             printf("write len = %d\n",len);     }     close(fd);     fd = open(file,O_CREAT|O_RDONLY,S_IREAD);     len = lseek(fd,0,SEEK_SET);     printf("lseek len = %d\n",len);     memset(stuInfo,0x00,sizeof(stuInfo));     for(i=0; i<2; i++)     {         if((len = read(fd,&stuInfo[i],sizeof(stuInfo[i]))) > 0)             printf("read len = %d\n",len);     }      for(i=0; i<2; i++)     {         stuInfo[i].aveScore = (stuInfo[i].mathScore+stuInfo[i].chScore+stuInfo[i].enScore)/3;         printf("%d %s %d %d %d %d\n", stuInfo[i].Id,stuInfo[i].Name,                 stuInfo[i].mathScore,stuInfo[i].chScore,                 stuInfo[i].enScore,stuInfo[i].aveScore);     }      return 0;  } 代码没什么问题，注释那两行和不注释都没问题。再说，注释的那两行不会影响读写。如果把close(fd)注释掉，那么第二次打开去读时可能读不到数据，因为写入的数据还在内存中，不在文件中，所以不能把写入之后的close(fd)注释掉； 注意，你的写入之前的键盘输入时，提示信息是id name xxx xxx xxx但是，实际上name是最要求最后输入的，所以这是一个问题～很容易输错。  找到错误原因了，open的时候flag标识有问题O_WRONLY，在write之后把文件close然后再open不会出问题，但是如果把37,38行注释掉，39,40行的注释去掉，因为文件描述符标识为O_WRONLY，所以read的时候就有问题了，改为O_RDWR之后解决。[/quote] 改正，代码应该是41,42以及42,43两行

引用 5 楼 cfjtaishan 的回复:#include <string.h> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h>  typedef struct {     int Id;     int mathScore;     int chScore;     int enScore;     int aveScore;     char Name[32]; }STU;  int main() {     STU stuInfo[2];     memset(stuInfo,0x00,sizeof(stuInfo));      int i;      for(i=0; i<2; i++)     {         printf("Please input one student's id name mathScore chScore enScore\n");         scanf("%d%d%d%d%s",                 &stuInfo[i].Id,                 &stuInfo[i].mathScore,                 &stuInfo[i].chScore,                 &stuInfo[i].enScore,                 stuInfo[i].Name);         stuInfo[i].aveScore = (stuInfo[i].mathScore+stuInfo[i].chScore+stuInfo[i].enScore)/3;     }      char *file = "f2.txt";     int fd = open(file,O_CREAT|O_WRONLY|O_APPEND,S_IREAD|S_IWRITE);      int len = 0;     for(i=0; i<2; i++)     {         if((len = write(fd,&stuInfo[i],sizeof(stuInfo[i]))) > 0)             printf("write len = %d\n",len);     }     close(fd);     fd = open(file,O_CREAT|O_RDONLY,S_IREAD);     len = lseek(fd,0,SEEK_SET);     printf("lseek len = %d\n",len);     memset(stuInfo,0x00,sizeof(stuInfo));     for(i=0; i<2; i++)     {         if((len = read(fd,&stuInfo[i],sizeof(stuInfo[i]))) > 0)             printf("read len = %d\n",len);     }      for(i=0; i<2; i++)     {         stuInfo[i].aveScore = (stuInfo[i].mathScore+stuInfo[i].chScore+stuInfo[i].enScore)/3;         printf("%d %s %d %d %d %d\n", stuInfo[i].Id,stuInfo[i].Name,                 stuInfo[i].mathScore,stuInfo[i].chScore,                 stuInfo[i].enScore,stuInfo[i].aveScore);     }      return 0;  } 代码没什么问题，注释那两行和不注释都没问题。再说，注释的那两行不会影响读写。如果把close(fd)注释掉，那么第二次打开去读时可能读不到数据，因为写入的数据还在内存中，不在文件中，所以不能把写入之后的close(fd)注释掉； 注意，你的写入之前的键盘输入时，提示信息是id name xxx xxx xxx但是，实际上name是最要求最后输入的，所以这是一个问题～很容易输错。  找到错误原因了，open的时候flag标识有问题O_WRONLY，在write之后把文件close然后再open不会出问题，但是如果把37,38行注释掉，39,40行的注释去掉，因为文件描述符标识为O_WRONLY，所以read的时候就有问题了，改为O_RDWR之后解决。

引用 8 楼 wyyy2088511 的回复:直接调用write并没有写到文件中，可以在debug 中查看，文件没有数据，直接读数据当然读不出来数据，write后frush 才会有数据！ 你说的应该是fopen等库函数，有缓存的。


Question: 二维数组过大，动态申请空间之后，再赋值，赋值进行的一半就不行了，请问该怎么解决

仅供参考：当程序需要使用比如2GB～1TB左右的存储时，最简单的办法恐怕得是用文件读写模拟内存读写了吧。windows参考_fseeki64函数，linux参考fseeko64函数。 FILE *fA;fA=fopen("A","rb+");_fseeki64(fA,10000000000i64*sizeof(int),SEEK_SET);fputc(fA,0);//int A[10000000000]; int B; _fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fread(&B,1,sizeof(int),fA);//B=A[9999999999]; _fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fwrite(&B,1,sizeof(int),fA);//A[9999999999]=B; fclose(fA);

我是要对一个1000X22500的矩阵进行svd分解，其中矩阵v就是22500X22500的

你这是要测试CPU和内存的极限吗？还是纯粹想玩，测试一下？ 22500 × 22500 × 8 / （1024 × 1024 × 1024） 大约为3.77个G，堆上的空间没这么大吧（还得考虑一下你的PC内存）

非得这样申请内存还想快, 那是不可能的, 但是完成一个任务方法有很多, 你应该描述一下原始需求.

1. a[i]也是要free的. 2. 申请的内存差不多有8G, 而且是碎片化的,运行需要比较长时间, 要考虑一下是不是设计不合理.


Question: 哪位大牛，解决一下int和float的精度问题

浮点数格式 http://bbs.csdn.net/topics/390676437

感谢两位仁兄的解惑，希望以后多多指点

看看这个帖子吧 http://bbs.csdn.net/topics/370138481

越界了，float虽然也是4个自己，但是它不是所有位用于表示整数部分。int类型不会这样，它是将所有位都表示整数。 http://www.cnblogs.com/mirrorgrass/p/5469552.html


Question: c语言读取文件夹下所有的文件名

system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad  c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住，能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作，而不要用各种API获取或者操作，因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时，API会处理的不全面或陷入死循环，而shell命令不会。 如果嫌system黑窗口一闪，将system("...")替换为WinExec("cmd /c ...",SW_HIDE);

#include <stdio.h> #include <string.h> #include <sys/types.h> #include <errno.h> #include <dirent.h>  int main(int argc, char *argv[]) {     if (argc < 2) {         fprintf(stdout, "Usage: too few paramters!\n");         return 0;     }      DIR *dp = NULL;      dp = opendir(argv[1]);     if (!dp) {         fprintf(stderr, "opendir: %s\n", strerror(errno));         return 0;     }      struct dirent *dirp;     while ((dirp = readdir(dp))) {         if (strcmp(dirp->d_name, ".") == 0 || strcmp(dirp->d_name, "..") == 0)             continue;         printf("%s\n", dirp->d_name);     }     closedir(dp);      return 0; } 系统调用，建议把上面的代码先运行一下，然后改成你想要的--就是把文件名拷贝到你要得缓存里。

@echo off & setlocal EnableDelayedExpansion for /f "delims=" %%i in ('"dir /a/s/b/on *.*"') do ( set file=%%~fi set file=!file:/=/! echo !file! >> 路径.txt )  bat文件内输入这个，然后把改文件放在你需要的目录下

这个批处理 dos就可以做到吧


Question: 急 vc：有木有大神帮忙加一下文本存储和统计功能呀 统计任一家庭的平均寿命，平均身高，男女比例，家庭平均人口 要做一个家谱管理系统

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

这个程序能编译通过吗？ 建议多检查一下scanf，看到里面多处错误；比较典型的是对于数组名前加&，数组名本身是地址，所以不用加&。 对于这么长的程序不建议一下子写出所有功能，然后再编译，除非你有比较好的C语言功底和足够的耐心。否则，你会在多个error和warning面前失去耐心的。 建议逐步注释和逐步调试，一个个功能调试。


Question: Serialport  串口问题    ReadFile

// 当在串口助手放1234的是时候就显示strcat_s(buffer, 16, szTmp);  VC我不会，但strcat应是连接字符串吧，如果发过来的数据不是字符串，不就会发生问题了？

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


Question: 小白问一个只有5行程序的题，求大神解我好几天谜团

引用 17 楼 cuipy 的回复:这个要说到整数的++运算的问题了； int a=2; a++;   //  返回值为a的当前值，这一行结束的时候a的值加1； ++a;   //  a的值加1，并且返回新的值。    其实第二种 ++a 这样的，应该是这一行语句执行完毕后才返回，并不是++a 之后马上返回；  因此 你说的那个题里面： add(n++,++n,n++)   第二个实参要等到另外n++都执行完毕后，才返回，这时候就成了n+1 又+1 ，然后中间的++n才返回，就成了好像中间的参数最后计算一样。   不知道说清楚没有？  哇塞！！你这个回答真好！终于懂了

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

好吧，目前还看不懂汇编代码，等以后学习一下汇编，再去看看运行时的反汇编，应该会懂。谢谢你了

感觉只有面试题或者谭的书上才会出这种难受的题

引用 14 楼 chenzheng1030 的回复:怎么会很混乱？参数之间的逗号相当于一个序列点，编译器到这里的时候会把++之后的新值写入到变量a的地址。 add(a++, ++a, a++); 我觉得汇编伪代码是长这样的: ;压第一个参数，最右边的 LOD a MOV a REG1 INC a STR a ;压第二个参数，中间的 LOD A INC a STR a MOV a REG2 ;压第三个参数，最左边的 LOD a MOV a REG3 INC a STR a 谁说参数之间的逗号是序列点了？

引用 12楼东边一耳 的回复:这个没有副作用，所有的++都已经有逗号分隔开了。 这个问题主要是要考虑到函数参数的压栈顺序，而这个压栈顺序是跟ABI相关的，不同的编译器在不同的平台和操作系统下面实现不同的ABI，楼主的测试结果来看，应该是从右往左入栈。 add(a++, ++a, a++);         <------<------<--- 因为从右往左，所以楼主自己就知道该怎么判断了。  真正未定义的是这样子的： a++ + ++a，这才是坑爹的玩意根据压栈顺序来讲，无论传入几个a++，结果都是可以推出来的。重点在于  传入++a的时候，结果很混乱，并不是简单的先把当前a的值自增然后进栈。在出栈的时候，++a还会有影响。我就是弄不清这个++a到底是怎么影响的。

各个厂商设计得都不一样，你用codeblocks和vc6运行都会不同。 怎么可能出这种题，退一万步说即使面试这种题，你直接指出来，估计这样分更高哦

编译器不同，可能会产生不同的计算值。 在实际编写程序的过程中，应当尽量避免此类运算的使用【一般也不会用到】， 而使用没有编译歧义的代码。

关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

引用 6楼yelinCoder 的回复:拒绝回答此类面试题，赞同一楼大哥回答。有的时候吧，只是单纯的想知道

拒绝回答此类面试题，赞同一楼大哥回答。

出这样题目的人，拉出去轮X十分钟再说！！！！

引用 1楼战在春秋 的回复:压栈顺序和编译器的实现相关，书上愿意出这样的题，源自谭浩强。 实际上这类题没有太大意义，在这上面纠结几天时间，更是极不划算。  在C99标准中属于不确定行为(undefined behavior)  引用The order of evaluation of the function designator, the actual arguments, and subexpressions within the actual arguments is unspecified.  具体到这个题目，如果是老师出的，问问老师怎么解释，如果是书上的，应该有解答，实在不行，邮件询问作者。视频在讲函数参数的运算顺序，这是我自己引申的，在Linux下和vs2015下运算结果是一样的。这种代码一般也不写，就是可能会出在企业的笔试题里

引用 2楼自信男孩 的回复:不论前++还是后++都会有副作用； 像这种：add(a++, ++a, a++);这种问题不建议继续讨论了。以后要避免写这样的代码；这是有可能出在面试的笔试题上的，自己肯定不会写这样的代码


Question: 有m组数，任意取n组（m>n），统计n组数里面数的个数

递归穷举法。

语文不太好，没看懂楼主的意思。

#include <stdio.h> #include <stdlib.h>  #define     MAX_SIZE    3  struct num_info {     int num;     int *list; };  void init_num(struct num_info **p, int len); void reinit_num(struct num_info **p, int len); void print_arr(struct num_info *p); void bubble_sort(int *arr, int len); void merge_nums(struct num_info *p1, struct num_info *p2, struct num_info **pnew);  int main(void) {     int i;     struct num_info *parr[MAX_SIZE], *pnew;      init_num(parr, MAX_SIZE);     for (i = 0; i < MAX_SIZE; i++) {         bubble_sort(parr[i]->list, parr[i]->num);         print_arr(parr[i]);     }      merge_nums(parr[1], parr[2], &pnew);      print_arr(pnew);      reinit_num(parr, MAX_SIZE);     free(pnew->list);     free(pnew);      return 0; }   void init_num(struct num_info **p, int len) {     int i, j, num;      for (i = 0; i < len; i++) {         p[i] = (struct num_info *)malloc(sizeof(struct num_info));         if (!p[i])             exit(0);         printf("Please input the number: ");         scanf("%d", &num);         p[i]->list = (int *)malloc(num * sizeof(int));         if (!p[i])             exit(0);         p[i]->num = num;         printf("Please input the data: ");         for (j = 0; j < num; j++)             scanf("%d", p[i]->list + j);     } }  void reinit_num(struct num_info **p, int len) {     int i;      for (i = 0; i < len; i++) {         free(p[i]->list);         free(p[i]);     } }  void print_arr(struct num_info *p) {     int i;      for (i = 0; i < p->num; i++)         printf("%d\t", p->list[i]);     printf("\n"); }  void bubble_sort(int *arr, int len) {     int i, j;      int tmp;     for (i = 0; i < len - 1; i++)         for (j = 0; j < len - 1 - i; j++)             if (arr[j] > arr[j+1]) {                 tmp = arr[j];                 arr[j] = arr[j+1];                 arr[j+1] = tmp;             } }  void merge_nums(struct num_info *p1, struct num_info *p2, struct num_info **pnew) {     int i = 0, j = 0, k = 0;      *pnew = (struct num_info *)malloc(sizeof(struct num_info));     if (!(*pnew))         exit(0);     (*pnew)->list = (int *)malloc(sizeof(int) * (p1->num + p2->num));     if (!(*pnew)->list)         exit(0);      while (i < p1->num && j < p2->num) {         if (p1->list[i] > p2->list[j]) {             (*pnew)->list[k++] = p2->list[j];             j++;         } else if (p1->list[i] < p2->list[j]) {             (*pnew)->list[k++] = p1->list[i];             j++;         } else {             i++;             j++;         }     }     while (i < p1->num) {         (*pnew)->list[k++] = p1->list[i];         i++;     }     while (j < p2->num) {         (*pnew)->list[k++] = p2->list[j];         j++;     }     (*pnew)->num = k; } 试一下这个程序


Question: 求一份C语言库函数手册 chm版的，网上找了好久都失效了，希望能给一份，谢谢

C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817

MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl

c++库函数(中文).chm http://download.csdn.net/detail/ygsfly/2519154

需要积分吧，可能很多，记得我曾经发过一个，

免费免帐号下载http://zh.cppreference.com/w/Cppreference:Archives 不过只有html的，chm是compiled html,可以找个工具转换

http://vdisk.weibo.com/s/aXnA1uHm1eS6s 下载连接

http://c.biancheng.net/cpp/u/hanshu/ 在线查


Question: 有m组数，任意取n组（m>n），合并n组数，组成新集合，计算新集合里元素的个数?

#include <stdio.h> #include <stdlib.h>  #define     MAX_SIZE    3  struct num_info {     int num;     int *list; };  void init_num(struct num_info **p, int len); void reinit_num(struct num_info **p, int len); void print_arr(struct num_info *p); void bubble_sort(int *arr, int len); void merge_nums(struct num_info *p1, struct num_info *p2, struct num_info **pnew);  int main(void) {     int i;     struct num_info *parr[MAX_SIZE], *pnew;      init_num(parr, MAX_SIZE);     for (i = 0; i < MAX_SIZE; i++) {         bubble_sort(parr[i]->list, parr[i]->num);         print_arr(parr[i]);     }      merge_nums(parr[1], parr[2], &pnew);      print_arr(pnew);      reinit_num(parr, MAX_SIZE);     free(pnew->list);     free(pnew);      return 0; }   void init_num(struct num_info **p, int len) {     int i, j, num;      for (i = 0; i < len; i++) {         p[i] = (struct num_info *)malloc(sizeof(struct num_info));         if (!p[i])             exit(0);         printf("Please input the number: ");         scanf("%d", &num);         p[i]->list = (int *)malloc(num * sizeof(int));         if (!p[i])             exit(0);         p[i]->num = num;         printf("Please input the data: ");         for (j = 0; j < num; j++)             scanf("%d", p[i]->list + j);     } }  void reinit_num(struct num_info **p, int len) {     int i;      for (i = 0; i < len; i++) {         free(p[i]->list);         free(p[i]);     } }  void print_arr(struct num_info *p) {     int i;      for (i = 0; i < p->num; i++)         printf("%d\t", p->list[i]);     printf("\n"); }  void bubble_sort(int *arr, int len) {     int i, j;      int tmp;     for (i = 0; i < len - 1; i++)         for (j = 0; j < len - 1 - i; j++)             if (arr[j] > arr[j+1]) {                 tmp = arr[j];                 arr[j] = arr[j+1];                 arr[j+1] = tmp;             } }  void merge_nums(struct num_info *p1, struct num_info *p2, struct num_info **pnew) {     int i = 0, j = 0, k = 0;      *pnew = (struct num_info *)malloc(sizeof(struct num_info));     if (!(*pnew))         exit(0);     (*pnew)->list = (int *)malloc(sizeof(int) * (p1->num + p2->num));     if (!(*pnew)->list)         exit(0);      while (i < p1->num && j < p2->num) {         if (p1->list[i] > p2->list[j]) {             (*pnew)->list[k++] = p2->list[j];             j++;         } else if (p1->list[i] < p2->list[j]) {             (*pnew)->list[k++] = p1->list[i];             j++;         } else {             i++;             j++;         }     }     while (i < p1->num) {         (*pnew)->list[k++] = p1->list[i];         i++;     }     while (j < p2->num) {         (*pnew)->list[k++] = p2->list[j];         j++;     }     (*pnew)->num = k; } 这个程序可以实现你的需求； 但是有一个问题，如果数组中有重复的数据，得到的组合数据里也有重复的数据，建议自己改一下程序，避免这个问题。

比如有三组数m1=（1，9，20，75）m2=（63，75，82）m3=（1,9,63,89） 从三组数中取任取两组数组合，假如取m2和m3，合并两个数组得n1=（1，9，63，75，82，89），计算n1里面数的个数是6个

两个常规方法： 1： 组合，去重（遍历，如果是重复的则把它放置在末端） 例如：2 2 3 1 3 0)设开始索引begin = 0，末端索引 last = 4； 1）首先取第一个数2，从它下一个数开始对比； 2）第二个元素是2，跟第一个数重复，跟末端数调换 2 3 3 1 2，同时末端索引-1，即last == 3； 3）如果重复进行从该处进行比较，否则比较下一个位置的元素，直到到达末端结点； 4）重复上述2~3步骤（跟冒泡排序有点类似，此处区别只是比较到末端结点就停止了，还有步骤3中的重复调换后比较的位置不变）  2： 写个有序数列，一个个元素插入进去，最后的结果是有序并且唯一的

建议你把你的需求说的详细一些，如果可以，列举一些例子最好了； 复杂的项目还得写需求文档呢，你的这个需求，起码需要几句说明一下吧


Question: 为何会出现段错误？

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

引用 6 楼 cfjtaishan 的回复:[quote=引用 5 楼 qq_34984564 的回复:] [quote=引用 4 楼 xaioxiaoguai 的回复:] 输入的n>10时，结构体数组就越界了（第三个测试点） 下标越界是未定义行为，有的编译器不会报错（运行的时候就什么都可能发生了） O(∩_∩)O谢谢！我明白了。[/quote] 不会输入超过10个吧？ 自己定义长度呢[/quote] 可能pat代码评测的时候会考虑到大于10的情况

引用 5 楼 qq_34984564 的回复:[quote=引用 4 楼 xaioxiaoguai 的回复:] 输入的n>10时，结构体数组就越界了（第三个测试点） 下标越界是未定义行为，有的编译器不会报错（运行的时候就什么都可能发生了） O(∩_∩)O谢谢！我明白了。[/quote] 不会输入超过10个吧？ 自己定义长度呢

引用 4 楼 xaioxiaoguai 的回复:输入的n>10时，结构体数组就越界了（第三个测试点） 下标越界是未定义行为，有的编译器不会报错（运行的时候就什么都可能发生了） O(∩_∩)O谢谢！我明白了。

引用 1 楼 qq_34984564 的回复:题目是：pat乙级1004 提交以后显示有段错误。 在LInux下测试没有问题。

#include <stdio.h>  struct student{     char sname[11];     char sno[11];     int score; }stu[10];  int main(){     int n;     int max=0,min=100,i=0,k,t;      scanf("%d",&n);      for(i=0;i<n;i++){         scanf("%s %s %d", stu[i].sname, stu[i].sno, &stu[i].score);     } /*     for(i=0;i<n;i++){         printf("%s %s %d\n", stu[i].sname, stu[i].sno, stu[i].score);     } */     t = k = 0;     for(i=0;i<n;i++){         if(stu[i].score<=100 && stu[i].score>=0){             if(stu[i].score>max){                 max = stu[i].score;                 k = i;             }             if(stu[i].score<min){                 min = stu[i].score;                 t = i;             }         }     }     printf("%s %s\n",stu[k].sname,stu[k].sno);     printf("%s %s\n",stu[t].sname,stu[t].sno);     return 0; } 代码没问题，怀疑是你的输入数据的格式问题

题目是：pat乙级1004 提交以后显示有段错误。


Question: vs2010 调用打印机怎么用的

搜索 win32 api 打印机


Question: 大神帮看看哪这个问题怎么解决

#include <stdio.h>  int arry( int (*arr)[3], int lines, int col);  int main() {     int arr[3][3] = {         {1,2,3},         {4,5,6},         {7,8,9}     };     arry(arr, 3,3);      return 0; }  int arry(int (*arr)[3], int lines, int col) {     int i;     int j = 0;     int index = 1;       for(i = 0; i < lines; i++)     {         arr[i][j+1]= index++;     }      for(j = 0; j < col; j++ )     {         arr[i++][j] = index++;     }     for (i = lines; i >= 0; i--)     {          arr[i][j--]= index++;     }     for(j = 0; j>= 0; j++)     {          arr[i-1][j] = index++;     }       for(i = 0; i< lines; i++)     {         for(j = 0; j < col; j++)         {             printf("%d ",arr[i][j]);         }         printf("\n");     }      return 0; }  参数需要是二维数组，传递为一个一维数组是不行的。传递一个数组指针到arry函数里。详见上面的代码；  上面的代码还有问题，很明显的是越界。比如j未初始化，但是第一个循环就是用到了j++ 根据你的需求，改一改，注意下标不要越界。否则越界导致段错误。


Question: 来大神帮忙看下，所有的输出都显示不出结果

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

input函数中的scanf不正确。 1楼和4楼的方法可采纳。

#include<stdio.h> #include<string.h> #include<stdlib.h>  int SIZE; struct student                                    //声明结构体类型struct student {     int num;     char name[10];     char time[12];     float score[4];  };  void search(struct student stu[]); void input(struct student stu[]); void correct(struct student stu[]); void all(struct student stu[]);  int main()                                    //定义主函数 {     struct student stu[10];                 //定义结构体数组     int n;     int flag=1;     printf("请输入学生人数(must less equal 10)：\n");     scanf("%d",&SIZE);       while(1)                                 //当为真时，进行以下循环     {         printf("*******************************\n");         printf("学生成绩系统\n");         printf("1.输入学生信息\n");         printf("2.查找学生信息\n");         printf("3.修改学生信息\n");         printf("4.显示所有学生信息\n");         printf("5.各优秀率\n");         printf("6.退出\n");         printf("*******************************\n");         scanf("%d", &n);         switch(n)                                //用该语句实现分支选择结构         {             case 1:input(stu);  break;             case 2:search(stu);  break;             case 3:correct(stu);   break;             case 4:all(stu);    break;              case 6:flag=0;          }          system("pause");         system("cls");     }   }  void input(struct student stu[]) {     int i=0;     system("cls");     printf("输入学生信息:\n学号    姓名 入学日期    4门成绩\n");     for(i = 0;i<SIZE;i++)     {         scanf("%d %s %s %f %f %f %f", &stu[i].num, stu[i].name,               stu[i].time,&stu[i].score[0],               &stu[i].score[1],&stu[i].score[2],               &stu[i].score[3]);     } }   void search(struct student stu[])                        //子函数，定义search函数 {     int n=0,no=20,i;     char name[20];     printf("请输入查询的类型：\n");     printf("1.根据学号查询\n");     printf("2.根据姓名查询\n");     scanf("%d",&n);                                     //通过输入不同的数字进行2种选择     if(n==1)                                            //根据学号进行查询     {         printf("请输入学号\n");         scanf("%d",&no);         printf("学号    姓名 入学日期    4门成绩\n");         for( i=0;i<SIZE;i++)         {             if(stu[i].num == no)  {                 printf("%d   %s    %s   %4.2f %4.2f %4.2f %4.2f\n",                     stu[i].num,stu[i].name,stu[i].time,                     stu[i].score[0],stu[i].score[1],                     stu[i].score[2],stu[i].score[3]);                 break;             }         }         if (i >= SIZE)                 printf("查无此人\n");     }     if(n==2)     {         printf("请输入姓名\n");         scanf("%s",name);         if(strlen(name)>10)             printf("输入的名字过长\n");         else             printf("学号    姓名 入学日期    4门成绩\n");         for(i=0; i< SIZE;i++) {             if(strcmp(stu[i].name, name) == 0)  {                 printf("%d   %s    %s  %4.2f %4.2f %4.2f %4.2f\n",                     stu[i].num,stu[i].name,stu[i].time,                     stu[i].score[0],stu[i].score[1],                     stu[i].score[2],stu[i].score[3]);                 break;             }         }         if (i >= SIZE)                 printf("查无此人\n");     } }   void correct(struct student stu[]) {     int i,num0,num1;     float fnum;     printf("请输入修改学生的学号:\n");     scanf("%d", &num0);     for(i = 0; i < SIZE;i++)         if (num0 == stu[i].num) {             printf("请输入要修改第几门课的成绩:\n");             scanf("%d",&num1);             printf("请输入修改的成绩:\n");             scanf("%f", &fnum);             stu[i].score[num1-1] = fnum;             break;         } }   void all(struct student stu[]) {      int j;     printf("学号    姓名    入学日期    成绩1    成绩2    成绩3    成绩4\n");     for(j=0;j<SIZE;j++)         printf("%d        %s        %s            %4.2f    %4.2f    %4.2f    %4.2f\n",                 stu[j].num,stu[j].name,stu[j].time,stu[j].score[0],                 stu[j].score[1],stu[j].score[2],stu[j].score[3]); }    参考一下这个代码吧，代码语句每行的长度建议不超过80个字符

#include<stdio.h> #include<string.h> #include<stdlib.h>  int SIZE; struct student                                    //声明结构体类型struct student {     int num;     char name[10];     char time[12];     float score[4];  };  void search(struct student stu[]); void input(struct student stu[]); void correct(struct student stu[]); void all(struct student stu[]);  int main()                                    //定义主函数 {     struct student stu[10];                 //定义结构体数组     int n;     int flag=1;     printf("请输入学生人数(must less equal 10)：\n");     scanf("%d",&SIZE);       while(1)                                 //当为真时，进行以下循环     {         printf("*******************************\n");         printf("学生成绩系统\n");         printf("1.输入学生信息\n");         printf("2.查找学生信息\n");         printf("3.修改学生信息\n");         printf("4.显示所有学生信息\n");         printf("5.各优秀率\n");         printf("6.退出\n");         printf("*******************************\n");         scanf("%d", &n);         switch(n)                                //用该语句实现分支选择结构         {             case 1:input(stu);  break;             case 2:search(stu);  break;             case 3:correct(stu);   break;             case 4:all(stu);    break;              case 6:flag=0;          }          system("pause");         system("cls");     }   }  void input(struct student stu[]) {     int i=0;     system("cls");     printf("输入学生信息:\n学号    姓名 入学日期    4门成绩\n");     for(i = 0;i<SIZE;i++)     {         scanf("%d %s %s %f %f %f %f", &stu[i].num, stu[i].name,               stu[i].time,&stu[i].score[0],               &stu[i].score[1],&stu[i].score[2],               &stu[i].score[3]);     } }   void search(struct student stu[])                        //子函数，定义search函数 {     int n=0,no=20,i;     char name[20];     printf("请输入查询的类型：\n");     printf("1.根据学号查询\n");     printf("2.根据姓名查询\n");     scanf("%d",&n);                                     //通过输入不同的数字进行2种选择     if(n==1)                                            //根据学号进行查询     {         printf("请输入学号\n");         scanf("%d",&no);         printf("学号    姓名 入学日期    4门成绩\n");         for( i=0;i<SIZE;i++)         {             if(stu[i].num == no)  {                 printf("%d   %s    %s   %4.2f %4.2f %4.2f %4.2f\n",                     stu[i].num,stu[i].name,stu[i].time,                     stu[i].score[0],stu[i].score[1],                     stu[i].score[2],stu[i].score[3]);                 break;             }         }         if (i >= SIZE)                 printf("查无此人\n");     }     if(n==2)     {         printf("请输入姓名\n");         scanf("%s",name);         if(strlen(name)>10)             printf("输入的名字过长\n");         else             printf("学号    姓名 入学日期    4门成绩\n");         for(i=0; i< SIZE;i++) {             if(strcmp(stu[i].name, name) == 0)  {                 printf("%d   %s    %s  %4.2f %4.2f %4.2f %4.2f\n",                     stu[i].num,stu[i].name,stu[i].time,                     stu[i].score[0],stu[i].score[1],                     stu[i].score[2],stu[i].score[3]);                 break;             }         }         if (i >= SIZE)                 printf("查无此人\n");     } }   void correct(struct student stu[]) {     int i,num0,num1;     float fnum;     printf("请输入修改学生的学号:\n");     scanf("%d", &num0);     for(i = 0; i < SIZE;i++)         if (num0 == stu[i].num) {             printf("请输入要修改第几门课的成绩:\n");             scanf("%d",&num1);             printf("请输入修改的成绩:\n");             scanf("%f", &fnum);             stu[i].score[num1-1] = fnum;             break;         } }   void all(struct student stu[]) {      int j;     printf("学号    姓名    入学日期    成绩1    成绩2    成绩3    成绩4\n");     for(j=0;j<SIZE;j++)         printf("%d        %s        %s            %4.2f    %4.2f    %4.2f    %4.2f\n",                 stu[j].num,stu[j].name,stu[j].time,stu[j].score[0],                 stu[j].score[1],stu[j].score[2],stu[j].score[3]); }   问题比较多，比如入学日期，可以用一个字符表示？ 查找，如果匹配了，就应该break出循环，否则还在匹配，自然会有”查无此人“的输出。 既然输入的是SIZE个学生信息，每个循环里都应该是循环SIZE次； 注意coding style，注释多了也会起副作用，让代码看着凌乱。

scanf("%d %s %s    %f    %f    %f    %f",&stu[i].num,stu[i].name,&stu[i].time,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2],&stu[i].score[3]);  终端输入时第一个%s格式字符串会将之后的值都接收到stu[i].name中，不能得到合法有效的输入。 解决办法： 6个变量分6行输入，类似: printf("input num:\n"); scanf("%d",&stu[i].num); printf("input name:\n"); scanf("%s",stu[i].name); //其它几个变量类似处理。 如果对您有帮助，请采纳答案好吗，谢谢！


Question: 大佬们，这个难题的思路是什么？顶级大佬才会解！

仅供参考//随机产生100000000个取值范围为[0～2的32次方减1]的数据， //然后让用户输入一个数据，判断用户输入的数据是不是包含在前面随机产生的数据中。 //要求：当用户输入完成后，必须在1毫秒(千分之一秒)之内完成判断。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <malloc.h> long int i; unsigned long ul; unsigned long *d; unsigned long ulrand(void) {     return (      (((unsigned long)rand()<<24)&0xFF000000ul)     |(((unsigned long)rand()<<12)&0x00FFF000ul)     |(((unsigned long)rand()    )&0x00000FFFul)); } void main() {     d=(unsigned long *)calloc(1<<(32-5),sizeof(unsigned long));     if (NULL==d) {         printf("Can not calloc(%d,%d)!\n",1<<(32-5),sizeof(unsigned long));         return;     }     srand(time(NULL));     for (i=0;i<100000000;i++) {         while (1) {             ul=ulrand();             if (0==(d[ul>>5]&(1lu<<(ul%32)))) {                 d[ul>>5]|=1<<(ul%32);                 break;             }         }         if (0==i%1000000) printf("%09d,%10lu\n",i,ul);     }     while (1) {         printf("\nInput a number:");         fflush(stdout);         rewind(stdin);         if (1==scanf("%lu",&ul)) break;     }     if (d[ul>>5]&(1<<(ul%32))) printf("Include.\n"    );     else                       printf("Not include.\n");     free(d); } //000000000,2135468533 //001000000,2465805973 //002000000,3844079964 //003000000,1883232874 //004000000,1204697784 //005000000,4050838287 //006000000,3802081245 //007000000,1586042671 //008000000,3119931368 //009000000, 251096899 //010000000,3491239701 //011000000,3365323844 //012000000,2191846708 //013000000,1879478195 //014000000,1112631457 //015000000,1927301519 //016000000,1717332861 //017000000,2922278240 //018000000, 694854106 //019000000, 273255526 //020000000, 398518467 //021000000,3270756812 //022000000,1500289424 //023000000,1502241936 //024000000,1770380660 //025000000,3668842116 //026000000,3255869879 //027000000,1299184024 //028000000,1072990028 //029000000, 242094712 //030000000,3789344297 //031000000,2599365925 //032000000, 962754138 //033000000,2055075654 //034000000,4083452879 //035000000, 489250842 //036000000, 611455230 //037000000, 277350616 //038000000,1597410795 //039000000,3224173662 //040000000,2291446877 //041000000,2546280575 //042000000,2509145642 //043000000,2371773252 //044000000, 635555963 //045000000,2674538666 //046000000,4253690312 //047000000,2675755514 //048000000,1269320296 //049000000,3172516920 //050000000,1430265210 //051000000, 196156173 //052000000,2470825669 //053000000,2536750977 //054000000,1182829949 //055000000,3202826434 //056000000,2263336265 //057000000, 313302924 //058000000,3630264578 //059000000,1154892716 //060000000,2985304230 //061000000,1252204837 //062000000,1292076720 //063000000, 242249250 //064000000,3999999961 //065000000, 431166416 //066000000,1366947236 //067000000,1414387330 //068000000,2143784481 //069000000,3242175409 //070000000,4158065163 //071000000,1425449573 //072000000,2493600232 //073000000,1316783455 //074000000,3723170478 //075000000,3064111466 //076000000, 408557403 //077000000,3722586955 //078000000,3801652651 //079000000,3788160154 //080000000,3329440047 //081000000,1408976868 //082000000, 471838899 //083000000,2145198260 //084000000,3781081738 //085000000,3439027738 //086000000,1150808750 //087000000,2782578638 //088000000,  85604584 //089000000,2704078162 //090000000, 584840269 //091000000,3854577719 //092000000,2823653537 //093000000, 797877025 //094000000,2248017755 //095000000,1787038685 //096000000,2816548567 //097000000, 489107494 //098000000, 911680090 //099000000,3677777147 // //Input a number:3677777147 //Include.

基本上就是大佬的思路了,哈希表是最合适的.时间是o(n),应该没有更优的方法了.

引用 4 楼 u011280788 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] 注意初始化一下aaa数组； 算法是：申请256长度的数组，先初始化为0，然后，[0, 255]中的数组作为下标，元素的值是出现的次数。  #include <stdio.h> #include <stdlib.h> #include <time.h>  int main(void) {     int num_list[256] = { 0 }, i;     int num;      srand(time(NULL));     for (i = 0; i < 100; i++) {         num = random() % 256;         num_list[num]++;     }      for (i = 0; i < 256; i++)         if (num_list[i] == 1)             printf("%d appears %d time.\n", i, num_list[i]);     /*         else             printf("%d appears %d times.\n", i, num_list[i]);             */      return 0;  }  思路是好的，小瑕疵是题设给定的 已知一组数字，您在产生数字的时候，顺便做了逻辑处理。[/quote] 改一下呢，如果什么事情都给你做的很完美，你拿来就能用，那么自己在解决这道题上扮演什么角色呢？

引用 2 楼 cfjtaishan 的回复:注意初始化一下aaa数组； 算法是：申请256长度的数组，先初始化为0，然后，[0, 255]中的数组作为下标，元素的值是出现的次数。  #include <stdio.h> #include <stdlib.h> #include <time.h>  int main(void) {     int num_list[256] = { 0 }, i;     int num;      srand(time(NULL));     for (i = 0; i < 100; i++) {         num = random() % 256;         num_list[num]++;     }      for (i = 0; i < 256; i++)         if (num_list[i] == 1)             printf("%d appears %d time.\n", i, num_list[i]);     /*         else             printf("%d appears %d times.\n", i, num_list[i]);             */      return 0;  }  思路是好的，小瑕疵是题设给定的 已知一组数字，您在产生数字的时候，顺便做了逻辑处理。

范围是[0，255]  用位图表示就可以了， 一个字节8位， 用32个字节即可标识所有的数  由于每个数存在3种状态：00：未出现过，01：出现过1次，10：出现过多次，因此32×2 = 64字节即可标识所有情况。  初始全部标0，  然后遍历数组中的每一个数字， 如果这个数字在位图中对应的状态为0，改为1，如果为1，改为2，如果为2，不变。  最后显示所有状态为01的，即为不重复的数

引用 1 楼 user-7 的回复:int aaa[256]; for(int i=0;i<n;i++) {     int b;     cin>>b;     aaa[b]++; } for(int i=0;i<256;i++) if(aaa[i]==0)cout<<i<<" "; 注意初始化一下aaa数组； 算法是：申请256长度的数组，先初始化为0，然后，[0, 255]中的数组作为下标，元素的值是出现的次数。  #include <stdio.h> #include <stdlib.h> #include <time.h>  int main(void) {     int num_list[256] = { 0 }, i;     int num;      srand(time(NULL));     for (i = 0; i < 100; i++) {         num = random() % 256;         num_list[num]++;     }      for (i = 0; i < 256; i++)         if (num_list[i] == 1)             printf("%d appears %d time.\n", i, num_list[i]);     /*         else             printf("%d appears %d times.\n", i, num_list[i]);             */      return 0;  }


Question: vc++6.0新手求解答，程序编译没问题，执行时总是停止工作

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

赞同2楼和4楼，编译器该换换了

scanf("%lf,&x"); 像这样的错误语句，编译器都发现不了吗？我只能说这个编译器不不行呢。

基础的扎实！同意二楼

scanf("%lf,&x"); 应修改为： scanf("%lf",&x);  错误原因是输入语句的格式不对，小心一些就好。  如果对您有帮助，请采纳答案好吗，谢谢！

内存泄漏了  double 不能转换为int 会造成泄漏


Question: 请教大神   (.text+0x20):cf 'main'未定义的引用 collect2

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

int main 当然要return 0了！

楼主是Linux哪个版本

单词拼写错误，错误提示信息就是找不到main，注意比较一下提示错误里的main和你定义的main有什么不同

int main  不是 int mian

include <stdlib.h>并在main函数末尾写上:return 0;


Question: VS2013 创建 win32控制台应用程序 项目创建失败，怎么解决啊？

完全卸载后重装试试。 搜“完全卸载VS2013”

引用 楼主 wyl915 的回复: win10操作系统。修复了也没用。 求大神帮忙！ 谢谢！  其它的可以创建，就这个项目不行

引用 2 楼 zhao4zhong1 的回复:关闭UAC、防火墙、杀毒软件、…… 以管理员身份运行 对VS2013修复或重装或打最新的SP补丁 没用啊，已经是重装过的了，修复不管用

已经是重装过的了，修复不管用

创建其他应用呢？比如MFC。实在不行只有重装VS了


Question: PAT乙级1003题目含义不是很理解

使用命令重定向操作符可以使用重定向操作符将命令输入和输出数据流从默认位置重定 向到不同的位置。输入或输出数据流的位置即为句柄。  下表将列出可用的句柄。  句柄      句柄的数字代号 描述 STDIN     0              键盘输入 STDOUT    1              输出到命令提示符窗口 STDERR    2              错误输出到命令提示符窗口 UNDEFINED 3-9            这些句柄由应用程序单独定义，并且是各个工具特定的。  数字 0 到 9 代表前 10 个句柄。可以使用命令 Cmd.exe 运行程序并将该程序前 10 个 句柄中的任何一个重定向。要指定想使用的句柄，可在重定向操作符前面键入该句柄的 数字。如果未定义句柄，则默认的 < 重定向输入操作符是 0，而默认的 > 重定向输出 操作符是 1。键入 > 或 < 操作符之后，必须指定要读取或写入数据的位置。可以指定 文件名或另一个现有的句柄。  要指定重定向到现有句柄，请使用与 (&) 字符，后面接要重定向的句柄号 （例如 &句柄#）。例如，下面的命令可以将句柄 2（即 STDERR）重定向到 句柄 1（即 STDOUT）：  2>&1  下表列出了可用于将输入和输出数据流进行重定向的操作符。  重定向操作符 描述 > 将命令输出写入到文件或设备（例如打印机）中，而不是写在命令提示符窗口或句柄中。 < 从文件中而不是从键盘或句柄中读入命令输入。 >> 将命令输出添加到文件末尾而不删除文件中的信息。 >& 将一个句柄的输出写入到另一个句柄的输入中。 <& 从一个句柄读取输入并将其写入到另一个句柄输出中。 | 从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。  默认情况下，可以从键盘将命令输入（即 STDIN 句柄）发送到 Cmd.exe，然后由 Cmd.exe 将命令输出（即 STDOUT 句柄）发送到命令提示符窗口。  重定向输入 (<) 要将键盘输入重定向到文件或设备，请使用 < 操作符。例如，要从 File.txt 获取 sort 命令的输入，请键入：  sort<file.txt  File.txt 的内容将以字母顺序列表的方式显示在命令提示符窗口中。  < 操作符可以打开具有只读访问的指定文件名。所以，不能使用该操作符向文件中写入 信息。例如，如果以 <&2 启动程序，则所有试图读取句柄 0 的操作都将失败，因为句 柄 2 最初是以只写访问打开的。   注意  0 是 < 重定向输入操作符的默认句柄。 重定向输出 (>) 几乎所有的命令都将输出发送到命令提示符窗口。即使将输出发送到驱动器或打印机的 命令也会在命令提示符窗口显示消息和提示。  要将输出从命令提示符窗口重定向到文件或设备，请使用 > 操作符。可以在许多命令中 使用该操作符。例如，要将 dir 输出重定向到 Dirlist.txt，请键入：  dir>dirlist.txt  如果 Dirlist.txt 不存在，Cmd.exe 将创建该文件。如果 Dirlist.txt 存在，Cmd.exe 将使用 dir 命令的输出替换文件中的信息。  要运行 netsh routing dump 命令，然后将输出发送到 Route.cfg，请键入：  netsh routing dump>c:\route.cfg  > 操作符可以打开具有只写访问属性的指定文件。所以，不能使用该操作符读取文件。 例如，如果使用重定向 >&0 启动程序，则所有试图写入句柄 1 的操作都将失败，因为 句柄 0 最初是以只读访问打开的。   注意  1 是 > 重定向输出操作符的默认句柄。 复制句柄 重定向操作符 & 可以将输出或输入从一个指定句柄复制到另一个指定的句柄。例如， 要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt，请键入：  dir>c:\file.txt 2>&1  复制句柄时，可以复制该句柄原状态的所有特性。例如，如果一个句柄具有只写访问的 属性，则该句柄的所有副本都具有只写访问属性。不能将一个具有只读访问属性的句柄 复制到另一个具有只写访问属性的句柄。  使用 & 操作符重定向输入和副本 要将重定向输入操作符 (<) 与复制操作符 (&) 一起使用，指定的文件必须已经存在。 如果输入文件存在，Cmd.exe 将以只读方式打开该文件，然后将文件中包含的字符作为 输入发送到此命令（如同从键盘输入一样）。如果指定了句柄，Cmd.exe 将指定的句柄 复制到系统现有的句柄中。  例如，要以句柄 0 输入读取（即 STDIN）的方式打开 File.txt，请键入：  <file.txt  要打开 File.txt，并在内容排序后将输出发送到命令提示符窗口（即 STDOUT），请键入：  sort<file.txt  要查找 File.txt，然后将句柄 1（即 STDOUT）和句柄 2（即 STDERR）重定向到 Search.txt，请键入：  findfile file.txt>search.txt 2<&1  要以句柄 0 输入读取（即 STDIN）的方式复制用户定义句柄 3，请键入：  <&3  使用 & 操作符重定向输出和复制 如果将输出重定向到文件且指定了现有的文件名，Cmd.exe 将以只写方式打开文件并覆 盖该文件内容。如果指定了句柄，Cmd.exe 将文件复制到现有句柄中。  要将用户定义句柄 3 复制到句柄 1，请键入：  >&3  要将包括句柄 2（即 STDERR）的所有输出从 ipconfig 命令重定向到 句柄 1（即 STDOUT），然后将输出重定向到 Output.log，请键入：  ipconfig.exe>>output.log 2>&1  使用 >> 重定向操作符追加输出 要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息，请使用两个连续 的大于号（即 >>）。例如，下面的命令可以将由 dir 命令生成的目录列表追加到 Dirlist.txt 文件：  dir>>dirlist.txt  要将 netstat 命令的输出追加到 Tcpinfo.txt 的末尾，请键入：  netstat>>tcpinfo.txt  使用管道操作符 (|) 管道操作符 (|) 可以提取一个命令的输出（默认情况下是 STDOUT），然后将其导入另 一个命令的输入中（默认情况下是 STDIN）。例如，下面的命令将对目录分类：  dir | sort  在本例中，将同时启动两个命令，但随后 sort 命令会暂停，直到它接收到 dir 命令 的输出为止。sort 命令使用 dir 命令的输出作为输入，然后将输出发送到 句柄 1（即 STDOUT）。  合并带重定向操作符的命令 可以通过合并带有其他命令和文件名的筛选器命令创建自定义命令。例如，可以使用以 下命令存储包含“LOG”字符串的文件名:  dir /b | find "LOG" > loglist.txt  dir 命令的输出通过 find 筛选器命令发送。包含字符串 "LOG" 的文件名作为文件名 列表（例如，NetshConfig.log、Logdat.svd 和 Mylog.bat）存储在文件 Loglist.txt 中。  要在相同命令中使用多个筛选器，请使用管道 (|) 分隔筛选器。例如，下面的命令将 搜索 C 盘上的每个目录以查找包含 "LOG" 字符串的文件名，并且在命令提示符窗口中 每次显示一屏：  dir c:\ /s /b | find "LOG" | more  利用管道 (|) 可以将 Cmd.exe 导向为通过 find 筛选器命令发送 dir 命令输出。 find 命令只选择包含字符串 "LOG" 的文件名。more 命令可以显示由 find 命令选择 的文件名（在命令提示符窗口中每次显示一屏）。有关筛选器命令的详细信息，请参阅 使用筛选器。


Question: 程序出现未知错误

score 是个数组，再取地址就是地址的地址，所以错误了！

你的数组长度是确定的，测试时n可能大于１０，就会发生数组下标越界的未定义行为； 你可以用malloc(),free()函数，运行时按输入的n申请空间，模拟动态数组

引用 11 楼 qq_34984564 的回复:我是按照题目要求输入的。 输入样例： 3 Joe Math990112 89 Mike CS991301 100 Mary EE990830 95 输出样例： Mike CS991301 Joe Math990112  可是提交代码的时候没有输入数据这一环节啊，我刚才给min,max赋值以后再提交还是显示有段错误。 我在Linux测试没有问题，输出正常；

引用 8 楼 qq_34984564 的回复:那个我改掉了，改完以后可以编译运行。   #include <stdio.h>    struct student{     char sname[11];     char sno[11];     int score; }stu[10];    int main(){     int n;     int max,min,i=0,k,t;     scanf("%d",&n);        for(i=0;i<n;i++){         scanf("%s %s %d", stu[i].sname, stu[i].sno, &stu[i].score);     }        t = k = 0;     max = min = stu[0].score;     for(i=0;i<n;i++){         if(stu[i].score<=100 && stu[i].score>=0){             if(stu[i].score>max){                 max = stu[i].score;                 k = i;             }             if(stu[i].score<min){                 min = stu[i].score;                 t = i;             }         }     }     printf("%s %s\n",stu[k].sname,stu[k].sno);     printf("%s %s\n",stu[t].sname,stu[t].sno);     return 0; }  这是我提交的代码，有段错误。不理解是哪里导致的段错误？ 需要初始化min和max;  另外， 你是如何输入的？

那个我改掉了，改完以后可以编译运行。   #include <stdio.h>    struct student{     char sname[11];     char sno[11];     int score; }stu[10];    int main(){     int n;     int max,min,i=0,k,t;     scanf("%d",&n);        for(i=0;i<n;i++){         scanf("%s %s %d", stu[i].sname, stu[i].sno, &stu[i].score);     }        t = k = 0;     for(i=0;i<n;i++){         if(stu[i].score<=100 && stu[i].score>=0){             if(stu[i].score>max){                 max = stu[i].score;                 k = i;             }             if(stu[i].score<min){                 min = stu[i].score;                 t = i;             }         }     }     printf("%s %s\n",stu[k].sname,stu[k].sno);     printf("%s %s\n",stu[t].sname,stu[t].sno);     return 0; }  这是我提交的代码，有段错误。不理解是哪里导致的段错误？

int score[5]; stu[i].score<=100  能解释下这个为什么能编译通过，是什么意思呢？

上面那段代码可以运行，答案也没有错 为什么提交以后编译错误？

#include <stdio.h>   #define     MAX_SIZE    10  struct student{     char sname[11];     char sno[11];     int score; }stu[MAX_SIZE];  int main(){     int n;     int max,min,i=0,k,t;     scanf("%d",&n);      for(i=0;i<n;i++){         scanf("%s %s %d", stu[i].sname, stu[i].sno, &stu[i].score);     }     printf("\n\n");      t = k = 0;     for(i=0;i<n;i++){         if(stu[i].score<=100 && stu[i].score>=0){             if(stu[i].score>max){                 max = stu[i].score;                 k = i;                 //printf("%s %s\n",stu[k].sname,stu[k].sno);             }             if(stu[i].score<min){                 min = stu[i].score;                 t = i;                 //printf("%s %s\n",stu[t].sname,stu[t].sno);             }         }     }     printf("%s %s\n",stu[k].sname,stu[k].sno);     printf("%s %s\n",stu[t].sname,stu[t].sno);     return 0; } 1. stu数组的长度需要确定，不定数组长度C语言不支持。 2. scanf参数有问题，建议看一下scanf的使用； 3. 最大值和最小值，需要等循环处理结束后输出。 4. score只有一个值，所以不能定义数组score[5]

编译应该不能通过才对。  score是数组， 类似stu[i].score <=100这样的地方都会报错。

上面心急打错了，运行时总是提示程序已停止运行。


Question: vs2010进行c程序编程的一些问题

引用未报错。这两个编译器对return命令的处理有什么不一样？  一定会报错。 你可以 重新编译 一下，看看结果。

1、因为你的main函数返回类型是void，改成int main()即可，void main()仅仅只是VC++中允许，标准的是int main()  2、因为本身程序运行完就退出了，main结束后会调用ExitProcess结束进程  3、参看：http://www.cnblogs.com/newpanderking/p/4003228.html

引用 1 楼 fight_in_dl 的回复:第一个问题：         main函数为void类型，即无返回值，此时，return 0;会报错。         应将main函数定义为int类型。         int main()         {              //其它代码               return 0;         }  第二个问题：        不加getchar（），console窗口在程序运行完毕会退出，属于正常现象。  第三个问题：         需要修改设置，右键点击项目，如下修改。         Project Properties                          -> Configuration Properties                                  -> Linker (General)                                         -> Enable Incremental Linking -> "No (/INCREMENTAL:NO)"  如下图：   用心回答每个问题，如果对您有帮助，请采纳答案好吗，谢谢！ 对第一个问题，我换用codeblocks，代码如下： #include <stdio.h>  #include <stdlib.h>  void main()  {  printf("The program \'s name is c:\\tools \book.txt");  return(0);  } 未报错。这两个编译器对return命令的处理有什么不一样？  对第三个问题，为什么不关闭嵌入清单，编译时会报错？

@ fight_in_dl  对第一个问题，我换用codeblocks，代码如下： #include <stdio.h> #include <stdlib.h> void main() { printf("The program \'s name is c:\\tools \book.txt"); return(0); } 未报错。这两个编译器对return命令的处理有什么不一样？ 对第三个问题，为什么不关闭嵌入清单，编译时会报错？


Question: 【LinuxC】新手，有个地方写的感觉不大对，求高手帮忙看看

引用 12 楼 kang2618 的回复:[quote=引用 11 楼 m0_38117705 的回复:] [quote=引用 10 楼 kang2618 的回复:] [quote=引用 9 楼 m0_38117705 的回复:] [quote=引用 8 楼 kang2618 的回复:] [quote=引用 7 楼 m0_38117705 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] if (timBuf >tieBuf){ //改为 if (strcmp(timBuf ,tieBuf)>0){ 引用 3 楼 zhao4zhong1 的回复:if (timBuf >tieBuf){ //改为 if (strcmp(timBuf ,tieBuf)>0){  您好现在还有一种情况，if (strcmp(timBuf ,tieBuf)<0){ 无论怎么样都进不到if中，永远都是进else里，这是什么问题呀[/quote] 说明你的strcmp(timBuf ,tieBuf) 是等于0，或者大于0的[/quote] 对这里我还是明白的，我把上面大神那个代码大小符反了一下，结果我改1.date的值和改2.date的值，无论谁比谁大，永远都是进if，不会进到else;[/quote] 因为你比较的是“cat /mnt/hd1/mysql/1.date”跟"cat /mnt/hd1/mysql/2.date"的值，不是这两个文件里面的值[/quote] 奥您这么说我就明白了，那如果想比较这两个文件中的值该用什么函数呢；[/quote] 百度linux文件操作，需要先open文件，获得fd，然后通过read函数将数据读出，再进行比较。[/quote] 好这里我懂了。谢谢您

引用 11 楼 m0_38117705 的回复:[quote=引用 10 楼 kang2618 的回复:] [quote=引用 9 楼 m0_38117705 的回复:] [quote=引用 8 楼 kang2618 的回复:] [quote=引用 7 楼 m0_38117705 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] if (timBuf >tieBuf){ //改为 if (strcmp(timBuf ,tieBuf)>0){ 引用 3 楼 zhao4zhong1 的回复:if (timBuf >tieBuf){ //改为 if (strcmp(timBuf ,tieBuf)>0){  您好现在还有一种情况，if (strcmp(timBuf ,tieBuf)<0){ 无论怎么样都进不到if中，永远都是进else里，这是什么问题呀[/quote] 说明你的strcmp(timBuf ,tieBuf) 是等于0，或者大于0的[/quote] 对这里我还是明白的，我把上面大神那个代码大小符反了一下，结果我改1.date的值和改2.date的值，无论谁比谁大，永远都是进if，不会进到else;[/quote] 因为你比较的是“cat /mnt/hd1/mysql/1.date”跟"cat /mnt/hd1/mysql/2.date"的值，不是这两个文件里面的值[/quote] 奥您这么说我就明白了，那如果想比较这两个文件中的值该用什么函数呢；[/quote] 百度linux文件操作，需要先open文件，获得fd，然后通过read函数将数据读出，再进行比较。

引用 10 楼 kang2618 的回复:[quote=引用 9 楼 m0_38117705 的回复:] [quote=引用 8 楼 kang2618 的回复:] [quote=引用 7 楼 m0_38117705 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] if (timBuf >tieBuf){ //改为 if (strcmp(timBuf ,tieBuf)>0){ 引用 3 楼 zhao4zhong1 的回复:if (timBuf >tieBuf){ //改为 if (strcmp(timBuf ,tieBuf)>0){  您好现在还有一种情况，if (strcmp(timBuf ,tieBuf)<0){ 无论怎么样都进不到if中，永远都是进else里，这是什么问题呀[/quote] 说明你的strcmp(timBuf ,tieBuf) 是等于0，或者大于0的[/quote] 对这里我还是明白的，我把上面大神那个代码大小符反了一下，结果我改1.date的值和改2.date的值，无论谁比谁大，永远都是进if，不会进到else;[/quote] 因为你比较的是“cat /mnt/hd1/mysql/1.date”跟"cat /mnt/hd1/mysql/2.date"的值，不是这两个文件里面的值[/quote] 奥您这么说我就明白了，那如果想比较这两个文件中的值该用什么函数呢；

引用 9 楼 m0_38117705 的回复:[quote=引用 8 楼 kang2618 的回复:] [quote=引用 7 楼 m0_38117705 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] if (timBuf >tieBuf){ //改为 if (strcmp(timBuf ,tieBuf)>0){ 引用 3 楼 zhao4zhong1 的回复:if (timBuf >tieBuf){ //改为 if (strcmp(timBuf ,tieBuf)>0){  您好现在还有一种情况，if (strcmp(timBuf ,tieBuf)<0){ 无论怎么样都进不到if中，永远都是进else里，这是什么问题呀[/quote] 说明你的strcmp(timBuf ,tieBuf) 是等于0，或者大于0的[/quote] 对这里我还是明白的，我把上面大神那个代码大小符反了一下，结果我改1.date的值和改2.date的值，无论谁比谁大，永远都是进if，不会进到else;[/quote] 因为你比较的是“cat /mnt/hd1/mysql/1.date”跟"cat /mnt/hd1/mysql/2.date"的值，不是这两个文件里面的值

引用 8 楼 kang2618 的回复:[quote=引用 7 楼 m0_38117705 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] if (timBuf >tieBuf){ //改为 if (strcmp(timBuf ,tieBuf)>0){ 引用 3 楼 zhao4zhong1 的回复:if (timBuf >tieBuf){ //改为 if (strcmp(timBuf ,tieBuf)>0){  您好现在还有一种情况，if (strcmp(timBuf ,tieBuf)<0){ 无论怎么样都进不到if中，永远都是进else里，这是什么问题呀[/quote] 说明你的strcmp(timBuf ,tieBuf) 是等于0，或者大于0的[/quote] 对这里我还是明白的，我把上面大神那个代码大小符反了一下，结果我改1.date的值和改2.date的值，无论谁比谁大，永远都是进if，不会进到else;

引用 7 楼 m0_38117705 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] if (timBuf >tieBuf){ //改为 if (strcmp(timBuf ,tieBuf)>0){ 引用 3 楼 zhao4zhong1 的回复:if (timBuf >tieBuf){ //改为 if (strcmp(timBuf ,tieBuf)>0){  您好现在还有一种情况，if (strcmp(timBuf ,tieBuf)<0){ 无论怎么样都进不到if中，永远都是进else里，这是什么问题呀[/quote] 说明你的strcmp(timBuf ,tieBuf) 是等于0，或者大于0的

引用 3 楼 zhao4zhong1 的回复:if (timBuf >tieBuf){ //改为 if (strcmp(timBuf ,tieBuf)>0){ 引用 3 楼 zhao4zhong1 的回复:if (timBuf >tieBuf){ //改为 if (strcmp(timBuf ,tieBuf)>0){  您好现在还有一种情况，if (strcmp(timBuf ,tieBuf)<0){ 无论怎么样都进不到if中，永远都是进else里，这是什么问题呀

引用 3 楼 zhao4zhong1 的回复:if (timBuf >tieBuf){ //改为 if (strcmp(timBuf ,tieBuf)>0){ 我试了试，是没问题的，万分感谢！

引用 4 楼 m0_38117705 的回复:[quote=引用 1 楼 sdghchj 的回复:] 没有任何格式化参数，用sprintf画蛇添足。 比较字符串内容的大小是用strcmp(str1,str2)函数。 而你这样直接比较的是地址。 现在会用的函数不大多，sprintf还是从同事那学来的= =[/quote]  strcpy(timBuf,"cat /mnt/hd1/mysql/1.date");  //直接拷贝。

引用 1 楼 sdghchj 的回复:没有任何格式化参数，用sprintf画蛇添足。 比较字符串内容的大小是用strcmp(str1,str2)函数。 而你这样直接比较的是地址。 现在会用的函数不大多，sprintf还是从同事那学来的= =

引用 1 楼 sdghchj 的回复:没有任何格式化参数，用sprintf画蛇添足。 比较字符串内容的大小是用strcmp(str1,str2)函数。 而你这样直接比较的是地址。  我现在是可以确定1.date与2.date中的值没有问题，现在就是找不好用什么命令去调那两个值来比较。


Question: 用codeblocks编译线性表的顺序插入程序

引用 楼主 Rourou_miao 的回复:新手，刚刚开始学习相关的知识。在写线性表的插入程序的时候，第42行总是报错，出现错误302和240，大家帮忙看一下我这是哪里有错呀..... #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ok 1 #define ERROR 0 #define error 0 #define INFEASIBLE -1 #define OVERFLOW 0 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef int ElemType; typedef int Status;  typedef struct{     ElemType *elem;     int length;     int listsize; }SqList; Status InitList(SqList *L) {     (*L).elem=(ElemType*)malloc(100*sizeof(ElemType));     if((*L).elem==NULL)     {         exit(OVERFLOW);     }     (*L).length=0;     (*L).listsize=LIST_INIT_SIZE;     return ok; } Status ListInsert(SqList(*L),int i,ElemType *e) {     ElemType *newbase,*p,*q;     if(i<1||i>(*L).length+1)     {         return ERROR;     }     if((*L).length>=(*L).listsize)     {         newbase=(ElemType*)realloc((*L).elem,((*L).listsize+10*sizeof(ElemType)));         (*L).elem=newbase;         (*L).listsize=(*L).listsize+LISTINCREMENT;     }     q=&((*L).elem[i-1]);     for(p=&((*L).elem[(*L).length-1]);p>=q;p--)     {         *(p+1)=*p;     }     *q=*e;     (*L).length++;     return ok; } 能否贴上完整的代码？


Question: 用C语言实现ECB模式下的DES加密解密

百度搜“C源代码 DES”


Question: 把0~9个数字赋予数组a，并逆序输出，用指针设计程序，输出结果相同，但是哪个程序是正确的。

引用 2 楼 cfjtaishan 的回复:#include <stdio.h>  int main () {     int i,a[10];     int *p;     p = a;     for(i=0;i<=9;i++,p++) {         *p = i;         printf("%3d",*p);     }     printf("\n");     for(i=9; i>=0; i--)          printf("%3d",*(p-i-1));      return 0; } 程序1，输入时，注意代码冗余的问题。  #include <stdio.h>  int main () {     int i,a[10];     int *p;     p = a;      i = 0;     while (i <= 9)         *p++ = i++;      for(i = 9; i >= 0; i--)         printf("%3d", *(p - i - 1));      printf("\n");      return 0; }   嗯，我就是没搞清楚printf中*（p-i-1）的意思

引用 1 楼 fight_in_dl 的回复:代码走查没发出什么问题，不放心上机测试，也都通过。 不知道您说的"正确"有什么特定约束？   嗯，我上机测试过，代码没报错，输出也正确，但除了程序2是反复改后直接写出来的，程序1是在测试后，根据输出将代码中第二个printf中改成*（p-1）的，并不能理解是为什么，程序3是根据网上的介绍写的  还有就是这个问题？

引用 6 楼 baidu_39384527 的回复:[quote=引用 5 楼 cfjtaishan 的回复:] [quote=引用 4 楼 baidu_39384527 的回复:] [quote=引用 2 楼 cfjtaishan 的回复:] #include <stdio.h>  int main () {     int i,a[10];     int *p;     p = a;     for(i=0;i<=9;i++,p++) {         *p = i;         printf("%3d",*p);     }     printf("\n");     for(i=9; i>=0; i--)          printf("%3d",*(p-i-1));      return 0; } 程序1，输入时，注意代码冗余的问题。  #include <stdio.h>  int main () {     int i,a[10];     int *p;     p = a;      i = 0;     while (i <= 9)         *p++ = i++;      for(i = 9; i >= 0; i--)         printf("%3d", *(p - i - 1));      printf("\n");      return 0; }   嗯，我就是没搞清楚printf中*（p-i-1）的意思[/quote] p指向数组a，那么，p可以当作数组来使用。*(p-i-1)等价于p偏移（向前）(i + 1) * sizeof(int)个字节。[/quote]   嗯，在了解了for循环中p初始值后就能理解了，是while循环结束时的p+10即a+10是吧？[/quote] 可以这么理解～

引用 5 楼 cfjtaishan 的回复:[quote=引用 4 楼 baidu_39384527 的回复:] [quote=引用 2 楼 cfjtaishan 的回复:] #include <stdio.h>  int main () {     int i,a[10];     int *p;     p = a;     for(i=0;i<=9;i++,p++) {         *p = i;         printf("%3d",*p);     }     printf("\n");     for(i=9; i>=0; i--)          printf("%3d",*(p-i-1));      return 0; } 程序1，输入时，注意代码冗余的问题。  #include <stdio.h>  int main () {     int i,a[10];     int *p;     p = a;      i = 0;     while (i <= 9)         *p++ = i++;      for(i = 9; i >= 0; i--)         printf("%3d", *(p - i - 1));      printf("\n");      return 0; }   嗯，我就是没搞清楚printf中*（p-i-1）的意思[/quote] p指向数组a，那么，p可以当作数组来使用。*(p-i-1)等价于p偏移（向前）(i + 1) * sizeof(int)个字节。[/quote]   嗯，在了解了for循环中p初始值后就能理解了，是while循环结束时的p+10即a+10是吧？

引用 4 楼 baidu_39384527 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] #include <stdio.h>  int main () {     int i,a[10];     int *p;     p = a;     for(i=0;i<=9;i++,p++) {         *p = i;         printf("%3d",*p);     }     printf("\n");     for(i=9; i>=0; i--)          printf("%3d",*(p-i-1));      return 0; } 程序1，输入时，注意代码冗余的问题。  #include <stdio.h>  int main () {     int i,a[10];     int *p;     p = a;      i = 0;     while (i <= 9)         *p++ = i++;      for(i = 9; i >= 0; i--)         printf("%3d", *(p - i - 1));      printf("\n");      return 0; }   嗯，我就是没搞清楚printf中*（p-i-1）的意思[/quote] p指向数组a，那么，p可以当作数组来使用。*(p-i-1)等价于p偏移（向前）(i + 1) * sizeof(int)个字节。


Question: 在codeblocks下新建的"hello world"生成的exe有多大？

好多半瓶子醋。 为什么不反汇编exe看其中都有哪些汇编指令呢？ 《Windows PE权威指南》也顺便参考一下。

正常！你写Hello World 之前写的#include <studio.h>里面超多东西的，里面的东西编译的时候会链接到你自己写的东西，然后再生成exe的

引用 1楼ipqtjmqj 的回复:正常。看编译选项，debug通常比release大，静态链接比动态链接大没有设置其他编译选项，用qt creator编译这个工程只有48k大小，差距挺大的，感觉好奇怪？

正常。看编译选项，debug通常比release大，静态链接比动态链接大

因为函数有C/C++标准库中好多东西  如果你只用API的话，估计2K都不用


Question: 自学新人提问：malloc,p[i]使用

引用 8 楼 fight_in_dl 的回复:引用定义成int *p[5];是不能直接使用scanf("%d",p+i);赋值的。因为p是指针数组，每个元素都是一个指针（并且都是野指针），需要malloc之后才能给其赋值。   嗯，你说的对。这两种方式有区别。 其实原题目中动态分配的内存，没调用free也存在问题。    嗯，刚学到这，书上解释里有写调用free函数，但代码中没写。

引用 6 楼 cfjtaishan 的回复:[quote=引用 3 楼 fight_in_dl 的回复:] 是两种分配内存的方式。  如果想声明指针数组，通常是这样：  int *p[5];        //在栈上静态申请内存   也可以这样： int *p1; p1=malloc(5*sizeof(int)); //在堆上动态申请内存  如果想深入学习，这是一篇参考文章：  http://blog.csdn.net/tigerjibo/article/details/7423728 定义成int *p[5];是不能直接使用scanf("%d",p+i);赋值的。因为p是指针数组，每个元素都是一个指针（并且都是野指针），需要malloc之后才能给其赋值。[/quote] 需要malloc之后赋值是指用malloc的返回值给p赋值吗？ int *p[5]不能直接使用scanf("%d",p+i);赋值是因为不能给指针元素赋值指针吗？

引用 4 楼 weixin_37923716 的回复:两种都是可以，传递过去的是指针，用你的方法还更好理解  嗯，我的想法就是在不影响逻辑的情况下，能精简就精简。我自己写的时候用的*（p+i）的形式，但书上用的p[I]，结果相同，但因为之前刚读到指针数组的问题，在遇到这个代码时有点晕。

直接使用p[i],我用*(p+i)结果是一样的，这里没有什么不同 一个是靠下标指向元素的位置，一个靠内存偏移指向元素的位置。

引用 3 楼 fight_in_dl 的回复:是两种分配内存的方式。  如果想声明指针数组，通常是这样：  int *p[5];        //在栈上静态申请内存   也可以这样： int *p1; p1=malloc(5*sizeof(int)); //在堆上动态申请内存  如果想深入学习，这是一篇参考文章：  http://blog.csdn.net/tigerjibo/article/details/7423728 定义成int *p[5];是不能直接使用scanf("%d",p+i);赋值的。因为p是指针数组，每个元素都是一个指针（并且都是野指针），需要malloc之后才能给其赋值。

A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价

两种都是可以，传递过去的是指针，用你的方法还更好理解

引用 13 楼 cfjtaishan 的回复:[quote=引用 10 楼 baidu_39384527 的回复:] [quote=引用 6 楼 cfjtaishan 的回复:] [quote=引用 3 楼 fight_in_dl 的回复:] 是两种分配内存的方式。  如果想声明指针数组，通常是这样：  int *p[5];        //在栈上静态申请内存   也可以这样： int *p1; p1=malloc(5*sizeof(int)); //在堆上动态申请内存  如果想深入学习，这是一篇参考文章：  http://blog.csdn.net/tigerjibo/article/details/7423728 定义成int *p[5];是不能直接使用scanf("%d",p+i);赋值的。因为p是指针数组，每个元素都是一个指针（并且都是野指针），需要malloc之后才能给其赋值。[/quote] 需要malloc之后赋值是指用malloc的返回值给p赋值吗？ int *p[5]不能直接使用scanf("%d",p+i);赋值是因为不能给指针元素赋值指针吗？ [/quote] int *p[5]是定义的5个野指针，需要将这5个指针指向一个可以读写的区域才可以。要么使用malloc，要么让这5个野指针指向栈上的某些位置。[/quote] 嗯

引用 12 楼 zhao4zhong1 的回复:5楼正解！   涉C未深，尚不能理解

引用 10 楼 baidu_39384527 的回复:[quote=引用 6 楼 cfjtaishan 的回复:] [quote=引用 3 楼 fight_in_dl 的回复:] 是两种分配内存的方式。  如果想声明指针数组，通常是这样：  int *p[5];        //在栈上静态申请内存   也可以这样： int *p1; p1=malloc(5*sizeof(int)); //在堆上动态申请内存  如果想深入学习，这是一篇参考文章：  http://blog.csdn.net/tigerjibo/article/details/7423728 定义成int *p[5];是不能直接使用scanf("%d",p+i);赋值的。因为p是指针数组，每个元素都是一个指针（并且都是野指针），需要malloc之后才能给其赋值。[/quote] 需要malloc之后赋值是指用malloc的返回值给p赋值吗？ int *p[5]不能直接使用scanf("%d",p+i);赋值是因为不能给指针元素赋值指针吗？ [/quote] int *p[5]是定义的5个野指针，需要将这5个指针指向一个可以读写的区域才可以。要么使用malloc，要么让这5个野指针指向栈上的某些位置。

5楼正解！

引用 1 楼 fight_in_dl 的回复:编译器总是把以下标的形式的操作解析为以指针的形式的操作。 p[i]这个操作会被解析成：先取出p 里存储的地址值，然后加上中括号中i个元素的偏移量，计算出新的地址， 然后从新的地址中取出值。也就是说以下标的形式访问在本质上与以指针的形式访问没有区别，只是写法上不同罢了。  从抽象的角度理解，指针和数组是外在形式，本质上都是对内存地址的读写操作。  如果有帮助，请采纳答案好吗，谢谢！  这里的p[I]和指针数组p[I]怎么做区别？数组加下标和指针加下标的使用有点模糊。


Question: 麻烦看看c语言写Json哪里出了错误

#include<stdlib.h> #include<string.h>  #include"C:\\Users\\32914\\Desktop\\cJSON-master\\cJSON.h"  int main(void) {     char str[1024];    /*此处定义为数组*/     char *char_json;     scanf("%s", &str);     char_json = str;    /* 此处去掉&*/     //从缓冲区中解析出JSON结构     cJSON *json = cJSON_Parse(char_json);     //将传入的JSON结构转化为字符串 并打印     char *buf = (char *)malloc(1024);    /*下面有free，这儿需要malloc */     printf("data:%s\n",buf = cJSON_Print(json));     //打开一个exec.json文件，并写入json内容     FILE *fp = fopen("exec.json", "w");     fwrite(buf,strlen(buf),1,fp);      fclose(fp);     free(buf);     cJSON_Delete(json);     return 0; }

char *buf = NULL;  buf是空的啊，你怎么fwrite啊

str 应该是字符数组 用来存储输入的字符串   char str[4096]; scanf("%s", str);


Question: 遇到个匪夷所思的问题，大佬们来看一下

原来如此！看的书上没有说，谢谢~

short用%hd


Question: C编写的Release下的.exe文件如何处理能在其他电脑上打开

生成Release版。 学会使用depends.exe查看exe依赖的dll

把依赖项.dll文件全复制粘贴到根目录不就ok了？

引用 7 楼 u010011236 的回复:前面回答的都是关于静态链接和动态链接的内容，这部分已基本了解。现在我的问题是：当我把程序发布给别人使用时只需要给予exe文件就行，不需要再把libgcc_s_dw2-1.dll也发给别人。而是我这边直接把dll和exe合并在一起，生成一个exe发布给别人。 试试生成WinRAR自解压格式的exe，并在解压后自动运行对话框中输入原exe的文件名。

使用静态链接，VC下RELEASE设置成MT，CB下应该也类似

引用 3楼战在春秋 的回复:点击Project  -----  Build Options 菜单， 在Linker Settins选项卡下，如下图所示，加入.lib文件。    如果有帮助，请采纳答案好吗，谢谢！直接这样设置可以吗？

@fight_in_dl，打开可执行程序提示缺少   libgcc_s_dw2-1.dll 的话该怎么处理，直接在Linker Settins下加上-static就行吗？？

静态连接-static


Question: 大神们，帮看一下这题，运行结果没错，上传Oj显示答案错误

引用 5 楼 qq_39369157 的回复:[quote=引用 4 楼 cfjtaishan 的回复:] 代码不易阅读，可读性比较差。变量不在多，而在根据需要而定义。 逻辑写在一起也不宜理解。  #include <stdio.h> #include <stdlib.h> #include <time.h>  #define ROW 4 #define COL 5   void init_array(int (*array)[COL], int row, int col) {     int i, j;      srand(time(NULL));     for (i = 0; i < row; i++)         for (j = 0; j < col; j++)             array[i][j] = rand() % 100; }   void show_array(int (*array)[COL], int row, int col) {     int i, j;      for (i = 0; i < row; i++) {         for (j = 0; j < col; j++)             printf("%2d ", array[i][j]);         putchar(10);     } }  void check_saddle_point(int (*point)[2], int (*array)[COL], int row, int col) {     int i, j, k, cnt = 0;     int row_idx, col_idx;     int max_row, min_col;      for (i = 0; i < row; i++) {         max_row = array[i][0];         col_idx = 0;         /* find max value in row */         for (j = 1; j < COL; j++)             if (max_row < array[i][j]) {                 max_row = array[i][j];                 col_idx = j;             }          /* Find min value in col */         min_col = array[i][col_idx];         row_idx = i;         for (k = 0; k < row; k++)             if (min_col > array[k][col_idx]) {                 min_col = array[k][col_idx];                 row_idx = k;             }         /* Check the condition*/         if (row_idx == i && min_col == max_row) {             point[cnt][0] = row_idx;             point[cnt][1] = col_idx;             cnt++;         }      } }  void init_point_array(int (*point)[2], int row) {     int i, j;      for (i = 0; i < row; i++)         for (j = 0; j < 2; j++)             point[i][j] = -1; }  void show_saddle_point(int (*point)[2], int (*array)[COL], int row) {     int i, row_idx, col_idx;      for (i = 0; i < row; i++) {         row_idx = point[i][0];         col_idx = point[i][1];         if (row_idx >= 0 && col_idx >= 0)             printf("鞍点为array[%d][%d] = %d\n", row_idx, col_idx, array[row_idx][col_idx]);     } }  int main(void) {     int array[ROW][COL];     int point[ROW][2];      init_array(array, ROW, COL);     init_point_array(point, ROW);     show_array(array, ROW, COL);     check_saddle_point(point, array, ROW, COL);     show_saddle_point(point, array, ROW);      return 0; } 这个程序是随机产生一个二维数组，建议将随机数改成你需要输入形式。 这是一个求鞍点的方法～ 引用 2 楼 fight_in_dl 的回复:错误比较隐蔽，不过总算找出来了。  假设输入为： 3 2 1 4 5 6 7 8 9  这种情况下会出错，详细原因在注释中。  int main() { 	int n, i, j, k, m, s, x, y, o; 	while (scanf("%d%d", &n, &o) != EOF) 	{ 		m = 0; 		for (x = 0; x < n; x++) 			for (j = 0; j < o; j++) 				scanf("%d", &a[x][j]); 		s = a[0][0]; y = 0; k = 0; //使用的局部变量y需要初始化。y=0;是我新加的。 		for (x = 0; x < n; x++) 		{ 			s = a[x][0]; 			for (j = 1; j<o; j++) 			{ 				if (a[x][j]>s) //对我给出的这个输入样例，第一行后两列值2，1小于3，这个if分支判断条件是假，不会执行。 				{ 					s = a[x][j]; 					k = j; y = x; //错误就在这，因为if分支不会执行，y得不到值。 				} 			} 			for (i = 0, j = k; i < n; i++) 				if (s < a[i][j]) 					m++; 			if (m == n - 1) 				break; 			k = 0; m = 0; 		} 		if (m == n - 1) 			printf("%d %d\n", y, k); //这里会报错----使用了未经初始化的局部变量。 		if (m != n - 1) 			printf("-1\n"); 	} 	return 0; } 如果有帮助，请采纳答案好吗，谢谢！ 不过我上传OJ后还是错的[/quote] 我给你的代码是随机产生的数据，你的要求是输入的数据，数据源不一样呢。你改一改吧。不能拿来别人的就用，要看看代码的逻辑嘛，不合自己的需求，那么就改改，总不能自己什么也不做的。

引用 6 楼 u011280788 的回复:OJ报错的时候应该会吧 错误的case ，提示出来的吧？ 我将  引用 6 楼 u011280788 的回复:OJ报错的时候应该会吧 错误的case ，提示出来的吧？我将这里“a[x][j]>s“改成“a[x][j]>=s”，"a[x][j]<s"改成”a[x][j]<=s“ 提交后是Compilation Error Main.cc: In function ‘int main()’: Main.cc:18: error: expected primary-expression before ‘>’ token 看不懂

引用 7 楼 zhao4zhong1 的回复:边界条件 输入输出格式 ……怎么讲？

边界条件 输入输出格式 ……

OJ报错的时候应该会吧 错误的case ，提示出来的吧？

引用 4 楼 cfjtaishan 的回复:代码不易阅读，可读性比较差。变量不在多，而在根据需要而定义。 逻辑写在一起也不宜理解。  #include <stdio.h> #include <stdlib.h> #include <time.h>  #define ROW 4 #define COL 5   void init_array(int (*array)[COL], int row, int col) {     int i, j;      srand(time(NULL));     for (i = 0; i < row; i++)         for (j = 0; j < col; j++)             array[i][j] = rand() % 100; }   void show_array(int (*array)[COL], int row, int col) {     int i, j;      for (i = 0; i < row; i++) {         for (j = 0; j < col; j++)             printf("%2d ", array[i][j]);         putchar(10);     } }  void check_saddle_point(int (*point)[2], int (*array)[COL], int row, int col) {     int i, j, k, cnt = 0;     int row_idx, col_idx;     int max_row, min_col;      for (i = 0; i < row; i++) {         max_row = array[i][0];         col_idx = 0;         /* find max value in row */         for (j = 1; j < COL; j++)             if (max_row < array[i][j]) {                 max_row = array[i][j];                 col_idx = j;             }          /* Find min value in col */         min_col = array[i][col_idx];         row_idx = i;         for (k = 0; k < row; k++)             if (min_col > array[k][col_idx]) {                 min_col = array[k][col_idx];                 row_idx = k;             }         /* Check the condition*/         if (row_idx == i && min_col == max_row) {             point[cnt][0] = row_idx;             point[cnt][1] = col_idx;             cnt++;         }      } }  void init_point_array(int (*point)[2], int row) {     int i, j;      for (i = 0; i < row; i++)         for (j = 0; j < 2; j++)             point[i][j] = -1; }  void show_saddle_point(int (*point)[2], int (*array)[COL], int row) {     int i, row_idx, col_idx;      for (i = 0; i < row; i++) {         row_idx = point[i][0];         col_idx = point[i][1];         if (row_idx >= 0 && col_idx >= 0)             printf("鞍点为array[%d][%d] = %d\n", row_idx, col_idx, array[row_idx][col_idx]);     } }  int main(void) {     int array[ROW][COL];     int point[ROW][2];      init_array(array, ROW, COL);     init_point_array(point, ROW);     show_array(array, ROW, COL);     check_saddle_point(point, array, ROW, COL);     show_saddle_point(point, array, ROW);      return 0; } 这个程序是随机产生一个二维数组，建议将随机数改成你需要输入形式。 这是一个求鞍点的方法～ 引用 2 楼 fight_in_dl 的回复:错误比较隐蔽，不过总算找出来了。  假设输入为： 3 2 1 4 5 6 7 8 9  这种情况下会出错，详细原因在注释中。  int main() { 	int n, i, j, k, m, s, x, y, o; 	while (scanf("%d%d", &n, &o) != EOF) 	{ 		m = 0; 		for (x = 0; x < n; x++) 			for (j = 0; j < o; j++) 				scanf("%d", &a[x][j]); 		s = a[0][0]; y = 0; k = 0; //使用的局部变量y需要初始化。y=0;是我新加的。 		for (x = 0; x < n; x++) 		{ 			s = a[x][0]; 			for (j = 1; j<o; j++) 			{ 				if (a[x][j]>s) //对我给出的这个输入样例，第一行后两列值2，1小于3，这个if分支判断条件是假，不会执行。 				{ 					s = a[x][j]; 					k = j; y = x; //错误就在这，因为if分支不会执行，y得不到值。 				} 			} 			for (i = 0, j = k; i < n; i++) 				if (s < a[i][j]) 					m++; 			if (m == n - 1) 				break; 			k = 0; m = 0; 		} 		if (m == n - 1) 			printf("%d %d\n", y, k); //这里会报错----使用了未经初始化的局部变量。 		if (m != n - 1) 			printf("-1\n"); 	} 	return 0; } 如果有帮助，请采纳答案好吗，谢谢！ 不过我上传OJ后还是错的

引用 12 楼 qq_39369157 的回复:[quote=引用 11 楼 cfjtaishan 的回复:] [quote=引用 5 楼 qq_39369157 的回复:] [quote=引用 4 楼 cfjtaishan 的回复:] 代码不易阅读，可读性比较差。变量不在多，而在根据需要而定义。 逻辑写在一起也不宜理解。  #include <stdio.h> #include <stdlib.h> #include <time.h>  #define ROW 4 #define COL 5   void init_array(int (*array)[COL], int row, int col) {     int i, j;      srand(time(NULL));     for (i = 0; i < row; i++)         for (j = 0; j < col; j++)             array[i][j] = rand() % 100; }   void show_array(int (*array)[COL], int row, int col) {     int i, j;      for (i = 0; i < row; i++) {         for (j = 0; j < col; j++)             printf("%2d ", array[i][j]);         putchar(10);     } }  void check_saddle_point(int (*point)[2], int (*array)[COL], int row, int col) {     int i, j, k, cnt = 0;     int row_idx, col_idx;     int max_row, min_col;      for (i = 0; i < row; i++) {         max_row = array[i][0];         col_idx = 0;         /* find max value in row */         for (j = 1; j < COL; j++)             if (max_row < array[i][j]) {                 max_row = array[i][j];                 col_idx = j;             }          /* Find min value in col */         min_col = array[i][col_idx];         row_idx = i;         for (k = 0; k < row; k++)             if (min_col > array[k][col_idx]) {                 min_col = array[k][col_idx];                 row_idx = k;             }         /* Check the condition*/         if (row_idx == i && min_col == max_row) {             point[cnt][0] = row_idx;             point[cnt][1] = col_idx;             cnt++;         }      } }  void init_point_array(int (*point)[2], int row) {     int i, j;      for (i = 0; i < row; i++)         for (j = 0; j < 2; j++)             point[i][j] = -1; }  void show_saddle_point(int (*point)[2], int (*array)[COL], int row) {     int i, row_idx, col_idx;      for (i = 0; i < row; i++) {         row_idx = point[i][0];         col_idx = point[i][1];         if (row_idx >= 0 && col_idx >= 0)             printf("鞍点为array[%d][%d] = %d\n", row_idx, col_idx, array[row_idx][col_idx]);     } }  int main(void) {     int array[ROW][COL];     int point[ROW][2];      init_array(array, ROW, COL);     init_point_array(point, ROW);     show_array(array, ROW, COL);     check_saddle_point(point, array, ROW, COL);     show_saddle_point(point, array, ROW);      return 0; } 这个程序是随机产生一个二维数组，建议将随机数改成你需要输入形式。 这是一个求鞍点的方法～ 引用 2 楼 fight_in_dl 的回复:错误比较隐蔽，不过总算找出来了。  假设输入为： 3 2 1 4 5 6 7 8 9  这种情况下会出错，详细原因在注释中。  int main() { 	int n, i, j, k, m, s, x, y, o; 	while (scanf("%d%d", &n, &o) != EOF) 	{ 		m = 0; 		for (x = 0; x < n; x++) 			for (j = 0; j < o; j++) 				scanf("%d", &a[x][j]); 		s = a[0][0]; y = 0; k = 0; //使用的局部变量y需要初始化。y=0;是我新加的。 		for (x = 0; x < n; x++) 		{ 			s = a[x][0]; 			for (j = 1; j<o; j++) 			{ 				if (a[x][j]>s) //对我给出的这个输入样例，第一行后两列值2，1小于3，这个if分支判断条件是假，不会执行。 				{ 					s = a[x][j]; 					k = j; y = x; //错误就在这，因为if分支不会执行，y得不到值。 				} 			} 			for (i = 0, j = k; i < n; i++) 				if (s < a[i][j]) 					m++; 			if (m == n - 1) 				break; 			k = 0; m = 0; 		} 		if (m == n - 1) 			printf("%d %d\n", y, k); //这里会报错----使用了未经初始化的局部变量。 		if (m != n - 1) 			printf("-1\n"); 	} 	return 0; } 如果有帮助，请采纳答案好吗，谢谢！ 不过我上传OJ后还是错的[/quote] 我给你的代码是随机产生的数据，你的要求是输入的数据，数据源不一样呢。你改一改吧。不能拿来别人的就用，要看看代码的逻辑嘛，不合自己的需求，那么就改改，总不能自己什么也不做的。[/quote] 你可能理解错了，我是说2层层主告诉我的改的方法，我自己改后上传到OJ还是错的，你给我的代码我好多看不懂，没用它，还有它跟题目要求不一样，我不可能直接拿它去上传[/quote] 我上面已经说了，确实不一样，所以让你改一改。

引用 10 楼 zhao4zhong1 的回复:偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。 平时都有类似这样做，只不过这次错误好难找

引用 11 楼 cfjtaishan 的回复:[quote=引用 5 楼 qq_39369157 的回复:] [quote=引用 4 楼 cfjtaishan 的回复:] 代码不易阅读，可读性比较差。变量不在多，而在根据需要而定义。 逻辑写在一起也不宜理解。  #include <stdio.h> #include <stdlib.h> #include <time.h>  #define ROW 4 #define COL 5   void init_array(int (*array)[COL], int row, int col) {     int i, j;      srand(time(NULL));     for (i = 0; i < row; i++)         for (j = 0; j < col; j++)             array[i][j] = rand() % 100; }   void show_array(int (*array)[COL], int row, int col) {     int i, j;      for (i = 0; i < row; i++) {         for (j = 0; j < col; j++)             printf("%2d ", array[i][j]);         putchar(10);     } }  void check_saddle_point(int (*point)[2], int (*array)[COL], int row, int col) {     int i, j, k, cnt = 0;     int row_idx, col_idx;     int max_row, min_col;      for (i = 0; i < row; i++) {         max_row = array[i][0];         col_idx = 0;         /* find max value in row */         for (j = 1; j < COL; j++)             if (max_row < array[i][j]) {                 max_row = array[i][j];                 col_idx = j;             }          /* Find min value in col */         min_col = array[i][col_idx];         row_idx = i;         for (k = 0; k < row; k++)             if (min_col > array[k][col_idx]) {                 min_col = array[k][col_idx];                 row_idx = k;             }         /* Check the condition*/         if (row_idx == i && min_col == max_row) {             point[cnt][0] = row_idx;             point[cnt][1] = col_idx;             cnt++;         }      } }  void init_point_array(int (*point)[2], int row) {     int i, j;      for (i = 0; i < row; i++)         for (j = 0; j < 2; j++)             point[i][j] = -1; }  void show_saddle_point(int (*point)[2], int (*array)[COL], int row) {     int i, row_idx, col_idx;      for (i = 0; i < row; i++) {         row_idx = point[i][0];         col_idx = point[i][1];         if (row_idx >= 0 && col_idx >= 0)             printf("鞍点为array[%d][%d] = %d\n", row_idx, col_idx, array[row_idx][col_idx]);     } }  int main(void) {     int array[ROW][COL];     int point[ROW][2];      init_array(array, ROW, COL);     init_point_array(point, ROW);     show_array(array, ROW, COL);     check_saddle_point(point, array, ROW, COL);     show_saddle_point(point, array, ROW);      return 0; } 这个程序是随机产生一个二维数组，建议将随机数改成你需要输入形式。 这是一个求鞍点的方法～ 引用 2 楼 fight_in_dl 的回复:错误比较隐蔽，不过总算找出来了。  假设输入为： 3 2 1 4 5 6 7 8 9  这种情况下会出错，详细原因在注释中。  int main() { 	int n, i, j, k, m, s, x, y, o; 	while (scanf("%d%d", &n, &o) != EOF) 	{ 		m = 0; 		for (x = 0; x < n; x++) 			for (j = 0; j < o; j++) 				scanf("%d", &a[x][j]); 		s = a[0][0]; y = 0; k = 0; //使用的局部变量y需要初始化。y=0;是我新加的。 		for (x = 0; x < n; x++) 		{ 			s = a[x][0]; 			for (j = 1; j<o; j++) 			{ 				if (a[x][j]>s) //对我给出的这个输入样例，第一行后两列值2，1小于3，这个if分支判断条件是假，不会执行。 				{ 					s = a[x][j]; 					k = j; y = x; //错误就在这，因为if分支不会执行，y得不到值。 				} 			} 			for (i = 0, j = k; i < n; i++) 				if (s < a[i][j]) 					m++; 			if (m == n - 1) 				break; 			k = 0; m = 0; 		} 		if (m == n - 1) 			printf("%d %d\n", y, k); //这里会报错----使用了未经初始化的局部变量。 		if (m != n - 1) 			printf("-1\n"); 	} 	return 0; } 如果有帮助，请采纳答案好吗，谢谢！ 不过我上传OJ后还是错的[/quote] 我给你的代码是随机产生的数据，你的要求是输入的数据，数据源不一样呢。你改一改吧。不能拿来别人的就用，要看看代码的逻辑嘛，不合自己的需求，那么就改改，总不能自己什么也不做的。[/quote] 你可能理解错了，我是说2层层主告诉我的改的方法，我自己改后上传到OJ还是错的，你给我的代码我好多看不懂，没用它，还有它跟题目要求不一样，我不可能直接拿它去上传

补充一下，如果测试用例中，有两个或多个整数是相等的。 题目中因为是用 > 或者 <号作为判断条件，也会出问题。  不过是否OJ会报错，您可以试试，但之前的答案中未初始化局部变量不能使用这个问题无论如何是要解决的。

看了半天，楼主的程序不能保证行中最大的值是唯一的。就是说楼主求出来的“鞍点”保证了行中不唯一最大，列中唯一最大。


Question: 问一个关于socket的问题

接收的数据先放在缓存buffer里面 处理逻辑是从buffer分析处理，检测字符串的结束字符，一般是‘\0’作为字符串的结束

不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545

引用 2 楼 kang2618 的回复:引用 1楼user-4 的回复:客户端write完你服务端这边就close了, 导致客户端java read中断那这种情况应该怎么解决呢？  测试配置：linux c ，windows VC 测试结果： 结论：客户端的接受缓存在读取字符串时，记住需要有‘\0’作为字符串的结尾，否则读不出来，除非幸运的遇上一个'\0'. 实践解释： 补充：若没问题请结帖，有问题欢迎讨论！谢谢！


Question: 如何用C语言读取分析wireshark抓取的包

github上搜，有没有合适的包。python 的dpkt包不错

首先要了解协议的结构，然后根据结构把数据包的头、标志、内容以及尾读取出来，最后根据读取的数据进行分析就可以了。

伪需求罢了 你应该做的是解析报文，而不是解析wireshark的包，都有wireshark了，还要你干嘛

C语言读取和你用不用wireshark抓不抓包没有关系吧。wireshark只是方便你查看，想用C语言解析，你要了解协议，根据协议去解析你想要了解和读取的东西。

引用 2 楼 OnePeace888 的回复:wireshark  抓取的包，用 wireshark 看不就行了，它都给你解析好，只要它支持，按字节，解析的值显示了。。  你c语言解析，具体还要做什么？具体要交实验报告

搜“.pcapng格式”


Question: 新手c语言问题求助！！写一个程序帮助出数学题

刚好写过，仅供参考： C++ Builder写的《ZEC 四则运算练习程序》海底海星情景 http://blog.163.com/tab_98/blog/static/1192409720174615242948/  关于C++ Builder： 初学者学习C++ Builder第一个程序（模拟聊天室），经典！ http://blog.163.com/tab_98/blog/static/11924097201693033057497/ C++ Builder绘图示例（模拟时钟） http://blog.163.com/tab_98/blog/static/11924097201611324819376/ 从C语言的菜单界面管理系统到C++ Builder的图形用户界面，一个简单的电话簿Demo例子 http://blog.163.com/tab_98/blog/static/1192409720158673337998/

仅供参考：//运用C语言开发一个“小学生算术四则运算测试系统”。该系统是让计算机充当一位给小学生布置作业的算术老师，为学生出题并阅卷。该系统要求实现下列功能： //①为小学生出题（分别进行+、-、*、/等不同运算）。 //②学生做题后，进行评阅。学生每做一题后，评阅给出“答题正确，很好”或“答题错误，重做”等信息。 //③加、减、乘、除运算功能可以自由选择实现。 //④运算数值可控制在两位数的四则运算范围内。 #include <stdio.h> #include <stdlib.h> #include <time.h> int c,a,b,r,ri; void main() {     srand( (unsigned)time( NULL ) );     system("cls");     printf("小学生算术四则运算测试系统\n");     while (1) {         printf("1加法 2减法 3乘法 4除法 0退出:");fflush(stdout);         rewind(stdin);         scanf("%d",&c);         if (0==c) break;         switch (c) {         case 1:             a=rand()%100;             b=rand()%100;             r=a+b;             while (1) {                 printf("%d+%d=?",a,b);fflush(stdout);                 rewind(stdin);                 scanf("%d",&ri);                 if (ri==r) {                     printf("答题正确，很好！\n");                     break;                 } else {                     printf("答题错误，请重做。\n");                 }             }         break;         case 2:             a=1+rand()%99;             b=rand()%a;             r=a-b;             while (1) {                 printf("%d-%d=?",a,b);fflush(stdout);                 rewind(stdin);                 scanf("%d",&ri);                 if (ri==r) {                     printf("答题正确，很好！\n");                     break;                 } else {                     printf("答题错误，请重做。\n");                 }             }         break;         case 3:             a=rand()%99;             b=rand()%99;             r=a*b;             while (1) {                 printf("%d*%d=?",a,b);fflush(stdout);                 rewind(stdin);                 scanf("%d",&ri);                 if (ri==r) {                     printf("答题正确，很好！\n");                     break;                 } else {                     printf("答题错误，请重做。\n");                 }             }         break;         case 4:             a=2+rand()%998;             b=1+rand()%(a/2);             while (1) {                 if (0==a%b) break;                 b--;             }             r=a/b;             while (1) {                 printf("%d/%d=?",a,b);fflush(stdout);                 rewind(stdin);                 scanf("%d",&ri);                 if (ri==r) {                     printf("答题正确，很好！\n");                     break;                 } else {                     printf("答题错误，请重做。\n");                 }             }         break;         }     } }


Question: c语言怎么输出一些特殊符号

仅供参考：#pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <windows.h> HWND WINAPI GetConsoleWindow(); void HideTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = FALSE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } void ShowTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = TRUE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } int main() {     HWND  hwnd;     HDC   hdc;     HFONT hfont;      system("color F0");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hfont = CreateFont(48, 0, 0, 0, 0, 0, 0, 0, 0             , 0, 0, 0, 0, "Arial Unicode MS");     SelectObject(hdc,hfont);     TextOutW(hdc,10,10,L"你好",2);     DeleteObject(hfont);     hfont = CreateFont(48, 0, 0, 0, 0, 0, 0, 0, JOHAB_CHARSET , 0, 0, 0, 0, "Arial Unicode MS");     SelectObject(hdc,hfont);     TextOutW(hdc,10,80,L"\xb7f0\xb7f0\xb2dd\xb2dd",4);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     getch();     system("color 07");     system("cls");     ShowTheCursor();     return 0; }

试试Unicode方式，用wcout之类。没做过，不确定。

引用 2 楼 Chancy_cx的回复:[quote=引用 1 楼 user-4 的回复:] 你需要调用windows函数，以图片形式显示。ASIIC无法显示你那个字符  具体怎么操作呀[/quote] 也有可能在graphic.h里面有相关API

引用 2 楼 Chancy_cx的回复:[quote=引用 1 楼 user-4 的回复:] 你需要调用windows函数，以图片形式显示。ASIIC无法显示你那个字符  具体怎么操作呀[/quote] 你可以去百度，也可以使用MSDN来查看windows.h这个头文件里面的函数

引用 1 楼 user-4 的回复:你需要调用windows函数，以图片形式显示。ASIIC无法显示你那个字符  具体怎么操作呀

你需要调用windows函数，以图片形式显示。ASIIC无法显示你那个字符