Question: c语言，写了个删除集合中相同元素的程序，用的链表，老是内存出问题

#include<stdio.h> #include<stdlib.h> struct node { char code; struct node *next; }; struct node *create(struct node *head) { struct node *p1,*p2; p1=p2=(struct node *)malloc(sizeof(struct node)); scanf("%c",&p1->code); head=NULL; if(p1->code=='#') return head; else { while(p1->code!='#') { if(head==NULL) head=p1; else p2->next=p1; p2=p1; p1=(struct node *)malloc(sizeof(struct node)); scanf("%c",&p1->code); } p2->next=NULL; free(p1); return (head); } } //这是创建链表  struct node* clear(struct node*head) { struct node*p1,*p2,*save; save=p1=p2=(struct node*)malloc(sizeof(struct node)); p1=head; if(head==NULL) { printf("头结点为空！！\n"); return head; } save=p1;//如果不先给save赋值，第一个节点就会出问题 for(;p1->next!=p2;p1=p1->next)//save :delete { p2=p1->next; for(;p2->next!=NULL;save=p2,p2=p2->next) { if(p1->code==p2->code) { save->next=p2->next; p2=p2->next; } } } if(p1->code==p2->code) { p1->next=NULL; } return head; } void print(struct node*head) { 	struct node *p1; 	p1=(struct node*)malloc(sizeof(struct node)); 	p1=head; 	if(head==NULL) 		printf("该链表为空\n"); 	else 	{ 	while(p1->next!=NULL) 	{ 		printf("%c\t",p1->code); 		p1=p1->next; 	} 	printf("%c\t",p1->code);//输出最后一个 	} } int main() { struct node*head_A; head_A=(struct node *)malloc(sizeof(struct node)); printf("请输入A集合的字符\n"); head_A=create(head_A); head_A=clear(head_A); print(head_A); }

把代码嵌在code c/c++中是怎么做到的

把代码嵌在code c/c++中

仅供参考：//带表头结点的单向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> struct NODE {     int          data;     struct NODE *next; } H,*head,*p,*q,*s1,*s2,*s3,*s4,*s; int i,j,k,n,t,m; int main() {     srand(time(NULL));      //填写头节点数据     H.data=-1;     H.next=NULL;     head=&H;      //创建10个节点的单链表     p=head;     for (i=0;i<10;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) return 1;         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         p->next=q;         p=q;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将值为5的结点插入到单链表的第k个结点前     k=3;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) return 1;             q->data=5;             q->next=p->next;             p->next=q;             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //删除第k个节点     k=5;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=p->next;             if (q) {                 p->next=q->next;                 free(q);             }             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //从小到大排序     for (p=head;p!=NULL && p->next!=NULL;p=p->next) {         for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {             if (p->next->data > q->next->data) {                  //交换data //              printf("swap %02d %02d\n",p->next->data,q->next->data); //              t=p->next->data;p->next->data=q->next->data;q->next->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->next->data,q->next->data);                 s1=p->next;                 s2=p->next->next;                 s3=q->next;                 s4=q->next->next;                  if (s2!=s3) {                      p->next=s3;                     s3->next=s2;                      q->next=s1;                     s1->next=s4;                 } else {                      p->next=s3;                     s3->next=s1;                            q=s3;                     s1->next=s4;                 }                  //输出整个单链表 //              s=head->next; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10     m=4;     n=6;     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m+1==k) {             q=p;         }         s=p;         p=p->next;     }     s1=head->next;     head->next=q->next;     s->next=s1;     q->next=NULL;      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head->next;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //18->94->58->17->27->20->43->57->75->78-> //18->94->05->58->17->27->20->43->57->75->78-> //18->94->05->58->27->20->43->57->75->78-> //05->18->20->27->43->57->58->75->78->94-> //43->57->58->75->78->94->05->18->20->27-> //

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


Question: 无法解析的外部符号 _star，_sort，该符号在函数 _main 中被引用

引用 14 楼 william7_138 的回复:[quote=引用 4 楼 qq_27384647 的回复:] [quote=引用 3 楼 william7_138 的回复:] 这是链接错误，你的star和sort函数定义在哪里，你要在定义main函数的文件中定义包含#include这个头文件。  什么include[/quote] 这是一种设计方法吧，比如你创建一个头文件FunDef.h，在里面声明 void  star(void);            void  sort(float score[]);   然后你再创建一个cpp文件FunDef.cpp，在里面写上函数的实现，然后在main函数所在的文件中 #include"FunDef.h" 这种设计便于以后扩展，当然你也可以在main函数所在的文件中定义这两个函数。你的写法是声明，非virtual函数，它的函数调用地址是在编译链接的时候确定的，其实要确定的就是函数的入口地址，但是只有声明没有定义的函数系统是不会分配地址，所以你这里报了链接错误。  [/quote]  看不懂。。。。。。。。。。。。

引用 4 楼 qq_27384647 的回复:[quote=引用 3 楼 william7_138 的回复:] 这是链接错误，你的star和sort函数定义在哪里，你要在定义main函数的文件中定义包含#include这个头文件。  什么include[/quote] 这是一种设计方法吧，比如你创建一个头文件FunDef.h，在里面声明 void  star(void);            void  sort(float score[]);   然后你再创建一个cpp文件FunDef.cpp，在里面写上函数的实现，然后在main函数所在的文件中 #include"FunDef.h" 这种设计便于以后扩展，当然你也可以在main函数所在的文件中定义这两个函数。你的写法是声明，非virtual函数，它的函数调用地址是在编译链接的时候确定的，其实要确定的就是函数的入口地址，但是只有声明没有定义的函数系统是不会分配地址，所以你这里报了链接错误。

引用 12 楼 qq_27384647 的回复:[quote=引用 11 楼 super_miker 的回复:] [quote=引用 10 楼 qq_27384647 的回复:] [quote=引用 7 楼 super_miker 的回复:] [quote=引用 5 楼 qq_27384647 的回复:] [quote=引用 1 楼 super_miker 的回复:] star和sort的定义在哪里？  void  star(void);           //打印星号 void  sort(float score[]);    //从小到大排序 这个不算定义么[/quote]  这是声明，不是定义。 声明是说“有这么一个函数”， 定义是说“这个函数做什么”。[/quote]   那该怎么定义，求教[/quote]  例如这样（当然内容要你自己写）：  void star(){    //此处是你所想要实现的代码 }[/quote]   void  star(void);           void  sort(float score[]); 那你的跟我的有什么区别    [/quote] 我的意思是，你要在里面填上内容。。。

引用 11 楼 super_miker 的回复:[quote=引用 10 楼 qq_27384647 的回复:] [quote=引用 7 楼 super_miker 的回复:] [quote=引用 5 楼 qq_27384647 的回复:] [quote=引用 1 楼 super_miker 的回复:] star和sort的定义在哪里？  void  star(void);           //打印星号 void  sort(float score[]);    //从小到大排序 这个不算定义么[/quote]  这是声明，不是定义。 声明是说“有这么一个函数”， 定义是说“这个函数做什么”。[/quote]   那该怎么定义，求教[/quote]  例如这样（当然内容要你自己写）：  void star(){    //此处是你所想要实现的代码 }[/quote]   void  star(void);           void  sort(float score[]); 那你的跟我的有什么区别

引用 10 楼 qq_27384647 的回复:[quote=引用 7 楼 super_miker 的回复:] [quote=引用 5 楼 qq_27384647 的回复:] [quote=引用 1 楼 super_miker 的回复:] star和sort的定义在哪里？  void  star(void);           //打印星号 void  sort(float score[]);    //从小到大排序 这个不算定义么[/quote]  这是声明，不是定义。 声明是说“有这么一个函数”， 定义是说“这个函数做什么”。[/quote]   那该怎么定义，求教[/quote]  例如这样（当然内容要你自己写）：  void star(){    //此处是你所想要实现的代码 }

引用 7 楼 super_miker 的回复:[quote=引用 5 楼 qq_27384647 的回复:] [quote=引用 1 楼 super_miker 的回复:] star和sort的定义在哪里？  void  star(void);           //打印星号 void  sort(float score[]);    //从小到大排序 这个不算定义么[/quote]  这是声明，不是定义。 声明是说“有这么一个函数”， 定义是说“这个函数做什么”。[/quote]   那该怎么定义，求教

这个链接错误，没有找到函数具体实现。

你的star()和sort()只是声明，就是说我有这两个函数，但是这两个函数要怎么完成你指定的功能却没有说，也就是你没有定义这两个函数

引用 5 楼 qq_27384647 的回复:[quote=引用 1 楼 super_miker 的回复:] star和sort的定义在哪里？  void  star(void);           //打印星号 void  sort(float score[]);    //从小到大排序 这个不算定义么[/quote]  这是声明，不是定义。 声明是说“有这么一个函数”， 定义是说“这个函数做什么”。

star和sort函数 只看到声明 没看到定义

引用 1 楼 super_miker 的回复:star和sort的定义在哪里？  void  star(void);           //打印星号 void  sort(float score[]);    //从小到大排序 这个不算定义么

引用 3 楼 william7_138 的回复:这是链接错误，你的star和sort函数定义在哪里，你要在定义main函数的文件中定义包含#include这个头文件。  什么include

链接库没加，或者你没有实现

star和sort的定义在哪里？


Question: 求两个日期相差天数，求教哪里有错误

有专门的公式，自己写应该闰年那块处理问题比较多

The COleDateTime class handles dates from 1 January 100 – 31 December 9999.

有那么复杂吗？通过C标准函数就可以简单完成 1、将日期转换为距离1970的秒数 2、将两个秒数相减 3、将差值处于一天的秒数  不需要考虑闰年大小月等问题

#include <stdio.h> #include <time.h>  int main(void) {     time_t x, y;     int year, mon, day;     scanf("%d%d%d", &year, &mon, &day);     struct tm a = { 0, 0, 0, day, mon - 1, year - 1900 };     scanf("%d%d%d", &year, &mon, &day);     struct tm b = { 0, 0, 0, day, mon - 1, year - 1900 };     x = mktime(&a);     y = mktime(&b);     if ( x != (time_t)(-1) && y != (time_t)(-1) )     {         double difference = difftime(y, x) / (60 * 60 * 24);         printf("%d days\n", (int)difference);     }     return 0; }

、、、、感谢说明

仅供参考：#include <afxdisp.h> #include <stdio.h> #include <stdlib.h> int main(int argc, TCHAR* argv[]) {     COleDateTime t;     COleDateTimeSpan ts;     CString s,fmt;     int nYear;     int nMonth;     int nDay;     int nHour;     int nMin;     int nSec;     int lDays;     int nHours;     int nMins;     int nSecs;     int i,N;     // initialize MFC and print and error on failure     if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {         printf("Fatal Error: MFC initialization failed\n");         return 1;     }     if (argc<13) {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 2;     }     if (stricmp(argv[12],"SQL")==0) fmt="%Y-%m-%d %H:%M:%S";     else if (stricmp(argv[12],"YYYY")==0) fmt="%Y%m%d %H%M%S";     else if (stricmp(argv[12],"YY")==0) fmt="%y%m%d %H%M%S";     else {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 3;     }     nYear =atoi(argv[ 1]);     nMonth=atoi(argv[ 2]);     nDay  =atoi(argv[ 3]);     nHour =atoi(argv[ 4]);     nMin  =atoi(argv[ 5]);     nSec  =atoi(argv[ 6]);     lDays =atoi(argv[ 7]);     nHours=atoi(argv[ 8]);     nMins =atoi(argv[ 9]);     nSecs =atoi(argv[10]);     N     =atoi(argv[11]);     if (N<=0) {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 4;     }     t=COleDateTime( nYear, nMonth, nDay, nHour, nMin, nSec);     ts=COleDateTimeSpan( lDays, nHours, nMins, nSecs );     for (i=1;i<=N;i++) {         s=t.Format(fmt);         printf("%08d %s\n",i,s);         t=t+ts;     }     return 0; }

我这儿有个例子  #include <stdio.h> #include <stdlib.h> #include <Windows.h>  static int month_of_year [][13] = {     {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},     {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} };  struct Date {     int year;     int mon;     int day; };  BOOL is_leap_year (int year) {     if ((0 == year % 4 && 0 != year % 100) || 0 == year % 400)         return TRUE;     return FALSE; }  BOOL date_early (const struct Date *x, const struct Date *y) {     if (x->year < y->year) {         return TRUE;     } else if (x->year == y->year && x->mon < y->mon) {         return TRUE;     } else if (x->year == y->year && x->mon == y->mon && x->day < y->day) {         return TRUE;     }      return FALSE; }  int date_day_of_year (const struct Date *x) {     int mon, days = 0;      for (mon = 1; mon < x->mon; ++mon) {         days += month_of_year[is_leap_year (x->year)][mon];     }      days += x->day;      return days; }  int date_compare_aux (const struct Date *x, const struct Date *y) {     int days = 0, year;     int xdays = date_day_of_year (x);     int ydays = date_day_of_year (y);      if (x->year == y->year) {         return ydays - xdays;     }      for (year = x->year + 1; year < y->year; ++year) {         days += (is_leap_year (year) ? 366 : 365);     }      if (is_leap_year (x->year)) {         return 366 - xdays + days + ydays;     } else {         return 365 - xdays + days + ydays;     } }  int date_compare (const struct Date *x, const struct Date *y) {     if (date_early (x, y))         return - date_compare_aux (x, y);     return date_compare_aux (y, x); }  int main () {     struct Date x = {2014, 1, 1};     struct Date y = {2012, 1, 1};      printf ("%d\n", date_compare (&x, &y)); }

不良风格，毫无注释

c==c+1; 这样是不会赋值的吧？


Question: linux  EPOLL UDP接收缓冲区 如何清空？

另开一个UDP端口，用来传输需要立即执行的命令。


Question: c语言课上要求我们做一个简单的学生管理系统 我遇到困难  想参考大神的代码：）（要求400行代码以上）

每行0.1分。。。

又一个伸手党。


Question: 请看代码。潜伏几个月，问一个c语言问题，请大神进来!!!

唉  正学JAVA    怀恋当年的C时代

指针那一方面的,大体意思就是四个等价

A{B] *(A+B) *(B+A) B[A] 以上四行等价。

这个函数是用来打印数组的，   //pArr[2] == *(pArr+2) == *(a+2) == a[2]  这段代码的意思是，pArr[2]和*(pArr+2)表达同样的意思，只是两种写法。后面的*(a+2)==a[2]同理。

这不是注释掉的语句吗

首先，编译器对方括号运算符 x [ y ] 的处理是转换成 * ( x + y )，两者表达效果自然是等价的。由于加法满足交换律，顺序颠倒也没问题。 其次，void OutArr(int * pArr, int len)这个函数在main里面调用的语句是OutArr(a, 5); 实参a传递给形参pArr，所以pArr的值等于a，因此在这个函数里： pArr[2] 等价于*(pArr+2)等价于*(a+2)等价于a[2]。

static int x = 1;  static void demo (int a [static 5]) {     static int y = 0;     /* …… */ }

int a[5] = {1,2,3,4,5}; int * pArr = a; // int * pArr = &a[0]; 即: *pArr = a[0] = 1; pArr[2] == *(pArr+2) == *(a+2) == a[2] = 3;

大概就是这么个意思。不是有效代码。  如果当成有效代码。大致相当于一行"true"会直接报错。


Question: 打印pthread_join(pthread_t thread, void** retval)的retval值

引用 5 楼 spider119 的回复:[quote=引用 3 楼 wanguser-4 的回复:] 这个取决于你的线程函数返回什么样的值，如果返回int *，那你这么用是对的：LOGD("Read thread exit code = %d\n",*((int*)err_code));，否则是错的，如果返回的是int值，比如-1，那你把-1转换成int *，再对这个-1指针解引用，肯定coredump。  返回值是int， 但是这个err_code是 void* 类型啊， 不是应该先转（int*）err_code ， 再解引用取值么？[/quote]  我也是这里不懂，有哪位大侠能指导指导吗？

《牛肉干》 C语言上机课，某女同学偷偷吃起牛肉干。 有一粒牛肉干掉到了键盘上，卡在7和8键之间。 女同学就在键盘上抠啊、抠啊、抠啊…… 程序里一行代码变成这个样子： int *pa=&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&a; 后来的结局是 ————程序顺利通过编译，运行结果正确！

***(int ****)err_code

