Question: 死循环

for(i = 0;i <= 10; i +=0.1)

仅供参考#include <stdio.h> #include <stdlib.h> #include <string.h> float f; double d; void showf() {     char bs[65];     char b[65];     unsigned char *p;     char e[12];     char *t;     int ex;      printf("\nf=%.6f\n",f);     p=(unsigned char *)&f;     printf("hex=%02X %02X %02X %02X\n",p[3],p[2],p[1],p[0]);     ltoa(*(long *)&f,b,2);     sprintf(bs,"%032s",b);     printf("bin=%s\n",bs);     printf("bin=%.1s %.8s   %s\n",bs,bs+1,bs+9);     strncpy(e,bs+1,8);e[8]=0;     ex=strtol(e,&t,2);     printf("    %c %-4d-127 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+9);     ex-=127;     printf("    %c %-8d 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+9); } void showd() {     char bs[65];     char b[65];     unsigned char *p;     char e[12];     char *t;     int ex;      printf("\nd=%.15lf\n",d);     p=(unsigned char *)&d;     printf("hex=%02X %02X %02X %02X %02X %02X %02X %02X\n",p[7],p[6],p[5],p[4],p[3],p[2],p[1],p[0]);     _i64toa(*(__int64 *)&d,b,2);     sprintf(bs,"%064s",b);     printf("bin=%s\n",bs);     printf("bin=%.1s %.11s   %s\n",bs,bs+1,bs+12);     strncpy(e,bs+1,11);e[11]=0;     ex=strtol(e,&t,2);     printf("    %c %-6d-1023 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+12);     ex-=1023;     printf("    %c %-11d 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+12); } int main() {      for (f=0.0f;f<=2.2f;f+=0.2f) showf();     printf("------------\n");     f=2.0f;showf();     printf("-----------------------------------\n");     for (d=0.0 ;d<=2.2 ;d+=0.2 ) showd();     printf("------------\n");     d=2.0 ;showd();      return 0; } // //f=0.000000 //hex=00 00 00 00 //bin=00000000000000000000000000000000 //bin=0 00000000   00000000000000000000000 //  + 0   -127 1.00000000000000000000000 //  + -127     1.00000000000000000000000 // //f=0.200000 //hex=3E 4C CC CD //bin=00111110010011001100110011001101 //bin=0 01111100   10011001100110011001101 //  + 124 -127 1.10011001100110011001101 //  + -3       1.10011001100110011001101 // //f=0.400000 //hex=3E CC CC CD //bin=00111110110011001100110011001101 //bin=0 01111101   10011001100110011001101 //  + 125 -127 1.10011001100110011001101 //  + -2       1.10011001100110011001101 // //f=0.600000 //hex=3F 19 99 9A //bin=00111111000110011001100110011010 //bin=0 01111110   00110011001100110011010 //  + 126 -127 1.00110011001100110011010 //  + -1       1.00110011001100110011010 // //f=0.800000 //hex=3F 4C CC CD //bin=00111111010011001100110011001101 //bin=0 01111110   10011001100110011001101 //  + 126 -127 1.10011001100110011001101 //  + -1       1.10011001100110011001101 // //f=1.000000 //hex=3F 80 00 00 //bin=00111111100000000000000000000000 //bin=0 01111111   00000000000000000000000 //  + 127 -127 1.00000000000000000000000 //  + 0        1.00000000000000000000000 // //f=1.200000 //hex=3F 99 99 9A //bin=00111111100110011001100110011010 //bin=0 01111111   00110011001100110011010 //  + 127 -127 1.00110011001100110011010 //  + 0        1.00110011001100110011010 // //f=1.400000 //hex=3F B3 33 34 //bin=00111111101100110011001100110100 //bin=0 01111111   01100110011001100110100 //  + 127 -127 1.01100110011001100110100 //  + 0        1.01100110011001100110100 // //f=1.600000 //hex=3F CC CC CE //bin=00111111110011001100110011001110 //bin=0 01111111   10011001100110011001110 //  + 127 -127 1.10011001100110011001110 //  + 0        1.10011001100110011001110 // //f=1.800000 //hex=3F E6 66 68 //bin=00111111111001100110011001101000 //bin=0 01111111   11001100110011001101000 //  + 127 -127 1.11001100110011001101000 //  + 0        1.11001100110011001101000 // //f=2.000000 //hex=40 00 00 01 //bin=01000000000000000000000000000001 //bin=0 10000000   00000000000000000000001 //  + 128 -127 1.00000000000000000000001 //  + 1        1.00000000000000000000001 //------------ // //f=2.000000 //hex=40 00 00 00 //bin=01000000000000000000000000000000 //bin=0 10000000   00000000000000000000000 //  + 128 -127 1.00000000000000000000000 //  + 1        1.00000000000000000000000 //----------------------------------- // //d=0.000000000000000 //hex=00 00 00 00 00 00 00 00 //bin=0000000000000000000000000000000000000000000000000000000000000000 //bin=0 00000000000   0000000000000000000000000000000000000000000000000000 //  + 0     -1023 1.0000000000000000000000000000000000000000000000000000 //  + -1023       1.0000000000000000000000000000000000000000000000000000 // //d=0.200000000000000 //hex=3F C9 99 99 99 99 99 9A //bin=0011111111001001100110011001100110011001100110011001100110011010 //bin=0 01111111100   1001100110011001100110011001100110011001100110011010 //  + 1020  -1023 1.1001100110011001100110011001100110011001100110011010 //  + -3          1.1001100110011001100110011001100110011001100110011010 // //d=0.400000000000000 //hex=3F D9 99 99 99 99 99 9A //bin=0011111111011001100110011001100110011001100110011001100110011010 //bin=0 01111111101   1001100110011001100110011001100110011001100110011010 //  + 1021  -1023 1.1001100110011001100110011001100110011001100110011010 //  + -2          1.1001100110011001100110011001100110011001100110011010 // //d=0.600000000000000 //hex=3F E3 33 33 33 33 33 34 //bin=0011111111100011001100110011001100110011001100110011001100110100 //bin=0 01111111110   0011001100110011001100110011001100110011001100110100 //  + 1022  -1023 1.0011001100110011001100110011001100110011001100110100 //  + -1          1.0011001100110011001100110011001100110011001100110100 // //d=0.800000000000000 //hex=3F E9 99 99 99 99 99 9A //bin=0011111111101001100110011001100110011001100110011001100110011010 //bin=0 01111111110   1001100110011001100110011001100110011001100110011010 //  + 1022  -1023 1.1001100110011001100110011001100110011001100110011010 //  + -1          1.1001100110011001100110011001100110011001100110011010 // //d=1.000000000000000 //hex=3F F0 00 00 00 00 00 00 //bin=0011111111110000000000000000000000000000000000000000000000000000 //bin=0 01111111111   0000000000000000000000000000000000000000000000000000 //  + 1023  -1023 1.0000000000000000000000000000000000000000000000000000 //  + 0           1.0000000000000000000000000000000000000000000000000000 // //d=1.200000000000000 //hex=3F F3 33 33 33 33 33 33 //bin=0011111111110011001100110011001100110011001100110011001100110011 //bin=0 01111111111   0011001100110011001100110011001100110011001100110011 //  + 1023  -1023 1.0011001100110011001100110011001100110011001100110011 //  + 0           1.0011001100110011001100110011001100110011001100110011 // //d=1.400000000000000 //hex=3F F6 66 66 66 66 66 66 //bin=0011111111110110011001100110011001100110011001100110011001100110 //bin=0 01111111111   0110011001100110011001100110011001100110011001100110 //  + 1023  -1023 1.0110011001100110011001100110011001100110011001100110 //  + 0           1.0110011001100110011001100110011001100110011001100110 // //d=1.600000000000000 //hex=3F F9 99 99 99 99 99 99 //bin=0011111111111001100110011001100110011001100110011001100110011001 //bin=0 01111111111   1001100110011001100110011001100110011001100110011001 //  + 1023  -1023 1.1001100110011001100110011001100110011001100110011001 //  + 0           1.1001100110011001100110011001100110011001100110011001 // //d=1.800000000000000 //hex=3F FC CC CC CC CC CC CC //bin=0011111111111100110011001100110011001100110011001100110011001100 //bin=0 01111111111   1100110011001100110011001100110011001100110011001100 //  + 1023  -1023 1.1100110011001100110011001100110011001100110011001100 //  + 0           1.1100110011001100110011001100110011001100110011001100 // //d=2.000000000000000 //hex=3F FF FF FF FF FF FF FF //bin=0011111111111111111111111111111111111111111111111111111111111111 //bin=0 01111111111   1111111111111111111111111111111111111111111111111111 //  + 1023  -1023 1.1111111111111111111111111111111111111111111111111111 //  + 0           1.1111111111111111111111111111111111111111111111111111 // //d=2.200000000000000 //hex=40 01 99 99 99 99 99 99 //bin=0100000000000001100110011001100110011001100110011001100110011001 //bin=0 10000000000   0001100110011001100110011001100110011001100110011001 //  + 1024  -1023 1.0001100110011001100110011001100110011001100110011001 //  + 1           1.0001100110011001100110011001100110011001100110011001 //------------ // //d=2.000000000000000 //hex=40 00 00 00 00 00 00 00 //bin=0100000000000000000000000000000000000000000000000000000000000000 //bin=0 10000000000   0000000000000000000000000000000000000000000000000000 //  + 1024  -1023 1.0000000000000000000000000000000000000000000000000000 //  + 1           1.0000000000000000000000000000000000000000000000000000 //

男人要对自己好一点

这个题目出得不错

嗯，的确是个死的，浮点数一般不能精确存储，最好不要for(i=0;i!=10; i += 0.1)这么写

引用 18 楼 a627088424 的回复:求汇编的   ==   实现。是否是精确的bit相同才算== 当然了

[quote=引用 20 楼 a627088424 的回复:] #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { 	float i=10.0f; 	char a[65]; 	char bin[65]; 	 	unsigned char *p=(unsigned char*)&i; 	printf("%f\n",i); 	printf("HEX: %02X %02X %02X %02X\n",p[3],p[2],p[1],p[0]);  		 	ltoa(*(unsigned long*)&i,a,2); 	sprintf(bin,"%032s",a); 	printf("     s exponent fraction\n"); 	printf("BIN: %c %8.8s %s\n\n",bin[0],&bin[1],&bin[9]); 	 	float value=0; 	while(!( value-10>-0.00001 && value-10<0.00001 )) 		value += 0.1; 	 	p=(unsigned char*)&value; 	printf("%f\n",value); 	printf("HEX: %02X %02X %02X %02X\n",p[3],p[2],p[1],p[0]);	 	ltoa(*(unsigned long*)&value,a,2); 	sprintf(bin,"%032s",a); 	printf("     s exponent fraction\n"); 	printf("BIN: %c %8.8s %s\n\n",bin[0],&bin[1],&bin[9]); } [/quote] 更正个小问题，"BIN: %c %8.8s %s\n\n",bin[0],&bin[1],&bin[8]——>"BIN: %c %8.8s %s\n\n",bin[0],&bin[1],&bin[9]  结贴之

引用 21 楼 lm_whales 的回复:1）如果需要精确的计数次数，循环变量不要用浮点数。 2）浮点数加（减）法，当两个操作数差别较大时；       可能因为精度问题，而造成加（减）法失灵，结果是绝对值较大的那个数。 3）浮点数比较 == 和 ！= 不能用于精确比较计算结果。 这里的问题是 0.1 不能用浮点数精确表示。 所以每次不是精确地加上0.1了嗯，误差在过程中积累了

#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { 	float i=10.0f; 	char a[65]; 	char bin[65]; 	 	unsigned char *p=(unsigned char*)&i; 	printf("%f\n",i); 	printf("HEX: %02X %02X %02X %02X\n",p[3],p[2],p[1],p[0]);  		 	ltoa(*(unsigned long*)&i,a,2); 	sprintf(bin,"%032s",a); 	printf("     s exponent fraction\n"); 	printf("BIN: %c %8.8s %s\n\n",bin[0],&bin[1],&bin[8]); 	 	float value=0; 	while(!( value-10>-0.00001 && value-10<0.00001 )) 		value += 0.1; 	 	p=(unsigned char*)&value; 	printf("%f\n",value); 	printf("HEX: %02X %02X %02X %02X\n",p[3],p[2],p[1],p[0]);	 	ltoa(*(unsigned long*)&value,a,2); 	sprintf(bin,"%032s",a); 	printf("     s exponent fraction\n"); 	printf("BIN: %c %8.8s %s\n\n",bin[0],&bin[1],&bin[8]); }

15楼正解！

求汇编的   ==   实现。是否是精确的bit相同才算==

别把double当成int来理解，不能简单的判断两个浮点类型的相等和不等。

浮点数不建议用==比较，除非你懂IEEE754。

double一般不能用==或者!=的,几乎必错

浮点数别用 == 来判断 可以这样处理 if(fNumber  - fN < 0.0000001 )

for(int i=0;i  < 100;  ++i) printf("%lf\n", i/10.0);

for(i=0;i!=10; i += 0.1)  --》 for(i=0;i <= 10; i += 0.1)

double 类型的参数不适合这种比较，容易出现不可预测的问题。建议使用整形

引用 3 楼 a627088424 的回复:[quote=引用 2 楼 a515360208 的回复:] double是有精度的，double的10,可能是10.000001， 你要循环100次，改为<=好了，干嘛非要要!=去判断不要用直觉回答[/quote] 不是直觉，本来double是有精度的，在精度范围内都是可以的，你查一查double的存储机制， 然后考虑一下如何判断一个double类型的数是否为0，


Question: 程序中凭空出现tw2865_video_norm stVideoMode；请问tw2865_video_norm这是什么类型的啊？

难道就没有头文件？ 难道LZ不知道有宏或者typedef这种东西？  终极解决方法：全文搜索tw2865_video_norm


Question: 求字符串匹配C程序代码

再供参考//摘自《代码之美》 // 字符     含义 // .        匹配任意的单个字符 // ^        匹配输入字符串的开头 // $        匹配输入字符串的结尾 // *        匹配前一个字符的零个或者多个出现 #include <stdio.h> int matchhere(char *regexp, char *text);  int matchstar(int c, char *regexp, char *text) {// matchstar: search for c*regexp at beginning of text    do {// a * matches zero or more instances        if (matchhere(regexp, text)) return 1;    } while (*text != '\0' && (*text++ == c || c == '.'));    return 0; } int matchhere(char *regexp, char *text) {// matchhere: search for regexp at beginning of text    if (regexp[0] == '\0') return 1;    if (regexp[1] == '*') return matchstar(regexp[0], regexp+2, text);    if (regexp[0] == '$' && regexp[1] == '\0') return *text == '\0';    if (*text!='\0' && (regexp[0]=='.' || regexp[0]==*text)) return matchhere(regexp+1, text+1);    return 0; }  int match(char *regexp, char *text) {// match: search for regexp anywhere in text     if (regexp[0] == '^') return matchhere(regexp+1, text);     do {// must look even if string is empty         if (matchhere(regexp, text)) return 1;     } while (*text++ != '\0');     return 0; } void main() {     printf("%d==match(abc ,abc)\n",match("abc" ,"abc"));     printf("%d==match(^a  ,abc)\n",match("^a"  ,"abc"));     printf("%d==match(c$  ,abc)\n",match("c$"  ,"abc"));     printf("%d==match(a.c ,abc)\n",match("a.c" ,"abc"));     printf("%d==match(a.*c,abc)\n",match("a.*c","abc"));     printf("-------------------\n");     printf("%d==match(ABC ,abc)\n",match("ABC" ,"abc"));     printf("%d==match(^B  ,abc)\n",match("^B"  ,"abc"));     printf("%d==match(A$  ,abc)\n",match("A$"  ,"abc"));     printf("%d==match(a..c,abc)\n",match("a..c","abc"));     printf("%d==match(a.*d,abc)\n",match("a.*d","abc")); } //1==match(abc ,abc) //1==match(^a  ,abc) //1==match(c$  ,abc) //1==match(a.c ,abc) //1==match(a.*c,abc) //------------------- //0==match(ABC ,abc) //0==match(^B  ,abc) //0==match(A$  ,abc) //0==match(a..c,abc) //0==match(a.*d,abc)

