Question: C语言输入输出问题

引用 3 楼 user-3 的回复:第一，你的password在循环之后已经指向了字符的结尾、 第二，如果自己都分辨不了优先级就不要写在一个语句里，while(*password++=getch()!='\r') ，!=优先级高于=，你得到的结果其实是bool值 第三，你输入的密码字符串最后应该添加一个'\0',再执行printf("\npassword is:%s\n",password); 再问一个其他的问题： //链表申明 typedef struct _list_head{ struct _list_head *prev; struct _list_head *next; }list_head,*Plist_head;   //结构体申明 typedef struct _MyStruct{ int age; list_head list; }mystruct;  如上链表放在结构体里面，我用下面的方法删除节点会出错，请问怎么释放节点： //删除节点 Plist_head DeleteNode(Plist_head head,int data) {         mystruct *ms=NULL;         Plist_head dNode=FindNode(head,data);         Plist_head bNode=head;           if(dNode==head)             bNode=head->next;//当删除头结点时，把头的后继当表头。         if(dNode)         {             dNode->prev->next=dNode->next;              dNode->next->prev=dNode->prev;             ms=GetAddr(mystruct,dNode,list);//获取结构体首地址               free(ms);//这里有问题，不知道怎么释放该节点以及包含该节点的结构体。             //free(dNode);         }                 else             return NULL;         return bNode; }  其中 #define GetAddr(type,addr,member) \ ((type *)((char *)addr-(unsigned long *)(&((type *)0)->member)))

仅供参考：#include <conio.h> #include <stdio.h> char pw[40]; int i,ch; FILE *f; void main() {     cprintf("\r\nPassword:");     i=0;pw[i]=0;     while (1) {         ch=getch();         if (ch==13 || i>=39) break;         switch (ch) {         case 27:             cprintf("\rPassword: %40s"," ");             cprintf("\rPassword: ");             i=0;pw[i]=0;             break;         case 8:             if (i>0) {                 i--;                 pw[i]=0;                 cprintf("\b \b");             }             break;         default:             pw[i]=ch;             i++;             pw[i]=0;             cprintf("*");             break;         }     }     cprintf("\r\n");     f=fopen("password.txt","w");     fprintf(f,"%s\n",pw);     fclose(f); }

#include<stdio.h> #include<conio.h>  int main(int argc, char *argv[]) {  	char *account=(char *)malloc(8); 	char *password=(char *)malloc(6); 	memset(account, 0, 8); 	memset(password, 0, 6);  	printf("Input account:\n"); 	gets(account); 	printf("account is:%s\n",account); 	printf("Input password:\n");  	//输入密码的时候显示* 	char* temp =password; 	int i =0; 	while ( i<5&&(*temp++ = getch()) !='\r') 	 { 		 i++; 		 putchar('*');		 	 } 	 	password[5] = '\0'; 	printf("\npassword is:%s\n",password);     free(account);     free(password);  	system("pause"); 	return 0; }  已经改好了

//输入密码的时候显示* while(*password++=getch()!='\r')     putchar('*'); printf("\npassword is:%s\n",password); 代码有问题啊 password 指针位置变了~~~

引用 1 楼 user-3 的回复:读不懂你问题，把你怎么输错导致错误描述清楚 Sorry! 我的意思是password最后输出的结果不是我输入的结果，是乱码的，想问下是怎么导致的，请帮忙更正，谢谢。

读不懂你问题，把你怎么输错导致错误描述清楚


Question: 嵌入式系统循环存储5000条日志信息可以用txt文件吗?

仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32     #include <windows.h>     #include <io.h> #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef WIN32 void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} int main(int argc,char * argv[]) {     int i; #ifdef WIN32     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL); #endif     for (i=0;i<10000;i++) {         Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);     } #ifdef WIN32     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //1-78行添加到你带main的.c或.cpp的那个文件的最前面 //81-85行添加到你的main函数开头 //89-93行添加到你的main函数结束前 //在要写LOG的地方仿照第87行的写法写LOG到文件MyLog1.log中

可以可以可以可以


Question: 思路卡卡的，望指出

#include <stdio.h>  int main(void)  {  int i,j,s,n,m,a[80][80];  while(scanf("%d%d",&n,&m)!=EOF)  {  if(n==0&&m==0)  break;  //s=0;  错了  for(i=0;i<n;i++)  for(j=0;j<m;j++)  scanf("%d",&a[i][j]);  for(j=0;j<m;j++)  { s=0; //改在这里  for(i=0;i<n;i++)  s=s+a[j][i];  printf("%d ",s);  }      printf("\n");  }    return


Question: 求C语言课程设计——选票系统框架！

引用 3 楼 c1043784804 的回复:[quote=引用 2 楼 paschen 的回复:] 你先自己写，有什么问题把代码发上来 typedef struct xinxi  //定义信息类型结构体  { 	int    num;  //学号  	char   name[10];  //姓名  	int    piao;  //票  	int    numb[6];  //被投人学号  	struct student *head;  //指向投票人信息  	int    use_up;  //票是否用完  }XINXI;  //类名 —— struct xinxi的小名  typedef struct student  //定义 学生类型结构体  { 	XINXI Xinxi;  //学生的信息  	struct student *next;  //指向后继节点的指针  }*STU1,STU; void menushow()  //菜单显示  { 	printf("\t\t\t*********************************************\n"); 	printf("\t\t\t\t\t1.创建学生信息\n"); 	printf("\t\t\t\t\t2.学生投票输入\n"); 	printf("\t\t\t\t\t3.删除\n"); 	printf("\t\t\t\t\t4.查找\n"); 	printf("\t\t\t\t\t5.输出得票最高的6名学生\n"); 	printf("\t\t\t\t\t6.退出\n"); 	printf("\t\t\t*********************************************\n"); 	printf("\t\t\t请输入数字1-6选择您的操作:"); } STU1 initlist(XINXI node )  //初始化链表 { 	STU1 head; 	int i; 	head=(STU1)malloc(sizeof(STU)); 	node.head=NULL; 	node.piao=0; 	node.use_up=0; 	head->Xinxi=node; 	head->next=NULL; 	for(i=0;i<6;i++) 	{ 		node.numb[i] = 0; 	} 	return head; }     这个链表初始化是这样的吗？[/quote]  initlist 参数应该要传入指针，否则你传到函数中的只是一个复制品，你在函数中的修改都是对这个复制品的修改

引用 2 楼 paschen 的回复:你先自己写，有什么问题把代码发上来 typedef struct xinxi  //定义信息类型结构体  { 	int    num;  //学号  	char   name[10];  //姓名  	int    piao;  //票  	int    numb[6];  //被投人学号  	struct student *head;  //指向投票人信息  	int    use_up;  //票是否用完  }XINXI;  //类名 —— struct xinxi的小名  typedef struct student  //定义 学生类型结构体  { 	XINXI Xinxi;  //学生的信息  	struct student *next;  //指向后继节点的指针  }*STU1,STU; void menushow()  //菜单显示  { 	printf("\t\t\t*********************************************\n"); 	printf("\t\t\t\t\t1.创建学生信息\n"); 	printf("\t\t\t\t\t2.学生投票输入\n"); 	printf("\t\t\t\t\t3.删除\n"); 	printf("\t\t\t\t\t4.查找\n"); 	printf("\t\t\t\t\t5.输出得票最高的6名学生\n"); 	printf("\t\t\t\t\t6.退出\n"); 	printf("\t\t\t*********************************************\n"); 	printf("\t\t\t请输入数字1-6选择您的操作:"); } STU1 initlist(XINXI node )  //初始化链表 { 	STU1 head; 	int i; 	head=(STU1)malloc(sizeof(STU)); 	node.head=NULL; 	node.piao=0; 	node.use_up=0; 	head->Xinxi=node; 	head->next=NULL; 	for(i=0;i<6;i++) 	{ 		node.numb[i] = 0; 	} 	return head; }     这个链表初始化是这样的吗？

你先自己写，有什么问题把代码发上来

去不写程序的论坛找！


Question: C语言，结构体

可以解释一下我的错误原因么？谢谢！

不能这样为字符数组赋值，你得用strcpy或者strcpy_s  strcpy(b.name ,  "zhang fang");

C语言的字符串实际上是char*，除了在定义时可以char* x="123"这样以外，之后不能用类似x="123"的语句来赋值。 string.h里有strcpy()函数可以用。如刚刚的情况可以写成strcpy(x,"123");

C语言  Char * 字符串  不能用 等于号赋值  在 MFC 中  CString 类型变量因为 运算符重载  可以 用 等于号赋值。

name如果是string类型的话就可以，char类型的数组不能这样赋值

引用 2 楼 dag617712 的回复:可以解释一下我的错误原因么？谢谢！  原因就是不能这样赋值！


Question: 结构体相关问题

感谢啊，有点乱，现在清晰了。

直接作为类型使用： //以下两句等价 // struct student* p; PSTU p;  //以下两句等价 // struct student s; STU s;

STU 就等价于struct Student PSTU 就等价于struct Student*  你可以直接用他们定义变量等，如 PSTU s;


Question: 老师要求写的一个  可是只会第一步 后面的怎么办啊 有没有大神愿意帮我一下

引用 4 楼 paschen 的回复:[quote=引用 3 楼 baidu_33630842 的回复:] [quote=引用 2 楼 paschen 的回复:] 楼主应该先把基础打好啊！   我知道呀~  正在努力呢…………但是这个  真的做不来[/quote]  函数名和返回值void中间要加上一个空格，另外不知你要做什么，帮不到你啊[/quote]  嗯哪 那个我知道  这个是老师给的大概框架…………大神跪求联系方式啊

引用 3 楼 baidu_33630842 的回复:[quote=引用 2 楼 paschen 的回复:] 楼主应该先把基础打好啊！   我知道呀~  正在努力呢…………但是这个  真的做不来[/quote]  函数名和返回值void中间要加上一个空格，另外不知你要做什么，帮不到你啊

引用 2 楼 paschen 的回复:楼主应该先把基础打好啊！   我知道呀~  正在努力呢…………但是这个  真的做不来

楼主应该先把基础打好啊！

先行谢过大神了！

引用 7 楼 pkuzhx 的回复:本来嘛，代写作业就是不合理的要求。 然后你也不说明你要实现什么东西，有什么要求，最少把作业题目贴出来才能有人帮你吧？  大神  ……  我贴出来了   C语言的题目  我知道伸手党可耻  可是真的是没办法了才这样的  我目前会的和我的能力不足以让我做出这道题…… 能不能帮帮我

这是表格内容    商品销售数据处理：利用文件操作函数完成简单的学生信息读入和输出，利用循环算法和结构体数据类型完成查询、计算、输出。 共三个功能：输出原始数据，计算商品种类，输出计算结果

引用 8 楼 user-3 的回复:具体问题都没描述清楚，是让用MFC还是简单的c程序呢？另外自己先把程序写好别人才能给你解答  题目  就是这样的……  还有一个txt文件  要求读取文件的表头和表格内容   我自己写的不好意思往上贴  自觉错误很多…… 也是很没办法了才来论坛问问  我知道伸手党很讨人厌那

引用 5 楼 baidu_33630842 的回复:[quote=引用 4 楼 paschen 的回复:] [quote=引用 3 楼 baidu_33630842 的回复:] [quote=引用 2 楼 paschen 的回复:] 楼主应该先把基础打好啊！   我知道呀~  正在努力呢…………但是这个  真的做不来[/quote]  函数名和返回值void中间要加上一个空格，另外不知你要做什么，帮不到你啊[/quote]  嗯哪 那个我知道  这个是老师给的大概框架…………大神跪求联系方式啊[/quote]  你先自己把代码写了，有问题可以发来论坛问


Question: 懂 ARM 汇编的大神帮忙!!!!

ding      hhhh


Question: 一元稀疏多项式求解问题中如何实现乘法？