引用 3 楼 wanguser-4 的回复:这个取决于你的线程函数返回什么样的值，如果返回int *，那你这么用是对的：LOGD("Read thread exit code = %d\n",*((int*)err_code));，否则是错的，如果返回的是int值，比如-1，那你把-1转换成int *，再对这个-1指针解引用，肯定coredump。  返回值是int， 但是这个err_code是 void* 类型啊， 不是应该先转（int*）err_code ， 再解引用取值么？

引用 2 楼 spider119 的回复:[quote=引用 1 楼 ren0065 的回复:] 逻辑是一样一样的  逻辑如何一样？ [/quote] 都是将返回值作为整型打印出来.

引用 1 楼 ren0065 的回复:逻辑是一样一样的  逻辑如何一样？

逻辑是一样一样的


Question: 怎样递归实现一元钱的兑换方案

引用 1 楼 zhao4zhong1 的回复:仅供参考：//求从Begin到End的正整数中挑出任意个数使其总和为Sum的所有方案 #include <stdio.h> int Begin,End,Sum; int j; int o[1000]; long n; void combsum(int b,int e,int s,int d) {     int i;      if (e>s) e=s;     for (i=e;i>=b;i--) {         if ((i+b)*(i-b+1)/2<s) break;         o[d]=i;         if (s-i<=0) {             n++;             printf("%8ld:",n);             for (j=0;j<=d;j++) printf("%d ",o[j]);             printf("\n");         } else {             if (d+1<1000) combsum(b,i-1,s-i,d+1);             else {                 printf("Error:Too deep.\n");                 return;             }         }     } } int main() {     printf("Input Begin,End,Sum:");fflush(stdout);     scanf("%d,%d,%d",&Begin,&End,&Sum);     n=0L;     combsum(Begin,End,Sum,0);     printf("Total:%ld\n",n);     return 0; }  “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出 #include <stdio.h> int list[256]; void split(int n , int m = 0) { 	int i; 	if(n == 0) 	{ 		for(i = 0 ; i < m ; ++i) 			printf("%d " ,list[i]);  		printf("\n"); 		return ; 	}  	for(i = n ; i > 0 ; --i) 	{ 		if(m == 0 || i <= list[m-1]) 		{ 			list[m] = i; 			split(n-i , m+1); 		} 	} }  int main() { 	int n; 	while(~scanf("%d" , &n)) 	{ 		split(n); 	} 	return 0; }

没看明白题目意思。

引用 2 楼 zhangxiangDavaid 的回复:比一元小的钱有哪些？  1角 2角 5角

您连问题是啥都没说清楚……怕了你了……

比一元小的钱有哪些？


Question: 新人求助，怎样读取一个大小不确定的结构体数据

结构体大小肯定是定的，就算用了UNION，写个CASE也就几种情况。要什么数据就访问相应的成员就完了。结构体大小还能变，除非你在堆中分配，那么你怎么分配就怎么读，一个小小的结构体哪来什么变化

WORD2SHORT	stProgNo[ MAX_NO_OF_FAVOR ] = {0} for(int i=0;i<100;++i) {     if(stProgNo[i] != 0)     {         //ProgNo_Valid_No有效长度为i+1     } } 这种原理？

解决方法。 实话讲，我不知道sdx文件有什么编辑规范，我这里只能认为是一个txt文本。文本中存着该结构体，所有数据有特定分隔符，比如空格、“，”等。  我的解决方法是，倒着读，先读到长度，再确定数组。  ===================================================================================== 如果sdx有什么其他规范，不想倒着读的话，我的一个思路是： WORD2SHORT的一个对象占32位，sNoOfTVFavor占16位，以此做判断依据，一直读结构体，直到读到一个16位的数为止。

为了大家能看的明白。我重新整理下LZ的问题：  背景： 1、有结构体FAVOR_LIST，具体看LZ提问。 2、该结构体有成员WORD2SHORT	stProgNo[ MAX_NO_OF_FAVOR ]，该成员大小确定，为100！！！！ 3、stProgNo成员的有效长度ProgNo_Valid_No不确定，即100个stProgNo中，可能只有前30个值有效，后70个为空。 4、上面的有效长度ProgNo_Valid_No由结构体FAVOR_LIST的两个成员决定：ProgNo_Valid_No = sNoOfTVFavor+sNoOfRadioFavor  问题： 有一个sdx文件，按照该结构体的格式存放数据，由于sNoOfTVFavor、sNoOfRadioFavor未知，导致stProgNo长度未知，进而导致无法确定一次读取该结构体的大小。

引用 6 楼 OMG_style2012 的回复:MAX_NO_OF_FAVOR是一个宏定义，是一个常数100，是确定的，问题是这个数组的是不确定的  既然宏值确定，整个结构体就确定，只是你填回数据的时候，数组有些单元是空的

结构体内存对齐，就可以用sizeof了 使用#pragma pack(1) 按字节对齐内存，不同的编译器可能使用的方法不同

引用 22 楼 liukeyong2110 的回复:问问题需要有个规范 你没描述这个结构体的具体定义：MAX_NO_OF_FAVOR 是宏，又是sNoOfTVFavor+sNoOfRadioFavor。在存之前，这个结构体时怎么定义和使用的。 你没描述清楚这个结构体的存储形式：存储方式，存储算法或代码。 你没描述清楚这个文件中结构体的存储方式：文件中就是有几个结构体，这很不明确，它们是一起存的？还是分开存的？总之，问题描述的太玄乎了

用事实说话，焦点访谈。 用代码说话，真程序员。

设计协议的时候遵守TLV(type length value)原则。

写数据的程序太不负责了，应该在写的时候做好序列化，读的时候反序列化，这样才能保证数据的完整性。

让结构体确定好吗，这个是最终办法

建议LZ再好好学学C语言里关于数组的部分, 注意别看谭浩强

WORD2SHORT stProgNo[ MAX_NO_OF_FAVOR ]这个数据大小是确定的。 整个结构体所占用的空间字节数是确定的。 你说的不确定的意思应该是说数组中实际可能存的有效的数据的个数不确定。

楼主不妨举两个实际用到的具体的该结构体数据，且其大小不一样，让我们大家来看看。

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

引用 1 楼 zhao4zhong1 的回复:VS IDE中，在不明白的符号上点鼠标右键，选转到定义。 引用 2 楼 OMG_style2012 的回复:看清楚我问的问题好么 VS IDE中，在不明白的符号MAX_NO_OF_FAVOR和WORD2SHORT上点鼠标右键，选转到定义。

嗯，不是怎么明白，学习下。晚安

楼主问题没有描述清楚吧 MAX_NO_OF_FAVOR既然是宏定义那么stProgNo的大小也就固定了，结构体大小就已经定了，按照结构体的字节读取就行了。楼主说“问题是这个数组的是不确定的”这不是相矛盾了？ 除非是文件中结构体存储时MAX_NO_OF_FAVOR并不是100而可能是其他值

WORD2SHORT	stProgNo[ MAX_NO_OF_FAVOR ];这个数组的实际大小是不确定的


Question: 错误	1	fatal error C1083: 无法打开包括文件:“stdafx.h”: No such file or directory

调整代码：  #include <math.h> #include <memory.h> #include <stdlib.h> #define EPS 0.000001 //filter函数 void filter(const double* x, double* y, int xlen, double* a, double* b, int nfilt, double* zi)//nfilt为系数数组长度 { 	double tmp; 	int i, j;  	//normalization 	if ((*a - 1.0>EPS) || (*a - 1.0<-EPS))  	{ 		tmp = *a; 		for (i = 0; i<nfilt; i++)  		{ 			b[i] /= tmp; 			a[i] /= tmp; 		} 	}  	memset(y, 0, xlen*sizeof(double));//将y清零，以双浮点为单位  	a[0] = 0.0; 	for (i = 0; i<xlen; i++)  	{ 		for (j = 0; i >= j&&j<nfilt; j++)  		{ 			y[i] += (b[j] * x[i - j] - a[j] * y[i - j]); 		} 		if (zi&&i<nfilt - 1) y[i] += zi[i]; 	} 	a[0] = 1.0; } //矩阵乘法 void trmul(double *a, double *b, double *c, int m, int n, int k)//矩阵乘法  m为a的行数，n为a的列数数，k为b的行数，第一个矩阵列数必须要和第二个矩阵的行数相同 { 	int i, j, l, u; 	for (i = 0; i <= m - 1; i++) 		for (j = 0; j <= k - 1; j++) 		{ 			u = i*k + j; c[u] = 0.0; 			for (l = 0; l <= n - 1; l++) 				c[u] = c[u] + a[i*n + l] * b[l*k + j]; 		} 	return; }  //求逆矩阵，当返回值为0时成功，a变为逆矩阵 int rinv(double *a, int n)//逆矩阵 { 	int *is, *js, i, j, k, l, u, v; 	double d, p; 	is = (int *)malloc(n*sizeof(int)); 	js = (int *)malloc(n*sizeof(int)); 	for (k = 0; k <= n - 1; k++) 	{ 		d = 0.0; 		for (i = k; i <= n - 1; i++) 			for (j = k; j <= n - 1; j++) 			{ 				l = i*n + j; p = fabs(a[l]); 				if (p>d) { d = p; is[k] = i; js[k] = j; } 			} 		if (d + 1.0 == 1.0) 		{ 			free(is); free(js); printf("err**not invn"); 			return(0); 		} 		if (is[k] != k) 			for (j = 0; j <= n - 1; j++) 			{ 				u = k*n + j; v = is[k] * n + j; 				p = a[u]; a[u] = a[v]; a[v] = p; 			} 		if (js[k] != k) 			for (i = 0; i <= n - 1; i++) 			{ 				u = i*n + k; v = i*n + js[k]; 				p = a[u]; a[u] = a[v]; a[v] = p; 			} 		l = k*n + k; 		a[l] = 1.0 / a[l]; 		for (j = 0; j <= n - 1; j++) 			if (j != k) 			{ 				u = k*n + j; a[u] = a[u] * a[l]; 			} 		for (i = 0; i <= n - 1; i++) 			if (i != k) 				for (j = 0; j <= n - 1; j++) 					if (j != k) 					{ 						u = i*n + j; 						a[u] = a[u] - a[i*n + k] * a[k*n + j]; 					} 		for (i = 0; i <= n - 1; i++) 			if (i != k) 			{ 				u = i*n + k; a[u] = -a[u] * a[l]; 			} 	} 	for (k = n - 1; k >= 0; k--) 	{ 		if (js[k] != k) 			for (j = 0; j <= n - 1; j++) 			{ 				u = k*n + j; v = js[k] * n + j; 				p = a[u]; a[u] = a[v]; a[v] = p; 			} 		if (is[k] != k) 			for (i = 0; i <= n - 1; i++) 			{ 				u = i*n + k; v = i*n + is[k]; 				p = a[u]; a[u] = a[v]; a[v] = p; 			} 	} 	free(is); free(js); 	return(1); }  //filtfilt函数 int filtfilt(double* x, double* y, int xlen, double* a, double* b, int nfilt) { 	int nfact; 	int tlen;    //length of tx 	int i; 	double *tx, *tx1, *p, *t, *end; 	double *sp, *tvec, *zi; 	double tmp, tmp1;  	nfact = nfilt - 1;    //3*nfact: length of edge transients  	if (xlen <= 3 * nfact || nfilt<2) return -1; 	//too short input x or a,b 	//Extrapolate beginning and end of data sequence using a "reflection 	//method". Slopes of original and extrapolated sequences match at 	//the end points. 	//This reduces end effects. 	tlen = 6 * nfact + xlen; 	tx = (double *)malloc(tlen*sizeof(double)); 	tx1 = (double *)malloc(tlen*sizeof(double));  	sp = (double *)malloc(sizeof(double) * nfact * nfact); 	tvec = (double *)malloc(sizeof(double) * nfact); 	zi = (double *)malloc(sizeof(double) * nfact);  	if (!tx || !tx1 || !sp || !tvec || !zi) { 		free(tx); 		free(tx1); 		free(sp); 		free(tvec); 		free(zi); 		return 1; 	}  	tmp = x[0]; 	for (p = x + 3 * nfact, t = tx; p>x; --p, ++t) *t = 2.0*tmp - *p; 	for (end = x + xlen; p<end; ++p, ++t) *t = *p; 	tmp = x[xlen - 1]; 	for (end = tx + tlen, p -= 2; t<end; --p, ++t) *t = 2.0*tmp - *p; 	//now tx is ok.  	end = sp + nfact*nfact; 	p = sp; 	while (p<end) *p++ = 0.0L; //clear sp 	sp[0] = 1.0 + a[1]; 	for (i = 1; i<nfact; i++) { 		sp[i*nfact] = a[i + 1]; 		sp[i*nfact + i] = 1.0L; 		sp[(i - 1)*nfact + i] = -1.0L; 	}  	for (i = 0; i<nfact; i++) { 		tvec[i] = b[i + 1] - a[i + 1] * b[0]; 	}  	if (rinv(sp, nfact)) { 		free(zi); 		zi = NULL; 	} 	else { 		trmul(sp, tvec, zi, nfact, nfact, 1); 	}//zi is ok  	free(sp); free(tvec);  	//filtering tx, save it in tx1 	tmp1 = tx[0]; 	if (zi) 		for (p = zi, end = zi + nfact; p<end;) *(p++) *= tmp1; 	filter(tx, tx1, tlen, a, b, nfilt, zi);  	//reverse tx1 	for (p = tx1, end = tx1 + tlen - 1; p<end; p++, end--) { 		tmp = *p; 		*p = *end; 		*end = tmp; 	}  	//filter again 	tmp1 = (*tx1) / tmp1; 	if (zi) 		for (p = zi, end = zi + nfact; p<end;) *(p++) *= tmp1; 	filter(tx1, tx, tlen, a, b, nfilt, zi);  	//reverse to y 	end = y + xlen; 	p = tx + 3 * nfact + xlen - 1; 	while (y<end) { 		*y++ = *p--; 	}  	free(zi); 	free(tx); 	free(tx1);  	return 0; }  int main(int argc, char* argv[]) { 	double* x = malloc(sizeof(double) * 8); 	double* y = malloc(sizeof(double) * 8); 	double* a = malloc(sizeof(double) * 3); 	double* b = malloc(sizeof(double) * 3);  	x[0] = 1.0; 	x[1] = 2.0; 	x[2] = 3.0; 	x[3] = 4.0; 	x[4] = 5.0; 	x[5] = 6.0; 	x[6] = 7.0; 	x[7] = 8.0; 	a[0] = 1.0; 	a[1] = 2.0; 	a[2] = 3.0;  	b[0] = 4.0; 	b[1] = 5.0; 	b[2] = 6.0;  	int nRet = filtfilt(x, y, 8, a, b, 3);  	for (int i = 0; i<8; i++) 	{ 		printf("%fn", y[i]); 	} 	return 0; }

求助啊，我的邮箱是623702082@qq.com 刚学的菜鸟遇到问题


Question: 求各位朋友帮忙纠错！！！

仅供参考：#include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //

*((double*)Pgr+128*o+ww)=j;  你输入的已经是一个指针的指针（即数组的数组），而不是一个单纯的数组。 用Pgr[o][ww]=j就好。。。

引用 1 楼 user-3 的回复:少了一种边界情况完全不明白- -，能否把改过的代码贴一下？不胜感激

少了一种边界情况


Question: C++和C语言在应用领域上有哪些不同？

引用 17 楼 vnvlyp 的回复:[quote=引用 9 楼 zhao4zhong1 的回复:] 记不得哪位C++大牛在哪本学习C++的书的前言里面说过 “用C语言1000行源码能完成的工作千万不要用C++重写！” 这是个什么道理。。能不能用C写，需要多少行代码和用C++去写有什么关系？[/quote] 因为为了显摆自己高大上，干这种傻事的码农多了去了。 但他们不知道自己违背了C++语言诞生的初衷。

引用 9 楼 zhao4zhong1 的回复:记不得哪位C++大牛在哪本学习C++的书的前言里面说过 “用C语言1000行源码能完成的工作千万不要用C++重写！” 这是个什么道理。。能不能用C写，需要多少行代码和用C++去写有什么关系？

引用 9 楼 zhao4zhong1 的回复:记不得哪位C++大牛在哪本学习C++的书的前言里面说过 “用C语言1000行源码能完成的工作千万不要用C++重写！”  C语言和C++应该都是对汇编语言做了翻译吧，为什么效率上还有区别呢？ 因为编译器技术更高明还是有些库只有C语言有而C++没有。

引用 8 楼 zhao4zhong1 的回复:Linux不是大型应用程序！？  我说的应用程序指的是在操作系统上的程序，例如以前的VC6.0，现在点奈特和JAVA开发出来的东西。 开发操作系统用的工具可能并不能或者不适合用来开发桌面程序。 不过我想问下Linux的界面是用什么写的？这套东西有没有应用到开发桌面程序上？

引用 10 楼 Raffin 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] Linux不是大型应用程序！？  我说的应用程序指的是在操作系统上的程序，例如以前的VC6.0，现在点奈特和JAVA开发出来的东西。 开发操作系统用的工具可能并不能或者不适合用来开发桌面程序。 不过我想问下Linux的界面是用什么写的？这套东西有没有应用到开发桌面程序上？[/quote] gnome，基于GDK，c语言 KDE，基于Qt，C++语言

引用 11 楼 Raffin 的回复:[quote=引用 9 楼 zhao4zhong1 的回复:] 记不得哪位C++大牛在哪本学习C++的书的前言里面说过 “用C语言1000行源码能完成的工作千万不要用C++重写！”  C语言和C++应该都是对汇编语言做了翻译吧，为什么效率上还有区别呢？ 因为编译器技术更高明还是有些库只有C语言有而C++没有。[/quote] 无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

Wolfenstein 3D Doom Quake Photo Shop 1.0 …… 不是大型应用程序？！

不能说C++不能开发驱动，起码有些系统上是可以的。

Linux不是大型应用程序！？

C本身的实现 依赖操作系统较少，所以开发操作系统一类程序时会偏爱C...（由汇编插写）

我所知道的： 类unix系统(linux/freebsd...)都是c开发的,够大了吧， 因此c可以开发大型系统。 驱动都是c加汇编开发的 大部分服务器程序c 网络核心设备（路由器，交换机，防火墙）大部分代码c开发的，用户界面可能用其他语言。 大部分的嵌入式系统c开发的。

一学姐（研究生）的毕设，做一个智能路灯控制系统。上位机用c++开发，下位机用c开发

c语言在底层开发用的比较多，我之前参与的嵌入式项目底端程序大部分都是用c语言（少量的汇编）； 个人觉得在c++高端程序用的比较多，我之前参与嵌入式项目高端程序一般用c#、c++实现。

服务器都是UNIX-like系统！

现在web应用领域基本java一家独大 c++，据我所知也没web服务器程序 那c++开发驱动是因为没有开发环境比如sdk的关系还是本身不适合开发驱动？

C的代码效率最高。当然是理论上的，如果你非要拿一个3三流C代码和一个一流Java代码比，我也没办法。 这个效率指的是两方面：1、代码执行效率，就是时间，相同功能，C的可跑的更快；2、编译效率，转成机器码，C的更简短。  但是C的开发效率比较低，差不多是除汇编外最低的了吧。由于代码效率的追求，导致C无法形成很统一的成熟开发框架。  以上特性决定了：C在追求效率的开发中占主流，比如驱动类、MCU开发等；C++牺牲了一定效率，在大型应用程序开发上占主流。  当然都是相对的。C的竞争对手只有汇编，C++则有JAVA、IOS、OC……一大把。


Question: 在vc环境下,用dir命令后，显示的文件目录,怎么保存?保存到字符串中还是什么?以及怎么保存

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……

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

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

引用 6 楼 u010933820 的回复:[quote=引用 1 楼 user-2 的回复:]  #include<stdio.h> #include<string.h> // 运行的时候不要加参数 int main(int argc,char** argv) { 	if(1==argc) // 无参数时 		system("dir /b | t.exe d"); // 这里的t.exe为此程序名，后加参数d。使用管道符号“|”后，dir的标准输出会作为t.exe的标准输入 	else if(2==argc) 	{ 		if(!strcmp(argv[1],"d")) // 有参数d时 		{ 			char filename[260]; 			int i=0; 			while(gets(filename)) // 用gets得到dir的每一行输出 				printf("%d:%s\n",++i,filename); 		} 	} 	return 0; }  非常感谢你的回答！！太感谢了！ 可是我太笨，没看懂●rz 那个，if(1==argc)是什么意思？2==argc呢？运行不加参数是什么意思 还有这个是什么功能system("dir /b | t.exe d"); 我想把如下图的目录存起来，请问怎么做[/quote] 如果只是保存目录的话建议你直接在cmd里输入 dir > x.txt 就可以保存到x.txt这个文本文件里。 > 是一种重定向符号，表示将其左侧命令的输出保存到右侧的文件或设备里，具体看3楼就可以了。  argc、argv与命令行参数有关，比如直接在cmd里输入“dir”得到的是你图片里的内容，如果输入“dir /b”，输出就只有文件名了，输入“dir /?”可以查看dir的帮助信息，这里的/b、/?都是命令行参数，它们加在程序名之后，用空格与程序名分开。 1==argc表示没有命令行参数，就像直接输入“dir”一样。 2==argc表示有一个命令行参数，输入“dir /?”一样。 if(!strcmp(argv[1],"d")) 表示这个命令行参数是“d” system("dir /b | t.exe d");，system是调用系统命令，与在cmd里直接输入命令的效果一样。“|”是管道符，表示前者的输出作为后者的输入，详细解释见3楼。

引用 1 楼 user-2 的回复: #include<stdio.h> #include<string.h> // 运行的时候不要加参数 int main(int argc,char** argv) { 	if(1==argc) // 无参数时 		system("dir /b | t.exe d"); // 这里的t.exe为此程序名，后加参数d。使用管道符号“|”后，dir的标准输出会作为t.exe的标准输入 	else if(2==argc) 	{ 		if(!strcmp(argv[1],"d")) // 有参数d时 		{ 			char filename[260]; 			int i=0; 			while(gets(filename)) // 用gets得到dir的每一行输出 				printf("%d:%s\n",++i,filename); 		} 	} 	return 0; }  非常感谢你的回答！！太感谢了！ 可是我太笨，没看懂●rz 那个，if(1==argc)是什么意思？2==argc呢？运行不加参数是什么意思 还有这个是什么功能system("dir /b | t.exe d"); 我想把如下图的目录存起来，请问怎么做

引用 楼主 u010933820 的回复:有代码例子更好，没有的话请讲一下思路，步骤什么的（我是编程白痴。。。） 非常感谢你的回答！！太感谢了！ 可是我太笨，没看懂●rz 那个，if(1==argc)是什么意思？2==argc呢？运行不加参数是什么意思 还有这个是什么功能system("dir /b | t.exe d"); 我想把如下图的目录存起来，请问怎么做


Question: C语言字符串替换。。。。

谢谢回答。。。。

/需要转义。

C++ Character Constants Character constants are one or more members of the “source character set,” the character set in which a program is written, surrounded by single quotation marks ('). They are used to represent characters in the “execution character set,” the character set on the machine where the program executes.  Microsoft Specific   For Microsoft C++, the source and execution character sets are both ASCII.  END Microsoft Specific  There are three kinds of character constants:   Normal character constants   Multicharacter constants   Wide-character constants  Note   Use wide-character constants in place of multicharacter constants to ensure portability.  Character constants are specified as one or more characters enclosed in single quotation marks. For example:  char ch = 'x';          // Specify normal character constant. int mbch = 'ab';        // Specify system-dependent                         //  multicharacter constant. wchar_t wcch = L'ab';   // Specify wide-character constant.  Note that mbch is of type int. If it were declared as type char, the second byte would not be retained. A multicharacter constant has four meaningful characters; specifying more than four generates an error message.  Syntax  character-constant :  'c-char-sequence' L'c-char-sequence'  c-char-sequence :  c-char c-char-sequence c-char  c-char :  any member of the source character set except the single quotation mark ('), backslash (\), or newline character escape-sequence  escape-sequence :  simple-escape-sequence octal-escape-sequence hexadecimal-escape-sequence  simple-escape-sequence : one of  \' \" \? \\ \a \b \f \n \r \t \v  octal-escape-sequence :  \octal-digit \octal-digit octal-digit \octal-digit octal-digit octal-digit  hexadecimal-escape-sequence :  \xhexadecimal-digit hexadecimal-escape-sequence hexadecimal-digit  Microsoft C++ supports normal, multicharacter, and wide-character constants. Use wide-character constants to specify members of the extended execution character set (for example, to support an international application). Normal character constants have type char, multicharacter constants have type int, and wide-character constants have type wchar_t. (The type wchar_t is defined in the standard include files STDDEF.H, STDLIB.H, and STRING.H. The wide-character functions, however, are prototyped only in STDLIB.H.)  The only difference in specification between normal and wide-character constants is that wide-character constants are preceded by the letter L. For example:  char schar = 'x';               // Normal character constant wchar_t wchar = L'\x81\x19';    // Wide-character constant  Table 1.2 shows reserved or nongraphic characters that are system dependent or not allowed within character constants. These characters should be represented with escape sequences.  Table 1.2   C++ Reserved or Nongraphic Characters  Character ASCII  Representation ASCII  Value Escape Sequence  Newline NL (LF) 10 or 0x0a \n  Horizontal tab HT 9 \t  Vertical tab VT 11 or 0x0b \v  Backspace BS 8 \b  Carriage return CR 13 or 0x0d \r  Formfeed FF 12 or 0x0c \f  Alert BEL 7 \a  Backslash \ 92 or 0x5c \\  Question mark ? 63 or 0x3f \?  Single quotation mark ' 39 or 0x27 \'  Double quotation mark " 34 or 0x22 \"  Octal number ooo — \ooo  Hexadecimal number hhh — \xhhh  Null character NUL 0 \0    If the character following the backslash does not specify a legal escape sequence, the result is implementation defined. In Microsoft C++, the character following the backslash is taken literally, as though the escape were not present, and a level 1 warning (“unrecognized character escape sequence”) is issued.  Octal escape sequences, specified in the form \ooo, consist of a backslash and one, two, or three octal characters. Hexadecimal escape sequences, specified in the form \xhhh, consist of the characters \x followed by a sequence of hexadecimal digits. Unlike octal escape constants, there is no limit on the number of hexadecimal digits in an escape sequence.  Octal escape sequences are terminated by the first character that is not an octal digit, or when three characters are seen. For example:  wchar_t och = L'\076a';  // Sequence terminates at a char    ch = '\233';     // Sequence terminates after 3 characters  Similarly, hexadecimal escape sequences terminate at the first character that is not a hexadecimal digit. Because hexadecimal digits include the letters a through f (and A through F), make sure the escape sequence terminates at the intended digit.  Because the single quotation mark (') encloses character constants, use the escape sequence \' to represent enclosed single quotation marks. The double quotation mark (") can be represented without an escape sequence. The backslash character (\) is a line-continuation character when placed at the end of a line. If you want a backslash character to appear within a character constant, you must type two backslashes in a row (\\). (SeePhases of Translation in the Preprocessor Reference for more information about line continuation.)