ref: http://baike.baidu.com/view/2020247.htm?fr=aladdin

引用 5 楼 huyidao88116 的回复:谢谢亲们的指教！可能是我问题没描述好，还有以下这种情况：  第一个字符串：AB-ADSP-21060LKS-160 第二个字符串：DEF-ADSP_21060_QFP  字符串一开始就不相同，中间连续一部分相同，占第二个字符串长度60%以上 仅供参考#include <stdio.h> #include <string.h> char *a="abcde"; int L,i,j,k; void main() {     L=strlen(a);     for (i=1;i<=L;i++) {         for (j=0;j<=L-i;j++) {             for (k=j;k<j+i;k++) {                 printf("%c",a[k]);             }             printf("\n");         }     } }

各位大神求指教啊 ，感激不尽啊

第一个字符串：yuADSP-21060LKS-160 第二个字符串：rtyADSP_21060_QFP 两个字符串中除去“-” 和“_”符号，只剩下字母和数字，比较两个字符串（不区分大小写），连续相同位数超过第二个字符串长度的60%，判断为相同。

最开始我写的也是判断是否 "-" 或 "_" 如果要求这样，那么你可以稍微改改： int IsStringSimilar(const char *psz1, const char *psz2) {     int cch = 0;     int len = 0;     if (psz1 != NULL && psz2 != NULL) {         len = strlen(psz2) * 0.6;         while (*psz1 != '\0' && *psz2 != '\0') {             while (*psz1 == '-' || *psz1 == '_') {                 psz1++;             }             while (*psz2 == '-' || *psz2 == '_') {                 psz2++;             }             if (*psz1 != *psz2) {                 break;             }             cch++;             psz1++;             psz2++;         }     }     return cch > len; }这个则是只跳过 "-" 和 "_"，其他的如果不同则认为字符串不相似。同时这里也修改了是判断字符串 2 的总长度而非减去不合法字符的长度。如果这两个都不能满足要求，可根据以上两个代码适当组合达到目的。

#include <stdio.h> #include <stdlib.h>  int IsStringSimilar(const char *psz1, const char *psz2) {     int cch = 0;     int len = 0;     if (psz1 != NULL && psz2 != NULL) {         len = strlen(psz2);         while (*psz1 != '\0' && *psz2 != '\0') {             /* 跳过字符串1中连续非数字字母字符 */             while (!isalnum(*psz1)) {                 psz1++;             }             /* 跳过字符串2中连续非数字字母字符，并将总长度减去这些字符 */             while (!isalnum(*psz2)) {                 len--;                 psz2++;             }             /* 如果两个字符不想等则直接终止 */             if (*psz1 != *psz2) {                 break;             }             /* 相等总数++ */             cch++;             /* 字符串1和2指针++ */             psz1++;             psz2++;         }     }     /* 相等总数是否大于等于字符串2中除去非数字字母字符的字符总数*0.6 */     return cch > (len * 0.6); }  int main(int argc, char *argv[]) {     // 0     printf("%d\n", IsStringSimilar("ADSP~210", "ADSP_21060_QFP"));     // 1     printf("%d\n", IsStringSimilar("ADSP-2106", "ADSP_21060_QFP"));     // 1     printf("%d\n", IsStringSimilar("ADSP-21060LKS-160", "ADSP_21060_QFP"));     return 0; }

大概写了一个，可能不是太符合要求，仅供参考： int strcmp_l(const char *s1, const char *s2) {     const int len = strlen(s2);     const char *s2_end = s2 + (int)(len * 0.6);     for ( ; *s1 && *s2 && s2 != s2_end && *s1 == *s2; )     {         if ('-' == *s1 || '_' == *s1)         {             ++s1;             continue;         }         if ('-' == *s2 || '_' == *s2)         {             ++s2;             continue;         }          ++s1;         ++s2;     }     return *s1 - *s2;  }

仅供参考#include <stdio.h> #include <string.h> #include <locale.h> char s[256]; char *p; int r,n,i; int main() {     setlocale(LC_ALL,"chs");     while (1) {         printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXXXXX\":\n");         fgets(s,256,stdin);         if ('\n'==s[0]) break;         p=s;         while (1) {             p=strstr(p,"%20");             if (p) {                 memmove(p+1,p+3,strlen(p)-3+1);                 p[0]=' ';             } else break;         }         p=s;         while (1) {             p=strstr(p,"你懂得");             if (p) {                 memmove(p+6,p+6,strlen(p)-6+1);                 for (i=0;i<6;i++) p[i]='X';             } else break;         }         printf("%s",s);     }     return 0; } //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //abcdefg%20helloworld%20something.pdf //abcdefg helloworld something.pdf //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //这是测试文字你懂得，在这个你懂的地方，就得做你懂得的事 //这是测试文字XXXXX，在这个你懂的地方，就得做XXXXX的事 //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //   C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\STRICMP.C/*** *stricmp.c - contains case-insensitive string comp routine _stricmp/_strcmpi * *       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved. * *Purpose: *       contains _stricmp(), also known as _strcmpi() * *******************************************************************************/  #include <cruntime.h> #include <string.h>  #ifdef _WIN32 #include <mtdll.h> #include <setlocal.h> #include <ctype.h> #include <locale.h> #endif  /* _WIN32 */  /*** *int _stricmp(dst, src), _strcmpi(dst, src) - compare strings, ignore case * *Purpose: *       _stricmp/_strcmpi perform a case-insensitive string comparision. *       For differences, upper case letters are mapped to lower case. *       Thus, "abc_" < "ABCD" since "_" < "d". * *Entry: *       char *dst, *src - strings to compare * *Return: *       <0 if dst < src *        0 if dst = src *       >0 if dst > src * *Exceptions: * *******************************************************************************/  int __cdecl _stricmp (         const char * dst,         const char * src         ) {         return( _strcmpi(dst,src) ); }   int __cdecl _strcmpi(const char * dst, const char * src) {         int f,l; #ifdef _MT         int local_lock_flag; #endif  /* _MT */  #if defined (_WIN32)         if ( __lc_handle[LC_CTYPE] == _CLOCALEHANDLE ) { #endif  /* defined (_WIN32) */             do {                 if ( ((f = (unsigned char)(*(dst++))) >= 'A') && (f <= 'Z') )                     f -= ('A' - 'a');                  if ( ((l = (unsigned char)(*(src++))) >= 'A') && (l <= 'Z') )                     l -= ('A' - 'a');             } while ( f && (f == l) ); #if defined (_WIN32)         }         else {             _lock_locale( local_lock_flag )             do {                 f = _tolower_lk( (unsigned char)(*(dst++)) );                 l = _tolower_lk( (unsigned char)(*(src++)) );             } while ( f && (f == l) );             _unlock_locale( local_lock_flag )         } #endif  /* defined (_WIN32) */          return(f - l); }


Question: c编译连接程序加载 具体怎样的

有一本书，叫Linker and Loader，花了整整一本书来讲这个，LZ指望一个帖子就能讲清楚？ 如果嫌这本书太高大上了，还有本《程序员的自我修养》，可以一读。 至于那些文件，微软的特定的实现而已。

请亲自用记事本打开.plg（VC6）或BuildLog.htm（VS20XX）文件一看究竟。  *.dsp(DeveloperStudio Project)：是VC++的工程配置文件,比如说你的工程包含哪个文件,你的编译选项是什么等等,编译的时候是按照.dsp的配置来的。 *.dsw(DeveloperStudio Workspace)：是工作区文件，用来配置工程文件的。它可以指向一个或多个.dsp文件。 *.clw：是 ClassWizard信息文件,实际上是INI文件的格式,有兴趣可以研究一下.有时候ClassWizard出问题,手工修改CLW文件可以解决.如果此文件不存在的话,每次用ClassWizard的时候绘提示你是否重建。 *.opt：工程关于开发环境的参数文件，如工具条位置等信息。 *.aps：(AppStudio File),资源辅助文件,二进制格式,一般不用去管他。 *.rc：资源文件。在应用程序中经常要使用一些位图、菜单之类的资源, VC中以rc为扩展名的文件称为资源文件, 其中包含了应用程序中用到的所有的windows资源, 要指出的一点是rc文件可以直接在VC集成环境中以可视化的方法进行编辑和修改。 *.plg：是编译信息文件,编译时的error和warning信息文件(实际上是一个html文件,一般用处不大)，在Tools->Options里面有个选项可以控制这个文件的生成。 *.hpj：(Help Project)是生成帮助文件的工程,用microsfot Help Compiler可以处理。 *.mdp：(Microsoft DevStudio Project)是旧版本的项目文件,如果要打开此文件的话,会提示你是否转换成新的DSP格式。 *.bsc：是用于浏览项目信息的,如果用Source Brower的话就必须有这个文件。如果不用这个功能的话,可以在Project Options里面去掉Generate Browse Info File,可以加快编译速度。 *.map：是执行文件的映像信息纪录文件,除非对系统底层非常熟悉,这个文件一般用不着。 *.pch：(Pre-Compiled File)是预编译文件,可以加快编译速度,但是文件非常大。 *.pdb：(Program Database)记录了程序有关的一些数据和调试信息,在调试的时候可能有用。 *.exp：只有在编译DLL的时候才会生成,记录了DLL文件中的一些信息。一般也没什么用。 *.ncb：无编译浏览文件(no compile browser)。当自动完成功能出问题时可以删除此文件，build后会自动生成。 *.c：源代码文件，按C语言用法编译处理。 *.cpp：源代码文件，按C++语法编译处理。 *.h是头文件，一般用作声明和全局定义。 *.sln:在开发环境中使用的解决方案文件。它将一个或多个项目的所有元素组织到单个的解决方案中。此文件存储在父项目目录中.解决方案文件，他是一个或多个.proj（项目文件）的集合。 *.vcproj 是vc的工程项目文件 .vcproj .sln 分别是VC2002以上工程文件和解决方案文件 .dsp .dsw 分别是VC6的工程文件和工程组文件 将VC7工程转换回VC6工程，换言之，就是将.sln/.vcproj这两个文件转换到.dsw/.dsp文件。 vc6打开dsp或dsw，vc2003,2005打开sln或vcproj VC6打开*.dsw文件,单击工具栏上的"!",然后你的文件夹里多了一个DEBUG文件夹里面有.EXE文件 在vc7里面打开vc6的工程时，它会提示你是否转换成vc7的格式，转换后就可以直接使用了。 转换后的工程，vc6就不认识了。 我使用vc.net 2003打开vc6的工程，提示要升级，我也选了yes to all ， 但是其实vc.net只是读取vc6的.dsw和.dsp中的信息并添加了.sln和.vcproj。 用vc.net打开过的vc6工程 dsw和dsp都没有改变。所以用vc.net打开过的vc6工程，虽然已经被“升级”其实 dsw和dsp并没有被改动，再打开时就不用dsw而用sln了。 这点做得很好，只是从vc6的工程文件中读信息，并不改，照样可以用vc6打开原来的dsw和dsp

pdb是调试信息文件，其他的类型可以百度或者google

给出具体的例子我分析哈


Question: 无符号数组处理

unsigned char brdaddr[4][4]; unsigned char IP[17]; strcpy(brdaddr[0],"10"); strcpy(brdaddr[1],"2"); strcpy(brdaddr[2],"255"); strcpy(brdaddr[3],"255"); sprintf(IP,"%s.%s.%s.%s",brdaddr[0],brdaddr[1],brdaddr[2],brdaddr[3]);  作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

你打错了吧，'10' 算什么，应该是值为 10。char addr[16]; unsigned char brdaddr[4]; brdaddr[0] = 10; brdaddr[1] = 2; brdaddr[2] = 255; brdaddr[3] = 255; sprintf(addr, "%u.%u.%u.%u", brdaddr[0], brdaddr[1], brdaddr[2], brdaddr[3]); puts(addr);


Question: 困扰很久的问题，求解惑！！！

引用 10 楼 jiangweilian 的回复:这些问题，等你被折磨久了就自然懂了  正在备受折磨中啊……

LZ还是放弃这行吧，转行其它的也许更能有发展

1  学会C和C++语法 2  学会用开发环境（开发环境中一般包含各种库） 3  学会用库/API（系统库如windowsAPI，开源库如opengl，专业库（这里就不太方面举例了））  最简单的是1，最难得是3

楼主问了一个好问题

引用 3 楼 dnlovena 的回复:1、C/C++开发人员只的是要回C和C++两种语言。 2、C是面向过程的一种编程语言，C++ 是面向对象的一种编程语言。 3、VC/VC++指的是同一个开发工具（Microsoft Visual C++），各个版本可以自己百度一下，在该工具中可以写C或者C++代码。 4、MFC是vc6.0、vs2003等工具中微软提供的一种开发工具，可以开发界面的。 5、STL标准模板库，英文Standard Template Library，里面包括vector、list等，自己百度，买本书自己看看。 6、熟悉C++，不代表他就会MFC和STL，这个之间没有必然的联系。可以参考这个回答！

这些问题，等你被折磨久了就自然懂了

经常看到很多地方都写着C/C++开发人员怎么怎么样， 一直很不理解C/C++开发人员指的是具有哪些技能的人员，是C、C++都精通吗？  熟悉C/C++这个自然不用说，精通的潜台词还包括：数据结构和算法、操作系统的知识及其操作系统的API、网络及其API⋯⋯    还有一直搞不清楚C、C++、VC、VC++到底都是什么关系，MFC和STL之类的也属于C++吗？别人如果说他熟悉C++，那么表明他也会MFC和STL吗？  C：语言 C++：语言，兼容C，多了类，OO和范型的支持 VC和VC++：一回事，都是指微软的C/C++的开发工具，核心是编译器，然后集成了编辑器等工具，是以称为IDE STL是标准C++的一部分；MFC只是微软对Win32开发封装的一套库 熟悉C++，自然要熟悉STL，因为STL是C++的一部分；MFC则不需要

引用 6 楼 buyong 的回复:[quote=引用 5 楼 zhangshichuan972 的回复:] 如果你要从事传统行业.那么C语言占%90,C++占%10. 如果你要从事游戏或者其他什么的.c语言%70,C++占%30.  C语言学: 指针做函数参数的输入输出模型,接口的封装与设计.接口的抽象能力.回调函数. C++:         多态的理解,   接口的封装和设计和模块界面分工    任务的实现 和 任务的调用 可以耦合  （提前进行接口的封装和设计）  这只是基础.  Unix/Linux操作系统技术（包括linux基本命令，用户管理，vi使用，安装卸载软件，网络配置管理 gcc,g++编译器,gdb调试工具,make管理项目 Unix/Linux信号处理(signal)，内存管理(malloc)，内存印象文件的使用; Unix/Linux进程间通信(IPC)，管道的操作以及FIFO。通过共享内存实现进程间通信，守护进程 Unix/Linux多线程编程技术，线程接口，线程同步机制 Unix/Linux网络编程(socket) Unix/Linux shell编程 QT Creator的使用；QT Designer的使用 Oracle开发实战   Linux Android 驱动开发概述以及设备管理机制 Linux Android 内核机制  Linux Android 内核调试，以及GDB Linux Android 键盘鼠标驱动程序设计 Linux Android 触摸屏驱动程序设计 Linux Android 网络设备驱动程序设计  物联网-智能家居  学习是个体系.不是学习一两门语言就行的.有人给你扶梯子,你很快就能上来.没人帮你.是比较困难的.  你念几年书？[/quote]  2年.我8月份找工作了.