仅供参考：//链表实现一元多项式的加法减法乘法 #include <stdio.h> #include <stdlib.h> typedef struct node {     float coef;   //系数     int expn;     //指数     struct node *next; } PolyNode;      //多项式节点 polynomial node typedef PolyNode* Polynomial; Polynomial createPolynomial() {  //创建多项式     PolyNode *p, *q, *head = (PolyNode *)malloc(sizeof(PolyNode));   //头节点     head->next = NULL;     float coef;     int expn;     printf("输入该多项式每一项的系数和指数，每项一行，输入0 0结束！\n");     while (scanf("%f %d", &coef, &expn) && coef) {   // 默认，按指数递减排列         if (head->next) {             p = head;             while (p->next && expn < p->next->expn)                 p = p->next;             if (p->next) {                 if (expn == p->next->expn) { //有相同指数的直接把系数加到原多项式                     p->next->coef += coef;                     if (p->next->coef > -0.000001 && p->next->coef < 0.000001) { //若是相加后系数为0，则舍弃该节点                         q = p->next;                         p->next = q->next;                         free(q);                     }                 } else {                     q = (PolyNode*)malloc(sizeof(PolyNode));                     q->coef = coef;                     q->expn = expn;                     q->next = p->next;                     p->next = q;                 }             } else {                 p->next = (PolyNode*)malloc(sizeof(PolyNode));                 p = p->next;                 p->coef = coef;                 p->expn = expn;                 p->next = NULL;             }         } else {             head->next = (PolyNode*)malloc(sizeof(PolyNode));             head->next->coef = coef;             head->next->expn = expn;             head->next->next = NULL;         }     }     return head; } Polynomial multiply(Polynomial poly, float coef, int expn) {  //多项式与指定单项式相乘，该单项式为 coefx^expn     PolyNode *p, *q, *Poly = (PolyNode*)malloc(sizeof(PolyNode));     p = Poly;     q = poly->next;     while (q) {         p->next = (PolyNode*)malloc(sizeof(PolyNode));         p = p->next;         p->coef = (q->coef*coef);         p->expn = (q->expn + expn);         q = q->next;     }     p->next = NULL;     return Poly; } void add(Polynomial poly1, Polynomial poly2) {  //把 poly2 加到 poly1 上     PolyNode *p, *q, *r;     r = poly1;     p = poly1->next;  //指向第一个节点     q = poly2->next;     poly2->next = NULL;     while (p && q) {         if (p->expn > q->expn) {             r->next = p;             p = p->next;             r = r->next;         } else if (p->expn < q->expn) {             r->next = q;             q = q->next;             r = r->next;         } else {             PolyNode *t;             p->coef += q->coef;             if (!(p->coef > -0.000001 && p->coef < 0.000001)) //系数不为0             {                 r->next = p;                 r = r->next;                 p = p->next;             } else {                 t = p;                 p = p->next;                 free(t);             }             t = q;             q = q->next;             free(t);         }     }     if (p)         r->next = p;     if (q)         r->next = q; } Polynomial polySubtract(Polynomial poly1, Polynomial poly2) {  //多项式减法 poly1-poly2形成一个新的多项式     //把poly2的系数取相反数，形成一个新的多项式     Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode)); //构造头节点     PolyNode *p, *q;     p = poly;     q = poly2->next;     while (q) {         p->next = (PolyNode*)malloc(sizeof(PolyNode));         p = p->next;         p->coef = -(q->coef);  //系数取反         p->expn = q->expn;         q = q->next;     }     p->next = NULL;     add(poly, poly1);  //利用加法     return poly; } Polynomial polyAdd(Polynomial poly1, Polynomial poly2) { //多项式相加 poly1+poly2形成一个新的多项式     Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode));  //和多项式的头节点     poly->next = NULL;     PolyNode *p, *q, *r;     r = poly;     p = poly1->next;     q = poly2->next;     while (p&&q) {         if (p->expn > q->expn) {             r->next = (PolyNode*)malloc(sizeof(PolyNode));             r = r->next;             r->coef = p->coef;             r->expn = p->expn;             p = p->next;         } else if (p->expn < q->expn) {             r->next = (PolyNode*)malloc(sizeof(PolyNode));             r = r->next;             r->coef = q->coef;             r->expn = q->expn;             q = q->next;         } else {             float m = p->coef + q->coef;             if (!(m > -0.000001 && m < 0.000001)) {                 r->next = (PolyNode*)malloc(sizeof(PolyNode));                 r = r->next;                 r->coef = m;                 r->expn = p->expn;             }             q = q->next;             p = p->next;         }     }     while (p) {         r->next = (PolyNode*)malloc(sizeof(PolyNode));         r = r->next;         r->coef = p->coef;         r->expn = p->expn;         p = p->next;     }     while (q) {         r->next = (PolyNode*)malloc(sizeof(PolyNode));         r = r->next;         r->coef = q->coef;         r->expn = q->expn;         q = q->next;     }     r->next = NULL;     return poly; } Polynomial polyMultiply(Polynomial poly1, Polynomial poly2) {  //多项式相乘     Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode));  //创建多项式和的头节点     poly->next = NULL;     PolyNode *p;     p = poly2->next;     while (p) {         add(poly, multiply(poly1, p->coef, p->expn));         p = p->next;     }     return poly; } void printPoly(Polynomial poly) {  //打印多项式     if (poly && poly->next) {         PolyNode *p = poly->next;  //p指向第一个节点         while (p->next) {             printf("%gx^%d", p->coef, p->expn);             p = p->next;             if (p && (p->coef > 0))                 printf("+");         }         if (p->expn == 0)             printf("%g", p->coef);   //打印常数项         else             printf("%gx^%d", p->coef, p->expn);         printf("\n");     } } void freePoly(Polynomial poly) {  //释放内存     if (poly && poly->next) {         PolyNode *p, *q;         p = poly;         while (p) {             q = p->next;             free(p);             p = q;         }     }     poly = NULL; } int main() {     printf("用链表实现多项式的加减法\n");     Polynomial poly1, poly2, poly3;     printf("创建多项式一\n");     poly1 = createPolynomial();     printf("多项式一：\n");     printPoly(poly1);     printf("创建多项式二\n");     poly2 = createPolynomial();     printf("多项式二：\n");     printPoly(poly2);     printf("两多项式相加，和为：\n");     poly3 = polyAdd(poly1, poly2);     printPoly(poly3);     freePoly(poly3);     printf("两个多项式相乘，积为：\n");     poly3 = polyMultiply(poly1, poly2);     printPoly(poly3);     freePoly(poly3);     printf("两多项式相减，差为：\n");     poly3 = polySubtract(poly1, poly2);     printPoly(poly3);     freePoly(poly1);     freePoly(poly2);     freePoly(poly3);     system("pause");     return 0; }


Question: 只有一个error，文件相似度问题