字符 '\'在C中用于转义特殊用途，使用它分割路径时，就要使用\\,才是‘\’, 就像你sprintf中拼接一样

#include <stdio.h> #include <stdlib.h>   int main(int argc, char **argv){ 	char path[] = "C:\\Users\\Frank\\Documents\\Visual Studio" 		" 2012\\Projects\\bin\\regenerate_original_picture.txt";  	int i;   	for(i = 0; i < sizeof(path); ++i) { 		if(path[i] == '\\') 			path[i] = '/'; 	} 	 	printf("%s\n", path); 	return 0; }

要使用'\\'去转义\

int main() { 	char s[] = "C:\\Users/Frank\\Documents\\Visual Studio 2012\\Projects\\bin\\regenerate_original_picture.txt"; 	puts(s); 	char *p = s; 	while (p = strstr(p, "\\")) 	{ 		*p = '/'; 		p += 1; 	} 	printf("替换后\n"); 	puts(s);  	return 0; } //C:\Users / Frank\Documents\Visual Studio 2012\Projects\bin\regenerate_original_picture.txt //替换后 //C : / Users / Frank / Documents / Visual Studio 2012 / Projects / bin / regenerate_original_picture.txt


Question: C 语言中的代码

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

不会写的话就先看别人的代码，或者把别人的代码一行一行敲进去，时间长了，会有所悟！

凡事循序渐进，慢慢有感觉。

这个练了第一遍，有用？？

#include <stdio.h> int main() { printf("hello world"); rreturn 0; }

引用 11 楼 u013163178 的回复:#include <stdio.h>  int main() {     printf("hello zhao4zhong1\n");     return 0; } 在你IED里面敲十遍。 IDE,纠正楼上

引用 3 楼 zhao4zhong1 的回复:先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm  对初学者建议用dev-c++，WIN-TC太老

引用 3 楼 zhao4zhong1 的回复:先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm+1，再找几本c相关的书籍看看

引用 8 楼 yabyijue 的回复:就像3楼说的那样，不知道去引入变量  根据变量功能、类型和作用域（生存期）

就像3楼说的那样，不知道去引入变量

复制，粘贴。

这问题，让我不知道怎么回答 LZ想问怎么写C程序？ 熟悉编译环境，熟悉文本编辑器或IDE，找点C示例代码，敲进去，编译，运行，修改，再编译再运行，如此循环加深理解，提升编程

就比如说 ：编写程序完成单处理机系统中的进程调度  这个如何去写？会用到哪些

楼主是想说变量名和函数名这样的不知道怎么命名吗

先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm

英文还有很多种吗？

楼主这问得我不知所措呀。能详细点吗？


Question: 本人新手，求教蓝桥杯比赛中的一个关于c的代码填空题

引用 1 楼 zhangxiangDavaid 的回复: buf=s;  //这个不是有问题吗？   int main(void) { 	char *s = "abcde1234"; 	printf("%*s%s%*s", 2, "| ", s, 2, " |"); 	return 0; } //| abcde1234 |   那个的确有问题，我的问题也解决了，谢谢！


Question: 如何在C语言中动态调用函数？

看my_sum源码，这个数必须你指定，如果指定有误，前后不匹配，出了问题，自己负责。

引用 7 楼 zhangxiangDavaid 的回复:[quote=引用 5 楼 super_miker 的回复:] [quote=引用 3 楼 zhangxiangDavaid 的回复:] [quote=引用 2 楼 super_miker 的回复:] [quote=引用 1 楼 zhangxiangDavaid 的回复:] my_sum这种写法叫可变参数函数：http://blog.csdn.net/zhangxiangdavaid/article/details/38278249 依据my_sum的参数类型，你是不可能把array，传递过去的，不过可以这样调用：  int my_sum(int n, ...) { 	int res = 0; 	va_list va; 	va_start(va, n); 	do { 		res += va_arg(va, int); 	} while (--n); 	va_end(va); 	return res; } int main(void) { 	printf("%d\n", my_sum(2, 1, 2)); 	printf("%d\n", my_sum(3, 1, 2, 3)); 	printf("%d\n", my_sum(4, 1, 2, 3, 4));  	return 0; } //3 //6 //10   问题是n只能在运行时确定，而且数值范围未知。。。[/quote] 在C语言中，可变参数函数是这样使用的：第一个参数指定后面可变参数的个数。 [/quote]  第一个参数确实是个数啊，但是个数是在运行时确定的[/quote]  这个数需要你指定。 [/quote]  这个数是从标准输入获得的。。。

引用 5 楼 super_miker 的回复:[quote=引用 3 楼 zhangxiangDavaid 的回复:] [quote=引用 2 楼 super_miker 的回复:] [quote=引用 1 楼 zhangxiangDavaid 的回复:] my_sum这种写法叫可变参数函数：http://blog.csdn.net/zhangxiangdavaid/article/details/38278249 依据my_sum的参数类型，你是不可能把array，传递过去的，不过可以这样调用：  int my_sum(int n, ...) { 	int res = 0; 	va_list va; 	va_start(va, n); 	do { 		res += va_arg(va, int); 	} while (--n); 	va_end(va); 	return res; } int main(void) { 	printf("%d\n", my_sum(2, 1, 2)); 	printf("%d\n", my_sum(3, 1, 2, 3)); 	printf("%d\n", my_sum(4, 1, 2, 3, 4));  	return 0; } //3 //6 //10   问题是n只能在运行时确定，而且数值范围未知。。。[/quote] 在C语言中，可变参数函数是这样使用的：第一个参数指定后面可变参数的个数。 [/quote]  第一个参数确实是个数啊，但是个数是在运行时确定的[/quote]  这个数需要你指定。

引用 4 楼 user-4 的回复://enter n array = (int *) malloc(sizeof(int) * n); // enter array int temp = 0; for(int i = 0; i < n; i++) { temp = my_sum(2, temp, array[i]); } 引用 4 楼 user-4 的回复://enter n array = (int *) malloc(sizeof(int) * n); // enter array int temp = 0; for(int i = 0; i < n; i++) { temp = my_sum(2, temp, array[i]); } 你说的好有道理，但实际中用的是一个函数指针，后面的参数也不是int类型而是一种指针类型。。。