引用 楼主 u013410838 的回复:经常看到很多地方都写着C/C++开发人员怎么怎么样， 一直很不理解C/C++开发人员指的是具有哪些技能的人员，是C、C++都精通吗？   还有一直搞不清楚C、C++、VC、VC++到底都是什么关系，MFC和STL之类的也属于C++吗？别人如果说他熟悉C++，那么表明他也会MFC和STL吗？      希望能够尽可能详细的描述一下，这个问题困扰很久了……  一般招聘信息都写的宽泛随意，招C/C++，有可能实际只需要C, 有可能只需要C++，具体情况有时面试时，甚至入职后才能知道。 有时C++和VC是同义词，在另一些公司可能就完全无关。STL属于C++，但也不表明会C++就必须用，有些地方就禁用STL。 总之，具体公司具体部门具体项目组具体分析吧

引用 5 楼 zhangshichuan972 的回复:如果你要从事传统行业.那么C语言占%90,C++占%10. 如果你要从事游戏或者其他什么的.c语言%70,C++占%30.  C语言学: 指针做函数参数的输入输出模型,接口的封装与设计.接口的抽象能力.回调函数. C++:         多态的理解,   接口的封装和设计和模块界面分工    任务的实现 和 任务的调用 可以耦合  （提前进行接口的封装和设计）  这只是基础.  Unix/Linux操作系统技术（包括linux基本命令，用户管理，vi使用，安装卸载软件，网络配置管理 gcc,g++编译器,gdb调试工具,make管理项目 Unix/Linux信号处理(signal)，内存管理(malloc)，内存印象文件的使用; Unix/Linux进程间通信(IPC)，管道的操作以及FIFO。通过共享内存实现进程间通信，守护进程 Unix/Linux多线程编程技术，线程接口，线程同步机制 Unix/Linux网络编程(socket) Unix/Linux shell编程 QT Creator的使用；QT Designer的使用 Oracle开发实战   Linux Android 驱动开发概述以及设备管理机制 Linux Android 内核机制  Linux Android 内核调试，以及GDB Linux Android 键盘鼠标驱动程序设计 Linux Android 触摸屏驱动程序设计 Linux Android 网络设备驱动程序设计  物联网-智能家居  学习是个体系.不是学习一两门语言就行的.有人给你扶梯子,你很快就能上来.没人帮你.是比较困难的.  你念几年书？

MFC倒不一定，不过STL那是要掌握的

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

C/C++，这就要求都会，STL是C++的一个库，还是需要掌握的 MFC是微软利用C++实现的一套GUI库，有的公司利用它来做界面，所以可能需要掌握，但已经很少有公司在用这个玩意了


Question: 求算法给思路(将一个字符串指针中的数据从尾到头倒过来，存到另一个字符串指针中)

这里的U8应指unsigned char之意，观察变量命名，也无unicode之意，所以忘记中文什么的吧  两个问题： 1、pSrc的长度如何确定？ 2、pTmpSrc还未分配空间。

中文请使用 _wcsrev或_mbsrev   C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\MBSREV.C /*** *mbsrev.c - Reverse a string in place (MBCS) * *       Copyright (c) 1985-1997, Microsoft Corporation.  All rights reserved. * *Purpose: *       Reverse a string in place (MBCS) * *******************************************************************************/  #ifdef _MBCS  #include <mtdll.h> #include <cruntime.h> #include <string.h> #include <mbdata.h> #include <mbctype.h> #include <mbstring.h>   /*** * _mbsrev - Reverse a string in place (MBCS) * *Purpose: *       Reverses the order of characters in the string.  The terminating *       null character remains in place.  The order of MBCS characters *       is not changed. * *Entry: *       unsigned char *string = string to reverse * *Exit: *       returns string - now with reversed characters * *Exceptions: * *******************************************************************************/  unsigned char * __cdecl _mbsrev(         unsigned char *string         ) {          unsigned char *start = string;         unsigned char *left  = string;         unsigned char c;          if ( _ISNOTMBCP )                 return _strrev(string);          _mlock(_MB_CP_LOCK);          /* first go through and reverse the bytes in MBCS chars */         while ( *string ) {                  if ( _ISLEADBYTE(*string++) ) {                         if ( *string ) {                                 c = *string;                                 *string = *(string - 1);                                 *(string - 1) = c;                                 string++;                         }                         else /* second byte is EOS */                                 break;                 }         }          /* now reverse the whole string */         string--;         while ( left < string ) {                 c = *left;                 *left++ = *string;                 *string-- = c;         }          _munlock(_MB_CP_LOCK);         return ( start ); }  #endif  /* _MBCS */   C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\WCSREV.C /*** *wcsrev.c - reverse a wide-character string in place * *       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved. * *Purpose: *       defines _wcsrev() - reverse a wchar_t string in place (not including *       L'\0' character) * *******************************************************************************/   #include <cruntime.h> #include <string.h>  /*** *wchar_t *_wcsrev(string) - reverse a wide-character string in place * *Purpose: *       Reverses the order of characters in the string.  The terminating *       null character remains in place (wide-characters). * *Entry: *       wchar_t *string - string to reverse * *Exit: *       returns string - now with reversed characters * *Exceptions: * *******************************************************************************/  wchar_t * __cdecl _wcsrev (         wchar_t * string         ) {         wchar_t *start = string;         wchar_t *left = string;         wchar_t ch;          while (*string++)                 /* find end of string */                 ;         string -= 2;          while (left < string)         {                 ch = *left;                 *left++ = *string;                 *string-- = ch;         }          return(start); }

只能实现英文字符串的翻转 #include <stdio.h>  char* turn_str(char* str_in,char* str_out) { 	char* temp=str_in; 	char* head=str_out; 	while(*str_in)str_in++; 	for(str_in--;str_in>=temp;) 	{ 		*str_out++=*str_in--; 	} 	*str_out='\0'; 	return head; }  int main() { 	char s1[]="this is a book 我的世界"; 	char s2[100]; 	turn_str(s1,s2); 	puts(s2); 	return 0; }  中文会出现乱码

引用 3 楼 nomefat 的回复:2L 的碰到中文就挂了  看楼主U8的意思是有中文吧。。。。。还得先判断一下中英文 然后再复制 _strrev, _wcsrev, _mbsrev Reverse characters of a string.  char *_strrev( char *string );  wchar_t *_wcsrev( wchar_t *string );  unsigned char *_mbsrev( unsigned char *string );  Routine Required Header Compatibility  _strrev <string.h> Win 95, Win NT  _wcsrev <string.h> or <wchar.h> Win 95, Win NT  _mbsrev <mbstring.h> Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  Each of these functions returns a pointer to the altered string. No return value is reserved to indicate an error.  Parameter  string  Null-terminated string to reverse  Remarks  The _strrev function reverses the order of the characters in string. The terminating null character remains in place. _wcsrev and _mbsrev are wide-character and multibyte-character versions of _strrev. The arguments and return value of _wcsrev are wide-character strings; those of _mbsrev are multibyte-character strings. For _mbsrev, the order of bytes in each multibyte character in string is not changed. These three functions behave identically otherwise.   Generic-Text Routine Mappings  TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined  _tcsrev _strrev  _mbsrev  _wcsrev     Example  /* STRREV.C: This program checks an input string to  * see whether it is a palindrome: that is, whether  * it reads the same forward and backward.  */  #include <string.h> #include <stdio.h>  void main( void ) {    char string[100];    int result;     printf( "Input a string and I will tell you if it is a palindrome:\n" );    gets( string );     /* Reverse string and compare (ignore case): */    result = _stricmp( string, _strrev( _strdup( string ) ) );    if( result == 0 )       printf( "The string \"%s\" is a palindrome\n\n", string );    else       printf( "The string \"%s\" is not a palindrome\n\n", string ); }   Output  Input a string and I will tell you if it is a palindrome: Able was I ere I saw Elba The string "Able was I ere I saw Elba" is a palindrome   String Manipulation Routines  See Also   strcpy, _strset

引用 1 楼 zhao4zhong1 的回复:参考C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\STRREV.C /*** *strrev.c - reverse a string in place * *       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved. * *Purpose: *       defines _strrev() - reverse a string in place (not including *       '\0' character) * *******************************************************************************/  #include <cruntime.h> #include <string.h>  /*** *char *_strrev(string) - reverse a string in place * *Purpose: *       Reverses the order of characters in the string.  The terminating *       null character remains in place. * *Entry: *       char *string - string to reverse * *Exit: *       returns string - now with reversed characters * *Exceptions: * *******************************************************************************/  char * __cdecl _strrev (         char * string         ) {         char *start = string;         char *left = string;         char ch;          while (*string++)                 /* find end of string */                 ;         string -= 2;          while (left < string)         {                 ch = *left;                 *left++ = *string;                 *string-- = ch;         }          return(start); }   字符串的内容没有反转.  ( 显示的还是原来的效果.)

string 是源字符串指针，start 是反转后的字符串指针,  是这样吗?


Question: 面试题 排序a[n] 我这么写是不是被鄙视了

如果题目本身不是让你写个排序算法，我会优先用qsort 如果题目是让你写排序算法，那么搞清楚题意，是哪种排序算法，快排还是冒泡，除非题目要求写冒泡，那么LZ的代码才有讨论的可能，否则让你写快排却来个冒泡，显然不合题意 如果题目就是写你熟悉的排序算法，那么LZ写了冒泡，是可以理解的，不过索引处理错了（越界），还是有问题

1. 你的代码格式极不规范.一看要么是古板的大学教授教出来的.要么老的一B的国产教科书.根本没有阅读的欲望. 2.for while 随意套用.极不规范. 3.多余的变量.  总结:  对于C/C++,与其他语言不同.这种题不能称为面试题.  最后就是如果你只是兴趣来学学,那么也无所谓.如果你是打算走这个方向就业的.那么你必须做彻底的改变.扔掉你的古董书.彻底摒弃你现在这中编码风格. 加油!

你循环是 i = 0开始， 到 i = 9 结束。但是i + 1已经是10了

void sort(char *p,int num) { 	int i; 	char data; 	while(num--){ 		for(i=0;i<num;i++){ 			if(p[i]>p[i+1]){ 				data = p[i]; 				p[i] = p[i+1]; 				p[i+1] = data; 			} 		} 	} 	 	 }    确实是越界了。。

p[i+1]越界了！  “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？


Question: 求解救！编程问题

没有什么比LZ自己打开debugger跟一遍更实际了。

自己做作业去！

啊地方撒发生的发发发

错误原因：对指针吃不透的后果！笑而不答！

不同意楼上的做法，不益于楼主独立分析的精神！

求送分。  #include<stdio.h> #include<string.h> #include<stdlib.h>  #define OK 1 #define ERROR 0  typedef struct BiTNode{     char data;     struct BiTNode *lchild, *rchild; }BiTNode;  typedef struct{ 	BiTNode *base; 	BiTNode *top; 	int stacksize; }Stack;  BiTNode *CreateBiTree(); void InOrderTraverse(BiTNode *T); void InOrderTraverse_NonRecursive(BiTNode *T); void GetHighth(); void GetNodeNum(); void GetLeafNum(); void ExchangeLRtree(); Stack *InitStack(); int StackEmpty(Stack *S); void Push(Stack *S, BiTNode *p); BiTNode *Pop(Stack *S);   int main() { 	BiTNode *T; 	 	T = CreateBiTree(); 	printf("\n"); 	InOrderTraverse(T); 	printf("\n"); 	InOrderTraverse_NonRecursive(T); 	printf("\n"); 	return 0; }  BiTNode *CreateBiTree() { 	char ch; 	BiTNode *T; 	scanf("%c", &ch); 	if(ch == ' ') 		return NULL; 	else{        	T = (BiTNode *)malloc(sizeof(BiTNode));        	if(!T) 			exit(0);         T->data = ch; 		T->lchild = CreateBiTree(); 		T->rchild = CreateBiTree();	 		return T; 	} }  void InOrderTraverse(BiTNode *T) { 	if(T){ 		if(T->lchild) 			InOrderTraverse(T->lchild); 		printf("%c", T->data); 		if(T->rchild) 			InOrderTraverse(T->rchild); 	} }   void InOrderTraverse_NonRecursive(BiTNode *T) { 	Stack *S = NULL; 	BiTNode *p; 	 	S = InitStack(); 	p = T; 	if(!p){ 		printf("Empty Tree!\n"); 		return; 	} 	while(p || !StackEmpty(S)){ 		if(p) { 			Push(S, p); 			p = p->lchild; 		} else { 			p = Pop(S); 			printf("%c", p->data); 			p = p->rchild; 		} 	} }  void GetHighth(){} void GetNodeNum(){} void GetLeafNum(){} void ExchangeLRtree(){}  Stack *InitStack() { 	Stack *S = (Stack *)malloc(sizeof(Stack)); 	if(!S) 		exit(ERROR); 	S->base = (BiTNode *)malloc(10 * sizeof(BiTNode)); 	if(!S->base) 		exit(ERROR); 	S->top = S->base; 	S->stacksize = 10; 	return S; }  int StackEmpty(Stack *S) { 	if(S->top == S->base) 		return OK; 	return ERROR; }  void Push(Stack *S, BiTNode *p) { 	if(S->top - S->base >= S->stacksize){ 		S->base = (BiTNode *)realloc(S->base, (++S->stacksize) * sizeof(BiTNode)); 		S->top = S->base + S->stacksize - 1; 	}	 	*(S->top) = *p; 	S->top++; }  BiTNode *Pop(Stack *S) { 	if(S->top == S->base) 		exit(ERROR); 	S->top--; 	return S->top; }

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

测试case: case 1: 执行程序，直接输入空格，程序崩溃 case 2: 执行程序，输入非空格，程序无止境运行，不能结束输入

首先非常感谢大家的指导，通过上网查看调试，今天早上经过反复调试，总算找到问题了。真的，很多时候是知识面不全，没有吃透的问题。在这之前还不懂怎么调试，只知道在在代码行间插入输出语句以确定程序运行进程，但当我进入调试界面才发现里面里面的数据非常全，非常有助于代码分析。真的很感谢你们，我相信，每个人的成长道路上总少不了别人的帮助。

要实际，不要口水！

引用 2 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。 错误信息是什么？stack s没有分配空间就调用了s->base

vc6.0没问题编译，连接都正常


Question: VS2010编译报错的头疼问题，帮忙看下

[/quote]  #ifndef BUFF_SIZE #define BUFF_SIZE (1024*1024) #endif  这套语句的用法不是这样的啊.这是用来避免头文件重复包含的.  然后C90里面要用bool语句就是true和false必须包含头文件bool.h  然后你的分号可能写成中文了.[/quote]  这个也可以用来防止宏的重复定义~ 问题已经解决了，基本上都是按照上述给分的办法解决

引用 20 楼 zhao4zhong1 的回复:[quote=引用 16 楼 liuhengxiao 的回复:] 继续发问。。。。编译都完成了，也能看到运行结果了，怎么找不到可执行文件啊？ 在debug的目录下面没有可执行程序  我用release 编译，也没有release文件夹。。。求解 关闭杀毒软件。 查看Building.html文件的内容。 资源管理器的搜索功能会用不？[/quote]  全盘搜索了。。没有找到我的可执行文件。。。  “FileOpr.exe”: 已加载“I:\VC++\FileOpr_object\Debug\FileOpr.exe”，已加载符号。 “FileOpr.exe”: 已加载“C:\Windows\SysWOW64\ntdll.dll”，Cannot find or open the PDB file “FileOpr.exe”: 已加载“C:\Windows\SysWOW64\kernel32.dll”，Cannot find or open the PDB file “FileOpr.exe”: 已加载“C:\Windows\SysWOW64\KernelBase.dll”，Cannot find or open the PDB file “FileOpr.exe”: 已加载“C:\Windows\SysWOW64\msvcr100d.dll”，已加载符号。  记录都说有这个文件了。。我也木有找到。。

引用 10 楼 zhangshichuan972 的回复:这个很简单.所以我一直强调优秀的外国书籍的重要性.  这和后缀名无关.  VS2010 采用的标准是:c90,在这个标准里.变量的声明必须放在最前面.   int a=33,b=126;     int i; bzero(buff,size);     init_srand();   必须写成这样.不用费解为什么.标准就是这么设定的.  但是C99标准.如我用的是VS2013, 其标准为C99  C99支持变量任意位置声明.和C++一样.  所以学习不要只学语法.语言的标准也自己要去了解. 加油! 别忘了使用什么标准编译是可以配置的。

