Question: while语句计算加减法

引用 10 楼 ipqtjmqj 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] 仅供参考：for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;[i]  } }  明明不等价http://codepad.org/NfncxIsE[/quote]  6.5.3 The for statement [stmt.for] 1 The for statement for ( for-init-statement condition; expression) statement is equivalent to { for-init-statement while ( condition ) { statement expression ; } } except that names declared in the for-init-statement are in the same declarative region as those declared in the condition, and except that a continue in statement (not enclosed in another iteration statement) will execute expression before re-evaluating condition. [ Note: Thus the first statement specifies initialization for the loop; the condition (6.4) specifies a test, made before each iteration, such that the loop is exited when the condition becomes false; the expression often specifies incrementing that is done after each iteration. — end note ]

引用 13 楼 ipqtjmqj 的回复:[quote=引用 11 楼 zhao4zhong1 的回复:] [quote=引用 10 楼 ipqtjmqj 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] 仅供参考：for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }  明明不等价http://codepad.org/NfncxIsE[/quote] #define 里面变量不加括号，还带++ whilefun少一层大括号 [/quote] 只有带参数的宏，它的参数才可称为变量吧，否则只是字符串替换, 还有whilefun少一层大括号不影响结果吧。 我加了大括号，加了括号，结果还是和原来一样http://codepad.org/DyGOO9MG[/quote] 给你出道题： A是B， A不是B。 将上面的A和B分别用一个词来替换，使前后不矛盾。

引用 11 楼 zhao4zhong1 的回复:[quote=引用 10 楼 ipqtjmqj 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] 仅供参考：for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }  明明不等价http://codepad.org/NfncxIsE[/quote] #define 里面变量不加括号，还带++ whilefun少一层大括号 [/quote] 只有带参数的宏，它的参数才可称为变量吧，否则只是字符串替换, 还有whilefun少一层大括号不影响结果吧。 我加了大括号，加了括号，结果还是和原来一样http://codepad.org/DyGOO9MG

#include <stdio.h> int main() {     int sum = 0,n;     printf("输入数字\n");     scanf("%d",&n);     if(n > 0)     {         while          {            if(n%2)               sum +=n;            else               sum -=n;            n--;           }       }       else        {           while(n)          {              if(n%2);                 sum +=n;              else                 sum -=n;              n++;            }         }         printf("和为%d\n",sum);         return 0;  	}

引用 10 楼 ipqtjmqj 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] 仅供参考：for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }  明明不等价http://codepad.org/NfncxIsE[/quote] #define 里面变量不加括号，还带++ whilefun少一层大括号

引用 3 楼 zhao4zhong1 的回复:仅供参考：for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }  明明不等价http://codepad.org/NfncxIsE

int sum_ex(int n) { 	static int sum = 0; 	sum = sum+n*(n%2 ? 1 : -1); 	return (n == 0)? sum:sum_ex(n-1); }

int getSum(int n) { 	if (n <= 0) 	{ 		return 0; 	} 	int i, sum; 	i = 1, sum = 0; 	while (i<=n) 	{ 		if (i % 2) 		{ 			sum += i; 		} 		else 		{ 			sum -= i; 		} 		i++; 	} 	return sum; }  当然，可以直接总结一公式~

感谢 大家的回复,谢谢

引用 1 楼 billowyu 的回复:int input; 	printf("Please input an integer: "); 	scanf("%d",&input); 	int i = 1; 	int count = 0; 	while (1) 	{ 		if (i > input) 			break;  		if (i%2 == 0) { 			count -= i; 		} else { 			count += i; 		} 		i++; 	}  	printf("%d", count);    感谢!!

忘记写返回了：  int Sum(int n) { int ret=0; for(int i=0;i<n;i++) {     ret+=((i<0)?1:-1)*i; } return ret; }

int Sum(int n) { int ret=0; for(int i=0;i<n;i++) {     ret+=((i<0)?1:-1)*i; } }

#include <stdio.h> #include <math.h> int main() { 	int n; 	int sum=0; 	printf("请输入数字"); 	scanf("%d",&n); 	for(int i=1;i<=n;i++) 	sum+=i*pow(-1,i+1); 	printf("%d",sum); }


Question: 如何用C语言把输入的密码隐形成*号？在线急求

#if defined(unix) #include<curses.h> #elif defined(_WIN32) #include<conio.h> #include<stdio.h> #else #error "Unknown OS" #endif int main() {     char str[256]={0},*p=str,c; #if defined(unix)     initscr();     cbreak();     noecho();     while((c=getch())!='\n')     {         *p++=c;         addch('*');     }     printw("\n%s\n",str);     getch();     endwin(); #elif defined(_WIN32)     while((c=getch())!='\n'&&c!='\r')     {         *p++=c;         putchar('*');     }     printf("\n%s\n",str); #endif     return 0; }

引用 4 楼 ipqtjmqj 的回复: #include <conio.h> // getch, putch #include <stdio.h> // FILE, fopen, fclose, fscanf, printf #include <string.h> // strcmp void getpassword(char *p, int n) { 	int ch; 	int i; 	for (i = 0; (ch = getch())!= '\r' && i != n; *p++ = ch, putch(ch), ++i); 	*p = '\0'; } int Judge_Password() { 	char inp[20]; 	char p[20];     	FILE *fp = fopen("C:\\password.txt", "r"); 	fscanf(fp, "%s", p); 	fclose(fp);  	printf("Please input init password (no more than 15ch)\n"); 	getpassword(inp, 19); 	return strcmp(inp, p) == 0; } int main() { 	printf("%d", Judge_Password()); 	return 0; }  打错了 ,getpassword函数中putch(ch)改成putch('*');

输入直接显示*，然后在内部用结构体保存密码。

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

#include <stdio.h> #include <conio.h> int main () {     int ch;      while ((ch = getch ()) != '\r') {         putchar ('*');     }      return 0; }


Question: 执行这个时，temp等于10时为什么输出时是0啊？