引用 3 楼 zhangxiangDavaid 的回复:[quote=引用 2 楼 super_miker 的回复:] [quote=引用 1 楼 zhangxiangDavaid 的回复:] my_sum这种写法叫可变参数函数：http://blog.csdn.net/zhangxiangdavaid/article/details/38278249 依据my_sum的参数类型，你是不可能把array，传递过去的，不过可以这样调用：  int my_sum(int n, ...) { 	int res = 0; 	va_list va; 	va_start(va, n); 	do { 		res += va_arg(va, int); 	} while (--n); 	va_end(va); 	return res; } int main(void) { 	printf("%d\n", my_sum(2, 1, 2)); 	printf("%d\n", my_sum(3, 1, 2, 3)); 	printf("%d\n", my_sum(4, 1, 2, 3, 4));  	return 0; } //3 //6 //10   问题是n只能在运行时确定，而且数值范围未知。。。[/quote] 在C语言中，可变参数函数是这样使用的：第一个参数指定后面可变参数的个数。 [/quote]  第一个参数确实是个数啊，但是个数是在运行时确定的

就结贴了。。 有一种特殊情况。。如果你知道n的上限，而且这个上限不是很大时，可以这样，比如n上限是9 my_sum( n,     n>0?arr[0]:0,     n>1?arr[1]:0,     n>2?arr[2]:0,      n>3?arr[3]:0,     n>4?arr[4]:0,     n>5?arr[5]:0,     n>6?arr[6]:0,     n>7?arr[7]:0,     n>8?arr[8]:0 );

引用 15 楼 super_miker 的回复:[quote=引用 14 楼 vnvlyp 的回复:] [quote=引用 13 楼 super_miker 的回复:]那C语言没有像lisp里面的apply类似的函数吗？ 有没有类似apply的函数：目测没有 能不能实现类似apply的功能：可以，但我觉得不可能做到跨平台，如果要跨平台只能是针对每个平台写一个版本，然后编译的时候根据平台链接对应版本[/quote] 能绕开汇编吗？[/quote] 应该不行，特别是64位的可以说不可能不用汇编，你这个需求我觉得最好的办法就是想别的方法。。比如要求你要调用函数的编写者提供更灵活的接口什么的 实在要这些用的话比较好的办法是用汇编写个类似apply的函数，做成一个库文件，然后在c里调用，链接的时候加上这个库文件就好了，如果你只要支持x86和x86_64架构的我觉得这应该还是可行的吧

引用 14 楼 vnvlyp 的回复:[quote=引用 13 楼 super_miker 的回复:]那C语言没有像lisp里面的apply类似的函数吗？ 有没有类似apply的函数：目测没有 能不能实现类似apply的功能：可以，但我觉得不可能做到跨平台，如果要跨平台只能是针对每个平台写一个版本，然后编译的时候根据平台链接对应版本[/quote] 能绕开汇编吗？

引用 13 楼 super_miker 的回复:那C语言没有像lisp里面的apply类似的函数吗？ 有没有类似apply的函数：目测没有 能不能实现类似apply的功能：可以，但我觉得不可能做到跨平台，如果要跨平台只能是针对每个平台写一个版本，然后编译的时候根据平台链接对应版本

引用 10 楼 vnvlyp 的回复:如果要符合C99标准，能够跨平台的话，目测无解。。因为要调用那个函数，你必须把n和数组里所有int都存到寄存器或栈上(具体是寄存器还是栈和平台有关)，但是这个只能在运行的时候才可以做到，编译的时候因为不知道n，所以不可能实现这个。  如果你要求没那么严，只针对具体一个平台的话，那还是有很多办法的，比如用嵌入汇编，以下这个例子在符合System V x86_64标准的平台上应该可以满足你的要求，具体的话我用的64位Linux和gcc进行测试没有问题(暂时没有发现问题。。)  /* 	用以下命令编译，-g -Wall -O2不是必须的 	gcc main.c -o main -masm=intel -g -Wall -O2 */  #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <time.h>  int get_sum( int n, ... ) { 	int sum, i; 	va_list va;  	va_start( va, n ); 	sum = 0; 	while ( n-- ) { 		i = va_arg( va, int ); 		sum += i; 	}  	return sum; }  int main( int argc, char *argv[] ) { 	int *arr; 	int sum, n, i;  	srand( time( NULL ) ); 	 	n = rand() % 100; 	printf( "n=%d\n", n ); 	arr = (int *)malloc( n * sizeof(int) );  	for ( i = 0; i < n; i++ ) { 		arr[i] = rand() % 1000; 	} 	  	sum = 0; 	for ( i = 0; i < n; i++ ) { 		sum += arr[i]; 	}  	printf( "sum=%d\n\n", sum );  	sum = 0; 	__asm__ __volatile__( 		"mov r15, 0\n\t" 		"mov r12, rax\n\t" 		 		"mov eax, edi\n\t" 		"test eax, eax\n\t" 		"jz .call\n\t"  		"mov esi, [r12]\n\t" 		"sub eax, 1\n\t" 		"jz .call\n\t"  		"mov edx, [r12+4]\n\t" 		"sub eax, 1\n\t" 		"jz .call\n\t"  		"mov ecx, [r12+8]\n\t" 		"sub eax, 1\n\t" 		"jz .call\n\t"  		"mov r8d, [r12+12]\n\t" 		"sub eax, 1\n\t" 		"jz .call\n\t"  		"mov r9d, [r12+16]\n\t" 		"sub eax, 1\n\t" 		"jz .call\n\t"  		".break:\n\t" 		"cdqe\n\t" 		"lea r15, [rax*8]\n\t" 		"sub rsp, r15\n\t"  		"mov r13, 0\n\t" 		"add r12, 16\n\t"  		".loop:\n\t" 		"add r12, 4\n\t" 		"mov r14d, [r12]\n\t" 		"mov [rsp+r13], r14d\n\t" 		"add r13, 8\n\t" 		"sub eax, 1\n\t" 		"jnz .loop\n\t"  		".call:\n\t" 		"mov eax, 0\n\t" 		"call rbx\n\t" 		"add rsp, r15\n\t" 		"mov %0, eax\n\t" 		: "=m"(sum) 		: "a"(arr), "D"(n), "b"(get_sum) 		: "rcx", "rdx", "rsi", "r8", "r9", "r12", "r13", "r14", "r15" 	); 	  	printf( "sum=%d\n", sum );  	free( arr );  	return 0; }   那C语言没有像lisp里面的apply类似的函数吗？

我怎么感觉函数指针好呢。

样例输出：(因为是随机生成数，所有结果不同) 第一个sum是用来测试结果是否正确的 第二个sum才是我这种方法得到的结果 [user ~/Documents/c/temp]# ./main  n=28 sum=12288  sum=12288 [user ~/Documents/c/temp]# ./main  n=2 sum=1143  sum=1143 [user ~/Documents/c/temp]# ./main  n=69 sum=34237  sum=34237   刚发现代码有一点点小问题，如果你觉得可行我再改改

引用 2 楼 super_miker 的回复:[quote=引用 1 楼 zhangxiangDavaid 的回复:] my_sum这种写法叫可变参数函数：http://blog.csdn.net/zhangxiangdavaid/article/details/38278249 依据my_sum的参数类型，你是不可能把array，传递过去的，不过可以这样调用：  int my_sum(int n, ...) { 	int res = 0; 	va_list va; 	va_start(va, n); 	do { 		res += va_arg(va, int); 	} while (--n); 	va_end(va); 	return res; } int main(void) { 	printf("%d\n", my_sum(2, 1, 2)); 	printf("%d\n", my_sum(3, 1, 2, 3)); 	printf("%d\n", my_sum(4, 1, 2, 3, 4));  	return 0; } //3 //6 //10   问题是n只能在运行时确定，而且数值范围未知。。。[/quote] 在C语言中，可变参数函数是这样使用的：第一个参数指定后面可变参数的个数。

引用 1 楼 zhangxiangDavaid 的回复:my_sum这种写法叫可变参数函数：http://blog.csdn.net/zhangxiangdavaid/article/details/38278249 依据my_sum的参数类型，你是不可能把array，传递过去的，不过可以这样调用：  int my_sum(int n, ...) { 	int res = 0; 	va_list va; 	va_start(va, n); 	do { 		res += va_arg(va, int); 	} while (--n); 	va_end(va); 	return res; } int main(void) { 	printf("%d\n", my_sum(2, 1, 2)); 	printf("%d\n", my_sum(3, 1, 2, 3)); 	printf("%d\n", my_sum(4, 1, 2, 3, 4));  	return 0; } //3 //6 //10   问题是n只能在运行时确定，而且数值范围未知。。。


Question: 一个老师出的题，问下思路：用c在裸机上写一个调度程序的框架，半分钟测一次温度，一分钟测一次压力，随按随测PM（优先最高）

写一个框架而已。 首先没有ＯＳ，time,difftime就用不了。所以你的框架就必须提供一个时间接口，随便取个名字就行了，例如GetTime..,又不要你真正的实现。 ＬＺ的写法是一个很常见的裸机程序写法，目前的单片机很多都是这种写法 即 while ( 1 ){  ... }

知道X86裸机带BIOS不？ 知道带BIOS的机器INT8每1/18.2秒被调用一次不？

那个#include <Windows.h>可以无视掉。。。


Question: 求大家帮忙纠错

引用 14 楼 super_miker 的回复: -              printf("lf ",Pgr[i][j]); +              printf("%lf ", Pgr[i][j]); 我勒个去原来错在这了，真想撞墙

引用 12 楼 kite289 的回复:代码已经贴了啊，你的malloc是错的。应该用下面这种。 double *Pgr = (double *)malloc(sizeof(double)*1280*128);麻烦亲按照一楼的模式全贴出来给我看一眼呗~主要是printf那里不太懂咋弄，试了好久没试出来

引用 9 楼 kite289 的回复:楼主，你试试和他用同样的malloc方法一次申请。。你的申请方式不对。别总说半截话啊，把代码贴出来啊亲~不懂啊~亲

引用 7 楼 kite289 的回复:[quote=引用 6 楼 user-3 的回复:] [quote=引用 3 楼 qq_15683855 的回复:] [quote=引用 1 楼 user-3 的回复:] 把下面这句话放到main的外面，定义成全局变量。 double Pgr[1280][128]; 如果让用全局变量我也就不用在这发帖了- -[/quote] 那你就不会这样： double *Pgr = (double *)malloc(sizeof(double)*1280*128);[/quote]   你居然是对的， 我刚替楼主试了一下跑通了， 莫非堆栈内存不足引起溢出？ windows XP下内存是几K？    另外，修改上面这个错误后。 *((double*)Pgr+128*o+ww)=j;会数组越界， o值很大。[/quote]跑通了是怎么回事？修改了什么错误？把代码贴出来呗，谢啦

楼主，你试试和他用同样的malloc方法一次申请。。你的申请方式不对。

引用 6 楼 user-3 的回复:[quote=引用 3 楼 qq_15683855 的回复:] [quote=引用 1 楼 user-3 的回复:] 把下面这句话放到main的外面，定义成全局变量。 double Pgr[1280][128]; 如果让用全局变量我也就不用在这发帖了- -[/quote] 那你就不会这样： double *Pgr = (double *)malloc(sizeof(double)*1280*128);[/quote]动态数组吗？原来用的就是这个，只不过是这样的 	Pgr=(double**)malloc(1280*sizeof(double*)); //存储能量数据  	for(i=0;i<k;i++)  	{  		Pgr[i]=(double*)malloc(128*sizeof(double));  	} 最后出来的错误都一样，我就直接用静态的了

引用 6 楼 user-3 的回复:[quote=引用 3 楼 qq_15683855 的回复:] [quote=引用 1 楼 user-3 的回复:] 把下面这句话放到main的外面，定义成全局变量。 double Pgr[1280][128]; 如果让用全局变量我也就不用在这发帖了- -[/quote] 那你就不会这样： double *Pgr = (double *)malloc(sizeof(double)*1280*128);[/quote]   你居然是对的， 我刚替楼主试了一下跑通了， 莫非堆栈内存不足引起溢出？ windows XP下内存是几K？    另外，修改上面这个错误后。 *((double*)Pgr+128*o+ww)=j;会数组越界， o值很大。

引用 3 楼 qq_15683855 的回复:[quote=引用 1 楼 user-3 的回复:] 把下面这句话放到main的外面，定义成全局变量。 double Pgr[1280][128]; 如果让用全局变量我也就不用在这发帖了- -[/quote] 那你就不会这样： double *Pgr = (double *)malloc(sizeof(double)*1280*128);

引用 2 楼 kite289 的回复:double a[100]和double *p是可以相互转换。  但double Pgr[1280][128]  和 double **Pgr 不是同一个类型不能相互转换。  在传参的时候，需要直接用数组而非指针传递这个是可以的，我以前用过，只是没发生这种情况 参考http://blog.csdn.net/haizhongyun/article/details/7729552 这里面有介绍

楼主百度一下““二维数组和二维指针””  这两个不是同一个东西。  有篇博客可以参考。 http://www.cnblogs.com/stoneJin/archive/2011/09/21/2184211.html

引用 1 楼 user-3 的回复:把下面这句话放到main的外面，定义成全局变量。 double Pgr[1280][128]; 如果让用全局变量我也就不用在这发帖了- -


Question: C语言读取数据 出错

fgets sscanf

引用 3 楼 maychard1121 的回复:#include<stdio.h>  #define item 1000 main() { 	FILE *fpt; 	float num[item][10], temp[1000]; 	int i=0, j;  	fpt = fopen("E:800.txt","r"); 	while(fscanf(fpt, "%[^' '] ", num[i]) != EOF) 	{ 		fscanf(fpt, "%[^\n]\n", temp); 		i++; 	}  	for(j=0; j<i; j++) 		printf("[%d] %s\n", j, num[j]); 	fclose(fpt); } 报错的 #include<stdio.h>  #define item 1000 main() { 	FILE *fpt;     // float num[item][10], temp[1000]; 	float num[item], temp; 	int i=0, j;  	fpt = fopen("E:800.txt","r");     // while(fscanf(fpt, "%[^' '] ", num[i]) != EOF) 	while(fscanf(fpt, "%f", &num[i]) != EOF) 	{         // fscanf(fpt, "%[^\n]\n", temp); 		fscanf(fpt, "%f", &temp); 		i++; 	}  	for(j=0; j<i; j++) 		// printf("[%d] %s\n", j, num[j]);         printf("[%d] %f\n", j, num[j]); 	fclose(fpt); }

引用 4 楼 zhangxiangDavaid 的回复:仅供参考：  #include<stdio.h>  int main() { 	FILE *f; 	if (NULL == (f = fopen("1.txt", "r"))) 	{ 		fprintf(stderr, "Can not open file : %s\n", "1.txt"); 		return 0; 	} 	int i, j; 	i = 0; 	float data1[100], data2[100]; 	while (!feof(f)) 	{ 		fscanf(f, "%f%f\n", data1 + i, data2 + i); 		i++; 		if (i == 100) break; 	}  	for (j = 0; j < i; j++) 		printf("%g %g\n", data1[j], data2[j]); 	fclose(f); 	return 0; } //1.txt //- 0.1 0.123 //- 0.2 0.234 //- 0.3 0.222 //- 0.5 0.333 //- 0.12 0.444  +1，赞一个

Unhandled exception at 0x1024300a (msvcr80d.dll) in MITtest1.exe: 0xC0000005: Access violation writing location 0x80000000.  报错呢，请教下

是float数据  通过读写一个点一个点的读取第一列的数据，与数据对应的位置  数据和位置都需要 后面有对于这个点的计算的内容

你读入的是整数还是浮点数？


Question: vs2013 调试C程序内存模型中为什么没有数据？

你键入地址还没回车或移走输入焦点呢骚年！

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

引用 2 楼 u010244002 的回复:请问一下如何键入？  在内存窗口下，输入地址即可

请问一下如何键入？

设置断点，键入地址，即可


Question: C语言变参函数实现打印SOCKET接收的数据报文