引用 16 楼 liuhengxiao 的回复:继续发问。。。。编译都完成了，也能看到运行结果了，怎么找不到可执行文件啊？ 在debug的目录下面没有可执行程序  我用release 编译，也没有release文件夹。。。求解 关闭杀毒软件。 查看Building.html文件的内容。 资源管理器的搜索功能会用不？

默认情况下，VS会在工程文件夹下生成Debug和Release目录的，如果没有请在VS中查看项目属性的输出目录在哪里！  项目属性->常规

引用 17 楼 Symfund 的回复:不送分？检查下是不是忘记送分了?  还没结贴呐。。。

不送分？检查下是不是忘记送分了?

引用 14 楼 Symfund 的回复:bool类型在C语言中是没有的啊！哈哈，又被我找到了！  。。。。。偶去查查去！

bool类型在C语言中是没有的啊！哈哈，又被我找到了！

引用 10 楼 zhangshichuan972 的回复:这个很简单.所以我一直强调优秀的外国书籍的重要性.  这和后缀名无关.  VS2010 采用的标准是:c90,在这个标准里.变量的声明必须放在最前面.   int a=33,b=126;     int i; bzero(buff,size);     init_srand();   必须写成这样.不用费解为什么.标准就是这么设定的.  但是C99标准.如我用的是VS2013, 其标准为C99  C99支持变量任意位置声明.和C++一样.  所以学习不要只学语法.语言的标准也自己要去了解. 加油!  上述问题基本搞定，编译的时候又遇到个问题如下：  #ifndef BUFF_SIZE #define BUFF_SIZE (1024*1024) #endif  void bzero(char *buff,long int size); bool is_dir_access(char *file_path); char *get_current_dir_name(); long int get_file_size(FILE *fp);  这段声明居然也能给我报个错出来！昨晚查了半天也没找到原因 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2061: 语法错误: 标识符“is_dir_access” 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2059: 语法错误:“;” 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2059: 语法错误:“类型” 1>i:\vc++\fileopr_object\windowsfunc.c(17): warning C4133: “函数”: 从“char [260]”到“LPWSTR”的类型不兼容 1>i:\vc++\fileopr_object\windowsfunc.c(21): error C2061: 语法错误: 标识符“is_dir_access” 1>i:\vc++\fileopr_object\windowsfunc.c(21): error C2059: 语法错误:“;” 1>i:\vc++\fileopr_object\windowsfunc.c(21): error C2059: 语法错误:“类型” 1>  operation.c 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2061: 语法错误: 标识符“is_dir_access” 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2059: 语法错误:“;” 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2059: 语法错误:“类型” 1>i:\vc++\fileopr_object\operation.c(113): warning C4013: “is_dir_access”未定义；假设外部返回 int 1>i:\vc++\fileopr_object\operation.c(113): error C2065: “false”: 未声明的标识符 1>  linuxfunc.c 1>  function.c 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2061: 语法错误: 标识符“is_dir_access” 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2059: 语法错误:“;” 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2059: 语法错误:“类型” 1>  FileOpr.c 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2061: 语法错误: 标识符“is_dir_access” 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2059: 语法错误:“;” 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2059: 语法错误:“类型”

引用 13 楼 liuhengxiao 的回复:[quote=引用 10 楼 zhangshichuan972 的回复:] 这个很简单.所以我一直强调优秀的外国书籍的重要性.  这和后缀名无关.  VS2010 采用的标准是:c90,在这个标准里.变量的声明必须放在最前面.   int a=33,b=126;     int i; bzero(buff,size);     init_srand();   必须写成这样.不用费解为什么.标准就是这么设定的.  但是C99标准.如我用的是VS2013, 其标准为C99  C99支持变量任意位置声明.和C++一样.  所以学习不要只学语法.语言的标准也自己要去了解. 加油!  上述问题基本搞定，编译的时候又遇到个问题如下：  #ifndef BUFF_SIZE #define BUFF_SIZE (1024*1024) #endif  void bzero(char *buff,long int size); bool is_dir_access(char *file_path); char *get_current_dir_name(); long int get_file_size(FILE *fp);  这段声明居然也能给我报个错出来！昨晚查了半天也没找到原因 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2061: 语法错误: 标识符“is_dir_access” 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2059: 语法错误:“;” 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2059: 语法错误:“类型” 1>i:\vc++\fileopr_object\windowsfunc.c(17): warning C4133: “函数”: 从“char [260]”到“LPWSTR”的类型不兼容 1>i:\vc++\fileopr_object\windowsfunc.c(21): error C2061: 语法错误: 标识符“is_dir_access” 1>i:\vc++\fileopr_object\windowsfunc.c(21): error C2059: 语法错误:“;” 1>i:\vc++\fileopr_object\windowsfunc.c(21): error C2059: 语法错误:“类型” 1>  operation.c 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2061: 语法错误: 标识符“is_dir_access” 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2059: 语法错误:“;” 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2059: 语法错误:“类型” 1>i:\vc++\fileopr_object\operation.c(113): warning C4013: “is_dir_access”未定义；假设外部返回 int 1>i:\vc++\fileopr_object\operation.c(113): error C2065: “false”: 未声明的标识符 1>  linuxfunc.c 1>  function.c 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2061: 语法错误: 标识符“is_dir_access” 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2059: 语法错误:“;” 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2059: 语法错误:“类型” 1>  FileOpr.c 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2061: 语法错误: 标识符“is_dir_access” 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2059: 语法错误:“;” 1>i:\vc++\fileopr_object\windowsfunc.h(12): error C2059: 语法错误:“类型”  [/quote]  #ifndef BUFF_SIZE #define BUFF_SIZE (1024*1024) #endif  这套语句的用法不是这样的啊.这是用来避免头文件重复包含的.  然后C90里面要用bool语句就是true和false必须包含头文件bool.h  然后你的分号可能写成中文了.

引用 21 楼 zhao4zhong1 的回复:[quote=引用 10 楼 zhangshichuan972 的回复:] 这个很简单.所以我一直强调优秀的外国书籍的重要性.  这和后缀名无关.  VS2010 采用的标准是:c90,在这个标准里.变量的声明必须放在最前面.   int a=33,b=126;     int i; bzero(buff,size);     init_srand();   必须写成这样.不用费解为什么.标准就是这么设定的.  但是C99标准.如我用的是VS2013, 其标准为C99  C99支持变量任意位置声明.和C++一样.  所以学习不要只学语法.语言的标准也自己要去了解. 加油! 别忘了使用什么标准编译是可以配置的。[/quote] 对!.大神补充了.

.c文件，所有变量定义要放在最前面。

“FileOpr.exe”: 已加载“I:\VC++\FileOpr_object\Debug\FileOpr.exe”，已加载符号。  在I:\VC++\FileOpr_object\Debug\文件夹下面找。

总不至于是你的exe里面包含自己将自己对应磁盘上的exe删除吧。 严重怀疑是正运行的杀毒软件或防火墙之类的软件将FileOpr.exe删掉了。

看10L的答案吧 想简单点就把所有声明放至函数开始处

这是编译器的语言标准的区别.不同的编译器的语言的标准不同.你不用记死了.

引用 3 楼 Symfund 的回复:C源文件的变量类型申明要放到函数的开始处。  尝试中。。还有一堆代码要修改才能再次编译。。。


Question: 新手提问关于控制程序重新执行

5楼的那个还是不行

仅供参考#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.  #include <afxdisp.h> #include <stdio.h> COleDateTime t; int main(int argc, char **argv) {     if (argc<2) {         printf("Usage:%s \"DateTimeStr\"\n",argv[0]);         return 2;     }     if (t.ParseDateTime(argv[1])) {         printf("\"%s\" is a valid DateTimeStr.\n",argv[1]);         printf("%s\n",t.Format("%Y-%m-%d %H:%M:%S"));         return 0;     } else {         printf("\"%s\" is a INVALID DateTimeStr!\n",argv[1]);         return 1;     } }  //以任意字符间隔输入两个整数 #include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }

而且只要输入的月份年份不对，也自动退出程序了

谢谢啊，可是我按您的代码试了 输出后 不能重新执行程序，虽然需要q 才退出 请教》？

#include<stdio.h> #include<stdlib.h> #include<string.h>  int main(void) { 	 	int a, iY, iM, iD; 	char s[50]; 	char sY[5]; 	char sM[3]; 	char sD[3]; 	FILE *fpt; 	char szText[50];   	printf("%s\n", "请输入年月日（按格式20140101）"); 	 	memset(sY,0,5); 	memset(sM,0,3); 	memset(sD,0,3); 	memset(s,0,50);	 	 	while(1) { 		scanf("%s", s);  		if(strcmp(s , "q") == 0) break; 		a = strlen(s); 		if(a != 8) { 			printf("%s\n", "Error!输入位数错误"); 			return 1; 		} 		 		strncpy(sY, s, 4); 		iY = atoi(sY); 		strncpy(sM, &(s[4]), 2); 		iM = atoi(sM); 		strncpy(sD, &s[6], 2); 		iD = atoi(sD); 		 		if(iY<1 || iY>9999) { 			printf("%s\n", "Error!请检查年份输入"); 			return 1; 		}       		if(iM>12 || iM<1) { 			printf("%s\n", "Error!请检查月份输入"); 			return 1; 		}  		if(iD>31 || iD<1) { 			printf("%s\n", "Error!请检查日输入"); 			return 1; 		} else {   			printf("%d%s\n", iM, "月"); 			 			sprintf(szText, "%d月\n", iM); 			printf(szText); 			 			fpt = fopen("1.txt", "w"); 			fprintf(fpt, sM); 			fclose(fpt); 		} 	} 	return 0; }

int main(void) {    printf("%s\n", "请输入年月日（按格式20140101）");     int a,iY,iM,iD;   char s[50];   char sY[5];   char sM[3];   char sD[3];  // s[8]=0;  //s[8]='\0'      memset(sY,0,5);   memset(sM,0,3);   memset(sD,0,3);   memset(s,0,50);       FILE *fpt;   while(1) {   scanf("%s",s);    if (s==q)break;   a= strlen(s);   if (a!=8) { printf("%s\n", "Error!输入位数错误"); return 1; }    strncpy(sY,s,4);   iY=atoi(sY);   strncpy(sM,&(s[4]),2);   iM=atoi(sM);   strncpy(sD,&s[6],2);   iD=atoi(sD);      if(iY<1||iY>9999) {  printf("%s\n", "Error!请检查年份输入");  return 1; }           if(iM>12||iM<1) {  printf("%s\n", "Error!请检查月份输入");  return 1; }      if(iD>31||iD<1) {  printf("%s\n", "Error!请检查日输入");  return 1; }     else  {   printf("%d%s\n",iM,"月");   //printf("%d月\n",iM);  char szText[50];    sprintf(szText,"%d月\n",iM);   printf(szText);       fpt = fopen("1.txt","w");   fprintf(fpt,sM);   fclose(fpt);   return 0;  } } }

求助啊，大哥大姐


Question: 请教前辈高手：如何在osg中绘制一个扇形波束，并控制其绕圆心旋转扫描！！求指导！...

LZ先科普下osg是什么？

不懂，有木有详细点的

会用GDI+将一个带透明的PNG旋转360°不？


Question: 代码排版的艺术..

引用 6 楼 a515360208 的回复:留个邮箱，发一份文档给你，还不错的、、、我自己在网上搜索一下吧....谢谢你了

好几天没来了..谢谢各位了..(受宠若惊的赶脚.. )

http://en.wikipedia.org/wiki/Indent_style 这里有几乎所有的风格 对于C，有个indent工具，可以按需配置，在各种“风格”之间切换 同意LS的，it is a matter of taste

关乎个人品味:it is a matter of taste

赵老师（我没弄错吧？）这照片可真像我一位师兄啊。 这个发帖遇到了关键字审查不通过，结果我发了个半截帖。 然后连发三帖又被阻了，所以都没发后半截的心情了，呵呵。 风格只要统一就好，特别是一个团队中。

比用什么风格更重要的是在任何地方，任何时候都坚持用一种风格。 比爱哪种美眉更重要的是在任何地方，任何时候都坚持爱一个美眉。

在VS IDE中选中要整理格式的代码片断，按Alt+F8  astyle自动整理c,c++,java源代码格式命令行工具源代码。 用astyle --help查看使用帮助。 http://download.csdn.net/detail/zhao4zhong1/5605415

4. 除了for/if/while等括号里面之外，相邻行的赋值等号纵向对齐，等号后要有一个空格

我们在C语言课中所要求的风格为： 1. for/if/while/do/switch/case等都要正确缩进，缩进都使用TAB而非空格 2. 除了函数体之外，左大括号都在紧接行尾  3. 右大括号另起一行，反缩进一级

程序员的水平体现在函数、宏和变量的命名上，体现在函数的参数和返回值设计上，无它。 Linux下有个程序叫indent，很好用。搜索一下indent和风格这两个关键字，能看到很多资料。 只要选择一个自己喜欢的风格就行。不过在团队中，要服从集体。 程序员的水平体现在函数、宏和变量的命名上，体现在函数的参数和返回值设计上，无它。 Linux下有个程序叫indent，很好用。搜索一下indent和风格这两个关键字，能看到很多资料。 只要选择一个自己喜欢的风格就行。不过在团队中，要服从集体。

留个邮箱，发一份文档给你，还不错的、、、

边写边总结吧。自己写的代码不是写了就写了，要在自己的代码上进一步修改。再看书，再修改，再看书，在修改。。。。

多看一些大师经典的代码，慢慢的跟着学，慢慢的你就习惯了。

Google C++ 风格指南 - 中文版.chm 支持全文搜索 http://download.csdn.net/detail/zhao4zhong1/5040814

学习linux源码的版式就是很不错的选择。  引用 楼主 u013115296 的回复:各位是怎么排版的...想学习一下..有时候看到自己的代码很乱...还有有相关的书籍吗..


Question: 浮点数在计算机中存放形式的问题

有必要了解的，多学点总不会坏

引用 6 楼 lin5161678 的回复:[quote=引用 2 楼 u012421456 的回复:] 浮点数无法精确存储，  可以的（个人觉得）有限的几个可以  绝大多数不可以 [/quote]  嗯，我说的不全面

我以为他会和指针有很大的关联呢  谢谢各位了

引用 2 楼 u012421456 的回复:浮点数无法精确存储，  可以的（个人觉得）有限的几个可以  绝大多数不可以

找两篇博客，大概了解一下浮点数的存储格式(IEEE754)，大概知道是怎么回事就行了。 看不懂就先跳过，和后面的指针没有什么关系。

了解一下就行了。学习存储方法。 如果是考研那就得好好琢磨了。 具体编程应用的话可以略过

个人认为， 在需要的时候在学习关于浮点的内存布局就行了。 其他时候，就别管如何布局了。  可以先跳过。

浮点数无法精确存储，  可以的（个人觉得）

可以


Question: 【求助】关于C语言结构体

引用 11 楼 u013984264 的回复:你有两个错我：（1）printf(" %c\n",TagTest.RFU);中%c是指输出单个字符，而你要输出的“0000”是字符串，要改成%s （2）把最上面的改成：struct Tag                                              {                                                 unsigned char RFU[16]="0000";                                              } TagTest;  //这个TagTest才是用struct Tag 结构体去定义的变量 你写的struct Tag TagTest｛｝结构体中，你的结构体名字是叫Tag TagTest，而不是Tag  恩。谢谢你！我刚看了，其实我还有个错误，unsigned char RFU[16]="0000";赋值放在花括号里面会报错，应该放在花括号和‘；’号之间赋值，或者在外面对字符串赋值。

引用 7 楼 bEst_02 的回复:struct Tag {     unsigned char RFU[16]; }TagTest{"00000"};  TagTest{"00000"};中间缺个=号吧。 刚编一下应该是这样子。TagTest={"00000"};

引用 8 楼 a515360208 的回复:[quote=引用 1 楼 oYinGui1 的回复:]  struct Tag  { unsigned char RFU[16]="0000"; } TagTest;  定义结构体时就进行初始化？？？[/quote]  问题找到了。就在这里。貌似不能在定义的时候给赋值初始化。

引用 1 楼 oYinGui1 的回复: struct Tag  { unsigned char RFU[16]="0000"; } TagTest;  定义结构体时就进行初始化？？？

引用 1 楼 oYinGui1 的回复: struct Tag  { unsigned char RFU[16]="0000"; } TagTest; C++11??

引用 1 楼 oYinGui1 的回复: struct Tag  { unsigned char RFU[16]="0000"; } TagTest;  #include <stdio.h> #include <string.h> #include <stdlib.h>  struct Tag{ 	unsigned char RFU[16]="0000"; } TagTest;  struct Tag TagTest;  void main() { 	printf(" %c\n",	TagTest.RFU); } error C2143: syntax error : missing ';' before '=' error C2059: syntax error : '=' error C2059: syntax error : '}' error C2079: 'TagTest' uses undefined struct 'Tag' error C2224: left of '.RFU' must have struct/union type Error executing cl.exe.

多看看书吧，

看看书上是怎么写的先。


Question: c语言的问题重复字符串

C语言水平有限，写的比较啰嗦，请指点。不过，以下代码各种情况考虑的还算完整吧。 从最大可能的长度->0进行检索。(同一字符串可能存在多个(>=3)，或者在同一长度不同数据的字符串存在相同的) #include <stdio.h> #include <string.h> #include <malloc.h>  int printf_same(char *p, int start, int len) { 	int i,l; 	char *tmp;  	l = strlen(p); 	tmp=malloc(l); 	tmp=strncpy(tmp,p,l);  	for(i=0; i<l; i++){ 		if((i>=start) && (i<(start+len))){ 			printf("%c", *tmp); 		}else{ 			printf(" "); 		} 		tmp++; 	} 	tmp = tmp-i; 	printf("\n");  	free(tmp); 	return 0; }  int main() { 	char *a = "abcdefabbcdfabbcdfabbcddafdsafsadffabbcdjakmddddddddddmszfabbcdfabbcdzlfabbcdfxfabbcdfabbcdxmddddddddddmxj"; 	int i,j,k,len; 	int flag=0; 	char *b; 	int tmp1=0;  	len = strlen(a); 	b=malloc(len); 	b=strncpy(b,a,len); 	printf("%s\n",a);  	for(i=len-1; i>0; i--){ 		for(j=0; j<(len-i); j++){ 			for(k=0; k<=(len-i); k++){ 				if(k == j){ 					continue; 				} 				a = a+j; 				b = b+k; 				if(strncmp(a,b,i) == 0){ 					a = a-j; 					b = b-k; 					if(k < j){ 						break; 					}  					if(tmp1 != j){ 						tmp1=j; 						flag=0; 					}  					if((flag == 0)){ 						printf("same length is : %d\n", i); 						printf_same(a, j, i); 						flag = 1; 					} 					printf_same(a, k, i); 				}else{ 					a = a-j; 					b = b-k; 				} 			} 		} 		if(flag == 1){ 			break; 		} 	}  	free(b); 	return 0; }   试验的结果是： [root@weihao01-vm samestring]# ./samestring.o  abcdefabbcdfabbcdfabbcddafdsafsadffabbcdjakmddddddddddmszfabbcdfabbcdzlfabbcdfxfabbcdfabbcdxmddddddddddmxj same length is : 12      fabbcdfabbcd                                                                                fabbcdfabbcd                                                                                fabbcdfabbcd                                                                                fabbcdfabbcd                same length is : 12                                            mddddddddddm                                                                                mddddddddddm   [root@weihao01-vm samestring]#

引用 10 楼 u014161864 的回复:[quote=引用 9 楼 SXJIAKE 的回复:] [quote=引用 3 楼 u014161864 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] 仅供参考#include <stdio.h> #include <string.h> char *a="abcde"; int L,i,j,k; void main() {     L=strlen(a);     for (i=1;i<=L;i++) {         for (j=0;j<=L-i;j++) {             for (k=j;k<j+i;k++) {                 printf("%c",a[k]);             }             printf("\n");         }     } }  膜拜论坛大牛！[/quote] 膜拜个鸟，这个例子没一点水平，会 C 的谁不会写。输入一个长串后要求把这个串中重复出现的最长字符串打出来，具体的重复内容和长度根本就是未知的。[/quote]  角度不一样。。你可以去看看这位大牛是不是在每个帖子里面都能发现他的魅影？！[/quote]  对于这种大牛，我只说一句话：希望这种人多多益善！！大大有利于人类进步，并向他致以敬意。

怎么感觉像字典压缩算法。

引用 9 楼 SXJIAKE 的回复:[quote=引用 3 楼 u014161864 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] 仅供参考#include <stdio.h> #include <string.h> char *a="abcde"; int L,i,j,k; void main() {     L=strlen(a);     for (i=1;i<=L;i++) {         for (j=0;j<=L-i;j++) {             for (k=j;k<j+i;k++) {                 printf("%c",a[k]);             }             printf("\n");         }     } }  膜拜论坛大牛！[/quote] 膜拜个鸟，这个例子没一点水平，会 C 的谁不会写。输入一个长串后要求把这个串中重复出现的最长字符串打出来，具体的重复内容和长度根本就是未知的。[/quote]  角度不一样。。你可以去看看这位大牛是不是在每个帖子里面都能发现他的魅影？！

引用 3 楼 u014161864 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] 仅供参考#include <stdio.h> #include <string.h> char *a="abcde"; int L,i,j,k; void main() {     L=strlen(a);     for (i=1;i<=L;i++) {         for (j=0;j<=L-i;j++) {             for (k=j;k<j+i;k++) {                 printf("%c",a[k]);             }             printf("\n");         }     } }  膜拜论坛大牛！[/quote] 膜拜个鸟，这个例子没一点水平，会 C 的谁不会写。输入一个长串后要求把这个串中重复出现的最长字符串打出来，具体的重复内容和长度根本就是未知的。