“新来的没有权限修改自己的帖子，只好再写一个了。”  所以呢，如果想实现你的目的，可以定义一个字符串数组。 不考虑编码规范的前提下，修改如下： { int i; char* temp[]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"}; for(i=0;i<=12;i++) printf("CLUBS  %s DIAMONDS  %s HEARTS  %s SPADES  %s\n",temp[i],temp[i],temp[i],temp[i]);     return 0;   }  不过这段程序仍然没太看明白：使用了循环，每次又输出多张牌的内容。。

1. 10作为一个字符太长了。你看看ascii表就知道了，没有‘10’这么个字符。http://www.asciitable.com/ 2. 让我意外的是，编译器是允许这么写的。只不过他将多余的高位给扔掉了。所以，‘10’就剩下‘0’了。 同理，如果你写‘15’那就剩下‘5’了。 你编译的时候，编译器给warning了，你可能没注意。参见下图。（抱歉日语的，不过warning号码应该一样）   happy2study.tk

引用An ordinary character literal that contains more than one c-char is a multicharacter literal. A multicharacter literal, or an ordinary character literal containing a single c-char not representable in the execution character set, is conditionally-supported, has type int, and has an implementation-defined value. 如果你不知道编译器的行为，就不要使用它


Question: 请教各位大神~关于strtok的参数问题

#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

因为那个函数会对你的输入字符串进行修改，在分隔符的地方替换字符为\0,如果你给常量字符串，这样的操作是被禁止的，当然要报错了。另外这个函数是多线程不安全的，切勿在多线程应用中使用。


Question: 输出e的值并统计累加项数，，感觉运行结果错误，各位大神，帮忙看下，，

#include <stdio.h> #include <math.h>  int main() {     int		i, t = 1;     double 	m, e = 1.0;     for(i = 1; ; i++)     {         t = t * i;         m = 1.0 / t;         e = e + m;         if(fabs(m) <= 1e-8)             break;     }     printf("i = %d, e = %.8f\n", i, e);      return 0; }

怎么没人啊  asdasdasdas


Question: 为什么加了zlib库 还是提示compress（）未定义

引用 4 楼 zhao4zhong1 的回复:-lxxxx 指示链接xxxxlib.a 这个就是-lz /usr/include/zlib.h才能成功

-lxxxx 指示链接xxxxlib.a

引用 2 楼 qiake110 的回复:[quote=引用 1 楼 user-2 的回复:] 链接时加 -lz 。  你没有链接 zlib 的库。 还真是，太感谢了！ 不过求教一下 为什么zlib.h已经在/usr/include/目录下了 还要链接zlib库呢 gcc 默认的链接库 不就是/usr/include/目录吗 [/quote]  C 从源代码到程序要经历两个大的步骤，一个是编译(compile)，一个是链接(link)。  .h 在编译的时候使用，告诉编译器 compress 是一个函数。（这个由 #include 指定） 库文件在链接的时候使用，提供了 compress 函数的（已经编译好的）具体实现。（这个需要由命令行指定）  库文件不是 .h ，一般为 .a (Linux, 静态库）或 .so （Linux，动态库）

引用 1 楼 user-2 的回复:链接时加 -lz 。  你没有链接 zlib 的库。 还真是，太感谢了！ 不过求教一下 为什么zlib.h已经在/usr/include/目录下了 还要链接zlib库呢 gcc 默认的链接库 不就是/usr/include/目录吗

链接时加 -lz 。  你没有链接 zlib 的库。


Question: fwrite读写乱码

引用 12 楼 mienfong 的回复:[quote=引用 7 楼 zhanglusmile 的回复:] [quote=引用 5 楼 mienfong 的回复:] 一般檔案的操作會用 char / unsigned char 的 Array 方式來存取，這樣在進行 fwrite/fread 時格式也會一致。 你的 pow_panel_array 有甚麼資料？或都說 struct 是長怎樣？	int i = 0; 	for(i=0; i<panelnum; i++){ 		if(!pow_panel_array[i].used){ 			pow_panel_array[i].panelhandle = panelhandle; 			pow_panel_array[i].used = 1; 			pow_panel_array[i].power_info = power_info; 			pow_panel_array[i].FirstShowPower = 1; 			pow_panel_array[i].FirstShowFrequencyDomain = 1; 			pow_panel_array[i].control_plothandle = -1; 			pow_panel_array[i].uncontrol_plothandle = -1; 			pow_panel_array[i].hzmaxval = 2500.0; 			pow_panel_array[i].hzminval = 0.0; 			pow_panel_array[i].k = 0; 			memset(pow_panel_array[i].double_data,0,sizeof(double)*8192); 			break; 		} 	}                  是一个数组，信号采集的样子[/quote]  這個 Array 是有 Struct 的，您的長度是不對的。 試試看這樣改  write_length =  fwrite(&pow_panel_array[i], 1, sizeof(struct), with_control_file);  注意，要把  sizeof(struct) 的 struct 換成實際的 struct 大小。[/quote]这样不太对吧，感觉fwrite输出还是有问题，用fprinft先试试

注意：要把  sizeof(struct) 的 struct 換成實際的 struct 或者 手動寫入實際大小。

引用 7 楼 zhanglusmile 的回复:[quote=引用 5 楼 mienfong 的回复:] 一般檔案的操作會用 char / unsigned char 的 Array 方式來存取，這樣在進行 fwrite/fread 時格式也會一致。 你的 pow_panel_array 有甚麼資料？或都說 struct 是長怎樣？	int i = 0; 	for(i=0; i<panelnum; i++){ 		if(!pow_panel_array[i].used){ 			pow_panel_array[i].panelhandle = panelhandle; 			pow_panel_array[i].used = 1; 			pow_panel_array[i].power_info = power_info; 			pow_panel_array[i].FirstShowPower = 1; 			pow_panel_array[i].FirstShowFrequencyDomain = 1; 			pow_panel_array[i].control_plothandle = -1; 			pow_panel_array[i].uncontrol_plothandle = -1; 			pow_panel_array[i].hzmaxval = 2500.0; 			pow_panel_array[i].hzminval = 0.0; 			pow_panel_array[i].k = 0; 			memset(pow_panel_array[i].double_data,0,sizeof(double)*8192); 			break; 		} 	}                  是一个数组，信号采集的样子[/quote]  這個 Array 是有 Struct 的，您的長度是不對的。 試試看這樣改  write_length =  fwrite(&pow_panel_array[i], 1, sizeof(struct), with_control_file);  注意，要把  sizeof(struct) 的 struct 換成實際的 struct 大小。

引用 10 楼 fefe82 的回复:[quote=引用 6 楼 zhanglusmile 的回复:] [quote=引用 3 楼 zhanglusmile 的回复:] [quote=引用 2 楼 fefe82 的回复:] 想用记事本看的话请使用 fprintf。   write_length =  fprintf(with_control_file, "%d",pow_panel_array[i].double_data); 可是我改成这样没结果啊，就是文本里没东西[/quote]    这样显示的是二进制，虽然不是乱码了 [/quote]   这可不是二进制，你在输出的时候没加空格，所有的数都连在一起了。[/quote]在哪里加空格啊？？麻烦您帮我下

引用 6 楼 zhanglusmile 的回复:[quote=引用 3 楼 zhanglusmile 的回复:] [quote=引用 2 楼 fefe82 的回复:] 想用记事本看的话请使用 fprintf。   write_length =  fprintf(with_control_file, "%d",pow_panel_array[i].double_data); 可是我改成这样没结果啊，就是文本里没东西[/quote]    这样显示的是二进制，虽然不是乱码了 [/quote]  这可不是二进制，你在输出的时候没加空格，所有的数都连在一起了。

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

引用 5 楼 mienfong 的回复:一般檔案的操作會用 char / unsigned char 的 Array 方式來存取，這樣在進行 fwrite/fread 時格式也會一致。 你的 pow_panel_array 有甚麼資料？或都說 struct 是長怎樣？	int i = 0; 	for(i=0; i<panelnum; i++){ 		if(!pow_panel_array[i].used){ 			pow_panel_array[i].panelhandle = panelhandle; 			pow_panel_array[i].used = 1; 			pow_panel_array[i].power_info = power_info; 			pow_panel_array[i].FirstShowPower = 1; 			pow_panel_array[i].FirstShowFrequencyDomain = 1; 			pow_panel_array[i].control_plothandle = -1; 			pow_panel_array[i].uncontrol_plothandle = -1; 			pow_panel_array[i].hzmaxval = 2500.0; 			pow_panel_array[i].hzminval = 0.0; 			pow_panel_array[i].k = 0; 			memset(pow_panel_array[i].double_data,0,sizeof(double)*8192); 			break; 		} 	}                  是一个数组，信号采集的样子

引用 3 楼 zhanglusmile 的回复:[quote=引用 2 楼 fefe82 的回复:] 想用记事本看的话请使用 fprintf。   write_length =  fprintf(with_control_file, "%d",pow_panel_array[i].double_data); 可是我改成这样没结果啊，就是文本里没东西[/quote]    这样显示的是二进制，虽然不是乱码了

引用 1 楼 qldsrx 的回复:你写入的是一个double而不是char，肯定是乱码了，不然你输出时用printf的格式化%d干嘛？直接%s不好吗？ 那我还是用另一个函数吗？

引用 2 楼 fefe82 的回复:想用记事本看的话请使用 fprintf。   write_length =  fprintf(with_control_file, "%d",pow_panel_array[i].double_data); 可是我改成这样没结果啊，就是文本里没东西

想用记事本看的话请使用 fprintf。

引用 楼主 zhanglusmile 的回复:int  Input() {      FILE *with_control_file  = NULL;       int write_length = 0;       with_control_file=fopen("with_control.txt","wb");      if(with_control_file == NULL)       {           return 0;       }       write_length =  fwrite(pow_panel_array[i].double_data,sizeof(short),512, with_control_file);     printf("write_length = %d\n", write_length);       fclose(with_control_file);     with_control_file = NULL;       return 0;    }    with_control_file=fopen("with_control.txt","wb"); //楼主你的文件是.txt文件此段代码"wb"中的b表示二进制改为 t 或 省略  参考8楼和9楼


Question: 简单的四则运算问题，头晕了。。。请教各位。

弄的这么麻烦能保证ID不同吗

看到楼上回复被爆击了，发现我看题都看歪了。

引用 楼主 yukuang 的回复:图中为一个长方体，x,y,z为三维方向按箭头所示，值分别为x=4,y=6,z=4。　圆圈中的数字表示节点的ID号。　请教6个表面的ID，用x,y,z怎么表示？ 如： 上表面表示为：ID<=y*z 下表面表示为：ID>(x-1)*y*z 其它的4个表面，即左右前后该怎么表达啊？  如图：

写错了 ID/100 区分上下， (ID%100)/10前后，   ID%10区分左右

Z/100 区分上下， Y/10前后，   X%10区分左右

ID=X+Y*10+Z*100  上下左右用X/10，X%10之类表示

是否这样： 左：y=0 右：y=5 前：z=0 后：z=3 貌似高数翻一翻里面有，都忘了。


Question: 数据类型的小问题

printf在遇到float或double时压栈均以double入栈, 第一个%x是以int取数, 而下一个%f才以double 取数,  从内存上看就很好理解了 10.0 的doubel 在二进制是 00 00 00 00 00 00 24 40, 那个两次压栈后在内存里是 00 00 00 00 00 00 24 40 00 00 00 00 00 00 24 40, 第一个%x刚好取到4个0, 而第二个%f得到的是00 00 24 40 00 00 00 00这个数看不出来没关系, 放在C里面显示一下就可以了, 其实它指数位0, 就是2^-1023了, 应该很小了

那就要看printf是怎么处理的了

%x只能输出整型, 输出浮点型的行为未定义


Question: c语言中有关链表的问题，求大神详细解答

简单的单链表~

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

你需要把Lnode的定义贴出来看下就明白了。


Question: 请推荐一些高性能的矢量直线绘制到位图的算法

5000*3000 *8 /8 =15M 这个位图很小了 24Bits也才 45M 不算太大

GDI

lz又不说明干嘛的, 用来显示的话, 又要效率又要矢量. Direct2D吧. 我的垃圾显卡都支持1W+宽度的位图.

如果不用GPU的话，基本都慢

应该每天直线 都单独一个线程 然后2分搜索法  什么的

你这个是想做什么啊？感觉跟我在弄的一个东西很像


Question: 纯C语言课程设计--类似于打飞机的游戏  求思路！

引用 3 楼 heqiao1996 的回复:[quote=引用 1 楼 u010165006 的回复:] 在while(1)循环中，也处理敌机，每一架敌机，可以用rand()产生随机位置。 推荐你一本书，《Windows游戏程序设计基础》秦海玉，里面有个打飞机游戏的完整案例，不过是C++的，比C语言复杂了一点，有10几个类，能把它调试通过也是不错的。  谢谢！ 请问里面的原理可以用纯C写出来么？[/quote] 改成C语言版估计难度较大，有复杂的生成、管理、调用的关系（飞机、敌机、导弹、子弹等），改成C函数调用不容易。

http://blog.csdn.net/user-3/article/category/2922463 可以参考下我写的雷电大战的过程（虽说没完成），其中可以参数下移动路径设置。智能AI设计。参考下我的思路

引用 1 楼 u010165006 的回复:在while(1)循环中，也处理敌机，每一架敌机，可以用rand()产生随机位置。 推荐你一本书，《Windows游戏程序设计基础》秦海玉，里面有个打飞机游戏的完整案例，不过是C++的，比C语言复杂了一点，有10几个类，能把它调试通过也是不错的。  谢谢！ 请问里面的原理可以用纯C写出来么？

谢谢！ 请问里面的原理可以用纯C写出来么？


Question: 字符问题

引用 4 楼 SHRDLU 的回复:引用 1 楼 ipqtjmqj 的回复:整形字符常量，默认类型是int，就像浮点型默认是double那个char a='c';而a占1个字节'c'占4个字节，转换的话不会丢失数据吗； 当然可能会丢失，但视情况。 float f = 1.1 int i = f; 这样会丢失，但如果f是1就不会丢失

#include<stdio.h> int main() { 	printf("%d, %d, %d, %d\n", sizeof('a'), sizeof('ab'), sizeof('abc'), sizeof('abcd'));  // 结果都是4 	printf("%d", sizeof('abcde')); // 这句VC会报错，MinGW是个警告，因为int型的只能放4个字节 	return 0; }

字符型常量一律按整型常量处理，见C标准 §6.4.4.4 10 An integer character constant has type int. The value of an integer character constant containing a single character that maps to a single-byte execution character is the numerical value of the representation of the mapped character interpreted as an integer. The value of an integer character constant containing more than one character (e.g., 'ab'), or containing a character or escape sequence that does not map to a single-byte execution character, is implementation-defined. If an integer character constant contains a single character or escape sequence, its value is the one that results when an object with type char whose value is that of the single character or escape sequence is converted to type int.

引用 1 楼 ipqtjmqj 的回复:整形字符常量，默认类型是int，就像浮点型默认是double那样的话char a='c';怎么转换的，请从内存那块谈起

应该是编译器看到'c'就自动用数字填充了（数字的类型默认是int，占4个字节），不知道对不对。  int main () {     char ch = 'c';     printf ("%u -> %c\n", sizeof (ch), ch);     printf ("%u -> %c\n", sizeof ('c'), 'c');     printf ("%u -> %c\n", sizeof (0x63), 0x63);     return 0; }

整形字符常量，默认类型是int，就像浮点型默认是double


Question: c库函数头文件中函数定义的标识符如何理解

引用 1 楼 赵4老师的回复:VS IDE中，在不明白的符号上点鼠标右键，选转到定义。 谢谢了，下次上机试试

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


Question: 请问C语言里，我想输入一个超过long long型的的整型数据该怎么办呢？

仅供参考：#include <iostream> #include <string> using namespace std; inline int compare(string str1,string str2) {//相等返回0，大于返回1，小于返回-1          if (str1.size()>str2.size()) return 1; //长度长的整数大于长度小的整数     else if (str1.size()<str2.size()) return -1;     else                              return str1.compare(str2); //若长度相等，则头到尾按位比较 } string SUB_INT(string str1,string str2); string ADD_INT(string str1,string str2) {//高精度加法     int sign=1; //sign 为符号位     string str;     if (str1[0]=='-') {         if (str2[0]=='-') {             sign=-1;             str=ADD_INT(str1.erase(0,1),str2.erase(0,1));         } else {             str=SUB_INT(str2,str1.erase(0,1));         }     } else {         if (str2[0]=='-') {             str=SUB_INT(str1,str2.erase(0,1));         } else { //把两个整数对齐，短整数前面加0补齐             string::size_type L1,L2;             int i;             L1=str1.size();             L2=str2.size();             if (L1<L2) {                 for (i=1;i<=L2-L1;i++) str1="0"+str1;             } else {                 for (i=1;i<=L1-L2;i++) str2="0"+str2;             }             int int1=0,int2=0; //int2 记录进位             for (i=str1.size()-1;i>=0;i--) {                 int1=(int(str1[i])-'0'+int(str2[i])-'0'+int2)%10;                 int2=(int(str1[i])-'0'+int(str2[i])-'0'+int2)/10;                 str=char(int1+'0')+str;             }             if (int2!=0) str=char(int2+'0')+str;         }     }     //运算后处理符号位     if ((sign==-1)&&(str[0]!='0')) str="-"+str;     return str; } string SUB_INT(string str1,string str2) {//高精度减法     int sign=1; //sign 为符号位     string str;     int i,j;     if (str2[0]=='-') {         str=ADD_INT(str1,str2.erase(0,1));     } else {         int res=compare(str1,str2);         if (res==0) return "0";         if (res<0) {             sign=-1;             string temp =str1;             str1=str2;             str2=temp;         }         string::size_type tempint;         tempint=str1.size()-str2.size();         for (i=str2.size()-1;i>=0;i--) {             if (str1[i+tempint]<str2[i]) {                 j=1;                 while (1) {//zhao4zhong1添加                     if (str1[i+tempint-j]=='0') {                         str1[i+tempint-j]='9';                         j++;                     } else {                         str1[i+tempint-j]=char(int(str1[i+tempint-j])-1);                         break;                     }                 }                 str=char(str1[i+tempint]-str2[i]+':')+str;             } else {                 str=char(str1[i+tempint]-str2[i]+'0')+str;             }         }         for (i=tempint-1;i>=0;i--) str=str1[i]+str;     }     //去除结果中多余的前导0     str.erase(0,str.find_first_not_of('0'));     if (str.empty()) str="0";     if ((sign==-1) && (str[0]!='0')) str ="-"+str;     return str; } string MUL_INT(string str1,string str2) {//高精度乘法     int sign=1; //sign 为符号位     string str;     if (str1[0]=='-') {         sign*=-1;         str1 =str1.erase(0,1);     }     if (str2[0]=='-') {         sign*=-1;         str2 =str2.erase(0,1);     }     int i,j;     string::size_type L1,L2;     L1=str1.size();     L2=str2.size();     for (i=L2-1;i>=0;i--) { //模拟手工乘法竖式         string tempstr;         int int1=0,int2=0,int3=int(str2[i])-'0';         if (int3!=0) {             for (j=1;j<=(int)(L2-1-i);j++) tempstr="0"+tempstr;             for (j=L1-1;j>=0;j--) {                 int1=(int3*(int(str1[j])-'0')+int2)%10;                 int2=(int3*(int(str1[j])-'0')+int2)/10;                 tempstr=char(int1+'0')+tempstr;             }             if (int2!=0) tempstr=char(int2+'0')+tempstr;         }         str=ADD_INT(str,tempstr);     }     //去除结果中的前导0     str.erase(0,str.find_first_not_of('0'));     if (str.empty()) str="0";     if ((sign==-1) && (str[0]!='0')) str="-"+str;     return str; } string DIVIDE_INT(string str1,string str2,int flag) {//高精度除法。flag==1时,返回商; flag==0时,返回余数     string quotient,residue; //定义商和余数     int sign1=1,sign2=1;     if (str2 == "0") {  //判断除数是否为0         quotient= "ERROR!";         residue = "ERROR!";         if (flag==1) return quotient;         else         return residue ;     }     if (str1=="0") { //判断被除数是否为0         quotient="0";         residue ="0";     }     if (str1[0]=='-') {         str1   = str1.erase(0,1);         sign1 *= -1;         sign2  = -1;     }     if (str2[0]=='-') {         str2   = str2.erase(0,1);         sign1 *= -1;     }     int res=compare(str1,str2);     if (res<0) {         quotient="0";         residue =str1;     } else if (res == 0) {         quotient="1";         residue ="0";     } else {         string::size_type L1,L2;         L1=str1.size();         L2=str2.size();         string tempstr;         tempstr.append(str1,0,L2-1);         for (int i=L2-1;i<L1;i++) { //模拟手工除法竖式             tempstr=tempstr+str1[i];             tempstr.erase(0,tempstr.find_first_not_of('0'));//zhao4zhong1添加             if (tempstr.empty()) tempstr="0";//zhao4zhong1添加             for (char ch='9';ch>='0';ch--) { //试商                 string str;                 str=str+ch;                 if (compare(MUL_INT(str2,str),tempstr)<=0) {                     quotient=quotient+ch;                     tempstr =SUB_INT(tempstr,MUL_INT(str2,str));                     break;                 }             }         }         residue=tempstr;     }     //去除结果中的前导0     quotient.erase(0,quotient.find_first_not_of('0'));     if (quotient.empty()) quotient="0";     if ((sign1==-1)&&(quotient[0]!='0')) quotient="-"+quotient;     if ((sign2==-1)&&(residue [0]!='0')) residue ="-"+residue ;     if (flag==1) return quotient;     else         return residue ; } string DIV_INT(string str1,string str2) {//高精度除法,返回商     return DIVIDE_INT(str1,str2,1); } string MOD_INT(string str1,string str2) {//高精度除法,返回余数     return DIVIDE_INT(str1,str2,0); } int main() {     char ch;     string s1,s2,res;      while (cin>>s1>>ch>>s2) {         switch (ch) {             case '+':res=ADD_INT(s1,s2);break;             case '-':res=SUB_INT(s1,s2);break;             case '*':res=MUL_INT(s1,s2);break;             case '/':res=DIV_INT(s1,s2);break;             case '%':res=MOD_INT(s1,s2);break;             default :                   break;         }         cout<<res<<endl;     }     return(0); }

引用 1 楼 zhao4zhong1 的回复:仅供参考：#include <stdio.h> #include <string.h> #define MAXLEN 1000 char a1[MAXLEN]; char a2[MAXLEN]; static int v1[MAXLEN]; static int v2[MAXLEN]; static int v3[MAXLEN]; int i,j,n,L,z; void main(void) {     scanf("%d",&n);     for (j=0;j<n;j++) {         scanf("%s%s",a1,a2);          L=strlen(a1);         for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';          L=strlen(a2);         for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';          for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];          for (i=0;i<MAXLEN;i++) {             if (v3[i]>=10) {                 v3[i+1]+=v3[i]/10;                 v3[i]=v3[i]%10;             }         }          printf("Case %d:\n", j+1);         printf("%s + %s = ", a1, a2);          z=0;         for (i=MAXLEN-1;i>=0;i--) {             if (z==0) {                 if (v3[i]!=0) {                     printf("%d",v3[i]);                     z=1;                 }             } else {                 printf("%d",v3[i]);             }         }         if (z==0) printf("0");          printf("\n");     } } //Sample Input //3 //0 0 //1 2 //112233445566778899 998877665544332211 // //Sample Output //Case 1: //0 + 0 = 0 //Case 2: //1 + 2 = 3 //Case 3: //112233445566778899 + 998877665544332211 = 1111111111111111110   存在数组里面，如果要用这一个整数该怎么办呢？比如我存在3008893900000832922939293，要把这个数除2呢？


Question: 几行代码就出了个大问题，解决不了啊。各位帮忙看一下

引用 5 楼 u010165006 的回复:小程序，这些定义貌似没必要，重要的是理解程序的流程、控制流程的方法、简单的算法（比如计算一个n的阶层n!）等，不能过于形式。另外，一般OK的返回0，Error的返回正整数，shell可以根据调用得到的返回值比如1或2或3等来判断是哪种错误，DOS就是这样的。 shell可以根据调用（运行程序）得到的返回值比如1或2或3等来判断是哪种错误，DOS就是这样的。

楼上说的都对

Status main() 你如果是想定义一个返回值为Status型的函数，就不要使用main命名你的函数，和默认的main冲突； 如果你只是想进入主函数，楼上正解； 不知道void main（）行不行。

Status main() => int main(void);


Question: C的有向图的十字链表入度输出问题

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


Question: 为什么输出结果不对啊 switch case

switch((int)s/500) 当然是可以的，但是或许你想要的是 switch((int)(s/500))  你不告诉别人你想要什么结果，只说个结果不对谁能猜到你想要什么

double型的是lf

想要输入的值，能取到1、2、3之类的整数

Switch  得到与case对应的整数

scanf("%lf",&s);  printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。


Question: [菜鸟求助]这个程序错了吗?怎么运行的

引用 5 楼 only_one_moment 的回复:引用 4 楼 fefe82 的回复:sqrt 是有误差的，sqrt(100) 不一定就能得到 10我在前面加上了（int）转换还是不行  如果 sqrt(100) 不是 10 的话，你转成 int 也可能得不到 10 啊

sqrt 是有误差的，sqrt(100) 不一定就能得到 10

PAT上显示程序答案错误，但是自己运行没出错，最后的子函数可以讲解一下吗，看不懂怎么检验的

引用 13 楼 only_one_moment 的回复:[quote=引用 9 楼 github_27756899 的回复:] if((flag[temp]++)== 2) return 1; 改为: if((++flag[temp])== 2) return 1;如果没把++提前的话，是不是先执行比较操作？[/quote] 没把++提前的话，先执行比较操作.

引用 9 楼 github_27756899 的回复:if((flag[temp]++)== 2) return 1; 改为: if((++flag[temp])== 2) return 1;如果没把++提前的话，是不是先执行比较操作？

引用 10 楼 github_27756899 的回复:[quote=引用 3 楼 only_one_moment 的回复:] int IsTheNumber ( const int N ){ 	int n=N;  	int p=sqrt(N); 	if(p*p==N){ 	 		int temp, flag[10] = {0}; 		     for(temp=n%10;n;n/=10,temp=n%10)         if((flag[temp]++)== 2) return 1; 		return 0; 	} 	else return 0; 	 } 我自己又改了一下子函数我真的看不错错误，为什么还是错了 改为楼上的代码，试试.[/quote]谢谢你们，我把N改成了n+1然后把++提前程序就对了，

引用 6 楼 fefe82 的回复:引用 5 楼 only_one_moment 的回复:[quote=引用 4 楼 fefe82 的回复:] sqrt 是有误差的，sqrt(100) 不一定就能得到 10我在前面加上了（int）转换还是不行  如果 sqrt(100) 不是 10 的话，你转成 int 也可能得不到 10 啊[/quote]谢谢你们，我把N改成了n+1然后把++提前程序就对了，

引用 3 楼 only_one_moment 的回复:int IsTheNumber ( const int N ){ 	int n=N;  	int p=sqrt(N); 	if(p*p==N){ 	 		int temp, flag[10] = {0}; 		     for(temp=n%10;n;n/=10,temp=n%10)         if((flag[temp]++)== 2) return 1; 		return 0; 	} 	else return 0; 	 } 我自己又改了一下子函数我真的看不错错误，为什么还是错了 改为楼上的代码，试试.

//Round(1.234,2) = 1.23 //Round(1.234,0) = 1.0 //Round(123.4,-1) = 120.0 double Round(double dVal, short iPlaces) {     double dRetval;     double dMod = 0.0000001;     if (dVal<0.0) dMod=-0.0000001;     dRetval=dVal;     dRetval+=(5.0/pow(10.0,iPlaces+1.0));     dRetval*=pow(10.0,iPlaces);     dRetval=floor(dRetval+dMod);     dRetval/=pow(10.0,iPlaces);     return(dRetval); }  double round(double dVal, short iPlaces) //iPlaces>=0 {     unsigned char s[20];     double dRetval;      sprintf(s,"%.*lf",iPlaces,dVal);     sscanf(s,"%lf",&dRetval);     return (dRetval); }

可以写成 sqrt(n + 1) 判重复时，若flag[]内容都初始化成0，则 if (flag[temp]++ == 1) 没问题


Question: 关于C语言函数参数为另一个函数地址的问题

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

你利用本来应该返回到main的跳转，改了地址，跳到了userret函数，但是跳之前却没有保存之前的位置，所以出错了。 下面代码是最简单的实现这一功能，弄成汇编，看看就明白了  #include<stdio.h> void b() { 	puts("b"); } void a(int n) { 	*(&n - 1) = (int)b; } int main() { 	a(1); 	return 0; }


Question: 求解数字问题

a小于0后，置0，继续向下执行到减2操作，得-2，判断a是否为0，不为0，继续循环执行。

自己写一下在每一轮循环，每一条语句执行之后 a 的值。


Question: LED二次开发 和稽查布控系统对接。本人小白。

为什么不直接请你的前任喝酒呢？


Question: 程序运行后，输入数据，无法输出是什么原因


Question: 结构体初始化和输出问题

char name[10]; 改为：char name[11]; 原因各楼已给出。

引用 楼主 hanxia12356789 的回复:定义一个学生结构体，包含姓名，学号，成绩，存放姓名，学号的都是一个长度为10的字符数组，在运行的过程中发现在初始化学号的时候，如果学号长度正好为10的时候，输出的时候就会比输入的学号多一个字符，这个字符对应的assic码就是输入的成绩大小，代码如下： #include<iostream> #include<vector> using namespace std; struct student { 	char name[10]; 	char num[10]; 	int score; }; int main() { 	int n; 	cin>>n; 	vector<struct student> vec; 	for(int i=0;i<n;i++) 	{ 		struct student stu; 		cin>>stu.name>>stu.num>>stu.score; 		vec.push_back(stu); 	} 	cout<<vec[0].name<<' '<<vec[0].num<<endl<<vec[0].score;  }   测试结果如下 ：当输入的学号长度等于字符数组的长度10的时候，如果成绩为89，则在输出学好的时候，会在后面多一个Y，不知道为什么，请各位经过的大神，多多指教，小女子在此谢过了  如果学号长度小于10的时候，则输出正常，如下图  cout<<vec[0].name<<' '<<vec[0].num<<endl<<vec[0].score; 改为:cout<<vec[0].name<<' '<<vec[0].num<<' '<<vec[0].score;试试。//endl

字符数组必须要多申请一个放结束符~

其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

多占的空间（行话叫“越界”）如果是一般的自动变量的位置，可能不会出现问题；如果是函数返回地址之类的关键位置，运行时系统就能发现了

引用 1 楼 shangyu0801 的回复:妹子你好。  字符串是以'\0'结尾的。如果你要输入十个字符的字符串，其实是占用了11个字符的空间，因为结尾有'\0'。所以如果你的学号需要10个字节，定义数组的时候，最小应该是11个字节的空间。  你好，可是为什么数组长度为10的时候，我输入10个字符也没有报错呢#include<iostream> #include<vector> using namespace std; int main() { 	char num[10]; 	cin>>num; 	cout<<num; } 这个代码，我输入10个字符的时候就会提示


Question: 这种效果怎么用for循环语序做出来啊？

向2楼致敬！#include <stdio.h> #define abs(a) (a>0?a:-a) int C() {     static int c='A';     return (c++-'A')%26+'A'; } int main() {     for (int y=-9;++y!=9;putchar(                    '\n'))     for (int x=-9;++x!=9;putchar(abs(x)+abs(y)<9?C():'+' ));     return 0; } //++++++++A++++++++ //+++++++BCD+++++++ //++++++EFGHI++++++ //+++++JKLMNOP+++++ //++++QRSTUVWXY++++ //+++ZABCDEFGHIJ+++ //++KLMNOPQRSTUVW++ //+XYZABCDEFGHIJKL+ //MNOPQRSTUVWXYZABC //+DEFGHIJKLMNOPQR+ //++STUVWXYZABCDE++ //+++FGHIJKLMNOP+++ //++++QRSTUVWXY++++ //+++++ZABCDEF+++++ //++++++GHIJK++++++ //+++++++LMN+++++++ //++++++++O++++++++ //

好，记号

引用 4 楼 shangyu0801 的回复:牛，以数学坐标的思维解此题，条件比较好判断。 根据此题，x != y 稍微对程序改了一下，如下：   #include <stdio.h> // putchar #include <stdlib.h> // abs #define BACK '+' #define FRONT getletter() int getletter() { 	static int c = 'A'; 	return (c++ - 'A') % 26 + 'A'; } #define N 9 #define M 10 int main() { 	int x, y; 	for (y = -N; ++y != N; putchar('\n'))	 		for (x = -M; ++x != M; putchar(abs(x) + abs(y) < N ? FRONT : BACK)); 	return 0; }  结果如下，与题目相符： +++++++++A+++++++++ ++++++++BCD++++++++ +++++++EFGHI+++++++ ++++++JKLMNOP++++++ +++++QRSTUVWXY+++++ ++++ZABCDEFGHIJ++++ +++KLMNOPQRSTUVW+++ ++XYZABCDEFGHIJKL++ +MNOPQRSTUVWXYZABC+ ++DEFGHIJKLMNOPQR++ +++STUVWXYZABCDE+++ ++++FGHIJKLMNOP++++ +++++QRSTUVWXY+++++ ++++++ZABCDEF++++++ +++++++GHIJK+++++++ ++++++++LMN++++++++ +++++++++O+++++++++   4楼真细心。我按题意修改了一下  #include <stdio.h> // putchar #include <stdlib.h> // abs #define BACK '+' #define FRONT getletter() int getletter() { 	static int c; 	return c++ % 26 + 'A'; } #define N 9 #define X (N + 1) #define Y N int main() { 	int x, y; 	for (y = -Y; ++y != Y; putchar('\n'))	 		for (x = -X; ++x != X; putchar(abs(x) + abs(y) < N ? FRONT : BACK)); 	return 0; }

引用 2 楼 ipqtjmqj 的回复: #include <stdio.h> // putchar #include <stdlib.h> // abs #define BACK '+' #define FRONT getletter() int getletter() { 	static int c = 'A'; 	return (c++ - 'A') % 26 + 'A'; } #define N 9 int main() { 	int x, y; 	for (y = -N; ++y != N; putchar('\n'))	 		for (x = -N; ++x != N; putchar(abs(x) + abs(y) < N ? FRONT : BACK)); 	return 0; }   牛，以数学坐标的思维解此题，条件比较好判断。 根据此题，x != y 稍微对程序改了一下，如下：   #include <stdio.h> // putchar #include <stdlib.h> // abs #define BACK '+' #define FRONT getletter() int getletter() { 	static int c = 'A'; 	return (c++ - 'A') % 26 + 'A'; } #define N 9 #define M 10 int main() { 	int x, y; 	for (y = -N; ++y != N; putchar('\n'))	 		for (x = -M; ++x != M; putchar(abs(x) + abs(y) < N ? FRONT : BACK)); 	return 0; }  结果如下，与题目相符： +++++++++A+++++++++ ++++++++BCD++++++++ +++++++EFGHI+++++++ ++++++JKLMNOP++++++ +++++QRSTUVWXY+++++ ++++ZABCDEFGHIJ++++ +++KLMNOPQRSTUVW+++ ++XYZABCDEFGHIJKL++ +MNOPQRSTUVWXYZABC+ ++DEFGHIJKLMNOPQR++ +++STUVWXYZABCDE+++ ++++FGHIJKLMNOP++++ +++++QRSTUVWXY+++++ ++++++ZABCDEF++++++ +++++++GHIJK+++++++ ++++++++LMN++++++++ +++++++++O+++++++++

#include <stdio.h>  int Print(int x) { 	int start,i,ch; 	if(x % 2 != 1 || x < 5) 	{ 		return -1; 	} 	start = 1; 	ch = 0; 	for( i = 0; i < x; i++) 	{ 		int a,b,c,j; 		a = (x - start) /2; 		b = start; 		c = x - a - b;  		for( j = 0; j < a; j++) 		{ 			printf("+"); 		} 		for( j = 0; j < b; j++) 		{ 			printf("%c",ch++ % 26 + 'A'); 		} 		for( j = 0; j < c; j++) 		{ 			printf("+"); 		} 		printf("\n");  		if(i >= (x - 2)/2) 		{ 			start -= 2; 		} 		else 		{ 			start += 2; 		} 		if(start < 0)break; 	}  	return 0; }   int main() { 	Print(17);  满足你的要求。


Question: 请教各位大神~关于逗号表达式还有参数求值顺序？

未定义行为 结果不可以预测 请看置顶： [置顶] [C/C++板块推荐阅读] 关于C,C++表达式求值顺序. [推荐]

引用 2 楼 u013112097 的回复:可是为什么两个 printf 输出 x 都是 3 呢？我觉得应该有一个是 0 ？为什么两个 printf 都先算了逗号表达式那个参数呢？ 编译器爱怎么做就怎么做 C语言没有规定该按什么顺序 所以，在参数表中修改变量的值，是所谓的“未定义”行为，任何结果都有可能出现，真正的程序员严禁编写这种代码

逗号表达式中，从左往右求值 函数的实际参数，求值顺序没有规定


Question: 请教各位大神，关于下标引用，-1[ap] 输出很奇怪

2[a]就是a[2]在for循环里赋的值，所以是2  -1[ap]由于下标运算符的优先级大于负号，所以它与ap[-1]不一样 应该是-ap[1]，由于ap = a + 2所以-ap[1] = -a[3] = -3  6[a]就量a[6]越界了，不过地址正好是i的，i加到5，循环结束，所以a[6] = 5

当 p i 是一个指针和一个整型时： p[i] i[p] *(p+i) *(i+p) 是等价的。

改成C语言后面三个也是一样的 我的编译选项：  mingw32-g++.exe -Wall -fexceptions -g  -c  mingw32-gcc.exe -Wall -g  -c


Question: b=(++a)+(++a)+(++a)运行结果疑问？

同意二楼的说法。 个人建议，写这种表达式的人只是想说明表达式中是存在求值顺序的，让我们在程序开发过程中注意由此而带来的副作用，不是让我们研究这个表达式到底是什么结果，我的结论是没有固定的结果，我用不同的编译器试过，结果不一样。

这种题目是不是每隔一年就要冒出来一阵。  又有一波新人来了。

看置顶贴子，以后楼主要是在这个论坛问这样的问题，估计要被喷死。

顺序点问题  参看置顶贴：http://bbs.csdn.net/topics/370153775

引用 1 楼 user-8 的回复:个人是这么理解的 四则运算，两两结合 (++a)+(++a)+(++a) 实际上编译时(++a)+（(++a)+(++a)） 后面的(++a)+(++a)会将结果算出来存入内存中， 实际上等价于 c=(++a)+(++a) b=(++a)+c C语言标准中明确说了这属于未定义的行为 得到任何结果都有可能 不要妄自猜测了 不要被一些书本中的所谓分析给误导了 在公司里如果有人敢这样写代码，哼哼

未定义行为 结果不可预测 [置顶] [C/C++板块推荐阅读] 关于C,C++表达式求值顺序. [推荐]


Question: 请大神看一下哪里出问题了

已找到答案，就是把数组定义的长度增大，因为哨兵会占用值。

引用 2 楼 china7628的回复:这个程序有点问题： 1、你在insert函数中用到了[n]，但你的main函数中定义r[11]，你用了r[11]，这个是不存在的。 2、你写这个程序的目的是什么？如果是测试某种用法的话，就不要定义那么复杂的结构了。 3、你定义了一个结构数组，你在insert函数中用了，这个数组本身的初始化值是不固定的。 4、你的insert函数没有对r[1]进行操作，输出结果中会不会是r[1]是空的。 5、我用Dev c++编译出错，cr a[]={,32,第一个数据为空，我加了一个0，但没有任何输出，输出是空的 我能运行，并且进行排序，但是会少一个数字。V C运行

引用 1 楼 user-3的回复:1. 你的程序期望完成什么功能？ 2. 你的程序是否有输入？如果有，输入是啥？ 3. 你的程序的输出是啥？你期望的输出是啥？ 不用输入，就是对数组里的数排序

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


引用 4楼wang0635 的回复:参考这种模式 fp = fopen("abc.txt", "r"); if (fp != NULL) { 	i = 0; 	while (!feof(fp)) 		fscanf(fp, "%c", &inString[i++]); 	inString[i] = '\0'; }谢谢

引用 1 楼 wang0635 的回复:[quote=引用 楼主 zcyang911 的回复:] 本人想实现AES对文件内容的加密与解密。输入文件名，输出加密的文件；输入加密的文件，输出解密的文件。但运行后出现如标题所描述的问题  #include <memory.h> #include <stdio.h> #include <string.h> #include <stdlib.h>  #include "aes.h"  #pragma comment(lib,"libeay32.lib")     char enString[1024]; 	char deString[1024];  void testAes(char inString[], int inLen, char passwd[], int pwdLen) { 	int i,j, len, nLoop, nRes;   	unsigned char buf[16]; 	unsigned char buf2[16]; 	unsigned char aes_keybuf[32]; 	AES_KEY aeskey;  	// 准备32字节(256位)的AES密码字节 	memset(aes_keybuf,0x90,32); 	if(pwdLen<32){ len=pwdLen; } else { len=32;} 	for(i=0;i<len;i++) aes_keybuf[i]=passwd[i]; 	// 输入字节串分组成16字节的块	 	nLoop=inLen/16; nRes = inLen%16; 	// 加密输入的字节串 	AES_set_encrypt_key(aes_keybuf,256,&aeskey); 	for(i=0;i<nLoop;i++){ 		memset(buf,0,16); 		for(j=0;j<16;j++) buf[j]=inString[i*16+j]; 		AES_encrypt(buf,buf2,&aeskey); 		for(j=0;j<16;j++) enString[i*16+j]=buf2[j]; 	} 	if(nRes>0){ 		memset(buf,0,16); 		for(j=0;j<nRes;j++) buf[j]=inString[i*16+j]; 		AES_encrypt(buf,buf2,&aeskey); 		for(j=0;j<16;j++) enString[i*16+j]=buf2[j]; 		//puts("encrypt"); 	} 	enString[i*16+j]=0; 	// 密文串的解密	 	AES_set_decrypt_key(aes_keybuf,256,&aeskey); 	for(i=0;i<nLoop;i++){ 		memset(buf,0,16); 		for(j=0;j<16;j++) buf[j]=enString[i*16+j]; 		AES_decrypt(buf,buf2,&aeskey); 		for(j=0;j<16;j++) deString[i*16+j]=buf2[j]; 	} 	if(nRes>0){ 		memset(buf,0,16); 		for(j=0;j<16;j++) buf[j]=enString[i*16+j]; 		AES_decrypt(buf,buf2,&aeskey); 		for(j=0;j<16;j++) deString[i*16+j]=buf2[j]; 		//puts("decrypt"); 	} 	deString[i*16+nRes]=0; 	//比较解密后的串是否与输入的原始串相同 	 }  int main(int argc, char* argv[]) {    	FILE *fp1,*fp2; 	int i=0; 	int j=0; 	char inString[1024]={0};     char enfilename[256]; 	char defilename[256]; 	char passwd[32]={0}; 	int x; 	while(1) 	{ 	printf("------选择模式------\n"); 	printf("1.enc\n"); 	printf("2.dec\n"); 	printf("3.exit\n"); 	scanf("%d",&x); 	printf("\n");      	if(x==3)       break; 	switch(x) 	{ 	case 1:printf("input enfile name:");            gets(enfilename); 		   fp1=fopen(enfilename,"r"); 		   if(fp1==NULL) 		   { 		   printf("error\n"); 		   getchar(); 		   exit(0); 		   } 		   fclose(fp1); 		   while(inString[i]!='\0') 		   {fscanf(fp1,"%c",inString[i]);  刚刚fclose了，fp1已经无效！后面还有类似情况 		   i++; 		   }  		   printf("input key:\n"); 		   scanf("%c",&passwd); 		   testAes(inString, strlen(inString), passwd, strlen(passwd)); 		   		   fp2=fopen("cipher.txt","w"); 		   if(fp2==NULL) 		   { 			 printf("error\n"); 			 getchar(); 			 exit(0); 		   }             while(enString[j]!='\0') 		   {fscanf(fp2,"%c",enString[j]); 		   j++; 		   } 		   fclose(fp2);  		   break;   	case 2:printf("input defile name:");            gets(defilename); 		   fp1=fopen(defilename,"r"); 		   if(fp1==NULL) 		   { 		   printf("error\n"); 		   getchar(); 		   exit(0); 		   } 		   fclose(fp1); 		   while(inString[i]!='\0') 		   {fscanf(fp1,"%c",inString[i]); 		   i++; 		   } 		   printf("input key:\n"); 		   scanf("%c",&passwd); 		   testAes(inString, strlen(inString), passwd, strlen(passwd)); 		   		   if(fp2==NULL) 		   { 			 printf("error\n"); 			 getchar(); 			 exit(0); 		   } 		  fp2=fopen("decipher.txt","w"); 		     while(deString[j]!='\0') 		   {fscanf(fp2,"%c",deString[j]); 		   j++; 		   } 			   fclose(fp2); 		   break; 	       default:printf("error\n"); 		break;     } 	     } 	return 0; } 至少fclose之后再用文件指针有问题[/quote] 我想把文件里的内容赋值到数组里，请问怎么改

仅供参考：#pragma comment(lib, "crypt32.lib") #pragma comment(lib, "advapi32.lib") #define _WIN32_WINNT 0x0400 #include <stdio.h> #include <windows.h> #include <wincrypt.h> #define KEYLENGTH  0x00800000 void HandleError(char *s); //-------------------------------------------------------------------- //  These additional #define statements are required. #define ENCRYPT_ALGORITHM CALG_RC4 #define ENCRYPT_BLOCK_SIZE 8 //   Declare the function EncryptFile. The function definition //   follows main. BOOL EncryptFile(     PCHAR szSource,     PCHAR szDestination,     PCHAR szPassword); //-------------------------------------------------------------------- //   Begin main. void main(void) {     CHAR szSource[100];     CHAR szDestination[100];     CHAR szPassword[100];     printf("Encrypt a file. \n\n");     printf("Enter the name of the file to be encrypted: ");     scanf("%s",szSource);     printf("Enter the name of the output file: ");     scanf("%s",szDestination);     printf("Enter the password:");     scanf("%s",szPassword);     //--------------------------------------------------------------------     // Call EncryptFile to do the actual encryption.     if(EncryptFile(szSource, szDestination, szPassword)) {         printf("Encryption of the file %s was a success. \n", szSource);         printf("The encrypted data is in file %s.\n",szDestination);     } else {         HandleError("Error encrypting file!");     } } // End of main //-------------------------------------------------------------------- //   Code for the function EncryptFile called by main. static BOOL EncryptFile(     PCHAR szSource,     PCHAR szDestination,     PCHAR szPassword) //-------------------------------------------------------------------- //   Parameters passed are: //     szSource, the name of the input, a plaintext file. //     szDestination, the name of the output, an encrypted file to be //         created. //     szPassword, the password. {     //--------------------------------------------------------------------     //   Declare and initialize local variables.     FILE *hSource;     FILE *hDestination;     HCRYPTPROV hCryptProv;     HCRYPTKEY hKey;     HCRYPTHASH hHash;     PBYTE pbBuffer;     DWORD dwBlockLen;     DWORD dwBufferLen;     DWORD dwCount;     //--------------------------------------------------------------------     // Open source file.     if(hSource = fopen(szSource,"rb")) {         printf("The source plaintext file, %s, is open. \n", szSource);     } else {         HandleError("Error opening source plaintext file!");     }     //--------------------------------------------------------------------     // Open destination file.     if(hDestination = fopen(szDestination,"wb")) {         printf("Destination file %s is open. \n", szDestination);     } else {         HandleError("Error opening destination ciphertext file!");     }     //以下获得一个CSP句柄     if(CryptAcquireContext(                 &hCryptProv,                 NULL,               //NULL表示使用默认密钥容器，默认密钥容器名                 //为用户登陆名                 NULL,                 PROV_RSA_FULL,                 0)) {         printf("A cryptographic provider has been acquired. \n");     } else {         if(CryptAcquireContext(                     &hCryptProv,                     NULL,                     NULL,                     PROV_RSA_FULL,                     CRYPT_NEWKEYSET))//创建密钥容器         {             //创建密钥容器成功，并得到CSP句柄             printf("A new key container has been created.\n");         } else {             HandleError("Could not create a new key container.\n");         }     }     //--------------------------------------------------------------------     // 创建一个会话密钥（session key）     // 会话密钥也叫对称密钥，用于对称加密算法。     // （注: 一个Session是指从调用函数CryptAcquireContext到调用函数     //   CryptReleaseContext 期间的阶段。会话密钥只能存在于一个会话过程）     //--------------------------------------------------------------------     // Create a hash object.     if(CryptCreateHash(                 hCryptProv,                 CALG_MD5,                 0,                 0,                 &hHash)) {         printf("A hash object has been created. \n");     } else {         HandleError("Error during CryptCreateHash!\n");     }     //--------------------------------------------------------------------     // 用输入的密码产生一个散列     if(CryptHashData(                 hHash,                 (BYTE *)szPassword,                 strlen(szPassword),                 0)) {         printf("The password has been added to the hash. \n");     } else {         HandleError("Error during CryptHashData. \n");     }     //--------------------------------------------------------------------     // 通过散列生成会话密钥     if(CryptDeriveKey(                 hCryptProv,                 ENCRYPT_ALGORITHM,                 hHash,                 KEYLENGTH,                 &hKey)) {         printf("An encryption key is derived from the password hash. \n");     } else {         HandleError("Error during CryptDeriveKey!\n");     }     //--------------------------------------------------------------------     // Destroy the hash object.     CryptDestroyHash(hHash);     hHash = NULL;     //--------------------------------------------------------------------     //  The session key is now ready.     //--------------------------------------------------------------------     // 因为加密算法是按ENCRYPT_BLOCK_SIZE 大小的块加密的，所以被加密的     // 数据长度必须是ENCRYPT_BLOCK_SIZE 的整数倍。下面计算一次加密的     // 数据长度。     dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE;     //--------------------------------------------------------------------     // Determine the block size. If a block cipher is used,     // it must have room for an extra block.     if(ENCRYPT_BLOCK_SIZE > 1)         dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE;     else         dwBufferLen = dwBlockLen;     //--------------------------------------------------------------------     // Allocate memory.     if(pbBuffer = (BYTE *)malloc(dwBufferLen)) {         printf("Memory has been allocated for the buffer. \n");     } else {         HandleError("Out of memory. \n");     }     //--------------------------------------------------------------------     // In a do loop, encrypt the source file and write to the destination file.     do {         //--------------------------------------------------------------------         // Read up to dwBlockLen bytes from the source file.         dwCount = fread(pbBuffer, 1, dwBlockLen, hSource);         if(ferror(hSource)) {             HandleError("Error reading plaintext!\n");         }         //--------------------------------------------------------------------         // 加密数据         if(!CryptEncrypt(                     hKey,           //密钥                     0,              //如果数据同时进行散列和加密，这里传入一个                     //散列对象                     feof(hSource),  //如果是最后一个被加密的块，输入TRUE.如果不是输.                     //入FALSE这里通过判断是否到文件尾来决定是否为                     //最后一块。                     0,              //保留                     pbBuffer,       //输入被加密数据，输出加密后的数据                     &dwCount,       //输入被加密数据实际长度，输出加密后数据长度                     dwBufferLen))   //pbBuffer的大小。         {             HandleError("Error during CryptEncrypt. \n");         }         //--------------------------------------------------------------------         // Write data to the destination file.         fwrite(pbBuffer, 1, dwCount, hDestination);         if(ferror(hDestination)) {             HandleError("Error writing ciphertext.");         }     } while(!feof(hSource));     //--------------------------------------------------------------------     //  End the do loop when the last block of the source file has been     //  read, encrypted, and written to the destination file.     //--------------------------------------------------------------------     // Close files.     if(hSource)         fclose(hSource);     if(hDestination)         fclose(hDestination);     //--------------------------------------------------------------------     // Free memory.     if(pbBuffer)         free(pbBuffer);     //--------------------------------------------------------------------     // Destroy session key.     if(hKey)         CryptDestroyKey(hKey);     //--------------------------------------------------------------------     // Destroy hash object.     if(hHash)         CryptDestroyHash(hHash);     //--------------------------------------------------------------------     // Release provider handle.     if(hCryptProv)         CryptReleaseContext(hCryptProv, 0);     return(TRUE); } // End of Encryptfile //-------------------------------------------------------------------- //  This example uses the function HandleError, a simple error //  handling function, to print an error message to the standard error //  (stderr) file and exit the program. //  For most applications, replace this function with one //  that does more extensive error reporting. void HandleError(char *s) {     fprintf(stderr,"An error occurred in running the program. \n");     fprintf(stderr,"%s\n",s);     fprintf(stderr, "Error number %x.\n", GetLastError());     fprintf(stderr, "Program terminating. \n");     exit(1); } // End of HandleError

引用 楼主 zcyang911 的回复:本人想实现AES对文件内容的加密与解密。输入文件名，输出加密的文件；输入加密的文件，输出解密的文件。但运行后出现如标题所描述的问题  #include <memory.h> #include <stdio.h> #include <string.h> #include <stdlib.h>  #include "aes.h"  #pragma comment(lib,"libeay32.lib")     char enString[1024]; 	char deString[1024];  void testAes(char inString[], int inLen, char passwd[], int pwdLen) { 	int i,j, len, nLoop, nRes;   	unsigned char buf[16]; 	unsigned char buf2[16]; 	unsigned char aes_keybuf[32]; 	AES_KEY aeskey;  	// 准备32字节(256位)的AES密码字节 	memset(aes_keybuf,0x90,32); 	if(pwdLen<32){ len=pwdLen; } else { len=32;} 	for(i=0;i<len;i++) aes_keybuf[i]=passwd[i]; 	// 输入字节串分组成16字节的块	 	nLoop=inLen/16; nRes = inLen%16; 	// 加密输入的字节串 	AES_set_encrypt_key(aes_keybuf,256,&aeskey); 	for(i=0;i<nLoop;i++){ 		memset(buf,0,16); 		for(j=0;j<16;j++) buf[j]=inString[i*16+j]; 		AES_encrypt(buf,buf2,&aeskey); 		for(j=0;j<16;j++) enString[i*16+j]=buf2[j]; 	} 	if(nRes>0){ 		memset(buf,0,16); 		for(j=0;j<nRes;j++) buf[j]=inString[i*16+j]; 		AES_encrypt(buf,buf2,&aeskey); 		for(j=0;j<16;j++) enString[i*16+j]=buf2[j]; 		//puts("encrypt"); 	} 	enString[i*16+j]=0; 	// 密文串的解密	 	AES_set_decrypt_key(aes_keybuf,256,&aeskey); 	for(i=0;i<nLoop;i++){ 		memset(buf,0,16); 		for(j=0;j<16;j++) buf[j]=enString[i*16+j]; 		AES_decrypt(buf,buf2,&aeskey); 		for(j=0;j<16;j++) deString[i*16+j]=buf2[j]; 	} 	if(nRes>0){ 		memset(buf,0,16); 		for(j=0;j<16;j++) buf[j]=enString[i*16+j]; 		AES_decrypt(buf,buf2,&aeskey); 		for(j=0;j<16;j++) deString[i*16+j]=buf2[j]; 		//puts("decrypt"); 	} 	deString[i*16+nRes]=0; 	//比较解密后的串是否与输入的原始串相同 	 }  int main(int argc, char* argv[]) {    	FILE *fp1,*fp2; 	int i=0; 	int j=0; 	char inString[1024]={0};     char enfilename[256]; 	char defilename[256]; 	char passwd[32]={0}; 	int x; 	while(1) 	{ 	printf("------选择模式------\n"); 	printf("1.enc\n"); 	printf("2.dec\n"); 	printf("3.exit\n"); 	scanf("%d",&x); 	printf("\n");      	if(x==3)       break; 	switch(x) 	{ 	case 1:printf("input enfile name:");            gets(enfilename); 		   fp1=fopen(enfilename,"r"); 		   if(fp1==NULL) 		   { 		   printf("error\n"); 		   getchar(); 		   exit(0); 		   } 		   fclose(fp1); 		   while(inString[i]!='\0') 		   {fscanf(fp1,"%c",inString[i]);  刚刚fclose了，fp1已经无效！后面还有类似情况 		   i++; 		   }  		   printf("input key:\n"); 		   scanf("%c",&passwd); 		   testAes(inString, strlen(inString), passwd, strlen(passwd)); 		   		   fp2=fopen("cipher.txt","w"); 		   if(fp2==NULL) 		   { 			 printf("error\n"); 			 getchar(); 			 exit(0); 		   }             while(enString[j]!='\0') 		   {fscanf(fp2,"%c",enString[j]); 		   j++; 		   } 		   fclose(fp2);  		   break;   	case 2:printf("input defile name:");            gets(defilename); 		   fp1=fopen(defilename,"r"); 		   if(fp1==NULL) 		   { 		   printf("error\n"); 		   getchar(); 		   exit(0); 		   } 		   fclose(fp1); 		   while(inString[i]!='\0') 		   {fscanf(fp1,"%c",inString[i]); 		   i++; 		   } 		   printf("input key:\n"); 		   scanf("%c",&passwd); 		   testAes(inString, strlen(inString), passwd, strlen(passwd)); 		   		   if(fp2==NULL) 		   { 			 printf("error\n"); 			 getchar(); 			 exit(0); 		   } 		  fp2=fopen("decipher.txt","w"); 		     while(deString[j]!='\0') 		   {fscanf(fp2,"%c",deString[j]); 		   j++; 		   } 			   fclose(fp2); 		   break; 	       default:printf("error\n"); 		break;     } 	     } 	return 0; } 至少fclose之后再用文件指针有问题


Question: func(++i, i++)  分析求助  C语言

引用 10 楼 qldsrx 的回复:在C语言中，函数的参数是从右到左的顺序压入到栈的，函数执行时再从栈弹出弹出来执行。 因此，先执行i++，压入的是0，然后i的值变为了1，然后执行++i，i的值变为了2，再压入这个i的值2，因此就得到了那个执行结果了。 下面说下C#语言，函数的参数是从左到右的顺序压入栈的，函数执行时，一次性弹出全部参数来执行。 因此，在C#里面执行的结果刚好相反，先执行++i后，压入1到栈里，再执行i++，压入的还是1，之后i变为了2。  所以这样的题目我个人认为意义不大，避免使用这种复用的++运算符就可以了。  C语言不是后压入栈的先出栈么，所以应该是先执行++i的吧！请指教

引用 2 楼 qldsrx 的回复:不建议在函数或表达式计算中使用这种复用的++运算符，不同的语言，不同的编译器，处理方式是不同的，你搞清这个了，换一个场景可能会不一样，这是自找麻烦，你直接定义两个变量，计算好了传递不是就好了吗？你好，我这题是在网上做C语言的测试题做到的，实际中我不会这样写的！

引用 3 楼 wang0635 的回复:哪个老师出的题？这个是我在网上做c语言的题目做到的！

引用 4 楼 liunian_MEI 的回复:func(++i,i++); C语言的顺序，自右向左 i=0 i++后为1，但是++在后，先赋值后+1 ++i，先加1，后赋值 因此 v1=2 v2=0  还有我想说一句，人家只是来问一个问题，这个问题可能对于你很简单，但是别人不是，我觉得给建议可以，但是至少是在帮别人解决完问题后你以为你在是在解决问题?? 请冷静的看看别人的回答 别误人子弟

1.搞清楚 ++i和i++的返回值。 2.搞清楚所用编译执行函数时参数执行顺序。 3.散分吧

引用 3 楼 wang0635 的回复:哪个老师出的题？ 谭浩强的第八代徒孙。

哪个老师出的题？

[置顶] [C/C++板块推荐阅读] 关于C,C++表达式求值顺序. [推荐]


Question: 大神求解~~~C语言*与++、--操作的优先级问题

引用 5 楼 wang0635的回复:函数的实际参数，求值顺序没有规定 编译器爱怎么做就怎么做 C语言没有规定该按什么顺序 所以，在参数表中修改变量的值，是所谓的“未定义”行为，任何结果都有可能出现，所有的解释只是解释巧合现象，真正的程序员严禁编写这种代码 哦哦，明白了~马上扔书~

引用 3 楼 Static_Love 的回复:引用 2 楼 wang0635 的回复:你都看的什么书啊，还不扔掉求讲解啊~~我是这么理解的            1    2    3    4    5             ^             p int    *p=a; 所以p指向的是数组的首地址 printf函数中从右往左的输出的值依次是 *p：因为p指向数组首地址，所以*p的值是1; --(*p):因为*p=1，所以--(*p)=1-1=0,*p的值就变成了0， 数组就变成了：0    2    3    4    5; *p--:*p=0,然后p的指针减去1就指向了首地址前一个地址了         0     2     3     4     5   ^  p *p:所以*p指向的是一个随机数 (*p)++:因为是后++，所以(*p)++的值还是上一个的随机数 *(++p):因为++p，所以p的地址有重新指向了数组的首地址，所以*(++p)=0; *p:所以*p还是=0; 所以最后的输出结果是：0    0    随机数    随机数    0    0    1 Linux系统下的输出跟这个是一样的 但是windows系统下输出的是：2    2    0    0    0    0    1

引用 2 楼 wang0635 的回复:你都看的什么书啊，还不扔掉求讲解啊~~

你都看的什么书啊，还不扔掉

未定义行为，参见置顶：  http://bbs.csdn.net/topics/370153775


Question: 编译原理NFA转化DFA，输出结果还要用图像把DFA用弧和圆的图像表示，用vs或vc++6.0怎么做？

参考VBA for Visio ?


Question: 我已经引用了组件文件，但是为何编译失败，提示文件不存在？

我输入了 但是报错了 写法不对

using namespace XXX;//?


Question: 在xp中使用dir查询文件夹里的文件，结果是没有完全按照文件名大小来排序

谢谢，问题解决，结贴

设置环境变量dircmd=/on


Question: C语言定义一个整形变量  以字符型输入   再以整形输出  为啥会是这样的结果

一个int应该有4个字节，你只修改了其中的一个字节，其它三个字节的内容未知，当你重新输出的时候，输出的四个字节的内容，如果你输出16进制，应该可以看到你输入的46(A的十六进制数据）。所以结果和你预想的不一样，解决的方法是int a=0; 清除原来四个字节的内容，应该就没有问题了，你可以试试。

不赋初值，里面也是有值的。  其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

引用 3 楼 zhao4zhong1 的回复:#include<stdlib.h> #include<stdio.h> int main() { int a=0x12345678; printf("input the data\n"); scanf_s("%c", &a,1); printf("%08x\n",a); putchar(a%128); system ("pause"); return 0; }   请问为何实现赋初值之后  会正确 ？

你的程序错了，出现什么结果都有可能。

请检查scanf函数的返回值


Question: 分数序列求和

引用 7 楼 qq_31521965 的回复:[quote=引用 3 楼 llq108 的回复:] 如果a和b都是整数，值分别是1和2，那相除出来的结果是0。但其实结果应该是0.5，所以要用浮点数来表示。    好像就是这样..意思就是其实也可以定义a b为整数型 只要将其改变形态就行啦吗？ 就像2/4是整数 而2/4.0 是浮点数这样吗？[/quote]  int a = 2,b = 4; float c = a / float(b); //你这样得到的c就是0.5了

引用 3 楼 llq108 的回复:如果a和b都是整数，值分别是1和2，那相除出来的结果是0。但其实结果应该是0.5，所以要用浮点数来表示。    好像就是这样..意思就是其实也可以定义a b为整数型 只要将其改变形态就行啦吗？ 就像2/4是整数 而2/4.0 是浮点数这样吗？

分数的结果一般有小数点，结果为浮点型，如果定义为整型，得不到结果。

这里边也是有精度问题的~应该先通分。

两个整形除出来还是整形啊

可以啊，只是不那么方便，但是更加准确， 毕竟分数是整数相除的结果，不是实数相除的结果。


Question: c语言中如何对负数开平方返回相应的复数

楼主问的是用c语言,所以参见http://en.cppreference.com/w/c/numeric/complex/csqrt

//sqrt complex example #include <iostream> #include <complex> using namespace std; int main() {     complex<double> mycomplex (-1.0,0.0);     cout << "The sqrt value of " << mycomplex << " is " << sqrt(mycomplex) << '\n';     return 0; } //The sqrt value of (-1,0) is (0,1) //

n1570:  7.3.8.3 The csqrt functions Synopsis 1 #include <complex.h> double complex csqrt(double complex z); float complex csqrtf(float complex z); long double complex csqrtl(long double complex z); Description 2 The csqrt functions compute the complex square root of z, with a branch cut along the negative real axis. Returns 3 The csqrt functions return the complex square root value, in the range of the right halfplane (including the imaginary axis).


Question: 求各位大牛解答

引用 4 楼 zhao4zhong1 的回复://首先输入一个正整数P（1 ≤ P ≤10000），代表了所有产品的总数，接下来是P行字符串（均是小写，长度不超过20个字符）。 //然后输入一个正整数Q（1 ≤ Q ≤100000），Q代表了记得的关键字符串的个数，接下来是Q行关键字字符串。 //输出Q行，每行对应第Q个关键字字符串在所有产品中出现的次数。 #include <stdio.h> bool find(char *a, char *b) {     int i,j,k;     bool found=false;      for (i=0; a[i]!=0; i++) {         for (j=i, k=0; a[j]==b[k] && a[j]!=0; j++, k++);         if (b[k]==0) {             found=true;             break;         }     }     return found; } int main() {     static char a[10000][21];     static char b[100000][21];     int P,Q;     int i,j;     int sum;      scanf("%d",&P);     for (i=0;i<P;i++) {         scanf("%20s",a[i]);     }     scanf("%d",&Q);     for (j=0;j<Q;j++) {         scanf("%20s",b[j]);     }     for (j=0;j<Q;j++) {         sum=0;         for (i=0;i<P;i++) {             if (find(a[i],b[j])) sum++;         }         printf("%d\n",sum);     }     return 0; } //输入： //3 //abc //abcdef //xyz //4 //abc //xyz //def //lmn //输出： //2 //1 //1 //0 //    看懂了，谢谢

引用 3 楼 qq986353946 的回复:[quote=引用 1 楼 github_27756899 的回复:] scanf("%s",a[i]);    改为:      scanf("%s",a);  scanf("%s",b[i]);    改为:      scanf("%s",b);  仅修改了一部分。这样改了以后能运行，但是没有达到题目效果啊[/quote] 楼上  赵4老师 已给出代码。

//输入： //3 //aaa //aa //aaaa //1 //aa //输出： //3 //

引用 1 楼 github_27756899 的回复:scanf("%s",a[i]);    改为:      scanf("%s",a);  scanf("%s",b[i]);    改为:      scanf("%s",b);  仅修改了一部分。这样改了以后能运行，但是没有达到题目效果啊

这样改了以后能运行，但是没有达到题目效果啊


Question: 为什么强制转换来判断一个数是否含有小数,在某些情款失效?

十进制浮点数都会存在无穷循环的情况，更何况很多十进制浮点数用二进制就没法精确表示，如0.1，除非你用一些特别的方法来实现精确表示 通常比较两个浮点数是否相等，可以比较两个浮点数的差的绝对值是否小于一个很小的正数，如0.000001

引用 2 楼 zhao4zhong1 的回复:http://img.my.csdn.net/uploads/201301/04/1357276191_5263.jpg 怎么到这样子的资料?

这个问题不要用浮点型。 直接读入字符串，然后记录小数点的位置，删掉小数点，剩下的部分作为分子，根据小数点位置生成分母。 浮点数经常有误差，不适合这种操作。


Question: 非托管dll引用，函数结构体调用报错

不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！ 楼主无视本ID的回复，祝楼主泪奔一辈子！

能来点干货吗？琢磨了这么久还是不会写了。老是报出：未能从程序集“EPC, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型“report”，因为它在 8 偏移位置处包含一个对象字段，该字段已由一个非对象字段不正确地对齐或重叠。  就调用了简单的dll有这么难吗？泪奔了

C#的char是2个字节的，C的char是一个字节，所以你只要留意这个char类型的转换，基本上没什么问题的。然后就是字节对其问题，是不是4字节对齐需要测试，最好的方法是，C#和C语言里面各自检查最终的结构体长度，只要结构体长度一样，P/Invoke就不会出现内存问题，最多就是数据莫名其妙。 C语言里面直接用sizeof来获取结构体长度，C#里面用Marshal.SizeOf函数来获取，比较这个长度是参数问题检查的最好方法。

就是函数运行到读取dll函数时出错了。怀疑是传参数不对，或结构体不对造成的。所以就提出结构体有联合体如何转c#语言，其他机构体基本和这个相同。 函数原型是：int test (int nDevHandle, AntId tAntId, DealReport *func) AntId结构体： #define ANTENNA_MAX_NUM (4)   typedef struct{       short wAntId[ANTENNA_MAX_NUM];    }AntId DealReport结构体 typedef struct Tag_Report{     union{         RoReport tRoReport;         EventReport tEventReport;     }report;     unsigned int  nResType; }Report;  *func是个回调函数，DealReport结构体比较复杂，是结构体中有联合体，比较复杂。 这些包括调用dll函数，怎么转到C#呢？

[StructLayout(LayoutKind.Sequential)]     public struct AntId     {        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]        public short[] wAntId;           } 在使用时报出，未将对象引用设置到对象的实例的错误。还有 c++中结构体中有联合体，转为c#这样子对吗 public struct Report      {          public reg report;        public uint nResType;      }      [StructLayout(LayoutKind.Explicit)]      public struct reg          {              [FieldOffset(0)]              public RoReport tRoReport;             [FieldOffset(0)]              public EventReport tEventReport;          }  求解答？？

不要定义class，必须定义struct才行StructLayout特性是针对struct的，而不是class（也许可以，反正我没试过） 然后在struct内部如果要定义array，必须增加[MarshalAs(UnmanagedType.ByValArray,SizeConst=4)]这样的特性来指定数组大小，不然你的数组可以后期动态改变大小的，自然内存就不对了。

有没有人我的问题啊

主要是我不清楚的你全部类型，也不清楚你的具体错误信息，所以也不好确定最终的问题是哪里。 比如你发帖时问的是函数read ，后来又突然蹦出个函数DealReport，现在干脆有来个函数test。你到底有多少个函数，自己也没交代清楚，原型也没整理好，看得别人很累，知道吗？

#define ANTENNA_MAX_NUM (4)  typedef struct{      short wAntId[ANTENNA_MAX_NUM];   }AntId; 长度是4啊，具体怎么分配。不是提示未将对象引用设置到对象的实例的错误，就是跳到 举行函数为：     int cc = DidCapture.test((int)nDevHandle, tAntId, ref dealReport); int cc = DidCapture.startInventory((int)nDevHandle, tAntId, ref dealReport);报错。原型为：int test (int nDevHandle, AntId tAntId, DealReport *func) RoReport 和EventReport是结构体的。 c++到c#数据类型转换不太懂

MarshalAs只是在P/Invoke的时候告诉被调用函数，这个地方的数组给了多少长度。但是这个数组的内存空间还是需要你来分配的呀。非托管代码无法识别托管代码中的Array类型，因此需要给一个长度参数，就用那个MarshalAs特性来告知。 联合体部分没错，当然类型RoReport 和EventReport也必须是结构体才行，如果是引用类型，那还是要出问题的。

仅供参考：#include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 // //A1.a 0 //A1.b 4 //A1.c 17 // //A2.a 0 //A2.b 4 //A2.c 18 // //A4.a 0 //A4.b 4 //A4.c 20 // //A8.a 0 //A8.b 4 //A8.c 24 // //A16.a 0 //A16.b 4 //A16.c 24 // //

请各位牛人帮一下忙，结构体还有结构体如何定义

c++函数原型 #define ANTENNA_MAX_NUM (4) typedef struct{     short wAntId[ANTENNA_MAX_NUM]; //天线1-4， 0表示天线未启用，1表示天线在用 }AntId; typedef void DealReport(Report *ptReport);回调函数 我定义的C#如下： 采用这种方法  public class Report     {         public reg report;         public uint nResType;//报告类型     }      [StructLayout(LayoutKind.Explicit)]     public struct reg         {             [FieldOffset(0)]             public RoReport tRoReport;            [FieldOffset(0)]             public EventReport tEventReport;         }  [StructLayout(LayoutKind.Sequential)]     public class AntId     {         public short[] wAntId = new short[4] { 0,0,0,0};     } 运行时报 “尝试读取或写入受保护的内存。这通常指示其他内存已损坏”这个错误。

1. c/c++中的struct 和 union在c#总都对应struct， 2. 如果嵌套，依次定义就可以使用。         //这个是基础结构体    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]     public struct SStruct1     {        //...     ｝        //嵌套使用     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]     public struct SStruct2     {        public SStruct1 m1;  //成员        //others            ｝    3.Union也对应struct： union{         ReadParam              tReadParam;         WriteParam             tWriteParam;     }op;  这么翻译   [System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]     public struct op     {          [FieldOffset(0)]         public  ReadParam tReadParam;             [FieldOffset(0)]         public WriteParam tReadParam;      ｝  4.基本类型，两种语言差不多，几乎可以直接对应  CharSet 和Pack 参数需要询问c/c++的提供方确认


Question: c语言能不能编程求克罗内克积

试试这个 #include <stdio.h> #include <stdlib.h>  //get an m*n matric's [i,j] element, a is a pointer to a[0][0] #define		E(a, rows, cols, i, j)		*(((a)+((i)*(cols)))+(j))  void print(double *a, int m, int n); double *kron(double *a, int m, int n, double *b, int p, int q);  int main() { 	double	a[2][3] = {{1,2,3},{4,5,6}}; 	double	b[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 	double	*c; 	print((double *)a, 2, 3); 	print((double *)b, 3, 4); 	c = kron((double *)a, 2, 3, (double *)b, 3, 4); 	if (c != NULL) 	{ 		print(c, 6, 12); 		free(c); 	} 	return 0; }  void print(double *a, int m, int n) { 	int		i, j; 	for (i = 0; i < m; i++) 	{ 		for (j = 0; j < n; j++) 			printf("%6.f", E(a, m, n, i, j)); 		printf("\n"); 	} }  double *kron(double *a, int m, int n, double *b, int p, int q) { 	double	*c; 	int		i, j, ii, jj; 	int		rows = m * p, cols = n * q; 	if (m <= 0 || n <= 0 || p <= 0 || q <= 0) 		return NULL; 	c = malloc(rows * cols * sizeof(double)); 	if (c == NULL) 		return NULL; 	for (i = 0; i < m; i++) 		for (j = 0; j < n; j++) 			for (ii = 0; ii < p; ii++) 				for (jj = 0; jj < q; jj++) 					E(c, rows, cols, i * p + ii, j * q +jj) = E(a, m, n, i, j) * E(b, p, q, ii, jj); 	return c; }


Question: 重复检查一段数字中的重复数求大神debug啊

引用 2 楼 qldsrx的回复:bool digit_seen[10] = { false }; 这个写法似乎有点问题，至少c语言里面，只会对数组的第一个元素进行初始化，后面9个元素都是不确定值，建议用bzero函数将数组全部内存置零。 其余的内啥问题，另外如果希望提高效率，可以不用scanf函数，而直接提取字符串后分析字符串的每个字符，scanf的性能不太好，还有兼容性问题。 这个初始化方法来自hnking的《C语言程序设计现代办法》，说是第一个为false其余的为0也相当于false。然后因为是C新手只能用scanf()函数啦

引用 3 楼 paschen的回复:下一次判断时需要恢复bool digit_seen[10]中元素的状态   int main() { 	bool digit_seen[10] = { false }; 	int digit; 	long number;  	for (;;) 	{ 		printf("Enter a number:"); 		scanf_s("%ld", &number);  		if (number <= 0) 			break; 		else 		{ 			for (; number > 0; ) 			{ 				digit = number % 10; 				if (digit_seen[digit]) 					break; 				digit_seen[digit] = true; 				number /= 10; 			} 			if (number > 0) 				printf("Repeated digit.\n"); 			else 				printf("No repeated digit.\n"); 		}  		for (int i = 0; i < 10; i++) 		{ 			digit_seen[i] = false; 		} 	} 	return 0; }   明了！也就是说要在每次输入数至少再次初始化数组为false的对吧，谢谢~

引用 1 楼 user-3的回复:测试数据是什么 测试数据？啊C语言新手不懂啊

测试数据是什么


Question: 请问为什么我输入了N后，没有跳出第一个while，反而进入了第一个while的无限循环

引用 11 楼 u014626834 的回复:[quote=引用 10 楼 hhhhhhhhhhkkkkkkkkkk 的回复:] 楼主你是没弄懂循环的真正意思，循环循环，说白了就是一次次的执行，执行完第一次又接着执行第二次。。。。。直到循环条件不满足为止。并不是执行完这次后就停在循环的最后那里。 就你写的这个代码，按N跳出第一个循环后会接着执行下面那个循环，当再按N后跳出第二个循环来到外面的循环，开始去测试1是不是真的（所有非0都是真的）所得的结果是真的，又接着执行里面的第一个循环。。。。。。。。。直到你关程序（因为1总是真的，所以总跳不出外面那个while）。  我的意思是，当我输入了N后，variable是N，已经不符合循环条件，为什么还会无限执行第一个循环[/quote] 它并没有无限执行第一个循环，当你第一次输入N后，就跳出了第一个循环进第二个循环里了，但是第二个循环的条件也是while (variable != 'N')，所以你第二次输入N后它就跳出第二个循环，因为外面还有个while (1)的循环，通过判断，需要继续执行while(1)里的内容，所以又跑去里面的第一个循环while (variable != 'N')里去了，当你第三次输入N里，跳出里面的第一个循环，进第二个循环。。。。。懂？

引用 4 楼 u014626834 的回复:[quote=引用 1 楼 u010370871 的回复:] while（1）没有跳出来  就算没有跳出来那也应该是在循环里什么都不做才对吧[/quote]  什么都不做就是死循环，你的这是两层循环，只跳出来了最里边那层，最外边那个没有跳出来所以会死！！！   再说一遍，你的这个程序是两层循环！

在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

你用 "%d" 读入，当输入不是数字时（比如你的 N ），scanf 会失败，而输入 'N' 不会被读出。  这样你的 scanf 就会持续失败，然而什么也读不进来。  请参考 6 楼

int variable = 0;  variable 是int型的n是char型的

一般循环内连续调用scanf需要刷新缓存，在scanf前加rewind（stdin）

可是就算没有跳出来也没有理由执行第一个循环吧，我不是输入了N吗

引用 1 楼 u010370871 的回复:while（1）没有跳出来  就算没有跳出来那也应该是在循环里什么都不做才对吧

没有给循环正常终止，那自然是无限循环

他是跳出来了，不过外面还有一个while(1)，这个就狠了，连出口都没有。

while（1）没有跳出来

引用 10 楼 hhhhhhhhhhkkkkkkkkkk 的回复:楼主你是没弄懂循环的真正意思，循环循环，说白了就是一次次的执行，执行完第一次又接着执行第二次。。。。。直到循环条件不满足为止。并不是执行完这次后就停在循环的最后那里。 就你写的这个代码，按N跳出第一个循环后会接着执行下面那个循环，当再按N后跳出第二个循环来到外面的循环，开始去测试1是不是真的（所有非0都是真的）所得的结果是真的，又接着执行里面的第一个循环。。。。。。。。。直到你关程序（因为1总是真的，所以总跳不出外面那个while）。  我的意思是，当我输入了N后，variable是N，已经不符合循环条件，为什么还会无限执行第一个循环


Question: 为什么提交poj第2250题时，代码第5,6行顺序对调后就会提示错误

并不是所有的错误都能被编译器和一个测试集发现。

但是正常可以提交正确，对调5,6行就不可以了

看5 6 行的内容，对调应该不会对一个正确的程序产生影响。  你的程序应该是在别的地方有错误。内存写出界的可能性大。自己调一下吧。


Question: 求助：IAR中建立ARM9工程，遇到Error[40]: Bad instruction

引用 1 楼 user-1 的回复:指令是rvds的，用armcc才行。  我想把程序移植到IAR for arm上，昨天有研究了一下，感觉是iar在汇编文件的格式上和gcc 或armcc的格式不同，我会继续研究，还希望大家多给建议。

指令是rvds的，用armcc才行。


Question: 求指点，程序报错glibc detected *** ./pool: free(): invalid next size (fast)

发现问题了，是第37行 block->first_p = malloc(sizeof(size)); 应该改为 block->first_p = malloc(size); 这里多加了一个sizeof，致使无论size是多少，分配的内存是4个字节了

仅供参考：//将c:\\tmp文件夹下的所有文件的内容全部放到用malloc分配的内存中 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <io.h> struct FB {     char fn[256];     size_t fl;     char *b;     struct FB *next;     struct FB *prev; } *fh,*fb,*ft; char ln[256]; char fpn[256]; FILE *af; FILE *f; int L,n; int main() {     system("dir /b /a-d c:\\tmp\\*.* >c:\\allfn.txt");     af=fopen("c:\\allfn.txt","r");     if (NULL==af) {         printf("Can not open file c:\\allfn.txt!\n");         return 1;     }     fh=NULL;     fb=NULL;     n=0;     while (1) {         if (NULL==fgets(ln,256,af)) break;         L=strlen(ln);         if ('\n'==ln[L-1]) ln[L-1]=0;         printf("read %s\n",ln);         strcpy(fpn,"c:\\tmp\\");         strcat(fpn,ln);         ft=(struct FB *)malloc(sizeof(struct FB));         if (NULL==ft) {             printf("Can not malloc ft!\n");             fclose(af);             return 2;//之前的malloc在main退出后由操作系统自动free         }         printf("ft[%d]==%p\n",n,ft);         strcpy(ft->fn,fpn);         f=fopen(fpn,"rb");         if (NULL==f) {             printf("Can not open file %s!\n",fpn);             fclose(af);             return 3;//之前的malloc在main退出后由操作系统自动free         }         ft->fl=_filelength(fileno(f));         ft->b=malloc(ft->fl);         if (NULL==ft->b) {             printf("Can not malloc ft->b!\n");             fclose(f);             fclose(af);             return 4;//之前的malloc在main退出后由操作系统自动free         }         printf("ft[%d]->b==%p\n",n,ft->b);         if (ft->fl!=fread(ft->b,1,ft->fl,f)) {             printf("fread error!\n");             fclose(f);             fclose(af);             return 5;//之前的malloc在main退出后由操作系统自动free         }         fclose(f);         ft->next=NULL;          if (NULL==fh) {             ft->prev=NULL;             fh=ft;         } else {             fb->next=ft;             ft->prev=fb;         }         fb=ft;         n++;     }     fclose(af);     printf("-----list-----\n");     for (ft=fh;NULL!=ft;ft=ft->next) {         printf("%8d %s\n",ft->fl,ft->fn);         if (NULL!=ft) fb=ft;     }     printf("-----free-----\n");     n--;     if (NULL!=fh) {         for (ft=fb->prev;NULL!=ft;ft=ft->prev) {             if (NULL!=ft->next->b) {                 printf("ft[%d]->b==%p\n",n,ft->next->b);                 free(ft->next->b);             }             if (NULL!=ft->next) {                 printf("ft[%d]==%p\n",n,ft->next);                 free(ft->next);             }             n--;         }         if (NULL!=fh->b) {             printf("ft[0]->b==%p\n",fh->b);             free(fh->b);         }         printf("ft[0]==%p\n",fh);         free(fh);     }     return 0; } //C:\tmp\tmp\Debug>dir /a-d c:\tmp // 驱动器 C 中的卷是 C_HD5_1 // 卷的序列号是 1817-D526 // // c:\tmp 的目录 // //找不到文件 // //C:\tmp\tmp\Debug>tmp //找不到文件 //-----list----- //-----free----- // //C:\tmp\tmp\Debug>dir /a-d c:\tmp // 驱动器 C 中的卷是 C_HD5_1 // 卷的序列号是 1817-D526 // // c:\tmp 的目录 // //2011-06-30  18:04            44,840 my_c.rar //2011-06-30  17:18             1,036 err.frm //2011-06-30  14:32            14,243 出租.txt //2011-06-28  12:08            23,681 MSDN98书签.txt //             4 个文件         83,800 字节 //             0 个目录 17,041,870,848 可用字节 // //C:\tmp\tmp\Debug>tmp //read my_c.rar //ft[0]==00421800 //ft[0]->b==00520068 //read err.frm //ft[1]==00421670 //ft[1]->b==0052AFC0 //read 出租.txt //ft[2]==00421530 //ft[2]->b==00378F28 //read MSDN98书签.txt //ft[3]==004213F0 //ft[3]->b==0052B3F8 //-----list----- // 44840 c:\tmp\my_c.rar //  1036 c:\tmp\err.frm // 14243 c:\tmp\出租.txt // 23681 c:\tmp\MSDN98书签.txt //-----free----- //ft[3]->b==0052B3F8 //ft[3]==004213F0 //ft[2]->b==00378F28 //ft[2]==00421530 //ft[1]->b==0052AFC0 //ft[1]==00421670 //ft[0]->b==00520068 //ft[0]==00421800 // //C:\tmp\tmp\Debug>