#include<stdio.h> #include<stdarg.h>  typedef enum { 	DEBUG_INFO, 	DATA_INFO } MyPrintArg;  void MyPrint(MyPrintArg type,const char *format,...) { 	va_list args; 	unsigned char* data; 	int datalen; 	va_start(args,format); 	switch(type) 	{ 		case DEBUG_INFO: 			vprintf(format,args); 			break; 		case DATA_INFO: 			printf("%s",format); 			data=va_arg(args,unsigned char*); 			datalen=va_arg(args,int); 			while(datalen--) 				printf("%02x ",*data++); 			break; 		default: 			break; 	} 	va_end(args); }  int main() { 	unsigned char x[]={1,2,3,4,5,16,32,254,255}; 	int datalen=sizeof x; 	MyPrint(DEBUG_INFO,"size of x is:%d\n",datalen); 	MyPrint(DATA_INFO,"Recv:",x,datalen); 	return 0; }

顶起来  ，没人吗？？？？？？？


Question: http用GET方法获取重定向网址源码

google浏览器确实屌，可以不用抓包就看交互过程，谢谢。 另外，这个代码你们看着顺眼吗？这个思路没有错，错在代码书写不规范上，搞得我找了好长时间，谢谢各位

说不定要设置User-Agent？

用chrome的审查元素或者wireshark抓交互过程 哪个http头看不懂网上搜就好 学起来很快的

的确302了很多次。 浏览器的话，chrome或者firefox  F12就可以看HTTP交互过程。 你的程序发出去的HTTP请求可以用HttpAnalyzer抓一下包看看就知道了。

引用 1 楼 wanguser-3 的回复:你看看返回的301头部有没有Set-Cookie行，如果有你把Cookie带上试试。 奥，错了，不是301是302。 没有你说的cookie，循环打印出的Location是这样的  ****************************6 jump.taobao.com/jump?target=http%3a%2f%2fdetail.tmall.com%2fitem.htm%3fspm%3da230r.1.14.1.qxtjZ5%26id%3d17200027726%26ad_id%3d%26am_id%3d%26cm_id%3d140105335569ed55e27b%26pm_id%3d%26_u%3damch7mc130a%26abbucket%3d18%26tbpm%3d1   ****************************7 err.taobao.com/error1.html   ****************************8 jump.taobao.com/jump?target=http%3a%2f%2fdetail.tmall.com%2fitem.htm%3fspm%3da230r.1.14.1.qxtjZ5%26id%3d17200027726%26ad_id%3d%26am_id%3d%26cm_id%3d140105335569ed55e27b%26pm_id%3d%26_u%3damch7mc130a%26abbucket%3d18%26tbpm%3d1   ****************************9 err.taobao.com/error1.html  把上面的Location沾到浏览器都能打开想要的网页，不知道浏览器是如何处理的？


Question: c语言小程序—多文件函数调用

while (*string++ != ENDSTRING); len++;   改为   while (*string++ != ENDSTRING) len++;

while(*string++ != ENDSTRING); 去掉

把 while 那行末尾的 ; 删掉。


Question: （Seciond Edition）附录疑疑惑

引用 6 楼 zhao4zhong1 的回复:不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？ 我在质疑书

引用 1 楼 ri_aje 的回复:写个小程序看看你的编译器给的是什么值，应该是 -128，因为 0 一般占正整数的坑。 写了的，我输出的-128，书上其他的定义也有问题，INT_MIN,SHORT_MIN,LONG_MIN等。。