在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。  ... int main(int argc, char *argv[]) { FILE *file = NULL; int i = 0; int iWordCountOne = 0; int iWordCountTwo = 0; char *pTextOne = NULL; char *pTextTwo = NULL; static T_WordCount tWordSetOne[MAX_WORD_COUNT]; static T_WordCount tWordSetTwo[MAX_WORD_COUNT]; ...

不行啊

#include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> #include<stdlib.h> #include <stdio.h> #include <string.h> #include <sys/stat.h> #include <errno.h>    #define MAX_WORD_COUNT 1024 //最多能保存的单词数，自己修改 #define MAX_WORD_LENGTH 50//每个单词的最大长度，自己修改 #define OUT_FILE "f:\\result.txt"//默认输出文件名,自己修改  //保存单词及在文章中出现个数的结构体 typedef struct WordCount  { 	char cWord[MAX_WORD_COUNT]; 	int  iCount; }T_WordCount;  //保存相同单词在数组中位置的结构体 typedef struct  SameWordInfo { 	int iIndexOne; 	int iIndexTwo;  }T_SameWordInfo;  //将单词转换成小写形式，方便统计 void LowerText(char *pText) { 	char *pTmp = pText; 	while (*pTmp != '\0') 	{ 		if ((*pTmp >= 'A' && *pTmp <= 'Z')) 		{ 			*pTmp += 32 ; 		}  		pTmp++; 	} }  //从文章中提取单词 //并统计出单词总数及每个单词出现的次数 int ExtractWord(const char *pText, T_WordCount *pWordSet, int *pWordCount) { 	char cTmp[MAX_WORD_LENGTH] = {0};  	int  i  = 0; 	char *pTmp   = cTmp; 	int  iFlag   = 0;  	while (*pText != '\0') 	{  		if ((*pText >= 'A' && *pText <= 'Z') || (*pText >= 'a' && *pText <= 'z')) 		{  			*pTmp = *pText; 			pTmp++; 		} 		else if (*pText == '-') 		{ 			++pText; 			continue; 		} 		else 		{  			if (strlen(cTmp) > 0) 			{ 				LowerText(cTmp); 				iFlag = 0; 				for (i = 0; i < MAX_WORD_COUNT; ++i) 				{ 					if (strlen(pWordSet[i].cWord) > 0) 					{ 						if (strcmp(pWordSet[i].cWord, cTmp) == 0) 						{ 							iFlag = 1; 							pWordSet[i].iCount++; 							(*pWordCount)++;  							break; 						}  					} 					else 					{ 						strcpy(pWordSet[i].cWord, cTmp); 						pWordSet[i].iCount = 1; 						iFlag = 1; 						(*pWordCount)++;  						break; 					}  				}  				if (!iFlag) 				{ 					printf("No more space to save word.\n"); 				} 			} 			memset(cTmp, 0, MAX_WORD_LENGTH); 			pTmp = cTmp; 		}  		++pText; 	}   	return 0; }  //计算结果 //同时输出结果到屏幕和文件 int CalcResult(T_WordCount *pSetOne, T_WordCount *pSetTwo, int *pWordCountOne, int *pWordCountTwo) { 	int i = 0; 	int j = 0; 	int iCurIndex = 0; 	int iSameCountOne = 0; 	int iSameCountTwo = 0; 	FILE *file = NULL;  	T_SameWordInfo tSameWordInfo[MAX_WORD_COUNT]; 	memset(&tSameWordInfo, 0, sizeof(tSameWordInfo));  	for (i = 0; i < MAX_WORD_COUNT; ++i) 	{ 		if (strlen(pSetOne[i].cWord) <= 0) 		{ 			break; 		}  		for (j = 0; j < MAX_WORD_COUNT; ++j) 		{ 			if (strlen(pSetTwo[j].cWord) <= 0) 			{ 				break; 			}  			if (strcmp(pSetOne[i].cWord, pSetTwo[j].cWord) == 0) 			{ 				tSameWordInfo[iCurIndex].iIndexOne = i; 				tSameWordInfo[iCurIndex].iIndexTwo = j; 				++iCurIndex; 			} 		} 	}   	file = fopen(OUT_FILE, "w"); 	if (file == NULL) 	{ 		printf("Can not open file to write.\n"); 		return -1; 	} 	printf("相似度统计结果:\n"); 	fprintf(file, "相似度统计结果:\n");  	printf("%12s  %14s  %12s\n", " 相同单词数 |", " 文1数量  |", " 文2数量"); 	fprintf(file, "%12s  %14s  %12s\n", " 相同单词数 |", " 文1数量  |", " 文2数量"); 	printf("------------+---------------+-----------\n"); 	fprintf(file, "------------+---------------+-----------\n");  	for (i = 0; i < iCurIndex; ++i) 	{ 		iSameCountOne += pSetOne[(tSameWordInfo[i].iIndexOne)].iCount; 		iSameCountTwo += pSetTwo[(tSameWordInfo[i].iIndexTwo)].iCount; 		printf("%-12s|  %-13d|  %-12d\n", pSetOne[(tSameWordInfo[i].iIndexOne)].cWord,  			pSetOne[(tSameWordInfo[i].iIndexOne)].iCount, 			pSetTwo[(tSameWordInfo[i].iIndexTwo)].iCount 			);  		fprintf(file, "%-12s|  %-13d|  %-12d\n", pSetOne[(tSameWordInfo[i].iIndexOne)].cWord,  			pSetOne[(tSameWordInfo[i].iIndexOne)].iCount, 			pSetTwo[(tSameWordInfo[i].iIndexTwo)].iCount 			); 	} 	printf("------------+---------------+-----------\n"); 	fprintf(file, "------------+---------------+-----------\n");  	printf("相同单词数:%d\n", iCurIndex); 	fprintf(file, "相同单词数:%d\n", iCurIndex);  	printf("在文1中所占比:%d/%d=%.0f%%\n", iSameCountOne, *pWordCountOne, 100 * (float)iSameCountOne/(*pWordCountOne)); 	fprintf(file, "在文1中所占比:%d/%d=%.0f%%\n", iSameCountOne, *pWordCountOne, 100 * (float)iSameCountOne/(*pWordCountOne)); 	printf("在文2中所占比:%d/%d=%.0f%%\n", iSameCountTwo, *pWordCountTwo, 100 * (float)iSameCountTwo/(*pWordCountTwo));  	fprintf(file, "在文2中所占比:%d/%d=%.0f%%\n", iSameCountTwo, *pWordCountTwo, 100 * (float)iSameCountTwo/(*pWordCountTwo));   	fclose(file);  	return 0;  }   //主函数 //首先获得文件大小，并动态分配内存，然后读取文章到内存中，并处理 //如果文章比较大，会比较耗内存 //可以考虑优化一下 int main(int argc, char *argv[]) { 	FILE *file = NULL; 	int i = 0; 	int iWordCountOne = 0; 	int iWordCountTwo = 0; 	char *pTextOne = NULL; 	char *pTextTwo = NULL; 	T_WordCount tWordSetOne[MAX_WORD_COUNT]; 	T_WordCount tWordSetTwo[MAX_WORD_COUNT];  	struct stat stStatus;   	//如果参数个数不对，退出，并显示使用方法 	if (argc != 3) 	{ 		printf("Usage:app file1 file2\n"); 		return -1; 	}  	//获取文件信息 	if (0 != stat(argv[1], &stStatus)) 	{ 		printf("Can not get file info of [%s],%d\n", argv[1], errno); 		return  -1; 	}  	//以只读模式打开文件 	file = fopen(argv[1], "r"); 	if (file == NULL) 	{ 		printf("Can not open file:%s\n", argv[1]); 		return  -1; 	}  	//分配比较文件大小多1个字节的内存 	pTextOne = (char *)malloc(stStatus.st_size + 1); 	if (pTextOne == NULL) 	{ 		printf("Can not allocate memory.\n"); 		return -1; 	} 	//内存初始化 	memset(pTextOne, 0, stStatus.st_size + 1);  	//读取文章到内存中 	if(fread(pTextOne, sizeof(char), (size_t)stStatus.st_size, file) <= 0) 	{ 		printf("Can not read file.\n"); 		return -1; 	}  	//以下处理文章2，步骤同上 	if (0 != stat(argv[2], &stStatus)) 	{ 		printf("Can not get file info of [%s]\n", argv[2]); 		return  -1; 	}  	file = fopen(argv[2], "r"); 	if (file == NULL) 	{ 		printf("Can not open file:%s\n", argv[2]); 		return  -1; 	}  	pTextTwo = (char *)malloc(stStatus.st_size + 1); 	if (pTextTwo == NULL) 	{ 		printf("Can not allocate memory.\n"); 		return -1; 	} 	memset(pTextTwo, 0, stStatus.st_size + 1);  	if(fread(pTextTwo, sizeof(char), (size_t)stStatus.st_size, file) <= 0) 	{ 		printf("Can not read file.\n"); 		return -1; 	}  	//fclose(file);  	//printf("%s\n", pTextOne); 	//printf("%s\n", pTextTwo);   	memset(tWordSetOne, 0, sizeof(tWordSetOne)); 	memset(tWordSetTwo, 0, sizeof(tWordSetTwo));  	//提取单词 	ExtractWord(pTextOne, tWordSetOne,&iWordCountOne); 	ExtractWord(pTextTwo, tWordSetTwo,&iWordCountTwo);  	//计算结果 	CalcResult(tWordSetOne, tWordSetTwo,&iWordCountOne,&iWordCountTwo);  	//释放内存 	free(pTextOne); 	free(pTextTwo);  	return 0;  }   编译通过~~~ 我修改了

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

求大神帮帮忙


Question: 用高级语言编写和调试一个简单的文件系统，模拟文件管理的工作过程。

fat16是不是行数更少？

使用C语言编写

把ext2或者fat文件系统改改就出来了，简化一些

操作系统真的没有学好，指针根本不会


Question: 静态局部变量定义时赋初值问题和定义后赋初值问题

慢慢看，不着急

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

初始化和赋值是不同的概念。

只初始化一次，不是只赋值一次


man 3 getchar  GETS Section: Linux Programmer's Manual (3 ) Updated: 1993-04-04  --------------------------------------------------------------------------------    NAME fgetc, fgets, getc, getchar, gets, ungetc - input of characters and strings    SYNOPSIS #include <stdio.h>  int fgetc(FILE *stream); char *fgets(char *s, int size, FILE *stream); int getc(FILE *stream); int getchar(void); char *gets(char *s); int ungetc(int c, FILE *stream);     DESCRIPTION fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or error.  getc() is equivalent to fgetc() except that it may be implemented as a macro which evaluates stream more than once.   getchar() is equivalent to getc(stdin).   gets() reads a line from stdin into the buffer pointed to by s until either a terminating newline or EOF, which it replaces with '\0'. No check for buffer overrun is performed (see BUGS below).   fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer. A '\0' is stored after the last character in the buffer.   ungetc() pushes c back to stream, cast to unsigned char, where it is available for subsequent read operations. Pushed - back characters will be returned in reverse order; only one pushback is guaranteed.   Calls to the functions described here can be mixed with each other and with calls to other input functions from the stdio library for the same input stream.   For non-locking counterparts, see unlocked_stdio(3).     RETURN VALUE fgetc(), getc() and getchar() return the character read as an unsigned char cast to an int or EOF on end of file or error.  gets() and fgets() return s on success, and NULL on error or when end of file occurs while no characters have been read.   ungetc() returns c on success, or EOF on error.     CONFORMING TO ANSI - C, POSIX.1. LSB deprecates gets().    BUGS Never use gets(). Because it is impossible to tell without knowing the data in advance how many characters gets() will read, and because gets() will continue to store characters past the end of the buffer, it is extremely dangerous to use. It has been used to break computer security. Use fgets() instead.  It is not advisable to mix calls to input functions from the stdio library with low - level calls to read() for the file descriptor associated with the input stream; the results will be undefined and very probably not what you want.     SEE ALSO read(2), write(2), ferror(3), fopen(3), fread(3), fseek(3), puts(3), scanf(3), unlocked_stdio(3)  --------------------------------------------------------------------------------

不可以右键转到定义？ 我是VS下C++开发的，所以~~~


Question: 简易离线外卖C语言设计

这个就是我编的代码  求帮忙改一下     #include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h>  struct bookdata { 	char name[20]; 	char writer[20]; 	char number[20]; }contact[500];  int No=0; FILE *fp;  void mainmenu(); void hotmenu(); void joinone(); void jointwo(); void joinstree(); void searchmenu(); void searchname(); void searchnumber(); int loadfile();  int main() { 	printf("欢迎进入\n"); 	system("cls"); 	loadfile(); 	while(1) 	{ 		mainmenu(); 	} 	return 0; }  void mainmenu() { 	char choice; 	system("cls"); 	system("color 4 "); 	printf("\n\t\t\t\t\t************主菜单**************\n"); 	printf("\n\t\t\t\t\t**********1-搜索店家**********\n"); 	printf("\n\t\t\t\t\t**********2-热门店家**********\n"); 	printf("\n\t\t\t\t\t**********0-返回主菜单**********\n");     printf("\n\t\t\t\t\t*************************************\n"); 	printf("\n\t\t\t\t\t请选择："); 	choice=getch();//从控制台读取一个字符 	switch(choice) 	{ 		case '1':searchmenu();break; 		case '2':hotmenu();break; 		case '0':exit(0);break; 		default:mainmenu(); 	} }  void searchmenu() { 	char choice; 	system("cls"); 	system("color 9"); 	printf("\n\t\t\t\t\t************搜索店家************\n"); 	printf("\n\t\t\t\t\t**********1-按店名查找**********\n"); 	printf("\n\t\t\t\t\t**********2-按编号查找**********\n");     printf("\n\t\t\t\t\t**********0-返回主菜单**********\n"); 	printf("\n\t\t\t\t\t********************************\n"); 	printf("请选择：\n"); 	choice=getch(); 	switch(choice) 	{ 		case '1':searchname();break; 		case '2':searchnumber();break; 		case '0':mainmenu();break; 	} }  void searchname() {     system("color A"); 	int mark=0; 	int i; 	int a=0; 	char name[20]; 	printf("\n\t\t\t\t\t**********按店名查找**********\n"); 	printf("\n\t\t\t\t\t请输入关键词："); 	scanf("\t\t\t\t\t%s",name); 	for(i=a;i<No;i++) 	{ 		if(strcmp(contact[i].name,name)==0) 		{ 			printf("\n\t\t\t\t\t**********以下是您要查找书籍的信息**********\n"); 			printf("\n\t\t\t\t\t店名：%s",contact[i].name); 		    printf("\n\t\t\t\t\t编号：%s",contact[i].number); 			printf("\n\t\t\t\t\t********************************************\n"); 			printf("\n\t\t\t\t\t按任意键返回\n"); 			mark++; 			getch(); 			return; 		} 	} 	if(mark==0) 	{ 		printf("\n\t\t\t\t\t没有该店家信息\n"); 		printf("\n\t\t\t\t\t按任意键返回\n"); 		getch(); 		return; 	} 	if(mark==1) 	{ 		printf("\n1-套餐A\t\t\t2-套餐B\t\t\t3-套餐C\n"); 		printf("\n4-卤肉饭\t\t\t5-饮料\t\t\t4-稀饭\n"); 	} 	if(mark==2) 	{ 		printf("\n1-素冒菜\t\t\t\t2-荤冒菜\n"); 		printf("\n3-自选\t\t\t\t4-饮料\n"); 	} 	if(mark==3) 	{ 		printf("\n1-推荐菜系\t\t\t\t2-环保餐盒\n"); 		printf("\n3-自选\t\t\t\t4-推荐饮品\n"); 	} }  void searchnumber() { 	int mark=0; 	int i; 	int a=0; 	char number[20]; 	printf("\n\t\t\t\t\t**********按编号查找**********\n"); 	printf("\n\t\t\t\t\t请输入编号："); 	scanf("\t\t\t\t\t%s",number); 	for(i=a;i<No;i++) 	{ 		if(strcmp(contact[i].number,number)==0) 		{ 			printf("\n\t\t\t\t\t**********以下是您要查找编号的信息**********\n"); 			printf("\n\t\t\t\t\t店名：%s",contact[i].name); 			printf("\n\t\t\t\t\t编号：%s",contact[i].number); 			printf("\n\t\t\t\t\t********************************************\n"); 			printf("\n\t\t\t\t\t按任意键返回\n"); 			mark++; 			getch(); 			return; 		} 	} 	if(mark==0) 	{ 		printf("\n\t\t\t\t\t没有该编号信息\n"); 		printf("\n\t\t\t\t\t按任意键返回\n"); 		getch(); 		return; 	} 	if(mark==1) 	{ 		printf("\n1-套餐A\t\t\t2-套餐B\t\t\t3-套餐C\n"); 		printf("\n4-卤肉饭\t\t\t5-饮料\t\t\t4-稀饭\n"); 	} 	if(mark==2) 	{ 		printf("\n1-素冒菜\t\t\t\t2-荤冒菜\n"); 		printf("\n3-自选\t\t\t\t4-饮料\n"); 	} 	if(mark==3) 	{ 		printf("\n1-推荐菜系\t\t\t\t2-环保餐盒\n"); 		printf("\n3-自选\t\t\t\t4-推荐饮品\n"); 	} } void hotmenu() {     char choice; 	system("cls"); 	system("color 4 ");     printf("\n\t\t\t\t\t************热门店家************\n"); 	printf("\n\t\t\t\t\t**********1-卤肉饭**********\n"); 	printf("\n\t\t\t\t\t**********2-冒菜**********\n");     printf("\n\t\t\t\t\t**********3-麻辣香锅**********\n");     printf("\n\t\t\t\t\t**********0-返回主菜单**********\n"); 	printf("\n\t\t\t\t\t********************************\n"); 	printf("请选择：\n"); 	choice=getch(); 	switch(choice) 	{ 		case '1':joinone();break; 		case '2':jointwo();break; 		case '3':joinstree();break; 		case '0':mainmenu();break; 	} 	return; } void joinone() { 	char number[20]; 	printf("\n\t\t\t\t\t**********按标号选择**********\n"); 	printf("\n1-套餐A\t\t\t2-套餐B\t\t\t3-套餐C\n");     printf("\n4-卤肉饭\t\t\t5-饮料\t\t\t4-稀饭\n");     printf("\n\t\t\t\t\t请输入编号：");     printf("\n\t\t订单已保存!\n"); 	fclose(fp); 	scanf("\t\t\t\t\t%s",number);     printf("\n\t\t\t\t\t按任意键返回\n");     getch();     return; } void jointwo() {int i;     int a=0; 	char number[20]; 	printf("\n\t\t\t\t\t**********按标号选择**********\n");     printf("\n1-推荐菜系\t\t\t\t2-环保餐盒\n");     printf("\n3-自选\t\t\t\t4-推荐饮品\n"); 	printf("\n\t\t\t\t\t请输入编号：");     printf("\n\t\t订单已保存!\n"); 	fclose(fp); scanf("\t\t\t\t\t%s",number); 	printf("\n\t\t\t\t\t按任意键返回\n");     getch();     return; } void joinstree() {int i;     int a=0; 	char number[20]; 	printf("\n\t\t\t\t\t**********按标号选择**********\n"); 	printf("\n1-素冒菜\t\t\t\t2-荤冒菜\n"); 	printf("\n3-自选\t\t\t\t4-饮料\n"); 	printf("\n\t\t\t\t\t请输入编号：");     printf("\n\t\t订单已保存!\n"); 	fclose(fp); scanf("\t\t\t\t\t%s",number); 	printf("\n\t\t\t\t\t按任意键返回\n");     getch();     return; } int loadfile() { 	fseek(fp,0,2); 	if (ftell(fp)>0) 	printf("\n\n\n\n"); 	printf("\n\t\t\t\t\t    欢迎使用饿了么"); 	printf("\n\t\t\t\t\t  按任意键进入主菜单 "); 	getch(); 	return(No); }

目测lz说的是类似学生信息管理系统的那种,实现增删查改的功能

马克，等楼主出具体需求

把需求、输入、期望输出说清楚点吧。

做叫外卖的网站还是APP？

问题描述要稍微清晰一点。不然谁知道你要表达什么啊


Question: 0xC0000005: Access violation报错怎么回事？

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

我只修改了这部分的bug 其他 我就没有弄了

#include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h>  typedef struct { 	char instring[50]; }Instring; //读取文件个数 void ReadFnum(int &num); //读取文件 bool ReadFile(Instring a[1000],int number);  int _tmain(int argc, _TCHAR* argv[]) { 	int number; 	Instring a[100]; 	memset(a, 0,100*sizeof(Instring)); 	srand((unsigned) time(NULL));  	printf("读取几条数据\n"); 	scanf("%d",&number); 	printf("读取%d条数据\n",number);  	ReadFile(a,number);  	for(int i=0;i<number;i++) 		printf("%s\n",&a[i].instring);  	return 0;  }  //读取文件个数 void ReadFnum(int &num) { 	FILE *op = NULL; 	op=fopen("data.txt","r"); 	if(op==NULL) 	{ 		printf("文件打开失败"); 		return ; 	}  	int i=0; 	int z=0; 	char a[100];  	while(!feof(op)) 	{ 		fscanf(op,"%s\t",&a[z]); 		i++; 	}  	if( op) 	{ 		if ( fclose( op ) ) 		{ 			printf( "The file 'crt_fopen.c' was not closed\n" ); 		} 	} 	num=i; } //读取文件 bool ReadFile(Instring a[1000],int number) {  	FILE *fp = NULL; 	int i = 0; 	int num = 0; 	ReadFnum(num);//得到文件个数  	int n =0;//从第n行开始读数据 	if (num - number >0 ) 	{ 		n=rand()%(num-number);//从第0行到num-1读取文件 	} 	fp=fopen("data.txt","r");  	if(fp==NULL) 	{ 		printf("文件无法打开"); 		return  false; 	}  	for(i=0;i<n;i++)//跳过一行字符串 	{ 		fscanf(fp,"%[^\n]%*c");  	} 	int iread = num - number >0? number:  num; 	for(int z=0;z<iread;z++) 		fscanf(fp,"%[^\n]%*c",a[z].instring);  	if( fp) 	{ 		if ( fclose( fp ) ) 		{ 			printf( "The file 'crt_fopen.c' was not closed\n" ); 		} 	} 	return true;  } 已经改好了 这个错误问题 不过的你的代码BUG真多  提一下： 1 局部变量没有初始化 2 异常情况边缘条件未考虑 3 空指针没有避免

检查文件有没打开成功，检查指针有没有效，必要时单步运行调试，另外如果打开失败不应该继续往下执行

if(op==NULL)  printf("文件打开失败");  这个地方 有问题 需要放回 不然后面就是空指针操作 会报内存操作的错误！

引用 1 楼 user-4 的回复:这是我运行时的错误提示，不知第13行的num前为什么要加“&” 加这个表示引用，表示该参数是实参的别名~~~ 这样你就可以改变实参的值~~~

这是我运行时的错误提示，不知第13行的num前为什么要加“&”


Question: 二进制文件操作问题

图片怎么可能追加合并呢，流式的还有可能，比如MP3、视频、文本文件。 图片合并要考虑合并后怎么显示，是横向并排，还是竖向排列，高度或宽度不同还要调整适应。真正合并可能要扫描图片每一像素行。或者用BitBlt、StretchBlt等矩形贴图的API。

引用 2 楼 zhao4zhong1 的回复:电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  先用PS手动合并两个图片并保存，再用WinHex软件查看合并后的图片文件长啥样。这个我知道，但是要怎么合并呢，是不是像1楼所说的要说明符?

每种文件都有文件的类型说明符 比如bmp文件的数据开始是424D表示的意思就是BM，而png文件的开头也有其类型说明，你把两种数据合并，肯定是不对的


Question: 输入每个学生的姓名和线性代数、通信原理和C语言课程成绩，统计每人的平均值，并按平均值降序排列，输出排列后的名次、姓名、课 想建立一个结构体中的结构体，不会引用

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


Question: 双向循环链表删除节点问题

引用 4 楼 zhao4zhong1 的回复:看代码中★的地方： #include<stdio.h> #include<malloc.h>  //根据结构体成员的地址找到结构体的起始地址 #define GetAddr(type,addr,member) \ ((type *)((char *)addr-(char *)(&((type *)0)->member)))  //链表申明 typedef struct _list_head{ struct _list_head *prev; struct _list_head *next; }list_head,*Plist_head;  //结构体申明 typedef struct _MyStruct{ int age; list_head list; }mystruct;  //建立表头 Plist_head CreateList() {     Plist_head head=NULL;     mystruct *p=(mystruct *)malloc(sizeof(mystruct));     p->age=0;     head=&p->list;     head->prev=head->next=head;     return head; }  //创建节点 Plist_head CreateNode(int data) {     Plist_head newnode=NULL;     mystruct *p=(mystruct *)malloc(sizeof(mystruct));     p->age=data;     newnode=&p->list;     newnode->next=newnode->prev=newnode;     return newnode;  }  //插入节点 Plist_head InsertNode(Plist_head head,int data) {     Plist_head newNode=CreateNode(data);     //建立连接     if(newNode)     {         head->prev->next=newNode;         newNode->next=head;         newNode->prev=head->prev;//★         head->prev=newNode;//★     }     else         return NULL;     return head;  }  //遍历 Plist_head FindNode(Plist_head head,int data) {     mystruct *fp;     Plist_head Fd=head;      for(;Fd->next!=head;Fd=Fd->next)     {         fp=GetAddr(mystruct,Fd,list);         if(fp->age==data)             break;     }     if(fp->age==data)     {         printf("find done!\n");         return Fd;     }     else         return NULL; }  //删除节点 Plist_head DeleteNode(Plist_head head,int data) {         mystruct *ms=NULL;         Plist_head dNode=FindNode(head,data);         Plist_head bNode=head;          if(dNode==head)             bNode=head->next;//当删除头结点时，把头的后继当表头。         if(dNode)         {             dNode->prev->next=dNode->next;             dNode->next->prev=dNode->prev;             ms=GetAddr(mystruct,dNode,list);              free(ms);//这里有问题，不知道怎么释放该节点以及包含该节点的结构体。             //free(dNode);         }         else             return NULL;         return bNode; }  //计算链表长度 int CalcLength(Plist_head cNode) {     int length=0;     Plist_head temp=cNode;     for(;temp->next!=cNode;temp=temp->next)         length++;     return (length+1); } //主函数 int main() {     Plist_head p=NULL;     mystruct *ms=NULL;     Plist_head head=CreateList();//建立表头      if(InsertNode(head,20))//插入节点20         printf("Insert 20 successfully!\n");     else         printf("Insert 20 failed!\n");      if(InsertNode(head,21))//插入节点21         printf("Insert 21 successfully!\n");     else         printf("Insert 21 failed!\n");      if(InsertNode(head,22))//插入节点22         printf("Insert 22 successfully!\n");     else         printf("Insert 22 failed!\n");      printf("Node length=%d\n",CalcLength(head));//打印长度      //打印链表     for(p=head;p->next!=head;p=p->next)     {         ms=GetAddr(mystruct,p,list);         printf("%d node!\n",ms->age);     }     printf("%d node!\n",GetAddr(mystruct,p,list)->age);      //删除节点21     if(DeleteNode(head,21))         printf("Delete 21 successfully!\n");     else         printf("Delete 21 failed!\n"); //  printf("Node length=%d\n",CalcLength(head));      //打印节点，这里有问题，节点22打出来是错的     for(p=head;p->next!=head;p=p->next)     {         ms=GetAddr(mystruct,p,list);         printf("%d node!\n",ms->age);     }     printf("%d node!\n",GetAddr(mystruct,p,list)->age);     return 0; }  解决了，谢谢

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  仅供参考：//不带表头结点的单向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> #include <locale.h> struct NODE {     int          data;     struct NODE *next; } *head,*p,*q,*s,*p1,*p2,*q1,**ta; int i,k,n,t,m,v,N=10; int main() {     setlocale(LC_ALL,"chs");     srand(time(NULL));      head=NULL;      printf("创建%d个节点的单链表:",N);//创建N个节点的单链表     p=head;     for (i=0;i<N;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) exit(1);         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         if (NULL==p) {             head=q;             p=head;         } else {             p->next=q;             p=q;         }     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      k=3;     v=5;     printf("将值为%d的结点插入到单链表的第%d个结点前:",v,k);//将值为v的结点插入到单链表的第k个结点前     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==1) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) exit(1);             q->data=5;             q->next=head;             head=q;             break;         } else {             if (k-1==n) {                 q=(struct NODE *)malloc(sizeof(struct NODE));                 if (NULL==q) exit(1);                 q->data=5;                 q->next=p->next;                 p->next=q;                 break;             }         }         p=p->next;     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      k=5;     printf("删除第%d个节点:",k);//删除第k个节点     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==1) {             q=head;             head=head->next;             free(q);             break;         } else {             if (k-1==n) {                 q=p->next;                 if (q) {                     p->next=q->next;                     free(q);                 }                 break;             }         }         p=p->next;     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      printf("从小到大排序:");//从小到大排序     for (p=head,p1=NULL;p!=NULL;p1=p,p=p->next) {         for (q=p->next,q1=p;q!=NULL;q1=q,q=q->next) {             if (p->data > q->data) {                  //交换data //              printf("swap %02d %02d\n",p->data,q->data); //              t=p->data;p->data=q->data;q->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->data,q->data);                 if (p==head) {//p是头                     if (p->next==q) {//pq挨着                         head=q;                         p->next=q->next;                         q->next=p;                         q=p;                         p=head;                     } else {//pq不挨着                         head=q;                         p2=p->next;                         p->next=q->next;                         q->next=p2;                         q1->next=p;                         q=p;                         p=head;                     }                 } else {//p不是头                     if (p->next==q) {//pq挨着                         p1->next=q;                         p->next=q->next;                         q->next=p;                         q=p;                         p=p1->next;                     } else {//pq不挨着                         p1->next=q;                         p2=p->next;                         p->next=q->next;                         q->next=p2;                         q1->next=p;                         q=p;                         p=p1->next;                     }                 }                  //输出整个单链表 //              s=head; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表并计算链表长度n     n=0;     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         n++;         s=s->next;     }      printf("将整个链表逆序:");//将整个链表逆序     if (n>=2) {         p=head;         q=p->next;         p->next=NULL;         while (1) {             q1=q->next;             q->next=p;             p=q;             q=q1;             if (NULL==q) break;         }         head=p;     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      m=4;     n=6;     printf("将单链表中前%d个结点和后%d个结点进行互换:",m,n);//将单链表中前m个结点和后n个结点进行互换,m+n为链表总长     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m==k) {             q=p;         }         s=p;         p=p->next;     }     q1=head;     head=q->next;     s->next=q1;     q->next=NULL;      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //创建10个节点的单链表:08->74->07->23->03->99->31->56->88->16-> //将值为5的结点插入到单链表的第3个结点前:08->74->05->07->23->03->99->31->56->88->16-> //删除第5个节点:08->74->05->07->03->99->31->56->88->16-> //从小到大排序:03->05->07->08->16->31->56->74->88->99-> //将整个链表逆序:99->88->74->56->31->16->08->07->05->03-> //将单链表中前4个结点和后6个结点进行互换:31->16->08->07->05->03->99->88->74->56-> //

木人

能不能举着类似我问题的例子


Question: 一个从输入中读取double数据的问题

引用 3 楼 zhao4zhong1 的回复:fscanf_s(fp, "%s%s%s %c %c %d%lf",              person.Id, sizeof(person.Id),             person.Name, sizeof(person.Name),             person.Birth, sizeof(person.Birth),             &person.Sex, sizeof(person.Sex),             &person.Marriage, sizeof(person.Marriage),             &person.Height, sizeof(person.Height),             &person.Weight, sizeof(person.Weight)             );   Format Specification Fields: scanf and wscanf Functions A format specification has the following form:  % [width] [{h | l | I64 | L}]type  The format argument specifies the interpretation of the input and can contain one or more of the following:   White-space characters: blank (' '); tab ('\t'); or newline ('\n'). A white-space character causes scanf to read, but not store, all consecutive white-space characters in the input up to the next non–white-space character. One white-space character in the format matches any number (including 0) and combination of white-space characters in the input.   Non–white-space characters, except for the percent sign (%). A non–white-space character causes scanf to read, but not store, a matching non–white-space character. If the next character in stdin does not match, scanf terminates.   Format specifications, introduced by the percent sign (%). A format specification causes scanf to read and convert characters in the input into values of a specified type. The value is assigned to an argument in the argument list.  The format is read from left to right. Characters outside format specifications are expected to match the sequence of characters in stdin; the matching characters in stdin are scanned but not stored. If a character in stdin conflicts with the format specification, scanf terminates, and the character is left in stdin as if it had not been read.  When the first format specification is encountered, the value of the first input field is converted according to this specification and stored in the location that is specified by the first argument. The second format specification causes the second input field to be converted and stored in the second argument, and so on through the end of the format string.  An input field is defined as all characters up to the first white-space character (space, tab, or newline), or up to the first character that cannot be converted according to the format specification, or until the field width (if specified) is reached. If there are too many arguments for the given specifications, the extra arguments are evaluated but ignored. The results are unpredictable if there are not enough arguments for the format specification.  Each field of the format specification is a single character or a number signifying a particular format option. The type character, which appears after the last optional format field, determines whether the input field is interpreted as a character, a string, or a number.   The simplest format specification contains only the percent sign and a type character (for example, %s). If a percent sign (%) is followed by a character that has no meaning as a format-control character, that character and the following characters (up to the next percent sign) are treated as an ordinary sequence of characters, that is, a sequence of characters that must match the input. For example, to specify that a percent-sign character is to be input, use %%.  An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.// crt_sscanf_s.c // This program uses sscanf_s to read data items // from a string named tokenstring, then displays them.  #include <stdio.h> #include <stdlib.h>  int main( void ) {    char  tokenstring[] = "15 12 14...";    char  s[81];    char  c;    int   i;    float fp;     // Input various data from tokenstring:    // max 80 character string plus NULL terminator    sscanf_s( tokenstring, "%s", s, _countof(s) );    sscanf_s( tokenstring, "%c", &c, sizeof(char) );    sscanf_s( tokenstring, "%d", &i );    sscanf_s( tokenstring, "%f", &fp );     // Output the data read    printf_s( "String    = %s\n", s );    printf_s( "Character = %c\n", c );    printf_s( "Integer:  = %d\n", i );    printf_s( "Real:     = %f\n", fp ); }从输入中获取数值时不需要在可选参数中指明缓冲区大小。 The sscanf_s function reads data from buffer into the location given by each argument. The arguments after the format string specify pointers to variables with a type that corresponds to a type specifier in format. Unlike the less secure version sscanf, a buffer size parameter is required when using the type field characters c, C, s, S and [.  参见MSDN原文：https://msdn.microsoft.com/library/t6z7bya3(v=vs.110).aspx

引用 1 楼 zhao4zhong1 的回复://请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0]; 老师啊，你这是啥意思呢？ 是不是说不管我读取什么类型的数据，都把它作为字符串去接受，然后在字符串的基础上再去做合法验证和类型转换？ 》》》》》》》》》》》》》》》》》》》》》》》》》 能不能就我的实际问题解惑一下呢？


Question: 求斐波那契数列第n项

斐波那契数列后面的数字会很大,会溢出,考虑用数组实现

http://blog.csdn.net/zyearn/article/details/7878657 编程之美 时间复杂度仅为O(log2 (n))。

int  太小 long long 只能计算92 项 usinged long long 93 项

你这是2个程序在一个文件里一起编译？ 网上搜索C语言斐波那契数列，结果一大堆


Question: strcpy 溢出检测问题


Question: 输入一个正整数n，计算1+1/3+1/5+...的前 n 项之和。

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

第二个多加了一项~~~你自己  列几个测试用例 看看吧   n=1的时候 就开始不对了~~~ 逻辑问题~~~

第二段代码循环多加了一个1/21，第一次循环已经计算到1+1/3了，而第一段代码第一次循环只计算了1，第二次才1+1/3

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

第二个多加了一项。计算的是N+1。


Question: C语言用函数求根

引用 3 楼 withszm 的回复:[quote=引用 2 楼 lilianjie001的回复:] #include<math.h> main() { 	float a,b,c,disc,x1,x2,realpart,inagpart; 	scanf("%f,%f,%f",&a,&b,&c); 	printf("THE equation"); 	if(fabs(a)<=1e-6) 		printf("is not a quadratic\n"); 	else 	{ 		disc=b*b-4*a*c; 		if(fabs(disc)<=1e-6) 			printf("has two equal  roots :%8.4f\n",-b/(2*a)); 		else if (disc>1e-6) 		{ 			x1=(-b+sqrt(disc))/(2*a); 			x2=(-b-sqrt(disc))/(2*a); 			printf("has distinct real roots:%8.4f and %8.4\n",x1,x2); 		} 		else 		{ 			realpart=-b/(2*a); 			inagpart=sqrt(-disc)/(2*a); 			printf("has complex roots:\n"); 			printf("%8.4f+%8.4fi\n",realpart,inagpart); 			printf("%8.4f-%8.4fi\n",realpart,inagpart); 		} 	} } 没事多看看书 可是我想要的是函数版的啊，不是函数的我也会了[/quote] 把这期中计算部分的代码，封装成函数有困难？

引用 3 楼 withszm 的回复:[quote=引用 2 楼 lilianjie001的回复:] #include<math.h> main() { 	float a,b,c,disc,x1,x2,realpart,inagpart; 	scanf("%f,%f,%f",&a,&b,&c); 	printf("THE equation"); 	if(fabs(a)<=1e-6) 		printf("is not a quadratic\n"); 	else 	{ 		disc=b*b-4*a*c; 		if(fabs(disc)<=1e-6) 			printf("has two equal  roots :%8.4f\n",-b/(2*a)); 		else if (disc>1e-6) 		{ 			x1=(-b+sqrt(disc))/(2*a); 			x2=(-b-sqrt(disc))/(2*a); 			printf("has distinct real roots:%8.4f and %8.4\n",x1,x2); 		} 		else 		{ 			realpart=-b/(2*a); 			inagpart=sqrt(-disc)/(2*a); 			printf("has complex roots:\n"); 			printf("%8.4f+%8.4fi\n",realpart,inagpart); 			printf("%8.4f-%8.4fi\n",realpart,inagpart); 		} 	} } 没事多看看书 可是我想要的是函数版的啊，不是函数的我也会了[/quote]  先把基础打好！ 如果要函数，你把需要的部分放到函数里，该传的参数传到函数里，函数把要的结果返回，有什么难的

引用 3 楼 withszm 的回复:[quote=引用 2 楼 lilianjie001的回复:] #include<math.h> main() { 	float a,b,c,disc,x1,x2,realpart,inagpart; 	scanf("%f,%f,%f",&a,&b,&c); 	printf("THE equation"); 	if(fabs(a)<=1e-6) 		printf("is not a quadratic\n"); 	else 	{ 		disc=b*b-4*a*c; 		if(fabs(disc)<=1e-6) 			printf("has two equal  roots :%8.4f\n",-b/(2*a)); 		else if (disc>1e-6) 		{ 			x1=(-b+sqrt(disc))/(2*a); 			x2=(-b-sqrt(disc))/(2*a); 			printf("has distinct real roots:%8.4f and %8.4\n",x1,x2); 		} 		else 		{ 			realpart=-b/(2*a); 			inagpart=sqrt(-disc)/(2*a); 			printf("has complex roots:\n"); 			printf("%8.4f+%8.4fi\n",realpart,inagpart); 			printf("%8.4f-%8.4fi\n",realpart,inagpart); 		} 	} } 没事多看看书 可是我想要的是函数版的啊，不是函数的我也会了[/quote]  函数模板 难道要cstring 类型的求根，还是要其他类对象的求根？ 不切实际，最后还是要模板特例化~~~  没意思~~~  就像这样 做空的模板函数 然后 模板特例化~~~double int float?

#include <stdio.h> #include<math.h>  void equal0(float a, float b, float c) { 	float disc, realpart,inagpart; 	disc=b*b-4*a*c; 	realpart=-b/(2*a); 	inagpart=sqrt(-disc)/(2*a); 	printf("has complex roots:\n"); 	printf("%8.4f+%8.4fi\n",realpart,inagpart); 	printf("%8.4f-%8.4fi\n",realpart,inagpart); }  void less0(float a, float b, float c) { 	printf("has two equal  roots :%8.4f\n",-b/(2*a)); }  void greater0(float a, float b, float c) { 	float disc, x1, x2; 	disc=b*b-4*a*c; 	x1=(-b+sqrt(disc))/(2*a); 	x2=(-b-sqrt(disc))/(2*a); 	printf("has distinct real roots:%8.4f and %8.4f\n",x1,x2); }   int main() { 	float a,b,c,disc; 	scanf("%f,%f,%f",&a,&b,&c); 	printf("THE equation"); 	if(fabs(a)<=1e-6) 		printf("is not a quadratic\n"); 	else 	{ 		disc=b*b-4*a*c; 		if(fabs(disc)<=1e-6) 			less0(a,b,c); 		else if (disc>1e-6) 			greater0(a,b,c); 		else 			equal0(a,b,c); 	} }

引用 5 楼 paschen的回复:[quote=引用 3 楼 withszm 的回复:] [quote=引用 2 楼 lilianjie001的回复:] #include<math.h> main() { 	float a,b,c,disc,x1,x2,realpart,inagpart; 	scanf("%f,%f,%f",&a,&b,&c); 	printf("THE equation"); 	if(fabs(a)<=1e-6) 		printf("is not a quadratic\n"); 	else 	{ 		disc=b*b-4*a*c; 		if(fabs(disc)<=1e-6) 			printf("has two equal  roots :%8.4f\n",-b/(2*a)); 		else if (disc>1e-6) 		{ 			x1=(-b+sqrt(disc))/(2*a); 			x2=(-b-sqrt(disc))/(2*a); 			printf("has distinct real roots:%8.4f and %8.4\n",x1,x2); 		} 		else 		{ 			realpart=-b/(2*a); 			inagpart=sqrt(-disc)/(2*a); 			printf("has complex roots:\n"); 			printf("%8.4f+%8.4fi\n",realpart,inagpart); 			printf("%8.4f-%8.4fi\n",realpart,inagpart); 		} 	} } 没事多看看书 可是我想要的是函数版的啊，不是函数的我也会了[/quote]  先把基础打好！ 如果要函数，你把需要的部分放到函数里，该传的参数传到函数里，函数把要的结果返回，有什么难的[/quote] 刚学不久  还是个学渣啊  大神

引用 6 楼 lilianjie001的回复:[quote=引用 3 楼 withszm 的回复:] [quote=引用 2 楼 lilianjie001的回复:] #include<math.h> main() { 	float a,b,c,disc,x1,x2,realpart,inagpart; 	scanf("%f,%f,%f",&a,&b,&c); 	printf("THE equation"); 	if(fabs(a)<=1e-6) 		printf("is not a quadratic\n"); 	else 	{ 		disc=b*b-4*a*c; 		if(fabs(disc)<=1e-6) 			printf("has two equal  roots :%8.4f\n",-b/(2*a)); 		else if (disc>1e-6) 		{ 			x1=(-b+sqrt(disc))/(2*a); 			x2=(-b-sqrt(disc))/(2*a); 			printf("has distinct real roots:%8.4f and %8.4\n",x1,x2); 		} 		else 		{ 			realpart=-b/(2*a); 			inagpart=sqrt(-disc)/(2*a); 			printf("has complex roots:\n"); 			printf("%8.4f+%8.4fi\n",realpart,inagpart); 			printf("%8.4f-%8.4fi\n",realpart,inagpart); 		} 	} } 没事多看看书 可是我想要的是函数版的啊，不是函数的我也会了[/quote] 把这期中计算部分的代码，封装成函数有困难？[/quote] 我才刚学，原谅我是学渣

引用 2 楼 lilianjie001的回复: #include<math.h> main() { 	float a,b,c,disc,x1,x2,realpart,inagpart; 	scanf("%f,%f,%f",&a,&b,&c); 	printf("THE equation"); 	if(fabs(a)<=1e-6) 		printf("is not a quadratic\n"); 	else 	{ 		disc=b*b-4*a*c; 		if(fabs(disc)<=1e-6) 			printf("has two equal  roots :%8.4f\n",-b/(2*a)); 		else if (disc>1e-6) 		{ 			x1=(-b+sqrt(disc))/(2*a); 			x2=(-b-sqrt(disc))/(2*a); 			printf("has distinct real roots:%8.4f and %8.4\n",x1,x2); 		} 		else 		{ 			realpart=-b/(2*a); 			inagpart=sqrt(-disc)/(2*a); 			printf("has complex roots:\n"); 			printf("%8.4f+%8.4fi\n",realpart,inagpart); 			printf("%8.4f-%8.4fi\n",realpart,inagpart); 		} 	} } 没事多看看书 可是我想要的是函数版的啊，不是函数的我也会了

再牛×的老师也无法代替学生自己领悟和上厕所！


Question: 求修改！！！会输出奇怪的结果

这个struct SIS* input(Student *head) 输入函数存在问题吧 好好读读程序，不是很难的

input中p1指针没有分配内存就直接用了

已经修改 可以正常输入了 不过其他我就没改 提个建议： 变量要记得初始化 特别是局部变量，在最近使用的地方定义                   还有注意逻辑问题，你的代码本来就需要一个头节点作为Head  其他的你自己慢慢琢磨吧  看下 C primer Plus 吧

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

// qwe.cpp : 定义控制台应用程序的入口点。 //  #include "stdafx.h" #include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> #include <time.h>   typedef struct SIS { //结构体的声明 	long StudentID;    //学号 	char Name[20];  //姓名 	char Sex[10];//性别 	int Age;//年龄 	char TOE[30] ;//Time of Enrollment入学日期 	float GPA;//（加权平均） 	char PhoneNo[100]; //电话号码 	char MailingAddress[100];//邮箱 	struct SIS *next;//指向下一个结构体的指针 } Student;  #define LEN sizeof(Student)   /////////////////////声明函数/////////////////////// void wellcome();//欢迎界面 void start();//开始界面 int menu();//菜单 struct SIS* input(Student *head);//输入/插入 struct SIS* del(Student *head);//删除 int search (Student *head);//查找 int ALL(Student *head);//显示全部 ///////////////////////////////////////////////////  void wellcome() { //欢迎界面 	time_t rawtime; 	struct tm * timeinfo; 	time ( &rawtime ); 	timeinfo = localtime ( &rawtime );   	printf("*************************************************\n"); 	printf("*\t\t学生信息管理系统\t\t*\n"); 	printf("*\t\t\t\t\t\t*\n"); 	printf("*\t\t\tLAB 8\t\t\t*\n"); 	printf("*\t\t\t\t\t\t*\n"); 	printf("*\t            莱茵出品\t\t        *\n"); 	printf("*\t\t\t\t\t\t*\n"); 	printf("*\t\t\t\t2.33.ver\t*\n"); 	printf("*\t\t\t\t\t\t*\n"); 	printf("*\t\t\t\t\t\t*\n"); 	printf("*************************************************\n"); 	printf("%s", asctime (timeinfo)); 	printf("Please Press Enter to continue……");  }   void start() { //开始界面 	int a=0; 	int b=0; 	int A=15080121; 	getchar(); 	system("cls"); 	printf("\n\n\n"); 	printf("\t\t学生信息管理系统\n\n\n"); 	printf("\t\t\t2.33.Ver\n\n\n"); 	getchar(); 	system("cls"); /*	printf("\t\t请输入用户名和密码，按下Enter继续\n\n\n"); 	printf("\tAdmin:"); 	scanf("%d",&a); 	printf("\n"); 	printf("\tPassword:"); 	scanf("%d",&b); 	if(a==A&&b==A) { 		getchar(); 		system("cls"); 	} else { 		printf("\t\t\t您没有足够的权限！！！！！\nPlease Press Enter to EXIT……"); 		getchar(); 		exit(0); 	}*/ }  int menu() {//菜单 	int shuru=0; 	printf("\n\n\n"); 	printf("\t\t （1）Create a student list\n"); 	printf("\t\t （2）Insert a student\n");//(to the sorted array or the sorted linked list ) 	printf("\t\t （3）Delete a student\n"); 	printf("\t\t （4）Search a student\n"); 	printf("\t\t （5）Display all students\n"); 	printf("\t\t （6）exit\n"); 	printf("\t\t请选择功能:"); 	scanf("%d",&shuru); 	return shuru;  }      struct SIS* input(Student *head) {//输入、插入 	Student *p1,*p2; 	Student *student=NULL; 	char a = 'y'; 	system("cls");  	if (head==NULL) 	{ 		head =  (Student*) malloc (LEN); 		memset(head, NULL,LEN); 		head->next = NULL; 	}  	printf("\t请按照要求输入\n"); 	while(a=='y'||a=='Y') { 		student = (Student *) malloc (LEN); 		memset(student , 0, LEN); 		student->next=NULL;//尾节点清零   		printf("\tStudentID："); 		scanf("%ld",&student->StudentID); 		printf("\t"); 		printf("Name："); 		scanf("%s",student->Name); 		printf("\t"); 		printf("Sex："); 		scanf("%s",&student->Sex); 		printf("\t"); 		printf("Age："); 		scanf("%d",&student->Age); 		printf("\t"); 		printf("TOE："); 		scanf("%s",&student->TOE); 		printf("\t"); 		printf("GPA："); 		scanf("%f",&student->GPA); 		printf("\t"); 		printf("PhoneNo："); 		scanf("%s",&student->PhoneNo); 		printf("\t"); 		printf("MailingAddress："); 		scanf("%s",&student->MailingAddress); 		printf("\n\n\n\n"); 		 		fflush(stdin); // 		if(head==NULL) head=student; // 		else {  	    	p1=head; 			p2=head; 			while(p1->next!=NULL&&p1->StudentID<student->StudentID) { 				p2=p1; 				p1=p1->next; 			} 			if(p1->StudentID>student->StudentID) 				if(p1==head) { 					student->next=head; 					head=student; 				} else { 					p2->next=student; 					student->next=p1; 				} 			else p1->next=student; /*		}*/ 	 		printf("是否继续添加,输入'y'或'Y'继续\n"); 		a=getchar(); 		fflush(stdin); 	} 	printf("\t\t\t录入成功!\n"); 	free(student); 	return(head); }    struct SIS* del(Student *head) {			//删除学生信息 	Student *p1,*p2; 	int tage = 0; 	long StudentID; 	system("cls"); 	p1=head; 	printf("\n\t\t请输入学号:"); 	scanf("%d",&StudentID); 	if(head==NULL) { 		printf("不存在学生信息!\n"); 		return 0; 	} 	while(p1!=NULL) { 		if(p1->StudentID==StudentID) { 			tage=1; 			if(p1==head)head=head->next; 			else p2->next=p1->next; 			free(p1); 			break; 		} 		p2=p1; 		p1=p1->next; 	} 	if(tage==0) printf("要删除的学生信息不存在!\n"); 	tage=0; 	printf("\t\t\t成功删除息\n"); 	fflush(stdin); //	system("cls");  	return (head); }  int search (Student *head) {	  //查询 	Student *p1; 	Student *student; 	int tage = 0; 	long StudentID;  	system("cls"); 	printf("请输入要查询的学生学号："); 	scanf("%d",&StudentID); 	p1=head; 	if(head==NULL) { 		printf("无学生信息!\n"); 		return 0; 	} else 		while(p1!=NULL) 			if(p1->StudentID==StudentID) { 				tage=1; 				printf("你查找的学生信息如下:\n"); 				printf("\t\tStudentID：%ld\n",p1->StudentID); 				printf("\t\tName：%s\n",p1->Name); 				printf("\t\tSex：%s\n",p1->Sex); 				printf("\t\tAge：%d\n",p1->Age); 				printf("\t\tTOE：%s\n",p1->TOE); 				printf("\t\tGPA：%2f\n",p1->GPA); 				printf("\t\tPhonrNo：%s\n",p1->PhoneNo); 				printf("\t\tMailingAddress：%s\n\n\n",&p1->MailingAddress); 				break; 			}   			else  p1=p1->next; 	if(tage==0)printf("\t\t\t无该学生信息!\n"); 	tage=0; 	fflush(stdin);  	return 0; }  int ALL(Student *head) { //显示全部信息 	Student *p1=NULL; 	p1 = head; 	system("cls"); 	if(head==NULL) { 		printf("无学生信息!\n"); 		return 0; 	} 	while(p1!=NULL) { 		printf("\t\tStudentID：%ld\n",p1->StudentID); 		printf("\t\tName：%s\n",p1->Name); 		printf("\t\tSex：%s\n",p1->Sex); 		printf("\t\tAge：%d\n",p1->Age); 		printf("\t\tTOE：%s\n",p1->TOE); 		printf("\t\tGPA：%2f\n",p1->GPA); 		printf("\t\tPhoneNo：%s\n",p1->PhoneNo); 		printf("\t\tMailingAddress：%s\n\n",p1->MailingAddress); 		p1=p1->next; 	} 	return 0; }    int _tmain(int argc, _TCHAR* argv[]) { 	int choose; 	int x=1; 	Student *head=NULL;     head =  (Student*) malloc (LEN); 	memset(head, NULL,LEN); 	head->next = NULL; 	wellcome(); 	start(); 	while(x) { 		choose=menu(); 		switch(choose) { 			case 1: { 				input(head); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 2: { 				input(head); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 3: { 				del(head); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 4: { 				search(head); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 5: { 				ALL(head); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 6: { 				exit(1); 			}   			default: { 				system("cls"); 				printf("\n\n\n\t\t\t无此功能\n\n\n\n"); 				break; 			} 		}  	}

我勒个去，代码这么长你也不说一下什么情况输出了什么错误结果？


Question: 可以将I2C里读出的数据存放在一个二维数组里吗

改正一下上面的错误加上硬件仿真时  好像获得的数据全是0x00  不对

谢谢啦     这个我改啦  还有一个问题问问你   我可以这样在 LeftDisplay();直接调用这个二维数组吗 加上硬件仿真 感觉不对   麻烦有时间帮我看看  可以吗  再次感谢 下面是部分程序    #include<reg52.h> #define uchar unsigned char  void LeftDisplay();  void  cuncu();	  void   init(); uchar  hanzi[3][32];  void main(void) {        init(); 	 cuncu();	         while(1)              {                      if（k1==0）                     { 	  LeftDisplay();                         }                            } }    uchar cuncu()          //2C04C04里的数据存储到hanzi[3][32]数组里的子函数 {        uchar i,j,p;        p=0;         init();     for(i=0;i<3;i++)  	 {    for(j=0;j<32;j++)    {     hanzi[i][j]=read_add(p);                                 p++;    }  } uchar cuncu() {        uchar i,j,p;        p=0;         init();     for(i=0;i<3;i++)  	 {    for(j=0;j<32;j++)    {     hanzi[i][j]=read_add(p);//这条可以将24C02存储的数据存放到二维数组里吗？                         //然后引用二维数组里的数据，对数据进行操作 ？	         p++;    }  }       void LeftDisplay(void)	//左移,半个字一移 { 	uchar i,j,scan,k; 	for(i=0;i<2;i++)		 	{ 		if(LeftFlag==1)		//K1=0时    该左移标志置1 		{ 			for(k=0;k<speed;k++)	//移动速度 			{ 				scan=0;		//154译码 				if(LeftFlag==1)	//这里同样做处理 				{ 					for(j=0;j<31;j+=2) 					{ 						ST=0; 					                                                              						 					SendByte(hanzi[i+1][j+1]);      这里   我感觉这样直接引用不了这个数组 为什么？					                                                                   						SendByte(hanzi[i+1][j]);               加上硬件仿真时  好像获得的数据全是0xff 不对 						SendByte(hanzi[i][j+1]);             sendByte是发送一个字节的数据子函数 						SendByte(hanzi[i][j]); 						ST=1;	//一个上升沿送数据 						EN=0;	 						P2=scan; 						delay(5); 						EN=1; 						scan++; 					} 				} 				else 				break; 			}

谢谢啦

uchar  hanzi[3][32];


Question: 请问下C语言读取注册表的规则是怎么样的，附图。觉得很奇怪

Getting the System Version The following example uses the GetVersionEx, GetSystemMetrics, and GetNativeSystemInfo functions to determine the version information of the currently running operating system. The code outputs the information to the console.  Relying on version information is not the best way to test for a feature. Instead, refer to the documentation for the feature of interest. For more information on common techniques for feature detection, see Operating System Version.  If you must require a particular operating system, be sure to use it as a minimum supported version, rather than design the test for the one operating system. This way, your detection code will continue to work on future versions of Windows.   #include <windows.h> #include <tchar.h> #include <stdio.h>  #define BUFSIZE 80  typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);  int __cdecl _tmain() {    OSVERSIONINFOEX osvi;    SYSTEM_INFO si;    PGNSI pGNSI;    BOOL bOsVersionInfoEx;     ZeroMemory(&si, sizeof(SYSTEM_INFO));    ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));     // Try calling GetVersionEx using the OSVERSIONINFOEX structure.    // If that fails, try using the OSVERSIONINFO structure.     osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);     if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )    {       osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);       if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) )           return FALSE;    }     // Call GetNativeSystemInfo if supported    // or GetSystemInfo otherwise.     pGNSI = (PGNSI) GetProcAddress(       GetModuleHandle(TEXT("kernel32.dll")),        "GetNativeSystemInfo");    if(NULL != pGNSI)       pGNSI(&si);    else GetSystemInfo(&si);     switch (osvi.dwPlatformId)    {       // Test for the Windows NT product family.        case VER_PLATFORM_WIN32_NT:        // Test for the specific product.        if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 )       {          if( osvi.wProductType == VER_NT_WORKSTATION )              printf ("Windows Vista ");          else printf ("Windows Server \"Longhorn\" " );       }        if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )       {          if( GetSystemMetrics(SM_SERVERR2) )             printf( "Microsoft Windows Server 2003 \"R2\" ");          else if( osvi.wProductType == VER_NT_WORKSTATION &&             si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)          {             printf( "Microsoft Windows XP Professional x64 Edition ");          }          else printf ("Microsoft Windows Server 2003, ");       }        if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )          printf ("Microsoft Windows XP ");        if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )          printf ("Microsoft Windows 2000 ");        if ( osvi.dwMajorVersion <= 4 )          printf ("Microsoft Windows NT ");        // Test for specific product on Windows NT 4.0 SP6 and later.       if( bOsVersionInfoEx )       {          // Test for the workstation type.          if ( osvi.wProductType == VER_NT_WORKSTATION &&               si.wProcessorArchitecture!=PROCESSOR_ARCHITECTURE_AMD64)          {             if( osvi.dwMajorVersion == 4 )                printf ( "Workstation 4.0 " );             else if( osvi.wSuiteMask & VER_SUITE_PERSONAL )                printf ( "Home Edition " );             else printf ( "Professional " );          }           // Test for the server type.          else if ( osvi.wProductType == VER_NT_SERVER ||                     osvi.wProductType == VER_NT_DOMAIN_CONTROLLER )          {             if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==2)             {                if ( si.wProcessorArchitecture ==                     PROCESSOR_ARCHITECTURE_IA64 )                {                    if( osvi.wSuiteMask & VER_SUITE_DATACENTER )                       printf ( "Datacenter Edition "                                "for Itanium-based Systems" );                    else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )                       printf ( "Enterprise Edition "                                "for Itanium-based Systems" );                }                 else if ( si.wProcessorArchitecture ==                          PROCESSOR_ARCHITECTURE_AMD64 )                {                    if( osvi.wSuiteMask & VER_SUITE_DATACENTER )                       printf ( "Datacenter x64 Edition " );                    else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )                       printf ( "Enterprise x64 Edition " );                    else printf( "Standard x64 Edition " );                }                 else                {                    if( osvi.wSuiteMask & VER_SUITE_DATACENTER )                       printf ( "Datacenter Edition " );                    else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )                       printf ( "Enterprise Edition " );                    else if ( osvi.wSuiteMask & VER_SUITE_BLADE )                       printf ( "Web Edition " );                    else printf ( "Standard Edition " );                }             }             else if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==0)             {                if( osvi.wSuiteMask & VER_SUITE_DATACENTER )                   printf ( "Datacenter Server " );                else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )                   printf ( "Advanced Server " );                else printf ( "Server " );             }             else  // Windows NT 4.0              {                if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )                   printf ("Server 4.0, Enterprise Edition " );                else printf ( "Server 4.0 " );             }          }       }       // Test for specific product on Windows NT 4.0 SP5 and earlier       else         {          HKEY hKey;          TCHAR szProductType[BUFSIZE];          DWORD dwBufLen=BUFSIZE*sizeof(TCHAR);          LONG lRet;           lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,             TEXT("SYSTEM\\CurrentControlSet\\Control\\"                  "ProductOptions"), 0, KEY_QUERY_VALUE, &hKey );          if( lRet != ERROR_SUCCESS )             return FALSE;           lRet = RegQueryValueEx( hKey, TEXT("ProductType"),             NULL, NULL, (LPBYTE) szProductType, &dwBufLen);          RegCloseKey( hKey );           if( (lRet != ERROR_SUCCESS) ||              (dwBufLen > BUFSIZE*sizeof(TCHAR)) )             return FALSE;           if ( lstrcmpi( TEXT("WINNT"), szProductType) == 0 )             printf( "Workstation " );          if ( lstrcmpi( TEXT("LANMANNT"), szProductType) == 0 )             printf( "Server " );          if ( lstrcmpi( TEXT("SERVERNT"), szProductType) == 0 )             printf( "Advanced Server " );          printf( "%d.%d ", osvi.dwMajorVersion, osvi.dwMinorVersion );       }        // Display service pack (if any) and build number.        if( osvi.dwMajorVersion == 4 &&            lstrcmpi( osvi.szCSDVersion, TEXT("Service Pack 6") ) == 0 )       {           HKEY hKey;          LONG lRet;           // Test for SP6 versus SP6a.          lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,             TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\"                  "Hotfix\\Q246009"), 0, KEY_QUERY_VALUE, &hKey );          if( lRet == ERROR_SUCCESS )             printf( "Service Pack 6a (Build %d)\n",              osvi.dwBuildNumber & 0xFFFF );                   else // Windows NT 4.0 prior to SP6a          {             _tprintf( TEXT("%s (Build %d)\n"),                osvi.szCSDVersion,                osvi.dwBuildNumber & 0xFFFF);          }           RegCloseKey( hKey );       }       else // not Windows NT 4.0        {          _tprintf( TEXT("%s (Build %d)\n"),             osvi.szCSDVersion,             osvi.dwBuildNumber & 0xFFFF);       }        break;        // Test for the Windows Me/98/95.       case VER_PLATFORM_WIN32_WINDOWS:        if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)       {           printf ("Microsoft Windows 95 ");           if (osvi.szCSDVersion[1]=='C' || osvi.szCSDVersion[1]=='B')              printf("OSR2 " );       }         if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)       {           printf ("Microsoft Windows 98 ");           if ( osvi.szCSDVersion[1]=='A' || osvi.szCSDVersion[1]=='B')              printf("SE " );       }         if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)       {           printf ("Microsoft Windows Millennium Edition\n");       }        break;        case VER_PLATFORM_WIN32s:        printf ("Microsoft Win32s\n");       break;    }    return TRUE;  }

RegOpenKeyEx Function  Opens the specified registry key. Note that key names are not case sensitive.  To perform transacted registry operations on a key, call the RegOpenKeyTransacted function.   LONG WINAPI RegOpenKeyEx(   __in          HKEY hKey,   __in          LPCTSTR lpSubKey,   DWORD ulOptions,   __in          REGSAM samDesired,   __out         PHKEY phkResult );  Parameters hKey  A handle to an open registry key. This handle is returned by the RegCreateKeyEx or RegOpenKeyEx function, or it can be one of the following predefined keys:    HKEY_CLASSES_ROOT  HKEY_CURRENT_USER  HKEY_LOCAL_MACHINE  HKEY_USERS  Windows Me/98/95:  This parameter can also be the following key:   HKEY_DYN_DATA  lpSubKey  The name of the registry subkey to be opened.   Key names are not case sensitive.  If this parameter is NULL or a pointer to an empty string, the function will open a new handle to the key identified by the hKey parameter.  For more information, see Registry Element Size Limits.  ulOptions  This parameter is reserved and must be zero.  samDesired  A mask that specifies the desired access rights to the key. The function fails if the security descriptor of the key does not permit the requested access for the calling process. For more information, see Registry Key Security and Access Rights.  phkResult  A pointer to a variable that receives a handle to the opened key. If the key is not one of the predefined registry keys, call the RegCloseKey function after you have finished using the handle.  Return Value If the function succeeds, the return value is ERROR_SUCCESS.  If the function fails, the return value is a nonzero error code defined in Winerror.h. You can use the FormatMessage function with the FORMAT_MESSAGE_FROM_SYSTEM flag to get a generic description of the error.  Remarks Unlike the RegCreateKeyEx function, the RegOpenKeyEx function does not create the specified key if the key does not exist in the registry.  If your service or application impersonates different users, do not use this function with HKEY_CURRENT_USER. Instead, call the RegOpenCurrentUser function.  A single registry key can be opened only 65534 times. When attempting the 65535th open operation, this function fails with ERROR_NO_SYSTEM_RESOURCES.  Note that operations that access certain registry keys are redirected. For more information, see Registry Virtualization and 32-bit and 64-bit Application Data in the Registry.  Example Code  For an example, see Getting the System Version.  Requirements Client  Requires Windows Vista, Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, or Windows 95.   Server  Requires Windows Server 2008, Windows Server 2003, Windows 2000 Server, or Windows NT Server.   Header  Declared in Winreg.h; include Windows.h.   Library  Use Advapi32.lib.   DLL  Requires Advapi32.dll.     Unicode  Implemented as RegOpenKeyExW (Unicode) and RegOpenKeyExA (ANSI).

在读取前没有对dataSize赋值，所以RegQueryValueEx不知道你传入的buffer的长度，在调用query前，你要把dataSize置为20

我都赋了admin同个键值，为什么读出来会出错呢?


Question: 一道简单的OJ题目  见鬼了  百思不得其解

楼主和你一样，看了半天没看出来，原来没替换也要返回-1，oj很多题其实就是没描述清楚。。醉了

assert(strOutput);  ///如果有可能，加断言 assert(strInput );  ///如果有可能，加断言  if(strOutput == NULL  ){    return -1; } if( strInput == NULL  ){    *strOutput='\0';    return -1; }  因为参数不够，所以最安全的只能是这样了

if( strInput == NULL  ) {    *strOutput = '\0';    return -1; }

输入输出是空返回-1, 没有替换也应该返回-1


Question: 求大神帮我看下为什么用C语言创建不了注册表

引用 6 楼 paschen 的回复:[quote=引用 5 楼 A5435431941 的回复:] 创建的问题解决的，有那个新键了，但键值却读不进，写进去的是乱码。   if(RegCreateKey(HKEY_CURRENT_USER,TEXT("Software\\news"),&hKEY)!=ERROR_SUCCESS) 		 { 			printf("创建注册表失败！\n"); 			system("pause"); 			exit(1); 		 } 			if (RegSetValueEx(hKEY,TEXT("news"), 0, REG_SZ, "abcde", 6) != ERROR_SUCCESS) { 			{ 				printf("错误：无法设置有关的注册表信息"); 			} 			RegCloseKey(hKEY);   这样写对吗？这些参数。  TEXT("abcde")  ?[/quote]  引用 6 楼 paschen 的回复:[quote=引用 5 楼 A5435431941 的回复:] 创建的问题解决的，有那个新键了，但键值却读不进，写进去的是乱码。   if(RegCreateKey(HKEY_CURRENT_USER,TEXT("Software\\news"),&hKEY)!=ERROR_SUCCESS) 		 { 			printf("创建注册表失败！\n"); 			system("pause"); 			exit(1); 		 } 			if (RegSetValueEx(hKEY,TEXT("news"), 0, REG_SZ, "abcde", 6) != ERROR_SUCCESS) { 			{ 				printf("错误：无法设置有关的注册表信息"); 			} 			RegCloseKey(hKEY);   这样写对吗？这些参数。  TEXT("abcde")  ?[/quote]   #include<stdio.h> #include<stdlib.h> #include<string.h> #include<windows.h> int main() { 	HKEY hKEY; 	int i,j; 	char data_set[]="SOFTWARE\\news";   	DWORD dataType;   	DWORD dataSize;  	char content[]="abcde"; 	char data[100] = {0};   	char News[100]; 	memset(News, 0x41, 100);    	if(RegOpenKeyEx(HKEY_CURRENT_USER,TEXT("Software\\news"), NULL, KEY_READ, &hKEY) != ERROR_SUCCESS)        //如果无法打开hKEY,则中止程序的执行   	{   		 if(RegCreateKey(HKEY_CURRENT_USER,TEXT("Software\\news"),&hKEY)!=ERROR_SUCCESS) 		 { 			printf("创建注册表失败！\n"); 			system("pause"); 			exit(1); 		 } 			if (RegSetValueEx(hKEY,TEXT("news"), 0, REG_SZ,(LPBYTE)content, strlen(content)) != ERROR_SUCCESS) { 			{ 				printf("错误：无法设置有关的注册表信息"); 			} 			RegCloseKey(hKEY); 	}   	if(RegOpenKeyEx(HKEY_CURRENT_USER,TEXT("Software\\news"), NULL, KEY_READ, &hKEY) == ERROR_SUCCESS) 	{ 		if((RegQueryValueEx(hKEY, TEXT("news"), NULL, &dataType, (LPBYTE)data, &dataSize ))!= ERROR_SUCCESS)       //如果无法打开hKEY,则中止程序的执行   		{   			printf("Error #RegQueryValueEx !!\n");     		}   	} 	printf("Data Type:%d\n", dataType);   	printf("Data Size:%d\n", dataSize);   	printf("data: ");      	// 因为键值数据每个字符中间都是0x00 = “/0”，so  puts只能输出一个字符。我也是调试才看到的，还以为是API参数错误呢。   	for ( i = 0, j = 0; i < dataSize; i += 2, j++)   	{   		printf("%c", data[i]);   		memcpy(News + j, data + i, 1);   	}   	printf("\n");      	printf("News: %s\n", News);  //   看看News的值      	RegCloseKey(hKEY);        // 程序结束前要关闭已经打开的 hKEY。   	system("pause");   	return 0;   	}  这是我更改的代码 运行后的情况   运行第一次可以显示，但运行后吗，再运行就不能再显示，一直闪退

引用 5 楼 A5435431941 的回复:创建的问题解决的，有那个新键了，但键值却读不进，写进去的是乱码。   if(RegCreateKey(HKEY_CURRENT_USER,TEXT("Software\\news"),&hKEY)!=ERROR_SUCCESS) 		 { 			printf("创建注册表失败！\n"); 			system("pause"); 			exit(1); 		 } 			if (RegSetValueEx(hKEY,TEXT("news"), 0, REG_SZ, "abcde", 6) != ERROR_SUCCESS) { 			{ 				printf("错误：无法设置有关的注册表信息"); 			} 			RegCloseKey(hKEY);   这样写对吗？这些参数。  TEXT("abcde")  ?

引用 2 楼 Bokutake 的回复:要想编辑HKLM部分的注册表的话，你的程序应该以管理员身份运行才可以吧。 右键单击你的.exe文件，选以管理员身份运行。 另外你要确定SOFTWARE\\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\news这个键真的存在。 否则你以READ方式打开会失败的，那种情况下，你需要 以READ/WRITE方式打开SOFTWARE\\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\ 判断是否有news，否则在下面创建news。  在哪个表下不用管理员身份就可运行？

Unicode 程序嘛？Unicode 的需要用 wchat_t 。  VS 写 windows 程序的话，可以直接用 TCHAR ，用 TEXT("string") 表示字符串常量。

我一直显示创建注册表失败，

引用 9 楼 A5435431941 的回复:还有一个问题就是为什么我在明明括号都够了，还是提示少了个括号，所以我在最后的地方加了一个花括号，就没提示了。请问这是什么情况？  在括号匹配的问题上，一般编译器的结果比你自己用眼看的结果要准确。

引用 9 楼 A5435431941 的回复:还有一个问题就是为什么我在明明括号都够了，还是提示少了个括号，所以我在最后的地方加了一个花括号，就没提示了。请问这是什么情况？ 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。


Question: 求助！！！怎么不用全局变量实现这些功能

引用 3 楼 Rhinedusk 的回复:[quote=引用 1 楼 paschen 的回复:] 全局变量只有一个head啊 你把他定义成局部变量，调用函数时，作为参数传递给函数即可void start() { //开始界面 	int a=0; 	int b=0; 	int A=15080121; 	getchar(); 	system("cls"); 	printf("\n\n\n"); 	printf("\t\t学生信息管理系统\n\n\n"); 	printf("\t\t\t2.33.Ver\n\n\n"); 	getchar(); 	system("cls"); /*	printf("\t\t请输入用户名和密码，按下Enter继续\n\n\n"); 	printf("\tAdmin:"); 	scanf("%d",&a); 	printf("\n"); 	printf("\tPassword:"); 	scanf("%d",&b); 	if(a==A&&b==A) { 		getchar(); 		system("cls"); 	} else { 		printf("\t\t\t您没有足够的权限！！！！！\nPlease Press Enter to EXIT……"); 		getchar(); 		exit(0); 	}*/ }  int menu() {//菜单 	int shuru=0; 	printf("\n\n\n"); 	printf("\t\t （1）Create a student list\n"); 	printf("\t\t （2）Insert a student\n");//(to the sorted array or the sorted linked list ) 	printf("\t\t （3）Delete a student\n"); 	printf("\t\t （4）Search a student\n"); 	printf("\t\t （5）Display all students\n"); 	printf("\t\t （6）exit\n"); 	printf("\t\t请选择功能:"); 	scanf("%d",&shuru); 	return shuru;  }      SIS* input() {//输入、插入 	Student *p1,*p2; 	Student *student; 	Student *head=NULL; 	char a = 'y';  	system("cls");  	student = (Student*) malloc (LEN); 	printf("\t请按照要求输入\n"); 	while(a=='y'||a=='Y') { 		p2=p1=head; 		printf("\tStudentID："); 		scanf("%ld",&student->StudentID); 		printf("\t"); 		printf("Name："); 		scanf("%s",student->Name); 		printf("\t"); 		printf("Sex："); 		scanf("%s",&student->Sex); 		printf("\t"); 		printf("Age："); 		scanf("%d",&student->Age); 		printf("\t"); 		printf("TOE："); 		scanf("%s",&student->TOE); 		printf("\t"); 		printf("GPA："); 		scanf("%f",&student->GPA); 		printf("\t"); 		printf("PhoneNo："); 		scanf("%s",&student->PhoneNo); 		printf("\t"); 		printf("MailingAddress："); 		scanf("%s",&student->MailingAddress); 		printf("\n\n\n\n"); 		student->next=NULL; 		fflush(stdin); 		if(head==NULL)head=student; 		else { 			while(p1->StudentID<student->StudentID&&p1->next!=NULL) { 				p2=p1; 				p1=p1->next; 			} 			if(p1->StudentID>student->StudentID) 				if(p1==head) { 					student->next=head; 					head=student; 				} else { 					p2->next=student; 					student->next=p1; 				} 			else p1->next=student; 		} 		student = (Student *) malloc (LEN); 		printf("是否继续添加,输入'y'或'Y'继续\n"); 		a=getchar(); 		fflush(stdin); 	} 	printf("\t\t\t录入成功!\n"); 	free(student); 	return (head); }    SIS* del(Student *head) {			//删除学生信息 	Student *p1,*p2; 	int tage = 0; 	long StudentID; 	system("cls"); 	p1=head; 	printf("\n\t\t请输入学号:"); 	scanf("%d",&StudentID); 	if(head==NULL) { 		printf("不存在学生信息!\n"); 		return 0; 	} 	while(p1!=NULL) { 		if(p1->StudentID==StudentID) { 			tage=1; 			if(p1==head)head=head->next; 			else p2->next=p1->next; 			free(p1); 			break; 		} 		p2=p1; 		p1=p1->next; 	} 	if(tage==0) printf("要删除的学生信息不存在!\n"); 	tage=0; 	printf("\t\t\t成功删除息\n"); 	fflush(stdin); //	system("cls");  	return (head); }  int search (Student *head) {	  //查询 	Student *p1; 	Student *student; 	int tage = 0; 	long StudentID;  	system("cls"); 	printf("请输入要查询的学生学号："); 	scanf("%d",&StudentID); 	p1=head; 	if(head==NULL) { 		printf("无学生信息!\n"); 		return 0; 	} else 		while(p1!=NULL) 			if(p1->StudentID==StudentID) { 				tage=1; 				printf("你查找的学生信息如下:\n"); 				printf("\t\tStudentID：%ld\n",p1->StudentID); 				printf("\t\tName：%s\n",p1->Name); 				printf("\t\tSex：%s\n",p1->Sex); 				printf("\t\tAge：%d\n",p1->Age); 				printf("\t\tTOE：%s\n",p1->TOE); 				printf("\t\tGPA：%2f\n",p1->GPA); 				printf("\t\tPhonrNo：%s\n",p1->PhoneNo); 				printf("\t\tMailingAddress：%s\n\n\n",&p1->MailingAddress); 				break; 			}   			else  p1=p1->next; 	if(tage==0)printf("\t\t\t无该学生信息!\n"); 	tage=0; 	fflush(stdin);  	return 0; }  int ALL(Student *head) { //显示全部信息 	Student *p1; 	p1 = head; 	system("cls"); 	if(head==NULL) { 		printf("无学生信息!\n"); 		return 0; 	} 	while(p1!=NULL) { 		printf("\t\tStudentID：%ld\n",p1->StudentID); 		printf("\t\tName：%s\n",p1->Name); 		printf("\t\tSex：%s\n",p1->Sex); 		printf("\t\tAge：%d\n",p1->Age); 		printf("\t\tTOE：%s\n",p1->TOE); 		printf("\t\tGPA：%2f\n",p1->GPA); 		printf("\t\tPhonrNo：%s\n",p1->PhoneNo); 		printf("\t\tMailingAddress：%s\n\n",p1->MailingAddress); 		p1=p1->next; 	} 	return 0; }    main() { 	int choose; 	int x=1; 	Student *head=NULL;  	wellcome(); 	start(); 	while(x) { 		choose=menu(); 		switch(choose) { 			case 1: { 				input(); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 2: { 				input(); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 3: { 				del(head); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 4: { 				search(head); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 5: { 				ALL(head); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 6: { 				exit(1); 			}   			default: { 				system("cls"); 				printf("\n\n\n\t\t\t无此功能\n\n\n\n"); 				break; 			} 		}  	} }  这样吗？好像传递不出去 [/quote]  如果你要在函数中修改这个指针，那么你应该传指针的指针进去，否则你传入的参数是复制到函数内部的，你在函数内部修改的都是对那个复制品的修改

引用 10楼zhouxiaofeng1021 的回复:又是你呀~~~这个代码 我已经帮你改过了~~~代码写的 ~~~ 输入有问题还是在运行ALL输出的时候会输出别的结果

又是你呀~~~这个代码 我已经帮你改过了~~~代码写的 ~~~ 输入有问题

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

函数多一个参数（指针）就行了  需要修改指针，传指针的指针(C,C++)，或者指针的引用（C++） 不需要修改指针。需要修改对象，传指针（对象地址） 不需要修改对象，传值(C,C++)，const 引用（C++），const 指针(C,C++) 需要修改对象，传指针(C,C++)，传引用（C++）。 指针，可以传递单个数据，也可传递一批数据（数组，链表等）

求助怎么传递参数

引用 4楼动力风暴 的回复:我感觉将head定义成全局变量和作局部变量当入参传递都可以…… 楼主可以试下~~~我想知道怎么传递..传参一直是弱点

全局变量当然也可以，但是全局变量在程序执行过程中不释放，所以占资源，另外变量如果多的话都定义成全局变量容易造成变量名污染

引用 1 楼 paschen 的回复:全局变量只有一个head啊 你把他定义成局部变量，调用函数时，作为参数传递给函数即可void start() { //开始界面 	int a=0; 	int b=0; 	int A=15080121; 	getchar(); 	system("cls"); 	printf("\n\n\n"); 	printf("\t\t学生信息管理系统\n\n\n"); 	printf("\t\t\t2.33.Ver\n\n\n"); 	getchar(); 	system("cls"); /*	printf("\t\t请输入用户名和密码，按下Enter继续\n\n\n"); 	printf("\tAdmin:"); 	scanf("%d",&a); 	printf("\n"); 	printf("\tPassword:"); 	scanf("%d",&b); 	if(a==A&&b==A) { 		getchar(); 		system("cls"); 	} else { 		printf("\t\t\t您没有足够的权限！！！！！\nPlease Press Enter to EXIT……"); 		getchar(); 		exit(0); 	}*/ }  int menu() {//菜单 	int shuru=0; 	printf("\n\n\n"); 	printf("\t\t （1）Create a student list\n"); 	printf("\t\t （2）Insert a student\n");//(to the sorted array or the sorted linked list ) 	printf("\t\t （3）Delete a student\n"); 	printf("\t\t （4）Search a student\n"); 	printf("\t\t （5）Display all students\n"); 	printf("\t\t （6）exit\n"); 	printf("\t\t请选择功能:"); 	scanf("%d",&shuru); 	return shuru;  }      SIS* input() {//输入、插入 	Student *p1,*p2; 	Student *student; 	Student *head=NULL; 	char a = 'y';  	system("cls");  	student = (Student*) malloc (LEN); 	printf("\t请按照要求输入\n"); 	while(a=='y'||a=='Y') { 		p2=p1=head; 		printf("\tStudentID："); 		scanf("%ld",&student->StudentID); 		printf("\t"); 		printf("Name："); 		scanf("%s",student->Name); 		printf("\t"); 		printf("Sex："); 		scanf("%s",&student->Sex); 		printf("\t"); 		printf("Age："); 		scanf("%d",&student->Age); 		printf("\t"); 		printf("TOE："); 		scanf("%s",&student->TOE); 		printf("\t"); 		printf("GPA："); 		scanf("%f",&student->GPA); 		printf("\t"); 		printf("PhoneNo："); 		scanf("%s",&student->PhoneNo); 		printf("\t"); 		printf("MailingAddress："); 		scanf("%s",&student->MailingAddress); 		printf("\n\n\n\n"); 		student->next=NULL; 		fflush(stdin); 		if(head==NULL)head=student; 		else { 			while(p1->StudentID<student->StudentID&&p1->next!=NULL) { 				p2=p1; 				p1=p1->next; 			} 			if(p1->StudentID>student->StudentID) 				if(p1==head) { 					student->next=head; 					head=student; 				} else { 					p2->next=student; 					student->next=p1; 				} 			else p1->next=student; 		} 		student = (Student *) malloc (LEN); 		printf("是否继续添加,输入'y'或'Y'继续\n"); 		a=getchar(); 		fflush(stdin); 	} 	printf("\t\t\t录入成功!\n"); 	free(student); 	return (head); }    SIS* del(Student *head) {			//删除学生信息 	Student *p1,*p2; 	int tage = 0; 	long StudentID; 	system("cls"); 	p1=head; 	printf("\n\t\t请输入学号:"); 	scanf("%d",&StudentID); 	if(head==NULL) { 		printf("不存在学生信息!\n"); 		return 0; 	} 	while(p1!=NULL) { 		if(p1->StudentID==StudentID) { 			tage=1; 			if(p1==head)head=head->next; 			else p2->next=p1->next; 			free(p1); 			break; 		} 		p2=p1; 		p1=p1->next; 	} 	if(tage==0) printf("要删除的学生信息不存在!\n"); 	tage=0; 	printf("\t\t\t成功删除息\n"); 	fflush(stdin); //	system("cls");  	return (head); }  int search (Student *head) {	  //查询 	Student *p1; 	Student *student; 	int tage = 0; 	long StudentID;  	system("cls"); 	printf("请输入要查询的学生学号："); 	scanf("%d",&StudentID); 	p1=head; 	if(head==NULL) { 		printf("无学生信息!\n"); 		return 0; 	} else 		while(p1!=NULL) 			if(p1->StudentID==StudentID) { 				tage=1; 				printf("你查找的学生信息如下:\n"); 				printf("\t\tStudentID：%ld\n",p1->StudentID); 				printf("\t\tName：%s\n",p1->Name); 				printf("\t\tSex：%s\n",p1->Sex); 				printf("\t\tAge：%d\n",p1->Age); 				printf("\t\tTOE：%s\n",p1->TOE); 				printf("\t\tGPA：%2f\n",p1->GPA); 				printf("\t\tPhonrNo：%s\n",p1->PhoneNo); 				printf("\t\tMailingAddress：%s\n\n\n",&p1->MailingAddress); 				break; 			}   			else  p1=p1->next; 	if(tage==0)printf("\t\t\t无该学生信息!\n"); 	tage=0; 	fflush(stdin);  	return 0; }  int ALL(Student *head) { //显示全部信息 	Student *p1; 	p1 = head; 	system("cls"); 	if(head==NULL) { 		printf("无学生信息!\n"); 		return 0; 	} 	while(p1!=NULL) { 		printf("\t\tStudentID：%ld\n",p1->StudentID); 		printf("\t\tName：%s\n",p1->Name); 		printf("\t\tSex：%s\n",p1->Sex); 		printf("\t\tAge：%d\n",p1->Age); 		printf("\t\tTOE：%s\n",p1->TOE); 		printf("\t\tGPA：%2f\n",p1->GPA); 		printf("\t\tPhonrNo：%s\n",p1->PhoneNo); 		printf("\t\tMailingAddress：%s\n\n",p1->MailingAddress); 		p1=p1->next; 	} 	return 0; }    main() { 	int choose; 	int x=1; 	Student *head=NULL;  	wellcome(); 	start(); 	while(x) { 		choose=menu(); 		switch(choose) { 			case 1: { 				input(); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 2: { 				input(); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 3: { 				del(head); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 4: { 				search(head); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 5: { 				ALL(head); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 6: { 				exit(1); 			}   			default: { 				system("cls"); 				printf("\n\n\n\t\t\t无此功能\n\n\n\n"); 				break; 			} 		}  	} }  这样吗？好像传递不出去

函数传参


Question: 堆排序的实现问题，好多错误···求帮忙改正

先把语法基础打好了，就算用别人代码起码也看懂是要作什么啊

引用 2 楼 user-2 的回复:还有  H.r[1]<-->H.r[i];不是C/C++的语法~~~   这个是我根据数据结构书上的算法写的···H.r[1]<-->H.r[i];是我在网上查的，也不知道啥意思···· 求大神指点迷津···· 到底该怎么样把算法是现成代码呢？

还有  H.r[1]<-->H.r[i];不是C/C++的语法~~~

你确定这个代码是你写的？ 有很多语法错误 1有些变量没有定义比如 HeapList中的r数组 2.函数定义与函数使用不一致 比如 int* Heap(HeapList &H) 和	HeapSort(H.r[i],i);不一致


Question: scanf函数输入多个字符串的奇葩问题

引用 10 楼 coleoptile 的回复:[quote=引用 7 楼 zhao4zhong1 的回复:] 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];  赵老师，您好，前面的三点建议都都很好，确实可以避免无谓的错误， 您的最后一个代码段，显式的取字符串的第一个是不是画蛇添足了？ 经测试，scanf传参%c ，如果输入字符串的话，会自动截取字符串的首字母赋值给字符变量， 您这样做是有其他目的吗？[/quote] 我的目的是自动跳过我想读的那个字符前面的极有可能存在的一个或多个由“空格、Tab字符、回车换行字符”组成的空白间隔字符（串）

引用 7 楼 zhao4zhong1 的回复:在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];  赵老师，您好，前面的三点建议都都很好，确实可以避免无谓的错误， 您的最后一个代码段，显式的取字符串的第一个是不是画蛇添足了？ 经测试，scanf传参%c ，如果输入字符串的话，会自动截取字符串的首字母赋值给字符变量， 您这样做是有其他目的吗？

引用 5 楼 lgbxyz 的回复:第二个程序，是因为终端输入字符串\整形 是以空格\tab\回车结束的，所以scanf将空格等作为输入间隔了，忽略了。  第一个程序， 是因为第二个scanf 取到是字符是你输入的空格\tab。因为取字符不像上面说的会有默认的间隔符。  #include <stdio.h> #include <stdlib.h>  int main(void) { 	int c; 	char s1[10]; 	 	scanf("%s%c", s1, &c); //	scanf("%s %c", s1, &c);	//这2个scanf的执行结果是完全不同的 	 	printf("s=%s,c=%d", s1, c); 	system("pause");  	return 0; }  完全赞同“字符不会有间隔符”这句话，间隔符本身就是字符，怎么能间隔开呢， 除非显式说明了，就像你说的这句 scanf("%s %c", s1, &c);	//显式的说明——一空格为分隔符  我刚才有试了下 scanf("%s,%c", s1, &c);	//这样子就可以用','充当分隔符 当然最好的是把字符放前面输入，这样子就不会有任何问题了

引用 4 楼 mydo 的回复:最好发布到C版  不好意思，我对发布规则还不太熟悉，不是发在CSDN > CSDN论坛 > C/C++ > C语言 ，这里吗？

我去 竟然是坟帖，浪费时间。。。

最好发布到C版

大概明白了点，空格、回车、tab本身就是字符，所以说用它们来作为字符串和字符的区分在逻辑上是行不通的

修改了下，增加了一个getchar(),用它吸收空格，结果是实现了，可是还是不能理解空格为什么做不了字符串和字符的分隔符 void main() { 	char c; 	char s[10]; 	scanf("%s", s); 	getchar();            //吸收空格 	scanf("%c",&c); 	printf("s=%s,c=%c", s, c); 	system("pause"); }

在接连输入一个字符串，一个字符的情况下，为什么后面的字符没了？ 看输出结果是把空格传入了字符c（scanf以空格、回车、tab为分隔符），分别以回车、制表符测试也都失败了， 但是分别输入两个字符串却可以，蒙圈了


Question: 定义结构体，输出学生信息。为什么编译时会显示：error:undefine structure 'student'

void stu_input(struct student stu[],const int data);  void stu_output(const struct student stu[],const int data); 写在 struct student  {     int num;     char name[20];     int age;     char sex;     int grd;  }; 之后~~~

把 struct student的结构体定义放在那两个函数申明前面

#include＂stdio.h＂  改成  #include <stdio.h>  就算用引号也要用英文的！ prinf("\nage=");  改成：printf("\nage="); getcahr(); 改成 getchar();

stu_input和stu_output这两个函数的声明要放到结构体定义的后面，因为这两个函数的参数中用到了Student结构体，而此时还没定义，程序编译肯定会出错！


Question: C语言：韩信点兵

韩信点兵，多多益善。

虽然有很多方法可以实现，但是如果可以将效率提高，减少循环，这样的代码无疑更具执行力。学到东西了。。。

#include<stdio.h> /*可以少用几次循环，只需要(i * 3 + a)==(j * 5 + b)== (k * 7 + c)*/ int main() {     int a, b, c;//队伍的排尾     int k;//七人一排排数      int sum;//总人数           scanf("%d%d%d", &a, &b, &c);     for (k = 1; k < 15; k++){     	sum=k * 7 + c;          if ( ( ( sum - a ) % 3 == 0 ) //判断满足 (i * 3 + a)==(j * 5 + b) 		   && ( ( sum - b ) % 5 == 0 ) //判断满足 (i * 3 + a)== (k * 7 + c) 		    ){               printf("%d", sum);                     return 0;          }       }     printf("%d", -1);     return 0; }结果应该差不多吧，有时间要求的，少用点循环总是好的啦~

直接用中国剩余定理可得答案  (70*a+21*b+15*c)%105

既然总数不小于10应该i从4开始，k从2开始。话说确定是只需要一组输入么？


Question: linux 下C编程实现  curl 和libcurl

curl_easy_setopt(pEasyHandle, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/43.0.2357.130 Chrome/43.0.2357.130 Safari/537.36");


Question: 算法课设的两个问题

引用 1 楼 qq373948560 的回复:递归替换问题：编写程序，扩展C/C++源文件中的#include指令(以递归的形式)，请以文件名的内容替换如下面的代码行 这个问题 其实就是遇到#include指令时，将#include 的 内容替换#include  不知道题目有没有说 多次嵌套同一个 头文件的事情  #include“filename”   读取filename 替换 这行就可以撒 百度下代码吧

引用 1 楼 qq373948560的回复:递归替换问题：编写程序，扩展C/C++源文件中的#include指令(以递归的形式)，请以文件名的内容替换如下面的代码行 #include“filename”

二叉排序树问题：设计程序，实现二叉排序树的相关操作。使用二叉链表存储二叉排序树，主要功能有：生成一棵二叉排序树T；计算二叉排序树T的平均查找长度，输出结果；插入元素x，重新计算二叉排序树T的平均查找长度以及统计各结点所在的层次；输入元素x，查找二叉排序树T：若存在含x的结点，则删除该结点；否则输出信息“无x”；判断二叉排序树T是否为平衡二叉树；遍历二叉排序树等；假设二叉排序树中的数据元素为整数，输入时以回车符作为结束标志。


Question: 打印huffman树的函数,谁能解释下吗？看不懂，怎么递归输出的？

这不就是二叉树中续遍历的递归算法吗

二叉树的遍历 http://blog.csdn.net/zhangxiangdavaid/article/details/37115355

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


Question: 求c语言书籍推荐，入门之后该看哪本？

只看书不累；写代码太累！

只是看书是没有用的 需要理论联系实际~~~ 建议你一边写代码一边学 比如网上下载一些开源的代码~~~ c语言的多着呢 看代码过程肯定有很多不懂 这样就需要查资料呀 等等  能力也提高了一些不~~~ 完全看懂了之后 如果这个项目让你做 你该怎么动手 怎么设计 然后 你自己在做一个类似的 如果你能够做出来~~~ 不也有点成就感~~~ 有点意思不··· 只看书 很无趣的~~~

我觉得自己应该要有个方向，然后向着这个方向学习，我的计划是学完C基础，然后再以一本稍微深入的书加强C技能，然后就学widows程序设计，如果有涉及到其他知识就一块学习，入门之后再学习windows核心编程，同样涉及的其他知识一块学习。每学完一门知识的基础，适当的练习或再看一本稍深入的书。这是根据我的方向拟定的大概的学习路线，至于数据结构算法一类的用到再学，因为不知道什么用，没有兴趣就很难找到成就感，学习动力不大。

数据结构和算法没看就不能算是入门，另外，多看一些开源项目的源代码，多动手实践

《深入理解C指针》这本书不错，当当或者亚马逊都有。 《C语言点滴》 《C语言课程设计案例精编》

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

同问啊，求大神指教！

不需要再看C语言的书了，去https://leetcode.com/注册个账号，有很多题，可以选择C语言解答，把难度标记为easy的题全过一遍就算入门了


Question: switch跳过了

来人啊，上我的哈勃望远镜。

引用 2 楼 zxh707wk 的回复:直接贴代码不方便吗 不如拍照上传方便。

直接贴代码不方便吗

看不清啊，楼主把代码贴出来吧~~~


Question: C语言怎么读取注册表的内容，怎么把密码写入注册表？

引用 3 楼 A5435431941 的回复:[quote=引用 1 楼 paschen 的回复:] http://blog.csdn.net/pjz969/article/details/7873553 有没有纯C语言的？[/quote]  一样的，操作注册表都是用WINDOWS API函数，而不是用C++的高级内容

引用 7 楼 pcboyxhy 的回复:[quote=引用 6 楼 A5435431941 的回复:] [quote=引用 5 楼 pcboyxhy 的回复:] 一个config.ini文件就搞定了，不一定需要写到注册表里 能详细帮我讲解下嘛？ [/quote]  直接写文件，不要用注册表[/quote] 如果是自己写在。txt文件的我就会，但我想尝试下写在注册表中的。

引用 6 楼 A5435431941 的回复:[quote=引用 5 楼 pcboyxhy 的回复:] 一个config.ini文件就搞定了，不一定需要写到注册表里 能详细帮我讲解下嘛？ [/quote]  直接写文件，不要用注册表

引用 5 楼 pcboyxhy 的回复:一个config.ini文件就搞定了，不一定需要写到注册表里 能详细帮我讲解下嘛？

一个config.ini文件就搞定了，不一定需要写到注册表里

Registry Functions The following functions are used with the registry:        RegCloseKey   RegConnectRegistry   RegCreateKey   RegCreateKeyEx   RegDeleteKey   RegDeleteValue   RegEnumKey   RegEnumKeyEx   RegEnumValue   RegFlushKey   RegGetKeySecurity   RegLoadKey   RegNotifyChangeKeyValue   RegOpenKey   RegOpenKeyEx   RegQueryInfoKey   RegQueryMultipleValues   RegQueryValue   RegQueryValueEx   RegReplaceKey   RegRestoreKey   RegSaveKey   RegSetKeySecurity   RegSetValue   RegSetValueEx   RegUnLoadKey

操作注册表使用的是windows API，自己在msdn里找

引用 1 楼 paschen 的回复:http://blog.csdn.net/pjz969/article/details/7873553 有没有纯C语言的？

有没有纯C语言的？


Question: 随机产生两个0到100的数，随机产生乘号或除法，乘出来的结果不大于100，否则重新生成

x=rand()%100+1;  y=(rand()%100+1)/x*x; 这个地方我觉得我有点问题 x=rand()%100+1; y= rand()%(100/x +1); 可能会好点呢~~~

这个是什么处理方式，本人只学过c++,不懂

这样可以吧？

产生一个随机数后除以100，如果商小于1，则不要这个随机数，重新生成

产生随机数后加个判断，如果乘积大于100，则不要这个随机数，重新生成

新手请指教，那个随机产生的数差不多都是结果大于100的，如何才能使产生的结果小于100


Question: win32下的 按钮问题

引用 3 楼 zhouxiaofeng1021 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 消息WM_PAINT处理有误。 需要调用setwindospos函数  设置按钮 窗口~~~[/quote]  能具体说说怎么用吗

能具体说说怎么用吗

引用 1 楼 zhao4zhong1 的回复:消息WM_PAINT处理有误。 需要调用setwindospos函数  设置按钮 窗口~~~