for(i=wz;i<cd;i++)       printf("%c",zifu[i]); fflush(stdout);或printf("\n");

引用 6 楼 wenpinglaoyao 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] 仅供参考#include <stdio.h> #include <string.h> char *a="abcde"; int L,i,j,k; void main() {     L=strlen(a);     for (i=1;i<=L;i++) {         for (j=0;j<=L-i;j++) {             for (k=j;k<j+i;k++) {                 printf("%c",a[k]);             }             printf("\n");         }     } }   请教赵老师，这是按楼主意思写的代码，可为什么却出现最后一个for循环不打印任何字符【竟然还能运行不报错！】这种奇怪现象？？下面是代码和运行结果图片： #include "stdio.h" char zifu[100]; void main() {     int a,b,d,e,i,j;     int cd=0,wz=0,temp;     char c;          for(i=0;i<100&&(c=getchar())!='\n';i++)       zifu[i]=c;          for(a=0;a<i;a++)     {     	for(b=a+1;b<i;b++)     	{     		if(zifu[a]==zifu[b])     		{     			for(d=a+1,e=b+1,temp=1;zifu[d]==zifu[e];d++,e++,temp++);     			if(temp>cd)     			{     				cd=temp;     				wz=a;     			}     		}     	}     }          printf("最长字符为%d\n",cd);     printf("它的位置在%d\n",wz);     for(i=wz;i<cd;i++)       printf("%c",zifu[i]);      } [/quote]   引用 6 楼 wenpinglaoyao 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] 仅供参考#include <stdio.h> #include <string.h> char *a="abcde"; int L,i,j,k; void main() {     L=strlen(a);     for (i=1;i<=L;i++) {         for (j=0;j<=L-i;j++) {             for (k=j;k<j+i;k++) {                 printf("%c",a[k]);             }             printf("\n");         }     } }   请教赵老师，这是按楼主意思写的代码，可为什么却出现最后一个for循环不打印任何字符【竟然还能运行不报错！】这种奇怪现象？？下面是代码和运行结果图片： #include "stdio.h" char zifu[100]; void main() {     int a,b,d,e,i,j;     int cd=0,wz=0,temp;     char c;          for(i=0;i<100&&(c=getchar())!='\n';i++)       zifu[i]=c;          for(a=0;a<i;a++)     {     	for(b=a+1;b<i;b++)     	{     		if(zifu[a]==zifu[b])     		{     			for(d=a+1,e=b+1,temp=1;zifu[d]==zifu[e];d++,e++,temp++);     			if(temp>cd)     			{     				cd=temp;     				wz=a;     			}     		}     	}     }          printf("最长字符为%d\n",cd);     printf("它的位置在%d\n",wz);     for(i=wz;i<cd;i++)       printf("%c",zifu[i]);      } [/quote]  哦懂了，真是献丑了。是自己代码有问题，之所以不报错是因为根本无措可报【循环不运行】

引用 2 楼 zhao4zhong1 的回复:仅供参考#include <stdio.h> #include <string.h> char *a="abcde"; int L,i,j,k; void main() {     L=strlen(a);     for (i=1;i<=L;i++) {         for (j=0;j<=L-i;j++) {             for (k=j;k<j+i;k++) {                 printf("%c",a[k]);             }             printf("\n");         }     } }   请教赵老师，这是按楼主意思写的代码，可为什么却出现最后一个for循环不打印任何字符【竟然还能运行不报错！】这种奇怪现象？？下面是代码和运行结果图片： #include "stdio.h" char zifu[100]; void main() {     int a,b,d,e,i,j;     int cd=0,wz=0,temp;     char c;          for(i=0;i<100&&(c=getchar())!='\n';i++)       zifu[i]=c;          for(a=0;a<i;a++)     {     	for(b=a+1;b<i;b++)     	{     		if(zifu[a]==zifu[b])     		{     			for(d=a+1,e=b+1,temp=1;zifu[d]==zifu[e];d++,e++,temp++);     			if(temp>cd)     			{     				cd=temp;     				wz=a;     			}     		}     	}     }          printf("最长字符为%d\n",cd);     printf("它的位置在%d\n",wz);     for(i=wz;i<cd;i++)       printf("%c",zifu[i]);      }

没有复杂度限制，那就直接四次方，枚举子串，然后判断每个子串出现了多少次。 要快的，后缀树，nlogn建树，然后直接统计后缀树里频度最高的节点就行。

引用 2 楼 zhao4zhong1 的回复:仅供参考#include <stdio.h> #include <string.h> char *a="abcde"; int L,i,j,k; void main() {     L=strlen(a);     for (i=1;i<=L;i++) {         for (j=0;j<=L-i;j++) {             for (k=j;k<j+i;k++) {                 printf("%c",a[k]);             }             printf("\n");         }     } }  恕我愚笨，没看出怎么计算结果，还望大神指点

引用 2 楼 zhao4zhong1 的回复:仅供参考#include <stdio.h> #include <string.h> char *a="abcde"; int L,i,j,k; void main() {     L=strlen(a);     for (i=1;i<=L;i++) {         for (j=0;j<=L-i;j++) {             for (k=j;k<j+i;k++) {                 printf("%c",a[k]);             }             printf("\n");         }     } }   膜拜论坛大牛！


Question: c写一个函数，检查一个字符串是否是数字字符串

感觉遍历这个字符串，只要全都是数字字符就行了吧？

刚刚疏忽了引用 11 楼 u013595256 的回复:int isdigitstr(char* str) {     if(strspn(str, "0123456789")==strlen(str))         return 1;     return 0; }

int isdigitstr(char* str) {     if(strspn(str)==strlen(str))         return 1;     return 0; }

#inclde<iostream>..........

BOOL    isdigitstr（char *x）； {     fif(NULL==x)    return  FALSE;     char *p=x;     while(*p)     {             if(*p<0x30&&*p>0x39&&*p!='.')                   return FALSE;            p++;     }     return TRUE; }

有没有可能是小数呢？？？ 有没有可能是负数呢？？？ 这也是个问题。。。。

比较简单的实现： #include <stdio.h>  int isdigitstr(char* str) { 	while(*str) 	{ 		if(*str<'0'||*str>'9')return 0; 		str++; 	} 	return 1; }  int main() { 	printf("%d",isdigitstr("12asd3123")); 	return 0; }

#include<stdio.h> int main() { 	void isdigitstr(char *); 	char str[30]; 	int k; 	gets(str); 	isdigitstr(str);//检查一个字符串是否是数字字符串 	getch(); } void isdigitstr(char *p) { 	int length; 	length=strlen(p);//统计输入字符串的有效字符长度 	while((*p)!=0) //逐个字符检查 	{ 		if((*p)>='0' && (*p)<='9')//如果出现数字，则字符串长度减1 			length--; 		p++;//指向下一个字符 	} 	if(length==0) 		printf("这是个数字字符串\n"); 	else 	   printf("不是数字字符串\n"); } 亲测，你真懒

#include <string.h>  int isDigitalStr(char *str) {	 	int len = strlen(str); 	char *s = str; 	int i = 0;  	while( '0' <= *s && *s <= '9' && i < len){ 		s++; 		i++; 	}  	if(i == len) 		return 1; 	else  		return 0;		 }

楼主真懒。

isdigit, iswdigit int isdigit( int c );  int iswdigit( wint_t c );  Each of these routines returns true if c is a particular representation of a decimal-digit character.  Routine Required Header Compatibility  isdigit <ctype.h> ANSI, Win 95, Win NT  iswdigit <ctype.h> or <wchar.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  isdigit returns a non-zero value if c is a decimal digit (0 – 9). iswdigit returns a non-zero value if c is a wide character corresponding to a decimal-digit character. Each of these routines returns 0 if c does not satisfy the test condition.  The result of the test condition for the isdigit function depends on the LC_CTYPE category setting of the current locale; see setlocale for more information. For iswdigit, the result of the test condition is independent of locale.  Parameter  c  Integer to test  Generic-Text Routine Mappings  TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined  _istdigit isdigit _ismbcdigit iswdigit     Character Classification Routines |  Locale Routines |  is, isw Function Overview


Question: 无连接的方式发送http报文？？？

用raw socket，所有层次的头内容都得自行构造。 建议libpcap／libnet之类的库

使用SOCK_RAW的话，IP头，tcp头等部分需要自己去生成。这样做写起来很累人也很麻烦，建议使用liburl

使用pcap驱动，任意发送数据到网卡上


Question: linux下java调用so库的编码问题，急急急急急急！

我不知道，就直接截图了， 有大神能解决下吗？

而且这个问题应该发到linux板块

为什么不发代码，而发图片？

大神们，问题解决了，我java里面传参数到C的时候用的是jstring ，而c里面接收参数的时候用的是char，只要把jstring转换成char就正常了，然后C回传给java的时候，就把char转换成jstring，谢谢你们。

c的实现代码多贴点

linux的汉字编码是UTF-8,而windows上的汉字编码是GB2312,可能和这儿有关系

我猜java字符串编码是utf8


Question: 关于open or creat创建新文件时返回描述符为0的问题

读open和creat的man page，检查返回值。

引用 4 楼 user-1 的回复:读open和creat的man page，检查返回值。   SSL_set_connect_state(ssl);     if(!SSL_set_fd(ssl, sockfd))     {         perror("ssl_set_fd failed");         exit(0);     }           printf("ssl_new scuess\n");     if (SSL_connect(ssl) == -1) 这几个函数会有影响么，貌似是调用他们之后才那样的，，昨晚上又莫名其妙的好了，在调试的时候，，

要沉了，，，，怎么破呢  谁给指点指点方法也好

比较乱，，，谢谢拉 有朋友之前碰到过，可自己不是他那种情况，链接如下 http://alwaysgo.blog.hexun.com/16801141_d.html