引用 4 楼 ri_aje 的回复:[quote=引用 3 楼 my_live_123 的回复:] 不妨通知一下里奇或者出版商 引用 3 楼 my_live_123 的回复:不妨通知一下里奇或者出版商 Ritchie 都去世了(http://en.wikipedia.org/wiki/Dennis_Ritchie)。[/quote] 告诉出版商也可行，发个邮件即可！或者自己知道，不了了之！

引用 3 楼 my_live_123 的回复:不妨通知一下里奇或者出版商 引用 3 楼 my_live_123 的回复:不妨通知一下里奇或者出版商 Ritchie 都去世了(http://en.wikipedia.org/wiki/Dennis_Ritchie)。

不妨通知一下里奇或者出版商


Question: Kmp算法中求next数组的时间复杂度问题

最近对kmp的getnext函数小做了一下研究。 贴一下自己的研究心得：http://blog.csdn.net/henuyx/article/details/44653799 对于算法复杂度，其实可以通过测试验证你心里的想法的。 首先最理想的情况是模式串是全部字符相同，比如：“aaaaaaaa”，算法复杂度为：O(m) 其次，考虑复杂度次之的字符串，即：“abababab”，算法复杂度为：O(m+1) 然后，考虑复杂度再次之的字符串，即：“abcabcabc”，算法复杂度为：O(m+2) .... 最差的情况，也就是楼主提的，每次都匹配失败，即：“abcdefg”，算法复杂度为：O(2m-2) 其中那个减2，表示第0个和第1个字符不会发生改变j的跳转。  ----------------- 个人见解，欢迎批评指正。

实际上最坏情况下也不会达到你说的情况，跳到k=-1不会复杂到o(n)


Question: arduino uno 编程中的问题：怎么调用.cpp中定义过的变量

extern  类型 变量名


Question: 设X[0:n-1]和Y[0:n-1]为2 个数组,每个数组中含有n 个已排好序的数。试设计一个O(log n)时间的算法,找出X和Y 的2n个数的中位数。

来一个O(n)的：  int main(void) { 	int x[] = { 2, 4, 5, 11, 12, 13, 14 }; 	int y[] = { 1, 3, 6, 7, 8, 9, 10 }; 	int a1, a2, n1, n2, n; 	n = n1 = n2 = 0; 	while (n < 7) 	{ 		a1 = x[n1] <= y[n2] ? x[n1++] : y[n2++]; 		n++; 	} 	a2 = x[n1] <= y[n2] ? x[n1++] : y[n2++]; 	printf("%lg\n", (double)(a1 + a2) / 2);  	return 0; } //7.5

1 2 3 4  5 6 7 8 9 10 11 12 13 14 这14个数的中位数应该是(7+8)/2=7.5啊


Question: c primer plus 第346页 为什么不用extern const double PI而用static。。。啊？

话说发图不说质量得多好，至少方向调一下把。。你这是帮治疗劲椎病么。。

引用 1 楼 vnvlyp 的回复:这书怎么看的。。 明明说了可以使用“两个策略”，“首先”是把定义放在一个c文件中，其他文件用extern，然后下面就有“extern const double PI” 然后“其次”是把定义放在h头文件中，这时候既然是定义，当然不能extern，为什么要用static下面也说清楚了 谢谢啦大神啊，看得太急了，没仔细

同一个编译文件，只需要static或非static 不一个编译文件，在当前使用定义在另外一个编译文件中的变量就要extern声明一下，告诉编译器它该怎么处理！ 注：一般一个.c文件称为一个编译文件

引用 2 楼 vnvlyp 的回复:话说发图不说质量得多好，至少方向调一下把。。你这是帮治疗劲椎病么。。 程序猿必读书目《颈椎病康复指南》


Question: 读WRK源代码，有个小问题请教大家！

你文本编辑器的问题, 就是分隔用的一条横行, 没啥意思, 当空格就是了..

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

试了下,  没几个文本编辑器识别 \f 并做特别的处理,   看来就是 M$ 的家伙为了打印的时候换页特别加入的,   看不出来是用啥编辑器写的.   在语义上这个就跟个空白差不多.

这个字符就是 '\x0c'  == '\f',  名字是 FF,   换页符,  认识的编辑器都显示一根横线,  打印的时候一般会分页..   M$ 的编辑器都不认识,  M$ 的内核代码又不是用 M$VC 写的, 不认识也正常得很..

到 vi 啥的里去看看..

引用 3 楼 mLee79 的回复:你文本编辑器的问题, 就是分隔用的一条横行, 没啥意思, 当空格就是了..  不是呀，我把这段代码拷到“记事本”和“VC2008”都是乱码呀？如下图所示

我认为这只是一个0xFF的字符。。。


Question: 一个编程练习

引用 3 楼 user-2 的回复:对于已排好序的数组，没必要这样做吧。。。 擦，居然没看见

引用 2 楼 u012077152 的回复:字典树裸题； 注意在oj提交代码时，别加system("pause") 否则你永远别想AC。 仅供参考(AC)： #include<cstdio> #include<cstdlib> #include<cstring> typedef char State[42]; const int Max_N = 100000; struct trie{ 	int cnt; 	trie *next[32]; }*root, stack[Max_N]; int sz = 0; State rec[110], low[110]; inline char tolow(char ch){ 	return ch >= 'A' && ch <= 'Z' ? ch + 32 : ch; } trie *_calloc(){ 	trie *p = &stack[sz++]; 	p->cnt = 0; 	for (int i = 0; i < 26; i++){ 		p->next[i] = NULL; 	} 	return p; } void insert(trie *x, char *src){ 	char *p = src; 	while (*p != '\0'){ 		if (x->next[*p - 'a'] == NULL) x->next[*p - 'a'] = _calloc(); 		x = x->next[*p - 'a']; 		x->cnt++; 		p++; 	} } int search(trie *x, char *src){ 	char *p = src; 	while (*p != '\0'){ 		if (x == NULL || x->next[*p - 'a'] == NULL) return 0; 		x = x->next[*p - 'a']; 		p++; 	} 	return x->cnt; } int main(){ #ifdef LOCAL 	freopen("in.txt", "r", stdin); 	freopen("out.txt", "w+", stdout); #endif 	State buf, src; 	int i, j, l, m, n = 0, k = 0; 	root = _calloc(); 	while (~scanf("%s", buf)){ 		n = strlen(buf); 		for (i = 0; i < n; i++){ 			low[k][i] = src[i] = tolow(buf[i]); 			rec[k][i] = buf[i]; 		} 		rec[k][i] = low[k++][i] = src[i] = '\0'; 		insert(root, src); 	} 	for (i = 0; i < k; i++){ 		n = strlen(rec[i]); 		for (j = 0; j < n; j++){ 			memset(src, 0, sizeof(src)); 			strncpy(src, low[i], j + 1); 			if (1 == search(root, src) || n == j + 1){ 				printf("%s ", rec[i]); 				m = strlen(src); 				for (l = 0; l < m; l++) printf("%c", rec[i][l]); 				printf("\n"); 				break; 			} 		} 	} 	return 0; }  对于已排好序的数组，没必要这样做吧。。。

-  char a[100]={0}; +  char *a = malloc(sizeof(char) * 100); +  memset(a, 0, sizeof(char) * 100);   顺便每个名字最多40个字符，最多100个名字


Question: 求助！多维数组与指针这有点问题不能理解呢！谢谢

for(;p <= p + 24;p++)   其实理论上这个也不算死循环，因为p <= p+24 不是永远成立的。当p增大到接近0xFFFFFFFF的时候，p+24就会溢出变成一个很小的值，循环就可以结束了。当然，在此之前程序早就挂掉了，因为一直在访问*p

引用 2 楼 user-1 的回复:for(;p <= p + 24;p++) 这是个死循环 ....我去 这么明显的错误我都没有发现 谢谢！！！！！

....我去 这么明显的错误我都没有发现 谢谢！！！！！

改成这样再试试吧 int* p = a[0]; int *p1 = p; for(;p <= p1 + 24;p++)

for(;p <= p + 24;p++) 这是个死循环


Question: 在C语言下查看float数据类型在内存中的存储形式，遇到一个奇怪的问题。

引用 2 楼 super_miker 的回复:证明你使用的平台上char是signed char, 而printf函数要求的是unsigned int, 将signed char进行类型提升之后,如果char数值的最高位是1(>=0x80), 那么就会像前面的位填入1,否则就会在前面的位填入0. 如果你使用unsigned char,那么不管char的数值是多少,提升至unsigned int时只会在前面的位填入0. 谢谢解惑

引用 1 楼 enlinux 的回复:这个需要知道浮点数的表达方式  浮点数 在 计算机中 表示为 1/2 + 1/4 + 1/8 + ....  0.1 = 1/16 + 1/32 + ...  然后，大多是是24.8 的精度，最后8bit就是00011000  %x 只是表达 32bit的值，实际表示的含义 由编译器决定 我预期是输出：3c cc cc cd

请这样做   printf("%02x  %02x  %02x  %02x", (BYTE)*(p + 3), (BYTE)*(p + 2), (BYTE)*(p + 1),(BYTE) *(p));  格式化成16进制时, 一定要注意强制转换成无符号类型, 否则就会出现输出负数的情况(前面全是f). 因为x格式化, 认为是是要取4个字节的. 如果未强制转换, 那么push参数时就会按有符号类型的转换成4字节数据. 当然就会出现负数了.

用unsigned char输出，原来我有个程序也是这种问题

int main(void) { 	float f = 1.3f; 	printf("%p\n", &f); 	char *p1 = (char*)&f; 	printf("%x %x %x %x\n", p1[3], p1[2], p1[1], p1[0]); 	unsigned char *p2 = (unsigned char*)&f; 	printf("%x %x %x %x\n", p2[3], p2[2], p2[1], p2[0]); 	return 0; } //0035F848 //3f ffffffa6 66 66 //3f a6 66 66


Question: 求问个算法问题

引用 2 楼 user-2 的回复:先手放中心，此后按对称方法，必胜。 我再补充一下， a>=b 时，先手胜 a < b 时，后手胜

先手放中心，此后按对称方法，必胜。


Question: 输出2007年某月月历

代码修改之后运行了一下，应该没问题了，你可以试试，改过的地方我用红色字体标出来了 #include<stdio.h> int main() {int s,d,i,m,w,j,k;  scanf("%d",&m); printf("          2007--%d\n",m); printf("----------------------------\n"); printf(" Su  Mo  Tu  We  Th  Fr  Sa\n"); s=0; for(j=1;j<m;j++)  {  	switch( j ) 		{ 			case 1: 			case 3: 			case 5: 			case 7: 			case 8: 			case 10: 			case 12:s=s+31;break; 			case 2:s=s+28;break; 			case 4: 			case 6: 			case 9: 			case 11:s=s+30;break; 		}  } switch(m) { 	case 1: 	case 3: 	case 5: 	case 7: 	case 8: 	case 10: 	case 12:d=31;break; 	case 4: 	case 6: 	case 9: 	case 11:d=30;break; 	case 2:d=28;break; } if(m==1) { 	w=1; 	printf("%4c",' '); 	for(i=1; i<=d; i++,w++)  	{ 		if(w==6) 		printf("\n"); 		w=(w+1)%7; 		printf("%3d ",i); 	} } else  { 	w=s%7; 	for(k=0;k<=w;k++) 	printf("%4c",' '); 	for(i=1; i<=d; i++)  	{ 		if(++w%7==0) 		putchar('\n'); 		printf("%3d ",i);  	} }  return 0; }

修改如下：  #include<stdio.h> int main() { 	int s, d, i, m, w, j, k; 	scanf("%d", &m); 	printf("          2007--%d\n", m); 	printf("----------------------------\n"); 	printf(" Su  Mo  Tu  We  Th  Fr  Sa\n"); 	s = 1; 	for (j = 1; j<m; j++) 	{ 		switch (j) 		{ 		case 1: 		case 3: 		case 5: 		case 7: 		case 8: 		case 10: 		case 12:s = s + 31; break; 		case 2:s = s + 28; break; 		case 4: 		case 6: 		case 9: 		case 11:s = s + 30; break; 		} 	} 	switch (m) 	{ 	case 1: 	case 3: 	case 5: 	case 7: 	case 8: 	case 10: 	case 12:d = 31; break; 	case 4: 	case 6: 	case 9: 	case 11:d = 30; break; 	case 2:d = 28; break; 	} 	if (m == 1) 	{ 		w = 1; 		printf("%4c", ' '); 		for (i = 1; i <= d; i++) 		{ 			printf("%3d ", i); 			if (7 == ++w)  //下次输出星期天，则先得换行 			{ 				printf("\n"); 				w = 0; 			} 		} 	} 	else { 		w = s % 7; 		for (k = 1; k <= w; k++) 			printf("%4c", ' '); 		for (i = 1; i <= d; i++) 		{ 			printf("%3d ", i); 			if (7 == ++w)  //下次输出星期天，则先得换行 			{ 				printf("\n"); 				w = 0; 			} 		} 	}  	return 0; }

int main() { 	int s = 0, d, i, m, w; 	scanf("%d", &m); 	printf("          2007--%d\n", m); 	printf("----------------------------\n"); 	printf("  Su  Mo  Tu  We  Th  Fr  Sa\n"); 	for(i=1; i<m; i++) { 		s += 31; 		switch(i) { 		case 2: 			s -= 3; 			break; 		case 4: case 6: case 9: case 11: 			s--; 			break; 		} 	} 	d = 31; 	switch(m) { 	case 2: 		d -= 2; 		break; 	case 4: case 6: case 9: case 11: 		d--; 		break;	 	} 	s += 1;	 	w = s % 7; 	for(i=1; i<=w; i++) 		printf("    "); 	for(i=1; i<=d; i++,w++) { 		printf("%4d", i); 		w %= 7; 		if(w == 6) 			printf("\n"); 	} 	printf("\n"); 	return 0; }

for(i=1; i<=d; i++,w++) 改成 for(i=1; i<=d; i++)  这里的w++是多余的，因为循环里面有一行 w=(w+1)%7;


Question: C语言实现对数据库的增、删、改、查操作

建议楼主先编译链接调试MySQL自带的例子代码。

如果你够牛B，直接用ODBC来做。


Question: 关于常量数组越界的问题，只读不写，有啥问题？

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

有的内存是不能读的  一读就崩溃

你这是定义了一个指针数组，可以这么赋值吗？我没这么试过，一会试下再来回复

如果程序以4 byte 对齐的方式编译，s2[-1] 就可能会取得random值，且如果以s2[-1]作为分支判断，就会有错误的分支处理流程，影响程序的正常功能。  lz的客户没有问题是，程序的幸运值高。

引用 4 楼 super_miker 的回复:char* s1[3] = {'a','b','c'}; char* s2[3] = {'d','e','f'}; 感觉这里有问题,要么后面是双引号,要么前面没有*. 此外,s1和s2的位置是编译器确定的,换一个编译器或者给编译器加上某些参数说不定会出问题,没出问题必须感谢编译器  不好意思，掩饰代码，敲错了，没有那个星号。

没有规定挨着写的变量，内存位置也挨着吧？ 最好翻翻标准

引用 2 楼 comfan1985 的回复:[quote=引用 1 楼 user-8 的回复:] 不知道问题的意图？ 尽量不要这么写 你不知道你越界访问的内存的内容， 以及 是否可以访问。 程序已经交给客户试用，也没啥问题。但是在复查代码的时候才发现这个问题的，而且index为-1的概率也比较低，现在要分析影响。  我觉得访问s2数组的-1下标，最多是访问到s1的内容。会有什么影响呢？[/quote]  下标是-1的话，你确定是s1的内容？ 要是这块内存是不可以访问的呢， 会出现段错误，那么你觉得影响大吗？

引用 1 楼 user-8 的回复:不知道问题的意图？ 尽量不要这么写 你不知道你越界访问的内存的内容， 以及 是否可以访问。 程序已经交给客户试用，也没啥问题。但是在复查代码的时候才发现这个问题的，而且index为-1的概率也比较低，现在要分析影响。  我觉得访问s2数组的-1下标，最多是访问到s1的内容。会有什么影响呢？


Question: 结构体指针之间的相互赋值

你执行位置过了赋值的地方没

你确定 程序已经执行到p=head这句了吗?  如果没有, 那是正常的.  如果已经执行到了, 那么 怀疑你是在release模式下调试的.   debug版执行到 p=head, p应该是NULL.

引用 1 楼 d741963250 的回复:看你怎么调试的了，当前的这个值 是在某处打的断点的值吗？ 直接运行 到这里中断了

看你怎么调试的了，当前的这个值 是在某处打的断点的值吗？

在那一行中断在我使用的IDE中代表那一行还未执行,要在它的下一行中断才得到执行这一行之后的结果.

是O2/O3编译优化吗?  代码重排 或 代码精简 会造成这个结果

你确定是在那一行中断了？ 0xcdcdcdcd这根本就是还没有初始化，连p = NULL那一行都没有执行

当我上面的没说~~~~~代码没看清楚!  你的这情况还真没发生过

你的断点是停在 p = head 那里吗? 按 F11 执行后 p 的值就会变了

在p=head之后加上一句  printf("%x, %x, =? %d\n", head, p, head == p ? 1 : 0);


Question: 内存不能read

可能和悬空指针有关

内存分配以及使用有问题吧，  再好好检查检查

1. 请把能通过和出错的代码分开 2. 能不能拜托用代码框发代码，这种代码有可读性么，代码框按钮在表情左边


Question: c语言如何连接MYSQL

可以调用mysql接口直接连接的

试验一下这个 http://t.51108.net/file/27&utm_source=AA01

借问下：linux下也是这样的吗

引用借楼问一下，楼主表介意 我是在vs2010中创建了一个win32控制程序项目mysql connect test。该设置的参数比如像包含目录和库目录都设置好了，但是提示说无法打开源文件mysql.h，求问大神是什么原因，有什么解决方案呢？ 回复四楼：路径改成英文名就可以啦。

引用 2 楼 henuyx 的回复:那个复制libmysql.dll令人费解 如果用-L指定动态库路径不是更好，而且也不会破坏当前系统的环境。  接分  以前写书就是这么任性


Question: 使用getc或者fgetc读取bin文件出错

第一个问题嘛，从没碰到过这种情况，你试试其他的文件  引用 1 楼 haolvshiqi 的回复:bin文件里面存储的内容都是int类型的吗？ 不管什么类型的文件存储的都是字节，至于为什么会有不同类型之分，那是人自己的理解问题，比如一个字节0x41，你可以把它当成文本，比如认为这个ASCII字符，那么它就是大写A，你也可以把它当成所谓“二进制”文件，那它也就是一个16进制数41或者10进制65 至于文件内容，那一样可以随意理解，比如一个文件有四个字节0xff 0xff 0x00 0x01，你可以认为内容是4个字节型，也就是4个char类型，你也可以认为这是1个整数型，就是1个int，所以问内容是什么类型的没有意义

引用 3 楼 vnvlyp 的回复:有几个问题 ch不能是char类型，至少应该是short，用int是最好的 如果你用char，你就不知道到底是读了一个EOF，还是读了一个0xFF字节，因为这两个东西用char表示是一样的  至于如果ch是char，为什么打印了0xffffff86这种东西，这是符号扩展(Sign Extension)的问题，本来这个ch的值是0x86，但因为要调用printf，传递参数的时候会提升成int类型，而又因为0x86是个负数如果表示成有符号数，所以用1来扩展成int类型变成0xffffff86，而不是0x00000086 非常感谢！但是您知道为何文件大小不是2的倍数就会多读很多数据出来吗？

人工置顶，大家来看看是什么原因

人工置顶。 bin文件里面存储的内容都是int类型的吗？

用getc 来读取是会自动转编码的，(getc 读取的是一个字符,而不是一个字节) 但你用 rb 方式打开，应该没有编码问题... 如果是编码问题，那用getc 统计出的大小应该比原文件小!  既然用 rb ，建议还是用 fwrite / fread 来处理

有大神知道第一个问题的原因吗？


Question: 一条语句看不懂？

static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别 C-style cast举例：  int i;  double d;  i = (int) d; 上面的代码就是本来为double类型的d，通过(int)d将其转换成整形值，并将该值赋给整形变量i (注意d本身的值并没有发生改变)。这就是典型的c-style类型转换。 下面是一个简单的程序： #include <iostream> using namespace std; int main(void) {          int i;          double d = 11.29;          i = (int)d;          cout << i << endl;          cout << d << endl;          return 0; } 输出结果： 11 11.29 我们发现d值本身并没有发生任何变化。 在简单的情况下，上面这种类型转换可以很好地工作，但在C++中往往还是不够的，为此ANSI-C++新标准定义的四个转换符，即      static_cast     dynamic_cast reinterpret_cast       const_cast 同时在C++环境中，原先的C-Style的类型转换仍旧可以使用。 1)  static_cast     用法：static_cast <typeid> (expression)     说明：该运算符把expression转换为typeid类型，但没有运行时类型检查来确保转换的安全性。     用途：     a) 用于类层次结构中基类和派生类之间指针或者引用的转换。         up-casting (把派生类的指针或引用转换成基类的指针或者引用表示)是安全的；         down-casting(把基类指针或引用转换成子类的指针或者引用)是不安全的。     b) 用于基本数据类型之间的转换，如把int转换成char，这种转换的安全性也要由开发人员来保证。     c) 可以把空指针转换成目标类型的空指针(null pointer)。     d) 把任何类型的表达式转换成void类型。     注意： static_cast不能转换掉expression的const、volitale或者__unaligned属性。 2)  dynamic_cast     用法：dynamic_cast <typeid> (expression)     说明：该运算符把expression转换成typeid类型的对象。typeid必须是类的指针、类的引用或者void*。如果typeid是类的指针类型，         那么expression也必须是指针，如果typeid是一个引用，那么expression也必须是一个引用。一般情况下，dynamic_cast用         于具有多态性的类(即有虚函数的类)的类型转换。                dynamic_cast依赖于RTTI信息，其次，在转换时，dynamic_cast会检查转换的source对象是否真的可以转换成target类型，        这种检查不是语法上的，而是真实情况的检查。先看RTTI相关部分，通常，许多编译器都是通过vtable找到对象的RTTI信息        的，这也就意味着，如果基类没有虚方法，也就无法判断一个基类指针变量所指对象的真实类型，这时候，dynamic_cast只能        用来做安全的转换,例如从派生类指针转换成基类指针。而这种转换其实并不需要dynamic_cast参与。也就是说,dynamic_cast        是根据RTTI记载的信息来判断类型转换是否合法的。     用途：主要用于类层次之间的up-casting和down-casting，还可以用于类之间的交叉转换。在进行down-casting时，dynamic_cast         具有类型检查的功能，比static_cast更安全。检测在运行时进行。如果被转换的指针不是一个被请求的有效完整的对象指针，         返回值为NULL。当用于多态类型时，它允许任意的隐式类型转换以及相反过程。不过，与static_cast不同，在后一种情况里         （注：即隐式转 换的相反过程），dynamic_cast会检查操作是否有效。也就是说，它会检查转换是否会返回一个被请求的有         效的完整对象。     注意：dynamic_cast不能转换掉expression的const、volitale或者__unaligned属性。 3)   reinterpret_cast      用法：reinterpret_cast <typeid>(expression)      说明：转换一个指针为其他类型的指针，也允许将一个指针转换为整数类型，反之亦然。这个操作符能够在非相关的类型之间进行         转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝，在类型之间指向的内容不做任何类型的检查和转换。这         是一个强制转换。使用时有很大的风险，慎用之。      注意：reinterpret_cast不能转换掉expression的const、volitale或者__unaligned属性。 4)   const_cast      用法：const_cast<typeid>(expression)      说明：这个类型操纵传递对象的const属性，或者是设置或者是移除。如：            Class C{…}            const C* a = new C;            C* b = const_cast<C*>(a);            如果将上面的const_cast转换成其他任何其他的转换，编译都不能通过，出错的信息大致如下：            “…cannot convert from 'const class C *' to 'class C *'”。      下面的代码是四种casting方法的典型用法示例：      #include <iostream>      using namespace std;      class Base      {      public:          int _base;          virtual void printinfo()          {               cout << _base << endl;          }      };      class Derived : public Base      {      public:          int _derived;          virtual void printinfo()          {               cout << _derived << endl;          }      };      int main(void)      {          Base    b1;          Derived d1;          int    aInt    = 10;          long   aLong   = 11;          float  aFloat  = 11.11f;          double aDouble = 12.12;          Derived* pd = static_cast<Derived*>(&b1);       // down-casting 不安全          Base*    pb = static_cast<Base*>(&d1);          // up-casting   安全          Derived& d = static_cast<Derived&>(b1);         // down-casting 不安全          Base& b = static_cast<Base&>(d1);               // up-casting   安全          aInt = static_cast<int>(aFloat);                // 基本数据类型转换          void* sth = static_cast<void*>(&aDouble);       // 将double指针类型转换成void指针类型          double* bDouble = static_cast<double*>(sth);    // 将void指针类型转换成double指针类型          cout << *bDouble << endl;          Base* pb1 = dynamic_cast<Base*>(&d1);          //Derived* pd1 = dynamic_cast<Derived*>(&b1);   // 编译时有warning，运行时出错          int bInt = reinterpret_cast<int>(pb1);          // 将地址或指针转换成整数          cout << bInt << endl;          pb1 = reinterpret_cast<Base*>(bInt);            // 将整数转换成地址或指针          int* cInt = reinterpret_cast<int*>(&aFloat);    // 这个转换的结果会出乎意料          cout << (int)*cInt << endl;          const Base* bBase = new Base();          Base* cBase = const_cast<Base*>(bBase);          //Base* dBase = dynamic_cast<Base*>(bBase);     // 不能通过编译          //Base* eBase = static_cast<Base*>(bBase);      // 不能通过编译          //Base* fBase = reinterpret_cast<Base*>(bBase); // 不能通过编译          return 0;     }

C++的多态

类型強转~~~~

属于C++类型强转，参考楼上答案详细了解下C++的类型强转，也可以自行搜索

就是c++的类型转换，和c转换区别开来

把e有QEvent* 转为QKeyEvent*  去学学c++中的static_cast

c++的类型转换，有点类似QKeyEvent *keyEvent = (QKeyEvent *)e; http://blog.csdn.net/bzhxuexi/article/details/17021559 http://blog.csdn.net/geeeeeeee/article/details/3427920


Question: 关于指针

初始化为指针为NULL，说明你这个指针指向地址为0的空间（没有用的），但是你又要对这个地址为0的空间赋值，这是不可以的地址0的空间是没用的，除非你重新制定个地址给指针，才能赋值。

初始化为null没有问题，但是不能读取null指针指向的内容。 所以scanf会崩溃。

说可以初始化为NUL 并不表示运行时可以用NULL。  scanf("%s%s",source,dest) 必须source dest 都不是NULL

char *source = NULL;     source = new char[100];


Question: c语言的逻辑尺问题

什么是“逻辑尺”——please define “逻辑尺”！！！

逻辑与或？

哪个教材 或 题目 误导人？  共享下，大家鄙视下

从没听说过C语言有逻辑尺

逻辑尺是啥？ 是 GUI编程中的 逻辑坐标吗？

逻辑尺？完全不懂你在说什么


引用 1 楼 a1193561652 的回复:可不可以先把编辑框设置成没有PASSWORD属性的再取text？  在其他应用的进程中，如何改呢？？

可不可以先把编辑框设置成没有PASSWORD属性的再取text？

引用 2 楼 u014390548 的回复:[quote=引用 1 楼 a1193561652 的回复:] 可不可以先把编辑框设置成没有PASSWORD属性的再取text？  在其他应用的进程中，如何改呢？？[/quote]SetWindowLong()


Question: C语言编程求大神帮助，感激不尽

srand((unsigned)time(0)); int num = rand()%2; if(num == 0)  // 正面 else //反面

自己打印语句看看中间值，或者设断点

#include<stdlib.h> #include<stdio.h> #include<stdlib.h> int flip() { 	return(rand()%100); } int main(void) { int sum1 = 0, sum2 = 0, i;  for (i = 1; i <= 100; i++) { 	if((flip())%2==0) { printf("正面\n"); sum1++; } else  { printf("反面\n\n"); sum2++; }      } printf("正面的次数为%d\n",sum1); printf("反面的次数为%d\n",sum2); system("pause"); return 0; }这样行不行


Question: 如何建立动态数组

再供参考：//在堆中开辟一个3×4×5的3维int数组 #include <stdio.h> #include <malloc.h> int ***p; int i,j,k; void main() {     p=(int ***)malloc(3*sizeof(int **));     if (NULL==p) return;     for (i=0;i<3;i++) {         p[i]=(int **)malloc(4*sizeof(int *));         if (NULL==p[i]) return;         for (j=0;j<4;j++) {             p[i][j]=(int *)malloc(5*sizeof(int));             if (NULL==p[i][j]) return;         }     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             for (k=0;k<5;k++) {                 p[i][j][k]=i*20+j*5+k;             }         }     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             for (k=0;k<5;k++) {                 printf(" %2d",p[i][j][k]);             }             printf("\n");         }         printf("---------------\n");     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             free(p[i][j]);         }         free(p[i]);     }     free(p); } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //--------------- // 20 21 22 23 24 // 25 26 27 28 29 // 30 31 32 33 34 // 35 36 37 38 39 //--------------- // 40 41 42 43 44 // 45 46 47 48 49 // 50 51 52 53 54 // 55 56 57 58 59 //---------------

仅供参考：#include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //

malloc and realloc

用new符号啊

#include <stdio.h> #include <stdlib.h> #include <string.h>  int **malloc_matrix(int m, int n)//m行n列 {     int **matrix;     int i;      if(m <= 0 || n <= 0)         return NULL;      matrix = (int **)malloc(n * sizeof(int *));     if(matrix == NULL)         return NULL;      for(i = 0; i < n; ++i) {         matrix[i] = (int *)malloc(m * sizeof(int));         if(matrix[i] == NULL)             return NULL;         memset(matrix[i], 0, m * sizeof(int));     }      return matrix; }  void free_matrix(int **matrix, int n) {     int i;     if(matrix == NULL)         return;     for(i = 0; i < n; ++i) {         free(matrix[i]);     }     free(matrix); }  int main(void) {     int **matrix;     matrix = malloc_matrix(3, 5);     if(matrix == NULL)         exit(-1);     printf("create a new matrix\n");     free_matrix(matrix, 5);     return 0; }


Question: C语言 VC++6.0打开显示乱码   求帮助

修复你的系统字体。

重装VC好几遍 都没有效果 还是乱码


Question: c语言程序错误 求大神

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

void val_Ab_sp(int i0,int j0,int q0,int nx,int ny,int nz,double rmax,double*P0,double D,double lca,double dt,double**A,double*b);这函数是有多蛋疼

新手能写出这种程序？是懒吧，自己解决。

哦哦 那这种问题怎么解决呢？？我还是新手，会的东西还比较基本，这种问题还不太会解决。。。。。。求指教了！！

gdb或其他调试器，你值得拥有！

效率问题。 XTRACE|1926|a.cpp-126-main|1|0s|0s-238us| XTRACE|1926|a.cpp-133-main|1|32s|32s-331531us| XTRACE|1926|a.cpp-137-main|1|62s|30s--412798us|  这段代码用了32s： 126         __X_                                                         127         for(j=0;j<nk;j++){                                           128             for(i=0;i<nk;i++){                                       129                 A[j][i] = 0.;                                        130             }                                                        131             A[j][j] = 1.;                                            132         }                                                            133         __X_    这段代码用了30s 136         //赋值：A，b                                                 137         val_Ab_sp(i0,j0,q0,nx,ny,nz,rmax,P0,D,lca,dt,A,P); __X_   这段代码运行了几分钟也没完成 139         //求解线性方程组（标准程序）                                 140         ludcmp(A,nk,indx,&d); __X_  //注意：此处 A 经运算后值发生改>     变;                                                                  141         lubksb(A,nk,indx,P); __X_   //P: 输入初值，输出结果；

太高看我了吧。


Question: 宏定义问题。

明白了，，，谢谢了。

bug： 存在越界 当i = N - 1时，num[i + 1] = num[N]越界

类似的例子：   int i = -1;   int n = 6;   unsigned u = 6;   printf("%d %d\n", i < n, i < u); // 输出1 0，i<u不成立   i++;   printf("%d %d\n", i < n, i < u);  // 输出1 1， i<u成立

改成这样： i < (int)(N-1) 原因：编译器把N当作了无符号整数，有符号整数i和无符号整数做比较的时候，需要先把i转换成无符号数0xFFFFFFFF

引用 3 楼 user-3 的回复:[quote=引用 2 楼 qq_24618483 的回复:] [quote=引用 1 楼 user-3 的回复:]  for(i=0;i<N;++i) {     printf("%d\n",num[i]); }  那为什么-1 不行呢？[/quote]  for(i=-1;i<N-1;++i) {     printf("%d\n",num[i+1]); }  不是-1不行，是你num下标的范围不对，num下标的范围是0到N-1共N个数，你的代码i最大为N-1，此时num的下标取N，超出了范围，i从0开始只是一种习惯。[/quote] 可是改为  for(i=-1;i<N-1;++i) {     printf("%d\n",num[i+1]); }  就有无法输出了。

引用 2 楼 qq_24618483 的回复:[quote=引用 1 楼 user-3 的回复:]  for(i=0;i<N;++i) {     printf("%d\n",num[i]); }  那为什么-1 不行呢？[/quote]  for(i=-1;i<N-1;++i) {     printf("%d\n",num[i+1]); }  不是-1不行，是你num下标的范围不对，num下标的范围是0到N-1共N个数，你的代码i最大为N-1，此时num的下标取N，超出了范围，i从0开始只是一种习惯。

引用 1 楼 user-3 的回复: for(i=0;i<N;++i) {     printf("%d\n",num[i]); }  那为什么-1 不行呢？


Question: 关于宏的一个问题

理解和讨论之前请先学会如何观察！  VC编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898

噢, 我看到了, 是 suffix 可变~~ 按1#和2#的来写吧

我就想不明白了, 你的函数名又不是可变的, 看了你的代码函数名都是固定的啊, 那为什么要用宏来写呢? 用 inline 来写这个函数不行吗?

-   cvtScaleAbs##suffix_SSE2 +   cvtScaleAbs ## suffix ## _SSE2

cvtScaleAbs##suffix_ 改成cvtScaleAbs##suffix##_ 宏在使用时，不能连着其他字母数字，必须用空格，换行，或井号连起。

下划线(_)也是标识符的一部分,所以suffix和suffix_是两个不同的标识符 在_前面加上##试试


Question: 输出100以内的素数

如果是固定范围，可以用查表法。

引用 9 楼 zhangxiangDavaid 的回复:算法有些问题……  for (int i = 3; i < 100; i += 2) 		if (prime(i) == 1) 			printf("%4d", i);

Finding prime numbers - Kenneth Haugland Different schemas for finding prime numbers explained with code http://www.codeproject.com/Articles/429694/Finding-prime-numbers

引用 8 楼 my_live_123 的回复:[quote=引用 6 楼 zhangxiangDavaid 的回复:] [quote=引用 5 楼 my_live_123 的回复:] 楼上的代码还有优化的空间  int prime(int n)//-1 error； 0-noprime； 1 prime； {     int i = 7;     if(n <= 0)         return -1;     else if(n == 1 || n == 2 || n == 3 || n == 5)         return 1;     else if(n % 2 == 0 || n % 3 == 0 || n % 5 == 0)         return 0;     else {         while(i < sqrt(n)) {             if(n % i == 0)                 return 0;             i += 4;             if(n % i == 0)                 return 0;             i += 2;             if(n % i == 0)                 return 0;             i+= 4;             if(n % i == 0)                 return 0;             i += 2;              if(n % i == 0)                 return 0;             i += 4;             if(n % i == 0)                 return 0;             i += 6;             if(n % i == 0)                 return 0;             i += 2;         }     }     return 1; }   你运行过吗？并且1还不是素数。  [/quote]   - else if(n == 1 || n == 2 || n == 3 || n == 5)  +else if(n == 1) +       return 0; + else if( n == 2 || n == 3 || n == 5) [/quote]  测试一下：  int prime(int n)//-1 error； 0-noprime； 1 prime； { 	int i = 7; 	if (n <= 0) 		return -1; 	else if (n == 1) 		return 0; 	else if(n == 2 || n == 3 || n == 5) 		return 1; 	else if (n % 2 == 0 || n % 3 == 0 || n % 5 == 0) 		return 0; 	else { 		while (i < sqrt(n)) { 			if (n % i == 0) 				return 0; 			i += 4; 			if (n % i == 0) 				return 0; 			i += 2; 			if (n % i == 0) 				return 0; 			i += 4; 			if (n % i == 0) 				return 0; 			i += 2; 			if (n % i == 0) 				return 0; 			i += 4; 			if (n % i == 0) 				return 0; 			i += 6; 			if (n % i == 0) 				return 0; 			i += 2; 		} 	} 	return 1; } int main(void) { 	for (int i = 0; i < 100; i++) 		if (prime(i) == 1) 			printf("%4d", i);  	return 0; } //2  3  5  73  95  算法有些问题……

引用 6 楼 zhangxiangDavaid 的回复:[quote=引用 5 楼 my_live_123 的回复:] 楼上的代码还有优化的空间  int prime(int n)//-1 error； 0-noprime； 1 prime； {     int i = 7;     if(n <= 0)         return -1;     else if(n == 1 || n == 2 || n == 3 || n == 5)         return 1;     else if(n % 2 == 0 || n % 3 == 0 || n % 5 == 0)         return 0;     else {         while(i < sqrt(n)) {             if(n % i == 0)                 return 0;             i += 4;             if(n % i == 0)                 return 0;             i += 2;             if(n % i == 0)                 return 0;             i+= 4;             if(n % i == 0)                 return 0;             i += 2;              if(n % i == 0)                 return 0;             i += 4;             if(n % i == 0)                 return 0;             i += 6;             if(n % i == 0)                 return 0;             i += 2;         }     }     return 1; }   你运行过吗？并且1还不是素数。  [/quote]   - else if(n == 1 || n == 2 || n == 3 || n == 5)  +else if(n == 1) +       return 0; + else if( n == 2 || n == 3 || n == 5)

语法错误，有个math。h错了

引用 5 楼 my_live_123 的回复:楼上的代码还有优化的空间  int prime(int n)//-1 error； 0-noprime； 1 prime； {     int i = 7;     if(n <= 0)         return -1;     else if(n == 1 || n == 2 || n == 3 || n == 5)         return 1;     else if(n % 2 == 0 || n % 3 == 0 || n % 5 == 0)         return 0;     else {         while(i < sqrt(n)) {             if(n % i == 0)                 return 0;             i += 4;             if(n % i == 0)                 return 0;             i += 2;             if(n % i == 0)                 return 0;             i+= 4;             if(n % i == 0)                 return 0;             i += 2;              if(n % i == 0)                 return 0;             i += 4;             if(n % i == 0)                 return 0;             i += 6;             if(n % i == 0)                 return 0;             i += 2;         }     }     return 1; }   你运行过吗？并且1还不是素数。

对于每一个i，这一步都会执行，不是吗？  if (j == i - 1) printf("%d ", a[i]);  所以遇到可以整除，就得跳出  for (j = 2; j <= i - 1; j++) { 	if (a[i] % j == 0) break;  //整除即跳出 	else 	{ 		if (j == i - 1) printf("%d ", a[i]); 	} }

经供参考：  /* 输出前一百个素数 */ #include<stdio.h> #include<math.h> int main(void)//30 { 	int a[100], trail, i, j, count; 	count = 3; 	trail = 5; 	a[0] = 2; 	a[1] = 3; 	a[2] = 5; 	printf("%4d%4d%4d", 2, 3, 5); 	while (count < 100) 	{ 		trail += 2;   //素数一定是奇数，所以只考察奇数 		for (i = 0; i < count; i++) 		{ 			if (a[i] <= trail / 2 && trail % a[i] == 0) break; 		} 		if (i == count) printf("%4d", a[count++] = trail); 	} 	getchar(); 	return 0; } //   2   3   5   7  11  13  17  19  23  29  31  37  41  43  47  53  59   //  61  67  71  73  79  83  89  97 101 103 107 109 113 127 131 137 139 149  // 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241  // 251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353  // 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461  // 463 467 479 487 491 499 503 509 521 523 541

仅供参考：  #include<stdio.h> #include<math.h> int main(void)//30 { 	int a[101], i, j; 	for (i = 0; i <= 98; i++) 	{ 		a[i] = i + 2; 		for (j = 2; j <= a[i] / 2; j++) 		{ 			if (a[i] % j == 0) break; 		} 		if (j > a[i] / 2) printf("%d ", a[i]); 	} 	getchar(); 	return 0; } //2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

#include<stdio.h> #include<math.h>  int main(void) { 	int i, j, flag = 0;  	for (i = 2; i <= 100; i++) 	{ 		for (j = 2; j <= i - 1; j++) 		{ 			if (i%j == 0) 			{ 				flag = 1;	 			} 		} 		if(!flag) 		{ 			printf("%d ", i); 		} 		flag = 0; 	} 	putchar(10); 	return 0;  }


Question: c语言中gets（）所引起的奇怪bug

哎 。。无意中看到我刚学编程时的提问。。。觉得以前真的好傻逼。。。

引用 1 楼 dinikinmi 的回复:哎。我知道原因了。。。if（）里面的a=b是赋值，，要改为a==b才是比较运算 恭喜

哎。我知道原因了。。。if（）里面的a=b是赋值，，要改为a==b才是比较运算


Question: 一个ACM签到题为啥总是答案错误

sum没有清零...


Question: 求问下这段代码哪里错了 我各种调试了一上午也没发现错误

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

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

引用 5 楼 enlinux 的回复:x是随机数，可能超过2010，可能是字符串的结尾位置，可能是负数，。。。。 没有啊 x在前面已经初始化过了

引用 7 楼 anshiny 的回复:lz的代码在逻辑上有诸多漏洞。 试一下这个： #include<stdio.h> #include<string.h>  void takeOff1(char *str); void takeOffKs(char *str, int *k); void doPreZeros(char *str);   int main() { 	char s[1001]; 	int t, k, i; 	scanf("%d", &t); 	for(i=1; i<=t; i++) { 		scanf("%s", s); 		scanf("%d", &k); 		takeOffKs(s, &k); 		printf("Case #%d: %s\n", i, s); 	} 	return 0; }  void doPreZeros(char *str) { 	int i, mark = -1, start; 	int lengthOfStr; 	i = 0; 	lengthOfStr = strlen(str); 	 	while(i < lengthOfStr) { 		if(str[i] != '0') break; 		mark = i; 		++i; 	} 	if(mark != -1) { 		i = mark + 1; 		start = 0; 		while(i < lengthOfStr) { 			str[start] = str[i]; 			start++; 			i++; 		} 		str[start] = '\0'; 	} 	return; }   void takeOff1(char *str) { 	int i = 0; 	int lengthOfStr = strlen(str); 	while(i+1 < lengthOfStr && str[i] <= str[i+1]) { 		++i; 	} 	if(i+1 == lengthOfStr) { 		str[i] = '\0'; 	} else { 		while(str[i+1] != '\0') { 			str[i] = str[i + 1]; 			i++; 		} 		str[i] = '\0'; 	} }   void takeOffKs(char *str, int *k) { 	while(*k) { 		takeOff1(str); 		doPreZeros(str); 		(*k)--;		 	} } 这道题我用别的方法做出来了 但是我就想不懂我这个代码哪里错了 逻辑上没什么问题啊

x是随机数，可能超过2010，可能是字符串的结尾位置，可能是负数，。。。。

引用 3 楼 user-4 的回复:看了半天,不明白变量x的意义... 没什么含义 一开始写的 后来没用上

看了半天,不明白变量x的意义...

#include<stdio.h> #include<string.h> #include<stdlib.h> void Delete(char s[2010],int k,int x) {     int i,j;     for(i=x+1;s[i]!='\0';i++){         if(s[i]<s[i-1]){             for(j=i-1;j>=x;j--){                 if((s[i]<s[j])&&(s[j]!='0')&&(s[j]!='.')){                     s[j]='.';                     k--;                     if(k==0)                         return;                 }                 else{                     if((s[i]>s[j])&&(s[j]!='0')&&(s[j]!='.'))                         break;             }         }     }     }     i--;     for(;i>=x;i--){         if(s[i]!='.'){             s[i]='.';             k--;             if(k==0){                 return;             }         }     } }   int main(void) {     int T,k,i,j,x,p;     char s[2010];     scanf("%d",&T);     for(i=0;i<T;i++){         x=0;p=0;         scanf("%s",s);         scanf("%d",&k);         Delete(s,k,x);         printf("Case #%d: ",i+1);         for(j=x;s[j]!='\0';j++){             if((s[j]!='.')){                 if((s[j]=='0')){                     if(p==0){                         continue;                         }                     else                         printf("0");                 }                 else{                     printf("%c",s[j]);                     p=1;                 }             }         }         if(p==0){             printf("0");         }         printf("\n");     }     return 0; }


Question: 为什么结果显示long和指针p都占12个字节，这不科学啊

应该看sizeof吧

看所占字节，要用sizeof，并不是打印他的地址就可以了。  打印的时候，是看格式化字符串，如果我打印%c,%d,那么1字节，4字节都可以打印出来，未必它们就占1字节了。

引用 2 楼 BoyNextDoor 的回复:因为b需要对齐到8字节，6c往下8字节64并不能对齐到8字节，所以只能再往下从60开始分配。这样68到6c这段内存其实是没有被使用的。b后面的空间有12位但是b本身还是只占用8字节。 引用 4 楼 vnvlyp 的回复:首先回答问题：内存对齐的原因，64位下，int一般需要4字节对齐，而long需要8字节对齐 拿变量b来说，变量a地址 0x7fff5fbff86c - 8 = 0x7fff5fbff864 只满足4字节对齐 要满足8字节对齐还要移动4个字节到0x7fff5fbff860  顺便说一下你这个问题本身就不科学 1) 你这个程序在不同平台、不同编译器、甚至不同优化级别下有可能产生不同的结果，因为不同平台内存对齐要求可能不一样，C标准也没有规定不能移动变量的顺序，比如在Linux gcc环境下，你可以看到编译器把c放到了b的前面来对齐。  2) long占用8个字节，int占用4个字节，char占用1个字节这样的说法都是纯理论的，实际一个变量占用多少内存这个问题情况太复杂，而且基本没有意义，比如根据编译器优化不同，一个变量有可能在寄存器中，所以根本不需要占用任何内存，又比如虽然char通常只需要1个字节，但因为内存对齐以及调用函数时参数传递问题，实际上会占用4个字节，所以理论性讨论这个问题还好，你要研究实际运行时的情况那已经不是C的范畴而是汇编甚至是底层硬件设计的问题。  谢谢你们的回答，我去了解了一下内存对齐，又增加了一个知识点。拿分，不谢！

引用 4 楼 vnvlyp 的回复:首先回答问题：内存对齐的原因，64位下，int一般需要4字节对齐，而long需要8字节对齐 拿变量b来说，变量a地址 0x7fff5fbff86c - 8 = 0x7fff5fbff864 只满足4字节对齐 要满足8字节对齐还要移动4个字节到0x7fff5fbff860  顺便说一下你这个问题本身就不科学 1) 你这个程序在不同平台、不同编译器、甚至不同优化级别下有可能产生不同的结果，因为不同平台内存对齐要求可能不一样，C标准也没有规定不能移动变量的顺序，比如在Linux gcc环境下，你可以看到编译器把c放到了b的前面来对齐。  2) long占用8个字节，int占用4个字节，char占用1个字节这样的说法都是纯理论的，实际一个变量占用多少内存这个问题情况太复杂，而且基本没有意义，比如根据编译器优化不同，一个变量有可能在寄存器中，所以根本不需要占用任何内存，又比如虽然char通常只需要1个字节，但因为内存对齐以及调用函数时参数传递问题，实际上会占用4个字节，所以理论性讨论这个问题还好，你要研究实际运行时的情况那已经不是C的范畴而是汇编甚至是底层硬件设计的问题。  说的太好了！


Question: 字符串常量的定义看不懂，求助

终端控制字符

/* VT100 escape sequence */ #define ESC_ATTR_RESET  "\033[0m"        // 恢复 #define ESC_ATTR_BG_RED "\033[41m"   //红 #define ESC_ATTR_BG_GRN "\033[42m"  // 绿 #define ESC_ATTR_BG_BLU "\033[44m"   // 蓝 .... 用putty试了下

应该是终端显示的控制符 (指今) \033 指令入口   [0m  , [41m  ... 等这些是指今码 用来控制显示终端的 颜色呀。什么的  //============================== 就像 \n  控制换行,..这种所有终端都支持

这些是 VT100 的控制字符, 就是个规定, ESC 1A 是光标上移一行貌似.

举例来说，"\033[1A"到底代表什么意思呢？我知道'\033'代表控制字符ESC，那后面的"[1A"代表什么意思呢？ 如果用printf()打印这个字符串，它会用来产生什么效果呢？

哦，可能我没有说清楚。我不明白那些字符串常量代表什么含义。  他们是用于打印的。比如： printFromISR("\r\n" ESC_CUR_UP ESC_CLR_END "                              Alarm at 27(Thu) 12:00 ");

就是基本的宏定义啊，有啥地方不懂呢

谢谢回复。 我上网搜了一点资料，有一点点明白了。  ANSI Escape sequences - VT100 / VT52 (ANSI Escape codes) ANSI Escape sequences  |  VT100 / VT52 ANSI escape sequences  |  VT100 User Guide    This document describes how to control a VT100 terminal.  ANSI escape sequence is a sequence of ASCII characters, the first two of which are the ASCII "Escape" character 27 (1Bh) and the left-bracket character " [ " (5Bh). The character or characters following the escape and left-bracket characters specify an alphanumeric code that controls a keyboard or display function.  Information is also available int the VT100 User Guide.    Esc[20h 	Set new line mode 	LMN  Esc[?1h 	Set cursor key to application 	DECCKM  none 	Set ANSI (versus VT52) 	DECANM  Esc[?3h 	Set number of columns to 132 	DECCOLM  Esc[?4h 	Set smooth scrolling 	DECSCLM  Esc[?5h 	Set reverse video on screen 	DECSCNM  Esc[?6h 	Set origin to relative 	DECOM  Esc[?7h 	Set auto-wrap mode 	DECAWM  Esc[?8h 	Set auto-repeat mode 	DECARM  Esc[?9h 	Set interlacing mode 	DECINLM    Esc[20l 	Set line feed mode 	LMN  Esc[?1l 	Set cursor key to cursor 	DECCKM  Esc[?2l 	Set VT52 (versus ANSI) 	DECANM  Esc[?3l 	Set number of columns to 80 	DECCOLM  Esc[?4l 	Set jump scrolling 	DECSCLM  Esc[?5l 	Set normal video on screen 	DECSCNM  Esc[?6l 	Set origin to absolute 	DECOM  Esc[?7l 	Reset auto-wrap mode 	DECAWM  Esc[?8l 	Reset auto-repeat mode 	DECARM  Esc[?9l 	Reset interlacing mode 	DECINLM    Esc= 	Set alternate keypad mode 	DECKPAM  Esc> 	Set numeric keypad mode 	DECKPNM    Esc(A 	Set United Kingdom G0 character set 	setukg0  Esc)A 	Set United Kingdom G1 character set 	setukg1  Esc(B 	Set United States G0 character set 	setusg0  Esc)B 	Set United States G1 character set 	setusg1  Esc(0 	Set G0 special chars. & line set 	setspecg0  Esc)0 	Set G1 special chars. & line set 	setspecg1  Esc(1 	Set G0 alternate character ROM 	setaltg0  Esc)1 	Set G1 alternate character ROM 	setaltg1  Esc(2 	Set G0 alt char ROM and spec. graphics 	setaltspecg0  Esc)2 	Set G1 alt char ROM and spec. graphics 	setaltspecg1    EscN 	Set single shift 2 	SS2  EscO 	Set single shift 3 	SS3    Esc[m 	Turn off character attributes 	SGR0  Esc[0m 	Turn off character attributes 	SGR0  Esc[1m 	Turn bold mode on 	SGR1  Esc[2m 	Turn low intensity mode on 	SGR2  Esc[4m 	Turn underline mode on 	SGR4  Esc[5m 	Turn blinking mode on 	SGR5  Esc[7m 	Turn reverse video on 	SGR7  Esc[8m 	Turn invisible text mode on 	SGR8    Esc[Line;Liner 	Set top and bottom lines of a window 	DECSTBM    Esc[ValueA 	Move cursor up n lines 	CUU  Esc[ValueB 	Move cursor down n lines 	CUD  Esc[ValueC 	Move cursor right n lines 	CUF  Esc[ValueD 	Move cursor left n lines 	CUB  Esc[H 	Move cursor to upper left corner 	cursorhome  Esc[;H 	Move cursor to upper left corner 	cursorhome  Esc[Line;ColumnH 	Move cursor to screen location v,h 	CUP  Esc[f 	Move cursor to upper left corner 	hvhome  Esc[;f 	Move cursor to upper left corner 	hvhome  Esc[Line;Columnf 	Move cursor to screen location v,h 	CUP  EscD 	Move/scroll window up one line 	IND  EscM 	Move/scroll window down one line 	RI  EscE 	Move to next line 	NEL  Esc7 	Save cursor position and attributes 	DECSC  Esc8 	Restore cursor position and attributes 	DECSC    EscH 	Set a tab at the current column 	HTS  Esc[g 	Clear a tab at the current column 	TBC  Esc[0g 	Clear a tab at the current column 	TBC  Esc[3g 	Clear all tabs 	TBC    Esc#3 	Double-height letters, top half 	DECDHL  Esc#4 	Double-height letters, bottom half 	DECDHL  Esc#5 	Single width, single height letters 	DECSWL  Esc#6 	Double width, single height letters 	DECDWL    Esc[K 	Clear line from cursor right 	EL0  Esc[0K 	Clear line from cursor right 	EL0  Esc[1K 	Clear line from cursor left 	EL1  Esc[2K 	Clear entire line 	EL2    Esc[J 	Clear screen from cursor down 	ED0  Esc[0J 	Clear screen from cursor down 	ED0  Esc[1J 	Clear screen from cursor up 	ED1  Esc[2J 	Clear entire screen 	ED2    Esc5n 	Device status report 	DSR  Esc0n 	Response: terminal is OK 	DSR  Esc3n 	Response: terminal is not OK 	DSR    Esc6n 	Get cursor position 	DSR  EscLine;ColumnR 	Response: cursor is at v,h 	CPR    Esc[c 	Identify what terminal type 	DA  Esc[0c 	Identify what terminal type (another) 	DA  Esc[?1;Value0c 	Response: terminal type code n 	DA    Escc 	Reset terminal to initial state 	RIS    Esc#8 	Screen alignment display 	DECALN  Esc[2;1y 	Confidence power up test 	DECTST  Esc[2;2y 	Confidence loopback test 	DECTST  Esc[2;9y 	Repeat power up test 	DECTST  Esc[2;10y 	Repeat loopback test 	DECTST    Esc[0q 	Turn off all four leds 	DECLL0  Esc[1q 	Turn on LED #1 	DECLL1  Esc[2q 	Turn on LED #2 	DECLL2  Esc[3q 	Turn on LED #3 	DECLL3  Esc[4q 	Turn on LED #4 	DECLL4      Codes for use in VT52 compatibility mode Esc< 	Enter/exit ANSI mode (VT52) 	setansi    Esc= 	Enter alternate keypad mode 	altkeypad  Esc> 	Exit alternate keypad mode 	numkeypad    EscF 	Use special graphics character set 	setgr  EscG 	Use normal US/UK character set 	resetgr    EscA 	Move cursor up one line 	cursorup  EscB 	Move cursor down one line 	cursordn  EscC 	Move cursor right one char 	cursorrt  EscD 	Move cursor left one char 	cursorlf  EscH 	Move cursor to upper left corner 	cursorhome  EscLineColumn 	Move cursor to v,h location 	cursorpos(v,h)  EscI 	Generate a reverse line-feed 	revindex    EscK 	Erase to end of current line 	cleareol  EscJ 	Erase to end of screen 	cleareos    EscZ 	Identify what the terminal is 	ident  Esc/Z 	Correct response to ident 	identresp      VT100 Special Key Codes These are sent from the terminal back to the computer when the particular key is pressed. Note that the numeric keypad keys send different codes in numeric mode than in alternate mode. See escape codes above to change keypad mode.    Function Keys:  EscOP	PF1 EscOQ	PF2 EscOR	PF3 EscOS	PF4   Arrow Keys:    	Reset 	Set  up 	EscA	EscOA down 	EscB	EscOB right 	EscC	EscOC left 	EscD	EscOD   Numeric Keypad Keys:  EscOp	0  EscOq	1  EscOr	2  EscOs	3  EscOt	4  EscOu	5  EscOv	6  EscOw	7  EscOx	8  EscOy	9  EscOm	-(minus)  EscOl	,(comma)  EscOn	.(period)  EscOM	^M    Printing:  Esc[i 	Print Screen 	Print the current screen  Esc[1i	Print Line 	Print the current line  Esc[4i	Stop Print Log 	Disable log  Esc[5i	Start Print Log	Start log; all received text is echoed to a printer


内部循环变量是从0开始遍历还是从i的值开始的区别  如果理解不了，可以上机单步调试一下就明白有什么不同了

一个倒三角，一个正方形

为什么不上机试试呢

引用 18 楼 zhao4zhong1 的回复:[quote=引用 17 楼 Minikinfish 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }   D中出现continue，就完蛋了。[/quote] 那麻烦你贴出一段D中出现continue，证明该论断“完蛋了”的例子代码。[/quote]  // for for (int i=0; i<10; ++i) {     if (i == 5)         continue; }  // while int i = 0; while (1) {     if (!(i<10))         break;          if (i == 5)         continue;        // 此处死循环了      ++i; }

前面执行n*n次，后面n*(n+1)/2次，后面j的初始值是i

区别是 1*1 1*2 1*3......... ........ ... ....... .... 9*1 9*2 .......9*9 和 1*1 1*2 .........1*9 2*2 .......  2*9 ... ... 8*8 8*9 9*9

引用 17 楼 Minikinfish 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }   D中出现continue，就完蛋了。[/quote] 那麻烦你贴出一段D中出现continue，证明该论断“完蛋了”的例子代码。

引用 2 楼 zhao4zhong1 的回复:for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }   D中出现continue，就完蛋了。

n * n 和 n * (n + 1) / 2 的区别

循环次数不同

次数不同 一个是n^2 ， 一个是n(n+1)/2

。。。赞一楼

for(i=0;i<n;i++) for(j=0;j<n;j++)与for(i=0;i<n;i++) for(j=i;j<n;j++)区别可大了，前者第一个for都执行了n次第二个执行n*n次，后者i对应执行了n次，j第一次执行n，第二次执行n-1次，第三次执行n-2次，以此类推

顶一楼

可以进行赋值输出看看结果

j每次循环的初始值不同

没错，初值不同，j执行的次数是不同的。

上机试一下  就知道了

第一个j的值每次都是从0开始，第二个j的值每次是从i开始。

要搞清楚for循环的使用方法，for(j=i;j<n;j++)中j=i是赋初值，表示j的初始值是i，随着i的不同是变化的


Question: 数据结构初学者求助 char name[20]；用意

char name[20]；  定义字符数组name，这样可以存放字符串

引用 11 楼 u012130706 的回复:用char name[20]可以存放20个学生的姓名，用name只能存一个 瞎扯蛋

不要误导新人嘛

char name[20] 是用来存放学生姓名的，char 定义的时字符型，学生姓名一般有多个字符组成，所以这里用了一个字符数组来存放学生姓名！但是如果一个学生的姓名字符数超过了20 ，这么写就有问题了，所以，这里写成char *name我觉得更合适。

引用 7 楼 zhao4zhong1 的回复:19  “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？水的太明显了

谢谢大家回答

不就是为了在student 中声明一个char类型的数组，数组存放20个char类型的字符，如果是字符串最后一个是\n。这有什么不明白的

引用 11 楼 u012130706 的回复:用char name[20]可以存放20个学生的姓名，用name只能存一个 胡扯！

引用 11 楼 u012130706 的回复:用char name[20]可以存放20个学生的姓名，用name只能存一个  胡扯 + 1  所有的变量都会对应内存的一个地址

我也是醉了，char  name[20],定义一个字符串数组，数组大小是二十个字节，但是最后一个字节要用来存放'   \0'  所以你实际能用的空间只有19个字节，   每一个姓名不管大小都占用19个字节，前提是数组能够装得下！

引用 2 楼 pjw694438869c 的回复:为什么要用数组?不能直接name吗?你果然是新手呀，姓名是字符串呀

char 字符型只能存一个字符集。想多存也就只能用数组了……

对，，明显误人

用char name[20]可以存放20个学生的姓名，用name只能存一个

C语言没有字符串类型，所以只能利用数组，连续地址存储；char name 表示name是一个字符，但是输入的字符串所以是name【】

C语言没有字符串变量,都是用char数组储存,例如一个单词student,它需要8个字符(包括最后的'\0')也就是char a[8]才能完全储存这个单词

char 是字符类型，只能存储1个字节的字符，所以一般用字符数组（连续的一组字符）来保存字符串。

char 代表字符型，也就是说 这个人名字最长只能有20个字符，来个外国人就放不下了

假如你的name是Tom， "Tom"可以放到char name;吗？ 是不是应该放到char name[20];呢？


Question: 如何修改特定地址的值

修改如下：  #include<stdio.h> #include<string.h> int main() { 	//char *c = "im the best";    //c指向一常量，不可对常量修改 	char c[] = "im the best";     //等价于 c[12]={'i','m',' ','t','h','e',' ','b','e','s','t','\0'}; 	char *fynd = strstr(c, "b"); 	printf("%s\n", c); 	*fynd = '6'; 	printf("%s\n", c); 	printf("%s\n", fynd);  	return 0; } //im the best //im the 6est //6best

字符串常量不可 修改

字符串常量的类型是const char *,你用char *很容易出错. 于是改成: char c[]="im the best";