int main(int argc, char *argv[]) { 	SSL *ssl = NULL; 	welecome(); 	if((ssl = connect_server(ssl, argc, argv)) == NULL) 	{ 		printf("server not launch\n"); 		return -1; 	} 	login(ssl); 	while(1) 	{	 		int	choice = 0; 		print_main_menu(); //		setbuf(stdin, NULL); 		scanf("%d", &choice); //		setbuf(stdin, NULL); 		switch(choice) 		{ 			case 1: 				uploadfile(ssl); 				break; 			case 2: 				downloadfile(ssl); 			   	break; 			case 3: 				list_file(ssl); 				break; 			case 4: 				process_server_cmd(ssl); 				break; 			case 5: 				process_local_cmd(); 			default: 				break; 		} 	} 	return 0; } struct package pack(unsigned char cmd, unsigned char state, UFC *pufc,  int count, char *buf) { 	struct package tpackage; 	memset(&tpackage, 0, sizeof(struct package)); 	tpackage.cmd = cmd; 	tpackage.state = state; 	if(buf != NULL) 		memcpy(tpackage.buf, buf, count); 	if(pufc == NULL) 		return tpackage; 	switch(tpackage.cmd) 	{ 	case CMD_LOGIN:	 		strcpy(tpackage.ufc.user, pufc->user); 		break; 	case CMD_DOWN: 		strcpy(tpackage.ufc.filename, pufc->filename); 		break; 	case CMD_UP: 		strcpy(tpackage.ufc.filename, pufc->filename); 		break; 	case CMD_LIST: 		break; 	case CMD_QUIT: 		break; 	case CMD_CMD:  		break; 	default: 		break; 	} 	return tpackage; };  void print_main_menu() { 	printf("   \033[34m------------------------------\033[31mClient  console\033[34m-----------------------------\033[0m\n"); 	printf("   \033[34m|\033[0m                1.Update Files   2.Download Files  3.List File               \033[34m|\033[0m\n"); 	printf("   \033[34m--------------   \033[36mUse \033[31mls \033[36mor \033[31mcd \033[36mto \033[31mdisplayer \033[36mand \033[31mchange dir   \033[34m--------------\033[0m\n"); 	printf("  Please input the Client command:");	 } void welecome() { 	printf("   \033[34m------------------------------\033[31mWelcome to bungarus \033[34m-----------------------------\033[0m\n"); 	printf("   \033[34m|\033[0m               this is a client console of transmit            \033[34m|\033[0m\n"); 	printf("  It is connecting to server....\n");	 } SSL* connect_server(SSL *ssl,int argc, char *argv[]) { 	int i,count=0; 	char ip[32] = "127.0.0.1"; 	if(argc==2) 	{ 		printf("usage error:  ./client 192.168.0.6\n"); //		exit(0); 		strcpy(ip, argv[1]);  		 	}  	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 	int sockfd; 	if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) 	{ 		perror("socket");	 		exit(0); 	} 	struct sockaddr_in sockaddr; 	memset(&sockaddr,0,sizeof(struct sockaddr_in)); 	sockaddr.sin_family = AF_INET; 	sockaddr.sin_addr.s_addr = inet_addr(ip); 	sockaddr.sin_port = htons(CLIENT_PORT);  	 	if(connect(sockfd,(struct sockaddr* )&sockaddr,sizeof(struct sockaddr_in))==-1) 	{ 		perror("connect"); 		exit(0); 	} 	  SSL_library_init(); 	  OpenSSL_add_all_algorithms(); 	  SSL_load_error_strings(); 	  ctx = SSL_CTX_new(SSLv23_client_method()); 	  if (ctx == NULL) 	  { 	    ERR_print_errors_fp(stdout); 	    exit(1); 	  } 	if((ssl = SSL_new(ctx)) == NULL) 	{ 		perror("ssl_new fail"); 		exit(0); 	} 	SSL_set_connect_state(ssl);     if(!SSL_set_fd(ssl, sockfd)) 	{ 		perror("ssl_set_fd failed"); 		exit(0); 	} 	 	printf("ssl_new scuess\n");     if (SSL_connect(ssl) == -1) 		ERR_print_errors_fp(stderr);   else   { 	printf("Connected with %s encryption\n", SSL_get_cipher(ssl)); 	ShowCerts(ssl);   } 	printf(" connect server scuess\n");   return ssl; 		 } void ShowCerts(SSL * ssl) {   X509 *cert;   char *line;    cert = SSL_get_peer_certificate(ssl);   if (cert != NULL) {     printf("Digital certificate information:\n");     line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);     printf("Certificate: %s\n", line);     free(line);     line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);     printf("Issuer: %s\n", line);     free(line);     X509_free(cert);   }   else     printf("No certificate information£¡\n"); }


Question: 新手提问，关于字符串输入长度判定

linux gcc编译通过 #include <stdio.h>  int check_num(char c) { 	if(c>='0'&&c<='9')return 1; 	return 0; }  int main() { 	int num[9]; 	int i=0; 	char temp; 	while((temp=getchar())!='\n') 	{ 		if(check_num(temp)&&i<9) 		{ 			num[i]=temp-'0'; 			i++; 		} 		else break; 	} 	if(i!=8)printf("Error	:	输入位数或数值错误 !\n"); 	else printf("输入正确\n"); 	return 0; }

输入8位后按回车，测试显示没有问题

解决了，谢谢！！

a= strlen(s) 少个分号

引用 6 楼 lunugno 的回复:scanf("%s",s);    a= strlen(s) 你这个是语法错误  这种错误一般不用问 就算要问 也请提供代码+编译器错误提示  按照你顶楼的问法 是解决不了问题的

引用 3 楼 user-5 的回复:char s[9]; scanf("%s",s);   你这样写s数组里面就最多只能存放9个字符（包括\n）。如果输入大于8个字符，加上个'\n'就放不下了。 建议把s设置大一些。反正最后strlen会通过判断'\n'来断定字符长度。别乱说 %s 不可能向数组 写入\n的

#include <iostream.h>  #include "platspub.h"  #include<stdio.h>   #include<string.h>  #include <stdlib.h>  #include<math.h>     int main(void) {   printf("%s\n", "请输入年月日（按格式20140101）");       int a,iY,iM,iD;    // int flag = 0;      char s[100];   char sY[5];   char sM[3];   char sD[3];      memset(sY,0,5);   memset(sM,0,3);   memset(sD,0,3);   memset(s,0,9);      FILE *fpt;     // clrscr();     scanf("%s",s);     a= strlen(s)   if (a!=8) { 	printf("%s\n", "Error!输入位数错误"); 	return 1; }   这是这个部分的代码 编译不通过，说if 不对

不对的具体情况是怎样的 说清楚  不要等到大家给出许多具体方案之后  你都说行不通 结果是 你语法错误

提示错误是什么呀，没感觉什么不对呀

请教一下 谢谢啊


Question: 【scanf求助】第一个数据不能由scanf读入

引用 13 楼 zhao4zhong1 的回复:http://bbs.csdn.net/topics/360055953 Format Specification Fields: scanf and wscanf Functions A format specification has the following form:  % [width] [{h | l | I64 | L}]type  The format argument specifies the interpretation of the input and can contain one or more of the following:   White-space characters: blank (' '); tab ('\t'); or newline ('\n'). A white-space character causes scanf to read, but not store, all consecutive white-space characters in the input up to the next non–white-space character. One white-space character in the format matches any number (including 0) and combination of white-space characters in the input.   Non–white-space characters, except for the percent sign (%). A non–white-space character causes scanf to read, but not store, a matching non–white-space character. If the next character in stdin does not match, scanf terminates.   Format specifications, introduced by the percent sign (%). A format specification causes scanf to read and convert characters in the input into values of a specified type. The value is assigned to an argument in the argument list.  The format is read from left to right. Characters outside format specifications are expected to match the sequence of characters in stdin; the matching characters in stdin are scanned but not stored. If a character in stdin conflicts with the format specification, scanf terminates, and the character is left in stdin as if it had not been read.  When the first format specification is encountered, the value of the first input field is converted according to this specification and stored in the location that is specified by the first argument. The second format specification causes the second input field to be converted and stored in the second argument, and so on through the end of the format string.  An input field is defined as all characters up to the first white-space character (space, tab, or newline), or up to the first character that cannot be converted according to the format specification, or until the field width (if specified) is reached. If there are too many arguments for the given specifications, the extra arguments are evaluated but ignored. The results are unpredictable if there are not enough arguments for the format specification.  Each field of the format specification is a single character or a number signifying a particular format option. The type character, which appears after the last optional format field, determines whether the input field is interpreted as a character, a string, or a number.   The simplest format specification contains only the percent sign and a type character (for example, %s). If a percent sign (%) is followed by a character that has no meaning as a format-control character, that character and the following characters (up to the next percent sign) are treated as an ordinary sequence of characters, that is, a sequence of characters that must match the input. For example, to specify that a percent-sign character is to be input, use %%.  An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.我懂了！！！谢谢啦~~~

引用 11 楼 shimachao 的回复:[quote=引用 10 楼 u013643920 的回复:] [quote=引用 9 楼 ForestDB 的回复:] Ctrl-Z回车 这样输入EOF恩恩，成功了。不过我还是想问一下如果我输入的不是EOF或者int型数值而是字符串或者exit命令，它为什么就会一直打印我上一个输入的数据？（那时候我就只能点“X”来关闭窗口了。。。）[/quote] 因为输入不成功，所以a的值没有被檫写[/quote]可是当a的值没有被擦写时，程序为什么就会一直输出呢？它为什么不等待我再次输入呢？你可以说一下当我输入错误的时候，底层具体是在做什么吗？

引用 10 楼 u013643920 的回复:[quote=引用 9 楼 ForestDB 的回复:] Ctrl-Z回车 这样输入EOF恩恩，成功了。不过我还是想问一下如果我输入的不是EOF或者int型数值而是字符串或者exit命令，它为什么就会一直打印我上一个输入的数据？（那时候我就只能点“X”来关闭窗口了。。。）[/quote] 因为输入不成功，所以a的值没有被檫写

引用 12 楼 u013643920 的回复:[quote=引用 11 楼 shimachao 的回复:] [quote=引用 10 楼 u013643920 的回复:] [quote=引用 9 楼 ForestDB 的回复:] Ctrl-Z回车 这样输入EOF恩恩，成功了。不过我还是想问一下如果我输入的不是EOF或者int型数值而是字符串或者exit命令，它为什么就会一直打印我上一个输入的数据？（那时候我就只能点“X”来关闭窗口了。。。）[/quote] 因为输入不成功，所以a的值没有被檫写[/quote]可是当a的值没有被擦写时，程序为什么就会一直输出呢？它为什么不等待我再次输入呢？你可以说一下当我输入错误的时候，底层具体是在做什么吗？[/quote] 看14楼赵老师的回答

引用 9 楼 ForestDB 的回复:Ctrl-Z回车 这样输入EOF恩恩，成功了。不过我还是想问一下如果我输入的不是EOF或者int型数值而是字符串或者exit命令，它为什么就会一直打印我上一个输入的数据？（那时候我就只能点“X”来关闭窗口了。。。）

Ctrl-Z回车 这样输入EOF

引用 2 楼 user-7 的回复:读进去了 你没有打印而已 随后又开始循环读和打印请问下我想退出循环应该怎么做？我试过输入exit，eof，可是最后程序都会不断打印我输入的最后一个整数？为什么？

引用 6 楼 zhao4zhong1 的回复:不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。 ]受教了，虽然没有直接解决我的问题，但是学到了新东西！！！谢了！受教了，虽然没有直接解决我的问题，但是学到了新东西！！！谢了！

把循环之前的那个scanf删掉就行了

你while循环之前不是scanf了吗？？但是你又没输出~~~

读过了，只是你后面的循环重新输入了。

读进去了 你没有打印而已 随后又开始循环读和打印


Question: 求一个用WINAPI编写的扫雷源程序

谢啦！但我怕写着写着就和别人的一样了。 我自己参考过一个程序，写了一半左右了，但感觉越来越像别人的程序。 这是我们的作业，马上要交了，怕被鉴定为抄袭，所以想找一个网上没有的版本 不过你的回答真的很有用。 引用 1 楼 turingo 的回复:参考http://www.cnblogs.com/hanxi/archive/2011/03/27/1997182.html系列文章，既有源码也有解说。  [quote=引用 楼主 pkudjc 的回复:] 用C编写的，不要MFC的，希望不要是网上能找到的代码 希望可以直接运行。 谢谢大神们了！ 可发1309077701@qq.com[/quote]

参考http://www.cnblogs.com/hanxi/archive/2011/03/27/1997182.html系列文章，既有源码也有解说。  引用 楼主 pkudjc 的回复:用C编写的，不要MFC的，希望不要是网上能找到的代码 希望可以直接运行。 谢谢大神们了！ 可发1309077701@qq.com


Question: C编程问题，vc6.0编程

修改后如下，第一名字要改为字符串数组，第二字符串输入（即名字输入），要放到最后，因为是以回车结束的。  #include<stdio.h> struct student//别加() {      int num;      char name[20];      int score[3]; }; void print(struct student *p) //定义一个输出学生信息的函数 {        int i;       printf("\n结果输出：\n");       for(i=0;i<2;i++)       {             printf("%d,%d,%d,%d,%s",(p+i)->num,(p+i)->score[0],(p+i)->score[1],(p+i)->score[2],(p+i)->name);             printf("\n");       } } int main() {       int i;       struct student a[2],*p=a;       for(i=0;i<2;i++) //输入2个学生的信息（学好，姓名，三门分数）       {             printf("Please input the 学号 and the 三门分数 ,姓名 of the 第%d个 student:\n",i+1);             scanf("%d,%d,%d,%d,%s",&(p+i)->num,&((p+i)->score[0]),&((p+i)->score[1]),&((p+i)->score[2]),(p+i)->name);             //fflush(stdin);       }       print(p); 	  return 0;       //getch(); }

struct student//别加() { student() { memset(name, 0, 200); }      int num;      char name[200];      int score[3]; };

char* name


gcc name.c -l pthread 链接动态库

gcc pthread.c -l pthread

为什么放在最后才生效呢？还是-ldl也是如此！

我和你的问题一样，网上查的结果都是说要gcc -lpthread flie.c 然后我试了也不行，最后这样 gcc flie.c -lpthread 这样就可以了

谢谢大家！搞定了！最后加一个-lpthread！好多天前发的问题，忘记来结贴了。。。

-pthread放在最后试试

把-lpthread放在最后试试

-pthread，没有l

加的地方不对，，，，加在 *.c文件后面 ，，，看看C专家编程上面有，动态库那些什么符号引用啥的

不知道你什么情况，你加在后面试试


Question: 一个有问题的程序——含有数组的结构体如何初始化？

引用 10 楼 a515360208 的回复:[quote=引用 8 楼 eltonzhang 的回复:] [quote=引用 6 楼 a515360208 的回复:] [quote=引用 3 楼 bEst_02 的回复:] [quote=引用 2 楼 bEst_02 的回复:] 声明指针时，请初始化为NULL；  void main() {     queuePointer aVQ;     int i;      InitQueue(aVQ);      for(i=0; i<SIZE; i++)         printf("%d ",aVQ->vertexQueue[i]);  }   void main() {     queuePointer aVQ = NULL;     int i;      InitQueue(aVQ);      for(i=0; i<SIZE; i++)         printf("%d ",aVQ->vertexQueue[i]);  } [/quote] 这样也有问题的，调用函数后，aVQ是什么还是什么，并且你这样函数调用产生了内存泄露[/quote] 不会吧。aVQ是个指针应该能够改变的。内存泄露如何发生能详细说一下吗？谢谢！[/quote]  VQ=(queuePointer)malloc(sizeof(struct queue));  调用结束后，没有可以指向VQ分配的地址空间了，因此产生了内存泄露，你单步调试就知道了[/quote] 是的，您说的完全正确。我知道问题所在了，谢谢！

引用 8 楼 eltonzhang 的回复:[quote=引用 6 楼 a515360208 的回复:] [quote=引用 3 楼 bEst_02 的回复:] [quote=引用 2 楼 bEst_02 的回复:] 声明指针时，请初始化为NULL；  void main() {     queuePointer aVQ;     int i;      InitQueue(aVQ);      for(i=0; i<SIZE; i++)         printf("%d ",aVQ->vertexQueue[i]);  }   void main() {     queuePointer aVQ = NULL;     int i;      InitQueue(aVQ);      for(i=0; i<SIZE; i++)         printf("%d ",aVQ->vertexQueue[i]);  } [/quote] 这样也有问题的，调用函数后，aVQ是什么还是什么，并且你这样函数调用产生了内存泄露[/quote] 不会吧。aVQ是个指针应该能够改变的。内存泄露如何发生能详细说一下吗？谢谢！[/quote]  VQ=(queuePointer)malloc(sizeof(struct queue));  调用结束后，没有可以指向VQ分配的地址空间了，因此产生了内存泄露，你单步调试就知道了

引用 7 楼 eltonzhang 的回复:[quote=引用 3 楼 bEst_02 的回复:] [quote=引用 2 楼 bEst_02 的回复:] 声明指针时，请初始化为NULL；  void main() {     queuePointer aVQ;     int i;      InitQueue(aVQ);      for(i=0; i<SIZE; i++)         printf("%d ",aVQ->vertexQueue[i]);  }   void main() {     queuePointer aVQ = NULL;     int i;      InitQueue(aVQ);      for(i=0; i<SIZE; i++)         printf("%d ",aVQ->vertexQueue[i]);  } [/quote] 谢谢您的意见。但这样以后仍然会出错。[/quote] 出错的是这句  printf("%d ",aVQ->vertexQueue[i]);

引用 6 楼 a515360208 的回复:[quote=引用 3 楼 bEst_02 的回复:] [quote=引用 2 楼 bEst_02 的回复:] 声明指针时，请初始化为NULL；  void main() {     queuePointer aVQ;     int i;      InitQueue(aVQ);      for(i=0; i<SIZE; i++)         printf("%d ",aVQ->vertexQueue[i]);  }   void main() {     queuePointer aVQ = NULL;     int i;      InitQueue(aVQ);      for(i=0; i<SIZE; i++)         printf("%d ",aVQ->vertexQueue[i]);  } [/quote] 这样也有问题的，调用函数后，aVQ是什么还是什么，并且你这样函数调用产生了内存泄露[/quote] 不会吧。aVQ是个指针应该能够改变的。内存泄露如何发生能详细说一下吗？谢谢！

引用 3 楼 bEst_02 的回复:[quote=引用 2 楼 bEst_02 的回复:] 声明指针时，请初始化为NULL；  void main() {     queuePointer aVQ;     int i;      InitQueue(aVQ);      for(i=0; i<SIZE; i++)         printf("%d ",aVQ->vertexQueue[i]);  }   void main() {     queuePointer aVQ = NULL;     int i;      InitQueue(aVQ);      for(i=0; i<SIZE; i++)         printf("%d ",aVQ->vertexQueue[i]);  } [/quote] 谢谢您的意见。但这样以后仍然会出错。

引用 3 楼 bEst_02 的回复:[quote=引用 2 楼 bEst_02 的回复:] 声明指针时，请初始化为NULL；  void main() {     queuePointer aVQ;     int i;      InitQueue(aVQ);      for(i=0; i<SIZE; i++)         printf("%d ",aVQ->vertexQueue[i]);  }   void main() {     queuePointer aVQ = NULL;     int i;      InitQueue(aVQ);      for(i=0; i<SIZE; i++)         printf("%d ",aVQ->vertexQueue[i]);  } [/quote] 这样也有问题的，调用函数后，aVQ是什么还是什么，并且你这样函数调用产生了内存泄露

程序问题很多，函数返回值没注意，指针没初始化， LZ对指针还不太熟悉，多看看指针相关内容啊

aVQ是一个未初始化的指针，不知道指向哪里。 然后传给VQ。那么VQ根本就没有空间，调用的VQ->又指向哪里呢。全都是未知数啊。 设断点调试。注意要先初始化指针。

引用 2 楼 bEst_02 的回复:声明指针时，请初始化为NULL；  void main() {     queuePointer aVQ;     int i;      InitQueue(aVQ);      for(i=0; i<SIZE; i++)         printf("%d ",aVQ->vertexQueue[i]);  }   void main() {     queuePointer aVQ = NULL;     int i;      InitQueue(aVQ);      for(i=0; i<SIZE; i++)         printf("%d ",aVQ->vertexQueue[i]);  }

aVQ指向何处，为指向的对象分配空间了吗？


Question: 请求：有没有用opengl实现海浪仿真的代码，求学习

二阶微分方程的数值解问题


Question: [请教：]Windows 编程，能否得到一个程序结束的返回值？

引用 6 楼 su_787910081 的回复:[quote=引用 2 楼 bEst_02 的回复:] GetExitCodeProcess 这个函数的调用是不是需要等待该进程的结束才行啊？[/quote] 进程没结束，怎么返回值？就算提供一个值，那也叫IPC，而不叫返回值。

引用 2 楼 bEst_02 的回复:GetExitCodeProcess 这个函数的调用是不是需要等待该进程的结束才行啊？

CreateProcess The CreateProcess function creates a new process and its primary thread. The new process executes the specified executable file.   BOOL CreateProcess(   LPCTSTR lpApplicationName,                          // pointer to name of executable module   LPTSTR lpCommandLine,  // pointer to command line string   LPSECURITY_ATTRIBUTES lpProcessAttributes,  // process security attributes   LPSECURITY_ATTRIBUTES lpThreadAttributes,   // thread security attributes   BOOL bInheritHandles,  // handle inheritance flag   DWORD dwCreationFlags, // creation flags   LPVOID lpEnvironment,  // pointer to new environment block   LPCTSTR lpCurrentDirectory,   // pointer to current directory name   LPSTARTUPINFO lpStartupInfo,  // pointer to STARTUPINFO   LPPROCESS_INFORMATION lpProcessInformation  // pointer to PROCESS_INFORMATION );

引用 2 楼 bEst_02 的回复:GetExitCodeProcess GetExitCodeProcess The GetExitCodeProcess function retrieves the termination status of the specified process.   BOOL GetExitCodeProcess(   HANDLE hProcess,     // handle to the process   LPDWORD lpExitCode   // address to receive termination status );   Parameters hProcess  Handle to the process.  Windows NT: The handle must have PROCESS_QUERY_INFORMATION access.   lpExitCode  Pointer to a 32-bit variable to receive the process termination status.  Return Values If the function succeeds, the return value is nonzero.  If the function fails, the return value is zero. To get extended error information, call GetLastError.   Remarks If the specified process has not terminated, the termination status returned is STILL_ACTIVE. If the process has terminated, the termination status returned may be one of the following:   The exit value specified in the ExitProcess or TerminateProcess function.  The return value from the main or WinMain function of the process.  The exception value for an unhandled exception that caused the process to terminate.  QuickInfo   Windows NT: Requires version 3.1 or later.   Windows: Requires Windows 95 or later.   Windows CE: Requires version 1.0 or later.   Header: Declared in winbase.h.   Import Library: Use kernel32.lib.  See Also Processes and Threads Overview, Process and Thread Functions, ExitProcess, ExitThread, TerminateProcess,WinMain

引用 1 楼 user-3 的回复:从父进程去获取。 关键是怎么获取，有什么函数可以调用。返回值是否是那个100(上面代码中的)。

GetExitCodeProcess

从父进程去获取。


Question: 使用cgic库上传文件是出现问题。求大神指点一下！！

文件不存在 文件名或文件夹名包含空格或汉字但文件全路径没用双引号括住 文件正被修改，无法打开读其内容 ……


Question: C语言

我弄懂怎么回事了，原来写程序时scanf("%c\n",p1+i);上多了\n，才导致错误的。 另外1楼和2楼的答案可以使得输出不乱码。  printf("%s\n",p1); 输出字符串需要有结束符‘\0’我常忽略

printf("%s\n",p1); 输出字符串需要有结束符‘\0’

p1=(char *)malloc(5*sizeof(char)); 改成分配6个，并将最后一个置为0(*(p1+5) = 0)试试


Question: 用C编程时，如何考虑三维空间中位置与时间的变化

搜网络教程“学OpenGL编3D游戏” ？

引用 1 楼 zhao4zhong1 的回复:http://blog.csdn.net/pizi0475 我想用opengl去做这个海浪的网格模型，其它参数先不考虑，我不知道如何去处理这种有位置的变化，又有时间的变化?请大侠帮我理理思路，或有相关的代码的话最好了，非常感谢！

想用opengl去实现


Question: 帮忙看看dac+dma双通道单独输出不正常是什么原因

stm32f103vet6的 板子


Question: 链表中的 指针的指针  求大神

仅供参考//假设带表头结点的单向链表头指针为head，试编写一个算法将值为5的结点插入到连接表的第k个结点前，删除第k个节点，并对该链表进行排序。 #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-> //

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

我相信这个源代码中也就只有这个初始化函数的时候用的是LinkList *L，其他地方用的都是LinkList L， 在初始化函数里面要为该链表头分配内存，这就需要你去理解值传递和地址传递的区别了  Status InitList(LinkList *L) { *L=(LinkList)malloc(sizeof(Node)); if(!(*L)) return ERROR; (*L)->next=NULL; return OK; }

是的，这是一个指向指针的指针。因为使用了一句typedef struct Node * LinkList;，那么之后的LinkList就是一级Node指针，那么在LinkList加上*，参数就是Node的指针的地址。那么L指向这个Node指针。 (*L)->next=NULL这句，*L就是指向Node的指针，那么p->next是正确的使用。

因为initList函数希望达到一个效果：即在本函数内对参数做的改变要在调用函数中得到体现。 这里要改变的参数是指针，所以只传指针达不到这个效果，必须传指针的指针。

在哪里看到的这个东西?


Question: 线性代数的重要性

引用 7 楼 zlm0913 的回复:貌似在这个版里面听谁说过，“数学决定了你的上限”。  +1  数学决定了你的上限

说的都对，小数据量就用几层嵌套循环自己算就ok了，但是大数据量就需要矩阵这些了

不仅仅是3D图像处理，主成分分析也是要用到协方差矩阵求特征值、特征向量的

线性代数的地位远远不及微积分，分析学，不要花太多的时间在上面！个人的感觉，线性代数就好像开一元二次方程的求根公式样！  可以说掌握了现代的数学分析学，你就进入了科学的殿堂！你就站在了巨人的肩膀上！

做图形图像方面会用到吧！

说实话吧。。在工程实践上，即便你遇到需要用线性代数的地方，大多数人也一般不会联系起来。大多数人还是会自己写个两层for循环，一个一个算，即便是N方的算法。反正数据量也就那么几个，有那功夫折腾还不如赶紧写完下班。。

如果做算法研究，包括科学计算或者图像处理等，跟矩阵相关的就要用到线性代数。  知道“黑客帝国”的英语是什么吗？ 是The matrix 直译过来就是“矩阵”，而线性代数就是解决矩阵问题的。 矩阵在科学中是很神秘的东西，所以中国人把他翻译为“黑客帝国”，如果翻译成“矩阵”，名字就不够霸气啊。

没什么作用，除非是2D／3D相关

表示同意数学决定上限的说法 尤其是做算法研究的

顶了

感学学习线性代数与计算机的关系是很大的，特别是矩阵的解法的学习

引用 10 楼 u012033027 的回复:软件民工是不需要学数学的。 不仅是软件民工，连老牌黑客也是这么说的（系统编程）

软件民工是不需要学数学的。

搜二维或三维坐标变换。

线性代数很重要 它属于计算机学科的基础课  算法与结构也是基础课

貌似在这个版里面听谁说过，“数学决定了你的上限”。

算法基础   做时域频域变换的时候就重要了    matlab 最多的就是矩阵变换

线性代数的矩阵用得最多，矩阵的加减乘等运算还是需要学习线性代数的。

我只有在做3D时才会用到。

数学是基本工具， 多学点没有坏处，不要把自己限定在某个方向。大多数时候，客户需求决定你要做什么。


Question: fwrite对换行符的存储问题

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

'\n'是换行，应该是'\r吧？可即使这样，不该去除的回车符不是就也被去除了吗？'

当你读取字符时，可以对字符的处理代码前面加上判断是不是回车符号，  if（ch==‘\n')  continue; .................... //下面是你要对字符处理的代码；

就是先存，再取，多的那个回车如何去掉

是啊，就用的wb二进制写入，每次一个字节，如果存入的一串字节包括一个0x0a,那我在用fread读取这一串字节时，原来的0xoa前多加了一个0x0d,如何不要这个多的一个回车符呢？

FILE* fp = fopen("yourfilename", "wb"); wb, b+, ab都是可以的，改用哪个取决于你的需求。

打开文件时用 wb 模式

打开文件时指定二进制模式


Question: 一条c语言不理解，请大神指点

for(;(c=getchar())==(c>=65&&c<=90||c>=97&&c<=122);) putchar(c);对照一下ASCII码表看看，输入的范围

(c=getchar())==(c>=65&&c<=90||c>=97&&c<=122)？？ ==换成,逗号，似乎才是写出这个表达式的人，想要表达的意思。 for(;(c=getchar()),(c>=65&&c<=90||c>=97&&c<=122);) putchar(c); 不过不用这样写代码吧。

参考9楼把这个for拆了看或单步调试。

你让一个char跟一个bool比？

引用 3 楼 mujiok2003 的回复:把写代码的人拖出去斩了 是！尊敬的陛下。

关代码风格什么事，操些不该操的心。 有问题说问题，代码风格是另一回事。

以后别写这种代码

for(; (c=getchar())==(c>=65&&c<=90)||(c>=97&&c<=122); )  这样就可以了

for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }

引用 楼主 IbeleveIcan 的回复:for(;(c=getchar())==(c>=65&&c<=90||c>=97&&c<=122);) putchar(c); 这条语句输入任意一个小写字母，怎么不输出，直接跳出循环？？？ (c>=65&&c<=90||c>=97&&c<=122); 这个表达式返回的是一个bool值，bool值只有0，1。条件判断这里，c的asc码怎么都不可能是0，1吧。条件都不能满足，进不了循环。建议用逗号表达式

引用 楼主 IbeleveIcan 的回复:for(;(c=getchar())==(c>=65&&c<=90||c>=97&&c<=122);) putchar(c); 这条语句输入任意一个小写字母，怎么不输出，直接跳出循环？？？ 楼主，这是低级错误： （c>=65&&c<=90||c>=97&&c<=122)//请问楼主这个判断语句的返回值是什么东东？     肯定是1或者0，这是个逻辑判断语句；   c是char 类型，你拿char 和1 或者0比较，编译器会怎么做？   它会把c转换成相对应的ASCII码与1或者0比较；   楼主，说到这里，你看着办吧。

putchar(c)  不会被执行

(c>=65&&c<=90||c>=97&&c<=122)  这是一个逻辑表达式，结果为 0 或 1 ， 也即使说 条件是 (c=getchar())  跟 1 在比较，

不知道什么叫代码风格啊，

(c=getchar())==(...)  这是啥意思？  为嘛是==一个表达式值呢？

把写代码的人拖出去斩了

这样? for(;c=getchar();) 	if(c>=65&&c<=90||c>=97&&c<=122)putchar(c);


Question: 【swu】扫雷问题

引用 5 楼 arthuryangsh 的回复:你指的超时是怎样计时的？scanf手动输入那个时间消耗可不是一点半点。 测试的数据是由服务器给出的，不需要手动输入。

楼主的代码据我目测，貌似有数组越界【准确说是逼近界限】带来的bug

我复制了一下楼主的代码，是秒输出答案，楼主为何还说运行时间长呢？

你指的超时是怎样计时的？scanf手动输入那个时间消耗可不是一点半点。

引用 1 楼 wyssurvivor 的回复:我倒没什么好的解法 只是觉得你扫描每一个位置周围的8个位置不好，为什么不直接扫描有雷的位置，然后给这个位置的周围8个数加1，毕竟雷的数量相对于格子的数量少很多 就是说检测到有雷的位置，之后在扫描周边的八个位置是吗？如果是数字就加一是吗？可是这样还是显示超时了。

不过手动输入雷图着实雷人，怎么不考虑用文件读入呢？从终端scanf是非常原始的手段。

楼上的意见很正确。


Question: C++指针变量问题

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

看你前面的定义是什么；如果是char* str2；str2=“USA”；这个事正确的可以puts（str2）输出； 如果是直接定义char str2=‘USA’这是不合法的；

难道你是这么写的？ char str2[10]; 然后 str2="USA";  这能合法？  “USA”是字符串常量。

还是没懂，具体一点，好吗

#include <iostream> int main()  {     char str[] = "CHINA";        //合法，初始化     const char *str2 = "USA";    //同样合法     char *str3 = "France";      //警告，不能从const char *转换到char *     return 0; }

写法都是错的。。。

这个嘛？教材上写的


Question: 关于C语言中的int 恳请高手解惑

同13L，好问题，问题的本质就是为何要有变量这个东西？  而个人的理解就是： printf ("My favorite number is 1 because it is first. \n "); 就只能输出 My favorite number is 1 because it is first. 如果我想输出 My favorite number is 2 because it is first. 如果没有变量这种东西，那么我得写 printf ("My favorite number is 2 because it is first. \n "); 如果我想输出 My favorite number is 10000 because it is first. 那又怎么办？ 还记得这样一个笑话不：一是1划，二是2划，三是3划⋯⋯这个人怎么姓万，到现在我才划了九百多划。 这还不是最重要的，关键点还在于，这个n是几，在运行这个程序之前，根本就不知道，而这个固定的 printf ("My favorite number is n because it is first. \n "); 其实根本就没法写出来  把这前前后后都想明白了，所以要又变量能hold这个n，同时系统也要能提供一种方式，让我们在运行时能知晓这个n的值，比如printf中的%d，而所有的这一切，是以为编程。

楼主我真的感觉你为何这么屌.

这个 1 你当然可以写个 1 进去，但是如果这个 num 是获取了屏幕分辨率宽度打出来呢？你能直接写到字符串进去吗？

当我需要改变“1”这个值的时候即num的值的时候，你没有num如何做改变和运算？

printf是输出到屏幕， 最终都是输出一个字符串到屏幕，同时printf提供了格式字符串的功能， 即会把%d标记的位置用参数里面的int 值转换成对于的字符串，最终格式化的字符串，输出， 如果已经是字符串，就不需要格式化了

谢谢各位高手解惑     我仔细想了一下，其实我纠结的原因是因为我认为这个程序的目的就是在屏幕上显示“我的幸运数字是1......”这段话    既然不用变量也可以让这段话正常显示出来，作者为什么还要用变量。如果他能用一个切实发挥变量功能的程序比如各位说到的乘法和加法，那么更能让人便于理解。

你才学这么点 问什么问啊 多看点书  你这点疑问都算不上的 多看20分钟数就能弄懂    再说 你不去看书 去了解 现在在这里问 别人说了 你以为你能看懂吗

因为人家就是想让你知道 想输出一个整形应该这么用= =

引用 3 楼 u012421456 的回复:我觉得不必穷究这个，前面打出的是个数字1，后面是个字符1，当然，它们在计算机内的存储方式一样，都是二进制代码，而且是一样的代码，只是取出的方式不同，  像直接printf("Hello World");和使用字符数组 # include <stdio.h>  int main(void) { 	char s[20] = "Hello World!"; 	printf("%s\n", s); 	printf("Hello World!\n"); 	  	return 0;  } 想使用那种都行，只是在某种情况下使用哪种更好罢了  两个完全不同。  一个是int，一个是字符常量。一个是0x00000001，一个是0x31。

楼主又来逗B了吗

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

引用 9 楼 gz_qmc 的回复:好吧,你牛B 既然不需要输出整数 直接给个1就可以  那么,楼主 请你输出123X456X789的结果他还是个孩子 不要打脸啊。。。

如果让用户自己输入自己的favorite number ,然后输出,你觉得你的想法可以做到吗?

引用 楼主 myID0 的回复:C PRIMER PLUS里面有一个例子是 #include <stdio.h>  int main (void) {    	int num; 	num = 1; printf (" My favorite number is  %d because it is first. \n ",num); 	return 0;  }  我试了一下不要int num; num=1;直接写成：printf (" My favorite number is  1 because it is first. \n ");  编译链接运行后显示出来的也是“My favorite number is  1 because it is first”    “1”既然直接就可以显示出来为什么还要定义整数变量？恳请各位高手解惑  好问题。问题的本质是为什么需要变量？

整形变量的用处还有很多的，这个例子只是告诉你如何打印整形变量

因为这个例子就是让你学int变量怎么用的。


Question: 求用C语言编译的小病毒代码

恶作剧都是死循环呀，no evil no dead!  不作死不死

引用 4 楼 user-6 的回复:while(1) {     MessagBox("F u c k........"); } +1

void StopCursor() { 	POINT CurPos;  	GetCursorPos(&CurPos); 	while(1) 	{ 		SetCursorPos(CurPos.x, CurPos.y); 	} }

linux下一行shell命令足以： .(){.|.&};.    windows下截消息，想干嘛干嘛。。。不过这恶作剧真的没什么意思

你学习C语言啥啊？咋来这儿找这个了？

这个。。。


Question: 先序中序遍历确定二叉树程序求指正问题

有有空帮我调试一下的吗= =

引用 1 楼 user-1 的回复:调试, 是解决问题的最好办法. 你这样的逻辑问题, 看代码可能找起来很慢, 但调试就会很快. 没弄好啊= =调试也不知道哪出了错误


Question: 新手提问

这个有什么难度啊，思路很清晰啊，一个一个的来，第一个字符相同才继续比较，否则移到下一个字符。

有点不太明白你要找的字符串就是GET，还是什么？？？ 题目能再说明白点吗？？？


Question: C语言文件输入和读取的一个问题

没人愿意帮一下忙吗？


Question: 有必要在析构函数里面释放Direct指针吗..

谢谢..刚刚在别人的代码里面看到了。。←_←

你静态地创建一个COM接口试试看，不可能的！

这个需要看其文档说明, 还有别人的例子. 理论上来说, 指针一般都是动态申请的. 除非是智能指针, 会有自动释放, 其它都是需要手动释放的.


Question: C语言解决自己冲突问题求解答`

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。


Question: linux动态库文件 *.so的加载地址

参考Linux加载ELF文件相关源代码。

动态链接库映射到MMAP区 经典布局方式:  2.6.7开始引入的新布局方式：

linux的.so是通过重定位表来确定要加载的.so的位置的。动态链接分三步：1.启动动态链接器本身。2.装载共享对象。3.重定位和初始化。  动态链接器通过文件的.dynamic段找到要加载的文件，然后映射到进程地址空间中

windows和linux的动态链接库有区别 windows的dll相当于共享库，系统常用的比如user32.dll，kernel.dll等使用的是固定地址，不用地址重定位，而其他的是动态加载的。系统会专门分配一个地方给你放置dll的。然后你加载的dll就在这个固定的地方。  推荐书籍《程序员的自我修养》。里面就是说的装载，链接和库


Question: exosip2使用TCP传输时碰到的问题

引用 5 楼 user-1 的回复:可以肯定的是， 你可以自己绑定到固定端口。具体API的查查文档和代码。  我知道端口会随机的原因，也知道bind之后就固定了。 但我不清楚exosip2这个开源库这一块为什么要这样搞。 我也尝试着在exosip2上去固定端口，尝试行的改动都以失败告终。 所以就延伸出题目中的两个问题： 1.exosip2为什么不使用tcp_tl_open中的socket去connect，而是创建一个socket去连接？ 2.如果修改才能将端口固定下来，使用同一个端口进行接收和发送？  不管怎么样，谢谢了。

引用 4 楼 lxj5832 的回复:[quote=引用 3 楼 user-1 的回复:]  对于TCP客户端来说， 系统“随机”分配的端口就足够了。  麻烦就在于：不管是服务端还是客户端，都可能会去对源IP和源端口进行判断，判定是否是商定好的IP和端口。 所以我现在需要固定端口，不能使用随机的。[/quote] 可以肯定的是， 你可以自己绑定到固定端口。具体API的查查文档和代码。

引用 3 楼 user-1 的回复:对于TCP客户端来说， 系统“随机”分配的端口就足够了。  麻烦就在于：不管是服务端还是客户端，都可能会去对源IP和源端口进行判断，判定是否是商定好的IP和端口。 所以我现在需要固定端口，不能使用随机的。

引用 2 楼 lxj5832 的回复:[quote=引用 1 楼 user-1 的回复:] 看看有没有bind方法 那个端口已经被绑定了，不能再绑定了。 我的疑问就是：为什么不使用已经绑定的那个端口，却又新创建了一个socket，用随机端口去connect。[/quote]  一个TCP一个五元组确定（TCP协议， 本地IP， 本地端口， 远端IP， 远端端口）， 对于客户端来说， 远端IP和远端端口已经确定， 也就是服务器的IP和端口，通常本地IP也是确定的，可变的部分就剩下本地端口。 如果复用本地端口可以创建2个连接， 当数据收到服务器发来的数据，没有办法决定改交给其中哪个连接。   对于TCP客户端来说， 系统“随机”分配的端口就足够了。

引用 1 楼 user-1 的回复:看看有没有bind方法 那个端口已经被绑定了，不能再绑定了。 我的疑问就是：为什么不使用已经绑定的那个端口，却又新创建了一个socket，用随机端口去connect。

看看有没有bind方法


Question: 求助：用C语言建立二叉排序树

正在学习二叉树的相关内容，和楼主共勉

楼主不会这个，可以去找本李春葆的上机指导看看，上面有这类的例子


Question: source insight有这两个功能吗？

请通读Source Insight联机使用帮助。

新版本不是在下面新开一个窗口显示的吗

第一个按住ctrl就可以过去了，按返回就回到原来的函数了

第二个可以，直接有个找符号定义的按饼干， 第一个我不太明白。


Question: 菜鸟求问

为什么要有数据结构这个东东？ 因为要将现实世界或者抽象理论中的各种数据保存在计算机外存（光盘、硬盘、U盘……）或内存（ROM、RAM、SRAM……）里面的二进制字节数组中。 然后让CPU这个只会执行预先保存好的加减乘除移位条件转移……等机器指令的家伙按照人的意志去处理这些数据。至于具体如何处理就是所谓算法。  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

《算法精解（C语言描述）》

我们直接上严蔚敏的数据结构。。。感觉我要死了

既然如此,要不楼主来本具体数学

引用 5 楼 zlm0913 的回复:《数据结构与算法分析：C语言描述》，深感对于初学者，根本看不下去。 第一遍可以看《大话数据结构》，这本书虽然评价不高，但是简单易懂。 第二遍就可以开始看《算法导论》了，这本书很好。  考研不是每个学校都有指定书籍么。一般都是严蔚敏板门的《数据结构》

引用 5 楼 zlm0913 的回复:《数据结构与算法分析：C语言描述》，深感对于初学者，根本看不下去。 第一遍可以看《大话数据结构》，这本书虽然评价不高，但是简单易懂。 第二遍就可以开始看《算法导论》了，这本书很好。要是考研的话看什么书好呢

引用 2 楼 xuweiwei1860 的回复:看不懂就再看一遍还没看呢

小白没看过所以不知道

看不懂就再看一遍

顶啊顶


Question: 英雄会第四届在线编程大赛·线上初赛：带通配符的数 一直说我输出错误勒 也没个提示 破财求救

是我代码逻辑有误             if(w[i] == '?')             {                 wild_cnt++;                 result += pow(10, wild_num - wild_cnt) * ('9' - x[i]);             }             else if(w[i] < x[i])             {                 break;             }             else if(w[i] == x[i])             {                 continue;             }             else             {                  result += pow(10, wild_num - wild_cnt) ;             }   下次用递归好看一些

这个要修改一下     #define DIG_LEN 11

谢谢回复 我改正了一下，round 函数link不过，头文件math.h是在的，不知道windows下是不是有点不一样 result的类型改成double了，函数返回值用"%.0f"打印  错误是一样一样的哈  不过感觉提升了一个档次 ， 谢谢  引用 1 楼 user-1 的回复:你的程序在我电脑上的测试结果：    为什么结果不是899？究其原因，在这一行：   result += pow(10, wild_num - wild_cnt) * ('9' - x[i]);   pow这个函数的原型为：double pow(double x, double y);  你的用法，会有“截断”的问题。比如pow(10, 2)是799.9999999的话，转换为int之后，变成799。 所以程序改为：   result += round(pow(10, wild_num - wild_cnt)) * ('9' - x[i]);   答案正确。

还有，          result = pow(10, wild_num);  也要改成：          result = round(pow(10, wild_num));


Question: 【求助】头文件中函数声明 源文件中#include出错

我记得双引号是全盘查找的会，（）是你安装目录进行查找的，小白说错了，请指出额，上课的时候老师是这么讲的貌似

1、一般多文件工程，都是一个.c(.cpp)对应一个.文件，这样项目结构清楚 2、如没太多变量定义，可考虑只写一个头目件，对其它需在主程序里调用的函数模块，可在头文件里用 extern int funXX();形式定议，函数具体实现在各自的.c 文件中实现就行了.这样编译就没问题了。

引用 1 楼 user-4 的回复:不要包含源文件（*.c, *.cpp), 只包含头文件。 头文件只应该包含其他头文件， 类型，变量，函数的声明。  那请问我该如何处理呢？因为我的那几个模块的函数都是定义在那几个.c文件里面的。


Question: C语言 何时刷新输出

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

引用 5 楼 linsulinying 的回复:用codeblock运行时，printf不加换行，并且后面加一个死循环一直不退出，也可以打印出来，请问这是为什么呢？谢谢。 原因 那里的printf 不是行缓冲

你看的是什么书？刚好少了一种情况 4.程序结束时它也会把缓冲区的内容打印在屏幕上。

printf后面都跟上fflush(stdout)处理吧

引用可是我怎么能判断缓冲区是否满了呢？ 不要判断。 如果你想把刷新缓冲区则是使用fflush(stdout);

程序退出会关闭打开的流,比如stdout。 而关闭流前其缓冲区的中内容会被刷新（flush).


Question: 求大神解释 left operand must be l-value，要怎么修改

if((fp=fopen("f.txt","w+"))==NULL)

谢谢！ 看了好久没看出来


Question: 想学win32，应该怎么学习呢

引用 10 楼 SKATE11 的回复:对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和 寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时 候。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！这不是赵老师的话么？

可以学C#，WPF,  MFC不好用,，不好学。  想跨平台还可以学QT。 题注可以百度一下 MFC WPF QT的区别

本人之前的做VC开发的，我当时是学的c，后面学c++（个人感觉开发一般的windows程序，c++还是比较好用的），学完这些之后，把win32窗口创建过程的一套，包括消息循环一套都学了一下，后面再学了MFC的一些基础的用法（MFC虽然很老了，但是学学还是有好处的，MFC底层里面很多东西还是很值得学习的），之后的就看一些开源第三方的库，之后的基本遇到难题百度谷歌一下就有能力解决了。

先学 windows 操作系统原理 和体系结构，再了解API；

学学api，然后sdk，mfc，可以去看那个c语言也能干大事的视频。

不是有本书叫什么《Programming Windows 程式开发设计指南〉的么 出版日期：2000/6/2  书  号：957-8239-73-4  原 作 者：Charles Petzold  译  者：余孟学 本主旨： 本书是地球上最有名、最受推崇、最多人使用的程式设计用书。 内容简介： “到 Petzold 的书中找找” ——仍然是解决 Windows 程式开发各种疑难 杂症时的灵丹妙药。在第五版的《Windows 程式开发设计指南》中，作者身 为倍受敬重的 Windows Pioneer Award（Windows 开路先锋奖）得主，依据 最新版本 Windows 作业系统， 以可靠的取材资料校定这一本经典之作——再 一次深入探索了 Win32 程式设计介面的根本重心。》 懂得C就可以看这本书。

一般我都是百度或google控件的使用方法的，然后在是参考编辑器i自带的模板

学win32最好和windows编程一起学。不然只用c语言的话，其实用win32 application和win32 console application都差不多。个人是这么认为的