Question: 把该字符串转换成等价整型值求解

引用 5 楼 cfjtaishan 的回复: char s[] = "1a0c2b"; sprintf(s, "%x", tmp); printf("%x", tmp);  利用sprintf或snprintf函数更直接，不用一个个字符解析。 错了，是使用sscanf char s[] = "1a0c2b"; int tmp; sscanf(s, "%x", &tmp); printf("%x", tmp);

如果使用MFC，就可以用CString类来处理这个问题就非常简单了。

简单做了个，供参考 #include <iostream>  int change(const char* str, int len);  int main() { 	const char str[] = "1a0c2b"; 	int v = change(str, strlen(str)); 	printf("%d", v); 	return 0; }  int change(const char* str, int len) { 	 	//没做参数检查 	//没对字符串中含有非法字符检查（不是数字和abcdef） 	 	int iret = 0; 	for (int i = 0; i < len; i++) 	{ 		iret *= 16; 		unsigned char uc = str[i]; 		if (uc >= '0'&& uc <= '9') 			iret += uc - '0';  //数字字符转数值 		else if (uc >= 'a' && uc <= 'f') 			iret += uc - 'a' + 10; //字母转数值 		else if (uc >= 'A' && uc <= 'F') 			iret += uc - 'A' + 10; //大写字母转数值 		else 			;//出错处理没做  	} 	return iret; }

实现把字符串当中的16进制数字，转换成10进制的数值？

#include <stdio.h> #include <string.h> #include <math.h>  int find(char *, char *, int);  int main() {     int i, t;     unsigned int num;     char a[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd','e', 'f'};     char s[] = "1a0c2b";      num = 0;     t = strlen(s);     printf("t = %d\n", t);     for(i = 0; i < t; i++)         num = num + find(s,a,i) * pow(16, t-i-1);     printf("%#x\n", num);     return 0; }  int find(char *x, char *y, int z) {     int i;     for(i = 0; i < 16; i++)         if(x[z] == y[i])             break;     printf("%d\n", i);     //return (i-1);     return i;   //直接返回i，而不是i-1 } 实参a并不是字符串，因为字符串结束标记是'\0'，而数组a没有'\0'，自然也不能用strcmp find函数直接返回i，而不是i-1; 以上的代码参考一下吧

int find(char *x, char *y, int z) {     int i;     for(i = 0; i < 13; i++)         if(x[z] == y[i])             break;     return i; }


Question: 怎么判断结构体中某个成员变量（变量为字符数组）的值是否包含数字？

你说不能，你的代码是怎么样的?

ASCII的数字范围就可以了


Question: 数据结构 C 二进制数转化为十进制

Pop函数中，if(s->top = s->base) 中的“=”应为“==”

引用 2楼我是你的主体 的回复:但是我把语句中\n删除掉，也一样不能运行。刷新输出缓存区是什么意思?在后面再加一个 print,随便输出点什么，看看是否正常输出

但是我把语句中\n删除掉，也一样不能运行。刷新输出缓存区是什么意思?

因为你把'\n'放在了前面，没有刷新输出缓冲区


Question: C语言编译执行返回255(0xFF)且时间为2秒多是怎么回事?

知道怎么回事了， 声明了指针变量后对给它申请内存，谢谢。

main函数里声明的结构体指针是这野指针，你传参传过去，还是对野指针操作


Question: 求助大神

建议楼主阅读include\tchar.h


Question: C语言 不用#怎么输出Hello，World！

我也想知道

用TC或BC生成，在DosBox中运行：int main() {  short int s[12]={0x0748,0x0765,0x076c,0x076c,0x076f,0x072c,0x0757,0x076f,0x0772,0x076c,0x0764,0x0721};  int i;  short int *p=0xB8000000L;// *前面可能还得加far  for (i=0;i<12;i++) p[i]=s[i];  return 0; }

输出函数 对话框函数 · · ·

百度 如何不借助第三方库在屏幕上输出


对fopen返回值加判断

你的 incode.txt 文件在哪里

求助，大佬们，帮帮忙吧

不知道，原来的作业都是这么写的，也过了，现在跑原来的作业也是不行

fopen的返回值为空么?


Question: 一个小问题

后一个if包括在前面的if里了

诶还是有点不对，这个前一个if不运行，后一个if还是可以运行的，这不是顺序结构吗

明白了，多谢

if(i％2==1) 当i到1时才运行 第一次输入0时，i=0，if语句不运行


Question: 求解

如果你不想改变实参的值（La，Lb）， 那就在前面加上 const 修饰符： void MergeList_Sq(SqList *La,const SqList *Lb,const SqList *Lc);  如果按照你的理解， 即不带地址符的话（ void MergeList_Sq(SqList *La,SqList Lb,SqList Lc);）, 这样会有重新创建La和Lc 的对象， 这是对性能有比较大的影响的。

试试便知                   。


Question: 用栈判断回文 哪里有问题

if(str[w]==e)

for(int w=0;w<len;w++) { m=pop(s,&e); if(str[w]==m)   <== m 应该是 e g++; } p


Question: C语言编写windows程序

我用c-free运行挺好的啊！

代码没问题，不过要用WIN32应用程序，而不是控制台应用

引用 4 楼 JILAU_WHO_AM_I_Q234 的回复:[quote=引用 3 楼 赵4老师的回复:]#pragma comment(lib,"gdi32") #pragma comment(lib,"user32") //... 还是不行，还是原来那个错误[/quote] 什么编译器？？？？

引用 3 楼 赵4老师的回复:#pragma comment(lib,"gdi32") #pragma comment(lib,"user32") //... 还是不行，还是原来那个错误

引用 1 楼 赵4老师的回复:#pragma comment(lib,"gdi32") //... 没用啊

#pragma comment(lib,"gdi32") //...


Question: 关于栈的动态初始化的问题

栈的base和top是两个指针，分别用于指向栈底和栈顶，运用指针加减来实现数据的存入和输出；但是这两个都是野指针或者指向NULL的不可以用的空间，所以要用malloc申请堆上的空间，用于存放入栈的数据。 可以写成这样， S->top-S.base==S->stacksize是可以的，在你的程序没有问题； 但是，还是建议写成S->top-S.base >=S->stacksize 因为上面的写法是下面写法的子集。即上面条件满足的，在下面的判断表达式里也是真。

问题1：为什么在初始化的时候要给S->base分配那么多空间？这块不是太理解。S->top和S->base是共用一块空间吗。是像数组那样先分配一大堆空间然后S->base就是相当于数组名字指向第一块空间，S->top++就移动向S->base的下一块空间。 分配空间的大小当然是预留了； top base一个是栈顶，一个是栈底，初始化的时候，是空栈，没有存东西，所以top和base是指向同一个位置的。 你的理解没错。  问题2：Push操作中，S-top-S.base>=S->stacksize是不是可以改写为S->top-S.base==S->stacksize。Push的时候相等就又追加分配了，怎么可能超过S->stacksize?  因为push的时候，可能放入不止一个元素，所以有可能会超出，当然如果超出了说明上一次压栈就已经出问题了，应当在上一次压栈前就分配。

http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素


Question: C语言小问题

((fp = fopen("G:\\Work\EP17.mp4","ab"))==NULL  // // 改为 ((fp = fopen("G:\\Work\\EP17.mp4","ab"))==NULL  //有一个斜杠只写了一个，要双斜杠。

我在Linux上运行时没有问题的，a：表示追加数据永远在未见末尾，读取还是从头开始读的

rb

路径分隔一律写两个反斜杠

通过检查errno判断失败原因，进而再作分析  http://en.cppreference.com/w/c/io/fopen


Question: C语言的sleep函数－－linux

引用 2 楼 destory27的回复:并不是有东西读就会有输出，不然CPU的负载过大，它会先将待输出的内容放到输出缓冲区上，，等到缓冲区满之后输出，，但遇到操纵符会提前输出 万分感谢

引用 4 楼 赵4老师的回复:#include<stdio.h> #include<unistd.h> int main() {                  while(1)     {                   printf("-");fflush(stdout);         usleep(100000);     }           return  0; }  活人是永远不会被尿憋死的。 谢谢解答！

引用 1 楼 das白的回复:linux 下print输出遇到换行或者缓冲区满才会输出 也可以手动fflush Thank you very much!

加个控制符吧，不然得等到缓冲区满才会输出

Linux系统是有缓冲区的，加上\n就可以了


Question: 大家看一看这该怎么办

#include <stdio.h> int main() { 	char s[100] = { "Our teacher teach C language!" }; 	int i, j; 	for (i = j = 0; s[i] != '\0'; i++) 	if (s[i] != ' ') 		s[j++] = s[i]; 	s[j] = '\0'; 	printf("%s\n", s); 	return 0; }

楼上的老哥谢了，我明白了


Question: 赐教

多长时间取决于你每天花多少时间，我觉得有万行代码量（自己做习题或者小项目），就基本掌握C语言并具有一定解决问题的能力了。

搜“一万小时定律”

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

关键你要写哪方面的软件，我还是推荐MFC，我一直用它


Question: 用的是vc++6.0,为什么老是显示max is 2

#include <stdio.h> int max(float x, float y);  void main() { 	float a, b; 	int c; 	scanf("%f%f", &a, &b); // 去掉逗号。 	c = max(a, b); 	printf("Max is %d\n", c); }  int max(float x, float y) { 	float z; 	z = x > y ? x : y; 	return(z);    // 这里的强制转换不安全。 }

c应该改成float或者double类型，输出建议使用%lf

4楼应该是正解了吧

scanf("%f,%f",&a,&b); 你输入的格式应该是有逗号的

我知道会进行强制转换，但是无论是怎么输入任意的两个数字，他都会显示max is 2，我在想是不是代码错了

由于你max函数返回值和c都是int类型，比较后会将浮点数转换成整数

c是int 建议改成float


Question: 这个代码有错吗，我想讲这个整型数组从大到小输出，运行时不行

你这个会越界          。

非常感谢楼上所说的，我明白了，看来我的想法没有错，细节反而错了，真的十分感谢

代码没错，输出有问题啊 你的输出代码 printf("%d\n",a); 只是输出了数组a的首地址，要输出数组a中的所有元素 修改为 	for (int i = 0; i < N; ++i) 	{ 		printf("%d\n", a[i]); 	}

我想用的是冒泡法，相邻的数组之间进行比较


Question: C语言windows编程

正如楼上所说 HGDIOBJ GetStockObject(   _In_ int fnObject ); 返回值是HGDIOBJ，为GDI对象的句柄。 MSDN上说 If the function succeeds, the return value is a handle to the requested logical object. 即如果GetStockObject()函数执行成功，则返回值是所需逻辑对象的句柄。 你的代码 wndclass.hbrBackground = (BRUSH)GetStockObject(WHIHTE_BRUSH); 中，要获取系统自带的白色画刷，因此GetStockObject()函数应该返回画刷的句柄，即HBRUSH

应该是HBRUSH吧，是个句柄


Question: 求救，我这个程序为啥一直出现烫烫

主要是你的程序里面的字符串char name[21]没有合法的结尾符“\0”，所以就使程序跑出界限，同时显示乱码“烫烫”！改进如下：这样可以了吧O(∩_∩)O

烫烫  啥意思

在 DEBUG　版本中，变量之间是不连续的，为初始化的变量和变量之间的边界都是被编译器处理过的。 没有初始化的变量，DEBUG　会初始化为　0xCC 的，这个值和 烫 的内码一致。

for(i=1;i<=n;i++);  printf("%s\n",a[i].name); 去掉 for 后面的分号就可以了。 写程序的时候要规范。我在 for 和 if 之后的语句块一律使用 {}； 就算是是空循环也把分号写在 {;} 里面。

他出的是空，什么都没有，是程序有问题么？

给struct student加上默认构造函数，给里边的字符串初始化试试 示例如下： struct student {     char name[21];     int score;     student()     {         memset(name ,0, 21);         score = 0;     } }

 * 0xABABABAB : Used by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory 漱 * 0xABADCAFE : A startup to this value to initialize all free memory to catch errant pointers 涵? * 0xBAADF00D : Used by Microsoft's LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory 很? * 0xBADCAB1E : Error Code returned to the Microsoft eVC debugger when connection is severed to the debugger 撅饰 * 0xBEEFCACE : Used by Microsoft .NET as a magic number in resource files 烫烫 * 0xCCCCCCCC : Used by Microsoft's C++ debugging runtime library to mark uninitialised stack memory 屯屯 * 0xCDCDCDCD : Used by Microsoft's C++ debugging runtime library to mark uninitialised heap memory 葺葺 * 0xDDDDDDDD : Used by Microsoft's free() or delete to mark freed heap memory 蕲蕲 * 0xDEADDEAD : A Microsoft Windows STOP Error code used when the user manually initiates the crash  * 0xFDFDFDFD : Used by Microsoft's C++ debugging heap to mark "no man's land" guard bytes before and after allocated heap memory  * 0xFEEEFEEE : Used by Microsoft's HeapFree() to mark freed heap memory

你的变量内存中没有初始化，值为0xCCCCCCCC  而两个字节的0xCCCC的编码对应的中文就是 烫 ， 所以你的程序里会有一堆烫烫

#include<stdio.h>  struct student {     char name[21];     int score; };  int main() {     struct student a[100],t;     int i,j,n;      scanf("%d",&n);     for(i=1;i<=n;i++)         scanf("%s %d", a[i].name,&a[i].score);     for(i=1;i<=n-1;i++)         for(j=1;j<=n-i;j++)             if(a[j].score<=a[j+1].score)             {                 t=a[j];                 a[j]=a[j+1];                 a[j+1]=t;             }     for(i=1;i<=n;i++)    /*去掉这儿的分号*/         printf("%s\n",a[i].name);     getchar();     getchar();     return 0; } 建议i从0开始，因为数组的下标都是从0开始的。另外，对n的值进行检查，若大于100，则会出现数组越界，因此n不能超过100;


Question: 求助一个挺诡异的问题，使用malloc函数分配内存之后，一个不相关的字符数组的值被修改

是因为char *pelements[] = {NULL};这个数组长度是1，后面使用的时候越界了。

请问你的那个={null}那儿是什么意思呢

测试了你的代码，没有出现第三个17行没有任何输出的情况，第三个17行输入和前面的一样。 从你的代码逻辑上分析，没有任何地方对pbuffer指针进行赋值修改操作，所以buffer的内容是不会被修改的。

char *pelements[] = {NULL}; 这个数组只有一个元素，后来 pelements[index] = (char *)malloc(320);  的时候，index大于0了，pelements[index]用的是哪里的空间呢？

程序里几行print语句都是一样的，就是打印buffer这个字符数组的值，让人百思不得解的是为什么调用malloc给另一个指针分配内存之后，buffer的值就像被覆盖了一样。

程序的执行结果是这样的：  Line 15: 1.5+2*3^4/-5 Line 17: 1.5+2*3^4/-5 Line 20: 1.5+2*3^4/-5 Line 15: 1.5+2*3^4/-5 Line 17: 1.5+2*3^4/-5 Line 35: 1.5+2*3^4/-5 Line 15: 1.5+2*3^4/-5 Line 17:


Question: qnx系统 提示malloc check fail

QNX 资料太少了


Question: 想问一下关于C的一个问题！

引用 2 楼 qq_40455655 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] if(current_1->pnext=NULL) 这句有问题，判断语句变成了赋值语句；  通过error提示感觉是参数类型不匹配呢 是这样的，我定义了一个user结构体，然后用开始的定义是user *head和user *current，然后就显示类型不匹配… 那个判断变成赋值是我的问题，谢谢啦~[/quote] 把你的代码，数据结构定义再贴出来一些，尤其是提示这些error的函数声明

引用 1 楼 cfjtaishan 的回复:if(current_1->pnext=NULL) 这句有问题，判断语句变成了赋值语句；  通过error提示感觉是参数类型不匹配呢 是这样的，我定义了一个user结构体，然后用开始的定义是user *head和user *current，然后就显示类型不匹配… 那个判断变成赋值是我的问题，谢谢啦~


Question: C语言小问题

引用 1 楼 自信男孩的回复:#include <stdio.h> #include <stdlib.h> #include <ctype.h>  #define LEN 100  int main(int argc, char **argv) {     if (argc < 3) {         fprintf(stdout, "too less parameters!\n");         return 0;     }     char ch = argv[2][0];     int i = 1,j = 1;     switch(argv[1][0])    //从0开始吧     {         case 'p':             puts(argv[2]);             break;         case 'u':             while(ch != '\0')             {                 ch = toupper(ch);                 putchar(ch);                 ch = argv[2][i++];             }             break;         case 'l':             while(ch != '\0')             {                 ch = tolower(ch);                 putchar(ch);                 ch = argv[2][j++];             }             break;      }      return 0; } 建议加上对argc的判断，argc存放输入的个数； argv存放的字符串里没有回车符，因为回车符不会加入到argv中，所以使用字符串结束标记，因为argv存放的是字符串 谢谢

引用 3 楼 当凸遇见凹凹的回复:弱弱的问一句，你这定义二维数组的时候[2][0]？？？0个元素？ 是表示第三个字符串的第一个元素

弱弱的问一句，你这定义二维数组的时候[2][0]？？？0个元素？


Question: sscanf使用问题求解！

楼主，与其让各位大神在这里八仙过海各显神通，还不如从源头上避免这种情况。 解决方法: 尽量让%s(读取字符串）成为格式化输入的最后一部分。就是说%s后面就不要加内容了。 或者，在源字符串的最后的##前面加上空格。如"sum=283,haha ##"，就可以不用读取到##了

最多接受99个字符。因为buf2定义为char buf2[100];最后一个字符留给结尾‘\0’

引用 1 楼 zhao4zhong1 的回复:sscanf(p, "##sum=%d; no.%d; len=%d; %s", &sum, &num, &len, buf2); 改为 sscanf(p, "##sum=%d; no.%d; len=%d; %99[^#]", &sum, &num, &len, buf2); 测试了下可以，请问%99是什么意思？

#include <stdio.h> #include <string.h>  int main(void) {     char *p = "##sum=283; no.200; len=64; ccled##";     char buf2[100];     int sum = 0;     int num = 0;     int len = 0;     memset(buf2, 0, sizeof(buf2));     sscanf(p, "##sum=%d; no.%d; len=%d; %s##", &sum, &num, &len, buf2);     buf2[strlen(buf2) - 2] = 0;    /*去掉##*/     printf("%d; %d; %d; s:%s\n", sum, num, len, buf2);     return 0; } 为啥不直接去掉呢，buf2[strlen(buf2) - 2] = 0;

sscanf(p, "%*[^0-9]%d%*[^0-9]%d%*[^0-9]%d%*[^ ] %[^#]", &sum, &num, &len, buf2);


Question: 新手求助C语言链表操作

int QueryLinkList(LinkList *L,int x) {     if (!L || !(*L))         return 0;      LinkList p = *L;      if (p->data == x)    /*check header */         return 1;     else         p = p->next;      while (p && p->data < x && p != *L)         p = p->next;      if (p->data == x)         return 1;     return 0; } 循环单单链表的查找，个人建议为了模块化，查找只做查找，插入操作领定义函数

链表不适合折半查找，所以从头开始查吧，我只给你关键的伪代码，表达意思，真正的程序你要自己补全：  while (p->data < x) { 	pre = p; 	p = p->next; 	if (p == L) 		break; }  if (p->data == x) 	return 1;  n = new LinkList; pre->next = n; n->next = p; n->data = x;  return 0;

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

建议自己还要尝试写写，调试一下；这样对链表操作才能了解更多，以后才能独自写出符合特定需求的链表；

/*不带哨兵的*/ int QueryLinkList(LinkList *L,int x) {     if (!L || !(*L))         return 0;      LinkList p = *L;      while (p) {         if (p->data == x)             return 1;         p = p->next;     }      return 0; }  /*带哨兵的*/ int QueryLinkList(LinkList *L,int x) {     if (!L || !(*L))         return 0;      LinkList p = *L->next;      while (p) {         if (p->data == x)             return 1;         p = p->next;     }      return 0; }

int QueryLinkList(LinkList *L,int x) 求写这个函数


Question: 数据结构栈的应用

#include <stack> #include <vector> #include <iostream> #include <string> #include <unordered_set> using namespace std; unordered_set<string>hashset; void dfs(stack<char>st, vector<char>&arr, int index, string res) { 	if (index == arr.size()) { 		//scan over,pop all 		while (!st.empty()) { 			res += " "; 			res.append(1, st.top()); 			st.pop(); 		} 		//remove duplicate 		if(hashset.find(res)==hashset.end()) 			cout << res << endl; 		hashset.insert(res); 		return; 	} 	//keep 	st.push(arr[index]); 	dfs(st, arr, index + 1, res); 	st.pop();  	//pop 	res += " "; 	res.append(1, arr[index]); 	dfs(st, arr, index + 1, res); } int main() { 	vector<char>arr = { 'a','b','c','d' }; 	stack<char>st; 	dfs(st, arr, 0, ""); 	int a; 	cin >> a; }  随手写的，应该没问题

百度搜相关关键字。

大佬们请给指点啊


Question: 小程序求助，为什么输出的值不同（厘米转化为英尺）

#include <stdio.h>  int main() {      int cmlen;      scanf("%d",&cmlen);      int foot= cmlen/100.0/0.3048;      printf("foot: %d\n", foot);     int inch = (cmlen/100.0/0.3048-foot)*12;     printf("%lf\n", cmlen/100.0/0.3048);      printf("%d %d\n",foot,inch);      return 0; } A程序中(cmlen/100.0/0.3048-foot)*12这个表达式是会隐式转换为double类型，计算出的结果为double类型，赋值给inch，即又强制转换为int类型，取整。 B程序呢，如下，由于cm为整型数，所以cm = cm/ 100.0强制转为int，170/100.0= 1.70，转整型为1，可以发现在这儿已经减少了很多，0.7；所以分开计算会导致丢掉小数部分。使其精度降低。程序A不会在计算中丢失小数部分，因为在赋值inch之前一直是隐式转换为double类型了，foot一样，cmlen/100.0/0.3048;这个表达式按照double类型计算； #include<stdio.h> int main() {     int cm;      scanf("%d",&cm);      cm = cm/100.0;     printf("cm = %d\n", cm);      int foot= cm/0.3048;      printf("foot = %d\n", foot);      int inch= (cm/0.3048 - foot)*12;      printf("%d %d\n",foot,inch);// 输出      return 0; }

int会丢失好多数据 你用double啊

cm = cm/100.0 这里你输入170  结果为1


Question: 使用ShellExecute函数

Contents  Index  Topic Contents   Previous Topic: Shell Extensions Next Topic: Shell Links    Shell Library   A shell is an application that enables users to group, start, and otherwise control other applications. This overview describes features of the shell for the Microsoft® Windows® operating system.   About the Shell Library   Shell Library Reference   About the Shell Library The following features are supported by the dynamic-link library Shell.dll:   The drag-and-drop feature.  Associations used to find and start applications.  Extraction of icons from executable files.  Using the Drag-and-Drop Feature When an application implements the drag-and-drop feature, a user can select one or more files in File Manager, drag them to an open application, and drop them there. The application in which the files were dropped receives a message it can use to retrieve the file names and the coordinates of the point at which the files were dropped.   An application that can accept dropped files from File Manager calls the DragAcceptFiles function for one or more of its windows. When the user releases the mouse button to drop a file or files in the window specified in the call to DragAcceptFiles, File Manager sends the application a WM_DROPFILES message. (File Manager does not send the WM_DROPFILES message to an application unless the application calls DragAcceptFiles.) WM_DROPFILES contains a handle to a structure that the application can query to retrieve the name of the dropped file and the coordinates of the cursor when the file was dropped. The application can use the DragQueryFile function to retrieve a count of the files that were dropped and their names. The DragQueryPoint function returns the window coordinates of the cursor when the user released the mouse button.   To free the memory allocated by the system for the WM_DROPFILES message, an application calls the DragFinish function when it is finished.   For example, an application can call the DragAcceptFiles function when it starts and call a drag-and-drop function when it receives a WM_DROPFILES message, as shown in the following example.   case WM_CREATE:      DragAcceptFiles(hwnd, TRUE);      break;    case WM_DROPFILES:      DragFunc(hwnd, wParam); /* application-defined function */      break;    case WM_DESTROY:      DragAcceptFiles(hwnd, FALSE);      break;   The following example uses the DragQueryPoint function to determine where to begin to write text. The first call to the DragQueryFile function determines the number of dropped files. The loop writes the name of each file, beginning at the point returned by DragQueryPoint.   POINT pt;  WORD cFiles, a;  char lpszFile[80];    DragQueryPoint((HANDLE) wParam, &pt);    cFiles = DragQueryFile((HANDLE) wParam, 0xFFFF, (LPSTR) NULL, 0);  for(a = 0; a < cFiles; pt.y += 20, a++) {      DragQueryFile((HANDLE) wParam, a, lpszFile, sizeof(lpszFile));      TextOut(hdc, pt.x, pt.y, lpszFile, lstrlen(lpszFile));  }    DragFinish((HANDLE) wParam);   Using Associations to Find and Start Applications File Manager includes an Associate dialog box that makes it possible for users to associate a file name extension with a specific application. File Manager stores these associations in the registry (under HKEY_CURRENT_USER\Software\Description\Microsoft\Windows\CurrentVersion\Extensions). If a file has a file name extension that is associated with an application, that application starts automatically whenever the user double-clicks that file in File Manager.   Using the FindExecutable and ShellExecute functions, applications can take advantage of such associations to find and start applications or open and print files.   An application can use the FindExecutable function to retrieve the name and handle to the executable file that is associated with a specified file name. The ShellExecute function either opens or prints a specified file, depending on the value of its lpOperation parameter. To open a document file, the function relies on the association of the file name extension.   You can use ShellExecute to open or explore a folder. To open a folder, use either of the following calls:   ShellExecute(handle, NULL, "path_to_folder", NULL, NULL, SW_SHOWNORMAL);  or   ShellExecute(handle, "open", "path_to_folder", NULL, NULL, SW_SHOWNORMAL);  To explore a folder, use the following call:   ShellExecute(handle, "explore", "path_to_folder", NULL, NULL, SW_SHOWNORMAL);  If the lpOperation parameter is NULL, the function opens the file specified by its lpFile parameter. If lpOperation is "open", the function will open the file in a new window. If lpOperation is "explore", the function will browse to the folder using an existing Explorer window, if one is open. If an Explorer window is not open, a new one will be created.   Extracting Icons from Executable Files An application can use theExtractIcon function to retrieve the handle to an icon from a specified executable file, dynamic-link library, or icon file. The following example uses the DragQueryPoint function to retrieve the coordinates of the point where a file was dropped, the DragQueryFile function to retrieve the file name of a dropped file, and the ExtractIcon function to retrieve the handle to the first icon in the file, if any.   POINT pt;  WORD cFiles;  HDC hdc;  char lpszFile[80];  HANDLE hCurrentInst, hicon;    DragQueryPoint((HANDLE) wParam, &pt);    cFiles = DragQueryFile((HANDLE) wParam, 0xFFFF, NULL, NULL);    if(cFiles > 1) {      TextOut(hdc, pt.x, pt.y,          "Please drop only one icon file.", 31);      return FALSE;  }  else {      DragQueryFile((HANDLE) wParam, 0, lpszFile, sizeof(lpszFile));      hCurrentInst = (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE);      hicon = ExtractIcon(hCurrentInst, lpszFile, 0);      if (hicon == NULL)          TextOut(hdc, pt.x, pt.y, "No icons found.", 15);      else if (hicon == (HICON) 1)          TextOut(hdc, pt.x, pt.y,              "File must be .EXE, .ICO, or .DLL.", 33);      else          DrawIcon(hdc, pt.x, pt.y, hicon);  }    DragFinish((HANDLE) wParam);   Shell Library Reference The following programming elements are associated with shell features.   Shell Library Functions The following functions are used to implement shell features. DragAcceptFiles  DragFinish  DragQueryFile  DragQueryPoint  ExtractAssociatedIcon  ExtractIcon  ExtractIconEx  FindExecutable  ShellAbout  ShellExecute   ShellExecuteEx     Shell Library Messages The following message is used to implement shell features. Message  Description  WM_DROPFILES  Sent to the window that the mouse is over when the user drops an item or items on the window. See the WM_DROPFILES description for more information.    Shell Library Structures The following structure is used to implement shell features. SHELLEXECUTEINFO      --------------------------------------------------------------------------------   Top of Page  © 1997 Microsoft Corporation. All rights reserved. Terms of Use.


Question: 03-树2 List Leaves（25 分） C语言

这里不能使用\b，因为其实退格，并没有删除，也就是说最后还是存在一个空格

谢谢 我检查一下

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


Question: if嵌套对3个数大小排序问题

引用 楼主 qq2369187058 的回复:有3个数a,b,c，要求按大小顺序把它们输出       我不知道哪里错了求大神指点 #include<stdio.h> main() { 	int a,b,c,d; 	printf("输入a,b,c的值：\n"); 	scanf("%d,%d,%d",&a,&b,&c); 	if(a>b) ; <<<========= 加分号 		else d=a,a=b,b=d; 		if(b>c) 			printf("%d,%d,%d",a,b,c);else 			if(a>c) 			printf("%d,%d,%d",a,c,b); 			else printf("%d,%d,%d",c,a,b);  <<<========= acb顺序错，应为cab  } 按楼主的思路，上面注明了

#include<stdio.h> main() {     int a,b,c,d;     printf("输入a,b,c的值：\n");     scanf("%d,%d,%d",&a,&b,&c);       printf("输入的a,b,c的值：%d, %d, %d\n", a, b, c);      if (b > c) {         d = b;         b = c;         c = d;     }     if (a > c) {         d = a;         a = c;         c = d;     }     if (a > b) {         d = a;         a = b;         b = d;     }      printf("%d,%d,%d",a,b, c);  } 类似冒泡排序

楼主的代码第一个if只能保证a < b，但不能保证a、b与c的比较大小。 楼主的要求应该是：从小到大顺序。 所以如果按楼主的思路，应该这样写 如： if(a>b)  else d=a,a=b,b=d; if(b>c){ if(a > c) printf("%d,%d,%d",c,a,b); else printf("%d,%d,%d",a,c,b); }else{ printf("%d,%d,%d",a,b,c); }  如果从大到小： if(a<b)  else d=a,a=b,b=d; if(b>c){ printf("%d,%d,%d",a,b,c);}else{ if(a>c) printf("%d,%d,%d",a,c,b); else printf("%d,%d,%d",c,a,b); }


Question: 关于文件流的问题，求解

原楼主的代码中： int x = 10; char a[x]; char b[x]; 此处有隐患，数组元素个数要求是不可变的，所以严格意义上不能是变量。 至于楼主的疑问，下面这位兄弟的解析，很清晰易懂 引用 5 楼 paschen 的回复:每次你输入完点的回车，还会在缓冲区中留下找行符，这样会被下一次读入，而不再等待你继续输入了，get则将这个换行符读了，相当于把缓冲区清空了

在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

cin.get(b,x); 不加cin.get();那么上面这句接收到回车符返回了。  while(cin.get() != '\n')     continue; 这句是遇到回车符'\n'退出while循环

正常情况下回车都是被当做结束符的，所以你输入回车的时候就会结束。 另外 while(cin.get() != '\n')     continue; 根据代码看，当遇到回车是就会结束循环


Question: c语言循环水题超时

嗯，用递推关系求级数可以把时间复杂度从O(n^2)降到O(n)

每一次都要从头算起，所以超时了，

楼主是在那个平台做的？给个地址呗

引用 1 楼 user-4 的回复:#include <stdio.h>  double ha(int n)  {      int i,j;      double a,b,sum1=0,sum2=0;      for(i=1;i<=n;i++){          sum1+=1.0/i;          b=(1.0/sum1);          sum2+=b;      }          return sum2;  }  int main()  {      int a,b,i,c=0,d=0;      scanf("%d%d",&a,&b);      for(i=1;ha(i)<=a;i++);     c=i;     for(i=c;ha(i)<b;i++) d=i;     if(c!=d)         printf("%d %d",c,d);     else         printf("%d",c);     printf("\n");      return 0;  }还是超时了，规定时间3000ms-


Question: 网易2018招聘真题 [编程题] 相反数

int main() { 	int nuber = 100; 	int n= nuber; 	int temp = 0; 	while (n!=0) 	{ 		temp = temp * 10 + n %10; 		n /= 10; 	} 	printf("%d",nuber + temp); 	getchar(); 	return 0; }

while(n>=10)  应该是 while(n>0)

可能是 pow 函数的问题。该函数的参数和返回值都是 double，所以计算 y+b[i]*pow(10,t++) 时是按 double 进行的，最后赋值给 y，可能引入截断误差。 整数运算是应避免浮点函数。

刚少了进位 #include <stdio.h> #include <string.h> int main() { 	int adr; 	char b[100] = {0}; 	char* pout = b+98; 	int n;  	scanf("%s", &b); 	n = strlen(b); 	 	adr = 0; 	for (int i=0; i<n; i++) 	{ 		adr = adr + b[i] + b[n-i-1] - 2*'0'; 		*pout-- = (adr%10)+'0'; 		adr = adr / 10; 	} 	if (adr > 0) 	{ 		*pout-- = adr + '0'; 	} 	printf("%s\n", pout+1); 	return 0; }

#include <stdio.h> #include <string.h> int main() { 	int adr; 	char b[100] = {0}; 	char* pout = b+98; 	int n;  	scanf("%s", &b); 	n = strlen(b); 	 	adr = 0; 	for (int i=0; i<n; i++) 	{ 		adr = adr + b[i] + b[n-i-1] - 2*'0'; 		*pout-- = (adr%10)+'0'; 		adr = adr / 10; 	} 	printf("%s\n", pout+1); 	return 0; }

int main() { 	int n,t,f{0};  	while (cin>>n) 	{	 		t = n; 		f = 0;  		do  		{ 			f = f * 10 + (t %10); 		} while (t = t / 10); 				 		cout << f + n << endl; 	} 	 	return 0; } 话说大网易出题怎么会这么简单，前天看到的那个储物柜的面试题真是好多坑

因为，100将数字顺序颠倒后得到是1,100+1就是101

int main() { 	int n, a, y, i, n1; 	 	while (~scanf("%d", &n)) 	{ 		int t = 0; 		int b[100]; 		i = 0; y = 0; 		n1 = n; 		while (n >= 10) 		{ 			a = n % 10; 			b[i++] = a; 			n = n / 10; 		} 		b[i] = n; 		for (; i >= 0; i--) 		{ 			y = y + b[i] * pow(10, t++); 		}  		printf("%d\n", y + n1); 	} 	return 0; }  我这里运行没问题， 结果是对的， 唯一有点问题的就是一次循环结束后没有付初值，对后续循环有影响


写了篇文章 《C++中有符号整数的取值范围》 http://blog.csdn.net/hou09tian/article/details/78145578 希望能帮助到你

首先，答案应该没有问题  对于有符号的数据类型，将第一位设置为0表示整数，第一位设置为1表示负数 如 short  a=1;short b=-1; 那么此时，a的值是0000 0000 0000 0001；b的值按照上述表示方式为1000 0000 0000 0001，但是计算机中是使用补码的方式来表示负数的，补码的含义就是把数据中除符号位（即第一位）之外的其它位取反之后在加1，所以b的值应该是1111 1111 1111 1111即0xFFFF。 回到程序当中来 int a = 32768; 此时a的值是0x00008000，即0000 0000 0000 0000 1000 0000 0000 0000，接下来 short b = a; 此时b的值是0x8000，即1000 0000 0000 0000，从结构上看它应该是个负数，但是需要注意的是，没有一个数的补码是1000 0000 0000 0000， 所以人为地把1000 0000 0000 0000定义为-32768，即-32767的值是1000 0000 0000 00001，而-32768的值是1000 0000 0000 0000 所以short类型的取值范围是-32768~32767

只有作者自己知道

不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

应该是0x8000 吧 我感觉答案写错了


Question: float和double比较判断

浮点数有精度误差，很多十进制数用二进制都没法精度表示，由于float和double在内存中精度是不同的，所以表示同样一个数值是有微小误差的

其次，比较的结果是bool值，用%d输出可以，但用%f是按浮点数解析的，没有任何意义，结果为1不代表true，为0也不代表false

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

引用 2 楼 cfjtaishan 的回复:浮点数比较大小不能按照整型数那样直接比较（如果相差很大，整数部分就有差距）； 浮点数比较大小，一般是两个浮点型相减，差值小于1e-6,则两数相等，若大于1e-6，则被减数大于减数，否则相反； 描述有点问题，差值的绝对值小于1e-6，即0.000001, 则两数相等；否则根据数的正负来确定那个数较大

为什么格式符是%d的时候是1  %f的时候是0  相同的浮点值情况下 double和float分大小吗？ 不是的，因为c1 < c2得出的是一个真假，即整型数据，如果要用%d能够正常输出，真即1，假即0； 如果用%f输出，由于整型数和浮点数在内存里的存储方式不同（建议楼主查一下这方面的差异），整型1在内存里存放的数据，按照%f浮点型输出，那么就是0.00000 就像printf ("%f", 2/1);得到的结果一样是0.000000


Question: c语言循环水题纠错

引用 4 楼 LiuCunZhiPu 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] ha函数里，x = g/h改一下 改成这样： x = g * 1.0/h  因为整型和浮点型数据在内存里的保存不一样，g/h都是int类型，计算之后是int类型。直接转成double类型，就是得到你的结果；  建议了解一下浮点型在内存里的表示  把整型赋值给浮点型会发生隐式类型转换的呀。所以不需要 x=(double)h/g; 或者 x=h*1.0/g;[/quote]   x=(double)h/g; 这个不是隐式类型转换，这个是强制类型转换

引用 5 楼 LiuCunZhiPu 的回复:[quote=引用 1 楼 hdt 的回复:] int  / int 还是int 难道不会发生隐式类型转换？整型赋值给double的x呀 [/quote] 试一下，就知道，代码那么少，这里问，不如自己动手做

引用 1 楼 hdt 的回复:int  / int 还是int 难道不会发生隐式类型转换？整型赋值给double的x呀

引用 2 楼 cfjtaishan 的回复:ha函数里，x = g/h改一下 改成这样： x = g * 1.0/h  因为整型和浮点型数据在内存里的保存不一样，g/h都是int类型，计算之后是int类型。直接转成double类型，就是得到你的结果；  建议了解一下浮点型在内存里的表示  把整型赋值给浮点型会发生隐式类型转换的呀。所以不需要 x=(double)h/g; 或者 x=h*1.0/g;

难道不会发生隐式类型转换吗？

int  / int 还是int


Question: 大学c的题目，要求输入任意日期，输出相应的星期，各位帮我看看哪有问题

对！好的程序对一些函数或语句都有必要的说明或注释，这叫完整的文档O(∩_∩)O

不加注释看参数  楼主你回头看能一下子明白吗

// 某年是否是闰年 bool isLeapYear(int y) { 	return ((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0); }  // 某年某月有多少天 int daysOfMonth(int y, int m) { 	static int dm[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };  	return dm[m] + ((m == 2 && (isLeapYear(y)) ? 1 : 0)); }  // 某日期在该年的哪一天（即在该年的累计天数） int daysInYear(int y, int m, int d) { 	while (--m > 0) 		d += daysOfMonth(y, m);  	return d; }  // 某日期是星期几 int dayOfWeek(int y, int m, int d) { 	return (y - 1 + (y - 1) / 4 - (y - 1) / 100 + (y - 1) / 400 + daysInYear(y, m, d)) % 7; }

失误：case 3: 	b += 28 + leap(n); // 这里 n 应该 + 1

楼上的思路不错，确实简单很多O(∩_∩)O

“输入格式，如：2017-10-12。你那样 %d%d%d 是不对的，你让如何区分三个数字？”使用空格来区分年月日的，使用“-”符号，在输入时必须使用“-”来分隔年月日，并且在输入时“-”符号是不可见的。别人如何知道“-”，并且正确的输入O(∩_∩)O。

写得太啰嗦了，我简化一下：#include <stdio.h>  static const char *weekdays[] = { 	"Sunday", 	"Monday", 	"Tuesday", 	"Wednesday", 	"Thursday", 	"Friday", 	"Saturday" };  static const int DAYS_IN_WEEK = sizeof(weekdays) / sizeof(*weekdays);  static int leap(int y) { 	return ((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0); }  int main(void) { 	int y = 0; 	int m = 0; 	int d = 0; 	int n = 0; 	int b = 0; 	scanf("%d-%d-%d", &y, &m, &d); 	while (++n < y) { 		b += 365 + leap(n); 	} 	switch (m) { 	case 12: 		b += 30; 	case 11: 		b += 31; 	case 10: 		b += 30; 	case 9: 		b += 31; 	case 8: 		b += 31; 	case 7: 		b += 30; 	case 6: 		b += 31; 	case 5: 		b += 30; 	case 4: 		b += 31; 	case 3: 		b += 28 + leap(n); 	case 2: 		b += 31; 	case 1: 		b += d; 	default: 		break; 	} 	if (b >= DAYS_IN_WEEK) { 		b %= DAYS_IN_WEEK; 	} 	printf("%d/%d/%d: %s\n", y, m, d, weekdays[b]); 	return 0; }输入格式，如：2017-10-12。你那样 %d%d%d 是不对的，你让如何区分三个数字？

消除一些错误的最终源码 #define _CRT_SECURE_NO_WARNINGS #include<string.h> #include<stdio.h> #include<memory.h>    struct SDate//Date时间数组结构体 { int nYear; int nMonth; int nDay; }dt = { 2008,10,7 };  int iYear(SDate *p)//输入年份转化为对基准的超前天数，注：基准年份为公元1年1月1日为星期一 { 	int y=p->nYear; 	unsigned int nDay; 	y = y - 1; 	nDay = y * 365; 	while (y> 0) 	{ 		if ((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) 			++nDay; 		else 			nDay = nDay; 		--y; 	} 	return nDay;  	 }  int iMonth(SDate *p)//一年中第几天计算函数 { 	 	int ms[] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; 	int i = 0; 	unsigned int nDay = p->nDay; 	while (i < p->nMonth - 1) 	{ 		nDay += ms[i]; 		++i; 	} 	if ((p->nYear % 4 == 0) && (p->nYear % 100 != 0) || (p->nYear % 400 == 0)) 		if (p->nMonth > 2) 			++nDay; 	return nDay;  }  void iWeek(int d)//一年中的天数转化成星期几函数 { 	unsigned int day=d; 	 	day = (day-1) % 7; 	switch (day) 	{ 	case 0:printf("Monday(星期一)"); break; 	case 1:printf("Tuesday(星期二)"); break; 	case 2:printf("Wednesday(星期三)"); break; 	case 3:printf("Thursday(星期四)"); break; 	case 4:printf("Friday(星期五)"); break; 	case 5:printf("Saturday(星期六)"); break; 	case 6:printf("Sunday(星期日)"); break; 	} }   void InputDate(SDate *p) { 	printf("请输入需要计算的年月日"); 	scanf("%d%d%d", &p->nYear, &p->nMonth, &p->nDay);  }  int main()//计算给定年月日后在年的第几天 { 	 	SDate *p = &dt; 	unsigned int Calculateday = 0; 	InputDate(&dt);  	Calculateday = iYear(&dt) + iMonth(&dt);     printf("%d年%d月%d日是星期：",p->nYear,p->nMonth,p->nDay); 	iWeek(Calculateday);  	return 0; }

355 what is it?

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h>  int Calculateday(int y,int m,int d) { 	unsigned int  year,  b = 0, month, c, day; 	day = d;  	month = m;  	year = y; 	c = y; 	year = year - 1; 	while (y> 0) 	{ 		if ((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) 			++b; 		else 			b = b; 		--y; 	} 	day = year * 365 + b+day;  	if (month == 1 && month == 2) 	{ 		if ((c % 4 == 0) && (c % 100 != 0) || (c % 400 == 0)) 			day = day + 29; 		else 			day = day + 28; 	} 	month = month - 2;  	while (month > 0) 	{ 		if (month % 2 == 0) 			day = day + 31; 		else 			day = day + 30; 		month--; 	}  	 	return day;  }  void iWeek(int d) { 	unsigned int day; 	day = d; 	day = day % 7; 	switch (day) 	{ 	case 0:printf("Monday"); break; 	case 1:printf("Tuesday"); break; 	case 2:printf("Wednesday"); break; 	case 3:printf("Thursday"); break; 	case 4:printf("Friday"); break; 	case 5:printf("Saturday"); break; 	case 6:printf("Sunday"); break; 	} }  int main() { unsigned int  year,month,day; printf("请输入需要计算的年月日："); scanf("%d%d%d",&year,&month,&day);//任意输入一个年月日,把公元元年元旦(公元1年1月1日)规定为星期一 day = Calculateday(year,month,day);//统计对应的日期数 iWeek(day);                        //计算具体为星期几  return 0; } 这是优化后的代码O(∩_∩)O

还有错，改正如下： #define _CRT_SECURE_NO_WARNINGS #include <stdio.h>     int main() { unsigned int  year,b = 0,c,month,d,day; scanf("%d%d%d",&year,&month,&day);//任意输入一个年月日 c = year; year = year - 1; while (year > 0) { 	if ((c % 4 == 0) && (c % 100 != 0) || (c % 400 == 0)) 		b = b + 1; 	else 	b = b; 	year--; } b = b * 366; c = (c - b) * 355; if ((c % 4 == 0) && (c % 100 != 0) || (c % 400 == 0)) switch (month) { case 1:d = 0; break; case 2:d = 31; break; case 3:d = 29 + 31; break; case 4:d = 31 + 29 + 31; break; case 5:d = 30 + 31 + 29 + 31; break; case 6:d = 31 + 30 + 31 + 29 + 31; break; case 7:d = 30 + 31 + 30 + 31 + 29 + 31; break; case 8:d = 31 + 30 + 31 + 30 + 31 + 29 + 31; break; case 9:d = 31 + 31 + 30 + 31 + 30 + 31 + 29 + 31; break; case 10:d = 30 + 31 + 31 + 30 + 31 + 30 + 31 + 29 + 31; break; case 11:d = 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 29 + 31; break; case 12:d = 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 29 + 31; break; } else switch (month) { case 1:d = 0; break; case 2:d = 31; break; case 3:d = 28 + 31; break; case 4:d = 31 + 28 + 31; break; case 5:d = 30 + 31 + 28 + 31; break; case 6:d = 31 + 30 + 31 + 28 + 31; break; case 7:d = 30 + 31 + 30 + 31 + 28 + 31; break; case 8:d = 31 + 30 + 31 + 30 + 31 + 28 + 31; break; case 9:d = 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31; break; case 10:d = 30 + 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31; break; case 11:d = 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31; break; case 12:d = 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31; break; } day = day + d + c + b; day = day % 7; switch (day) { case 0:printf("Monday"); break; case 1:printf("Tuesday"); break; case 2:printf("Wednesday"); break; case 3:printf("Thursday"); break; case 4:printf("Friday"); break; case 5:printf("Saturday"); break; case 6:printf("Sunday");break; } return 0;

有几个地方错了改正如下： #include <stdio.h>     int main() { unsigned int  year,b = 0,c,month,d,day; scanf("%d%d%d",&year,&month,&day);//任意输入一个年月日 c = year; year = year - 1; while (year > 0) { 	if ((c % 4 == 0) && (c % 100 != 0) || (c % 400 == 0)) 		b = b + 1; 	else 	b = b; 	year--; } b = b * 366; c = (c - b) * 355; if ((c % 4 == 0) && (c % 100 != 0) || (c % 400 == 0)) switch (month) { case 1:d = 0; break; case 2:d = 31; break; case 3:d = 29 + 31; break; case 4:d = 31 + 29 + 31; break; case 5:d = 30 + 31 + 29 + 31; break; case 6:d = 31 + 30 + 31 + 29 + 31; break; case 7:d = 30 + 31 + 30 + 31 + 29 + 31; break; case 8:d = 31 + 30 + 31 + 30 + 31 + 29 + 31; break; case 9:d = 31 + 31 + 30 + 31 + 30 + 31 + 29 + 31; break; case 'a':d = 30 + 31 + 31 + 30 + 31 + 30 + 31 + 29 + 31; break; case 'b':d = 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 29 + 31; break; case 'c':d = 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 29 + 31; break; } else switch (month) { case 1:d = 0; break; case 2:d = 31; break; case 3:d = 28 + 31; break; case 4:d = 31 + 28 + 31; break; case 5:d = 30 + 31 + 28 + 31; break; case 6:d = 31 + 30 + 31 + 28 + 31; break; case 7:d = 30 + 31 + 30 + 31 + 28 + 31; break; case 8:d = 31 + 30 + 31 + 30 + 31 + 28 + 31; break; case 9:d = 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31; break; case 'a':d = 30 + 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31; break; case 'b':d = 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31; break; case 'c':d = 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31; break; } day = day + d + c + b; day = day % 7; switch (day) { case 1:printf("Monday"); break; case 2:printf("Tuesday"); break; case 3:printf("Wednesday"); break; case 4:printf("Thursday"); break; case 5:printf("Friday"); break; case 6:printf("Saturday"); break; case 0:printf("Sunday");	break; } return 0; }

case为什么要加单引号，试一试不加。我好像没加过。

这样的程序看起来真的不太好，不知道你参加ACM吗？你这样写编程的效率太低了。你这样写就算没有BUG，写完的时候别人第二题都快AC了，建议找一下规律递归一下就可以了。不建议养成这样编程习惯。这样写，正确率，编程效率都不高。定义宏，递归处理比较好

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

这个是算法问题吧。只要弄懂日期与星期几的转换，应该一下子出来。

d是整型，所以case 后面的选项都应该用整型的1， 2， 3，4...


Question: 同样一段代码在tdm gcc上运行不出来，在mingw gcc就可以运行出来

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

for(int i = 0; i < userLen; i++) { // 计算趟次为userLen次，即每个user都要跟其它user比较得出相似性得分         if(userDegree[i] == 0)             continue;         for(int j = i + 1; j < userLen; j++) {             if(userDegree[j] == 0)                 continue;             //          比较user(i+1)的itemList和user(j+1)的itemList的交集与并集             int intersectionCount = 0;  //交集的个数             if(userDegree[i] <= userDegree[j]) { //用度小的为基准，可能查找的次数会变少                 for(int k = 1; k <= userDegree[i]; k++) {                     int itemId = *(userP[i] + k); //获得id值                     for(int l = 1; l <= userDegree[j]; l++) {                         if(itemId == *(userP[j] + l)) {                             intersectionCount++;                             break;                         }                     }                 }             } else {                 for(int k = 1; k <= userDegree[j]; k++) {                     int itemId = *(userP[j] + k); //获得id值                     for(int l = 1; l <= userDegree[i]; l++) {                         if(itemId == *(userP[i] + l)) {                             intersectionCount++;                             break;                         }                     }                 }             }             if(intersectionCount == 0)                 continue;             //              求出并集的个数             int unionSetCount = userDegree[i] + userDegree[j] - intersectionCount;             //          权值             double weight = (double)intersectionCount / unionSetCount;             //          把这个权值累加到user i的所有item对应的权值位置，和j的所有item对应的权值位置             for(int k = 1; k <= userDegree[i]; k++) {                 int itemId_i =  *(userP[i] + k);                 *(userScore[j] + itemId_i) += weight;             }             for(int k = 1; k <= userDegree[j]; k++) {                 int itemId_j =  *(userP[j] + k);                 *(userScore[i] + itemId_j) += weight;             }         }

MyLog1.log和可执行文件在同一目录下。

跟系统也是有关系的吧


Question: 求助：关于IEEE754浮点数的操作的问题

Run-Time Library Reference  printf Type Field Characters  ……  %a  double  Signed hexadecimal double precision floating point value having the form [−]0xh.hhhh p±dd, where h.hhhh are the hex digits (using lower case letters) of the mantissa, and dd are one or more digits for the exponent. The precision specifies the number of digits after the point.   %A  double  Signed hexadecimal double precision floating point value having the form [−]0Xh.hhhh P±dd, where h.hhhh are the hex digits (using capital letters) of the mantissa, and dd are one or more digits for the exponent. The precision specifies the number of digits after the point.

#include <stdio.h>   int main(void) {     double d = 1.2345;     int intege = 0;     double point = 0.0;      intege = (int)d;     point = d - intege;      printf("%d, %.4lf\n", intege, point);      return 0; } 作为一个参考吧

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


Question: vs community2015的C语言

把另一个文件移除了

点击选择右边“菲波那契数列.c”，按Del键，……

在一个程序中或项目中只能有一个main，这个main是整个程序或者项目的执行入口

一个项目只能定义一个入口点

1.你新建一个工程就好了  2.把小程序写成一个函数 然后主函数调用也可以  3.你保存原有程序到一个文档 然后删除写你的新程序 解决方法太多了


Question: 关于鸽巢排序的问题？

那个并不是一个运算符  --  和  >  两个

(j--)  > 0

bucket[j]-->0 这个是一个判断+后减的表达式，先判断bucket[j] > 0是否大于0，然后再将bucket[j]的值减1


Question: if语句

a + b>c || a + c>b || b + c>a 和 a + b>c && a + c>b && b + c>a) 能是一回事吗？  运算符优先级：//C++ Operators //  Operators specify an evaluation to be performed on one of the following: //    One operand (unary operator) //    Two operands (binary operator) //    Three operands (ternary operator) //  The C++ language includes all C operators and adds several new operators. //  Table 1.1 lists the operators available in Microsoft C++. //  Operators follow a strict precedence which defines the evaluation order of //expressions containing these operators.  Operators associate with either the //expression on their left or the expression on their right;    this is called //“associativity.” Operators in the same group have equal precedence and are //evaluated left to right in an expression unless explicitly forced by a pair of //parentheses, ( ). //  Table 1.1 shows the precedence and associativity of C++ operators //  (from highest to lowest precedence). // //Table 1.1   C++ Operator Precedence and Associativity // The highest precedence level is at the top of the table. //+------------------+-----------------------------------------+---------------+ //| Operator         | Name or Meaning                         | Associativity | //+------------------+-----------------------------------------+---------------+ //| ::               | Scope resolution                        | None          | //| ::               | Global                                  | None          | //| [ ]              | Array subscript                         | Left to right | //| ( )              | Function call                           | Left to right | //| ( )              | Conversion                              | None          | //| .                | Member selection (object)               | Left to right | //| ->               | Member selection (pointer)              | Left to right | //| ++               | Postfix increment                       | None          | //| --               | Postfix decrement                       | None          | //| new              | Allocate object                         | None          | //| delete           | Deallocate object                       | None          | //| delete[ ]        | Deallocate object                       | None          | //| ++               | Prefix increment                        | None          | //| --               | Prefix decrement                        | None          | //| *                | Dereference                             | None          | //| &                | Address-of                              | None          | //| +                | Unary plus                              | None          | //| -                | Arithmetic negation (unary)             | None          | //| !                | Logical NOT                             | None          | //| ~                | Bitwise complement                      | None          | //| sizeof           | Size of object                          | None          | //| sizeof ( )       | Size of type                            | None          | //| typeid( )        | type name                               | None          | //| (type)           | Type cast (conversion)                  | Right to left | //| const_cast       | Type cast (conversion)                  | None          | //| dynamic_cast     | Type cast (conversion)                  | None          | //| reinterpret_cast | Type cast (conversion)                  | None          | //| static_cast      | Type cast (conversion)                  | None          | //| .*               | Apply pointer to class member (objects) | Left to right | //| ->*              | Dereference pointer to class member     | Left to right | //| *                | Multiplication                          | Left to right | //| /                | Division                                | Left to right | //| %                | Remainder (modulus)                     | Left to right | //| +                | Addition                                | Left to right | //| -                | Subtraction                             | Left to right | //| <<               | Left shift                              | Left to right | //| >>               | Right shift                             | Left to right | //| <                | Less than                               | Left to right | //| >                | Greater than                            | Left to right | //| <=               | Less than or equal to                   | Left to right | //| >=               | Greater than or equal to                | Left to right | //| ==               | Equality                                | Left to right | //| !=               | Inequality                              | Left to right | //| &                | Bitwise AND                             | Left to right | //| ^                | Bitwise exclusive OR                    | Left to right | //| |                | Bitwise OR                              | Left to right | //| &&               | Logical AND                             | Left to right | //| ||               | Logical OR                              | Left to right | //| e1?e2:e3         | Conditional                             | Right to left | //| =                | Assignment                              | Right to left | //| *=               | Multiplication assignment               | Right to left | //| /=               | Division assignment                     | Right to left | //| %=               | Modulus assignment                      | Right to left | //| +=               | Addition assignment                     | Right to left | //| -=               | Subtraction assignment                  | Right to left | //| <<=              | Left-shift assignment                   | Right to left | //| >>=              | Right-shift assignment                  | Right to left | //| &=               | Bitwise AND assignment                  | Right to left | //| |=               | Bitwise inclusive OR assignment         | Right to left | //| ^=               | Bitwise exclusive OR assignment         | Right to left | //| ,                | Comma                                   | Left to right | //+------------------+-----------------------------------------+---------------+

if条件成立才会进。不确定情况加上括号。

引用 8 楼 qq_40430681 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] #include<stdio.h> #include<math.h>  int main() {     float a, b, c, s, area;     printf("input 3 lengths:");     scanf_s("%f,%f,%f", &a, &b, &c);     if (a == 0 || b == 0 || c == 0)    /* 三边有一个为0，则不能组成三角形*/         printf("cannotconstitute a triangle!");     else if (a + b > c && a + c > b && b + c > a)     {         s = 1.0 / 2 * (a + b + c);         area = sqrt(s*(s - a)*(s - b)*(s - c));         printf("a=%7.2f,b=%7.2f,c=%7.2f", a, b, c);         printf("s=%7.2f,area=%7.4f", s, area);     }      return 0; } 判断条件有问题，if 和else if的||和&&正好调换一下；   --------------------------------------------------- 把你的代码贴到我的vs2015上面也是得不到答案，可能是软件的问题？[/quote] 加一句： system("pause"); 试试

2楼的代码没错啊，需要注意的是 scanf_s("%f,%f,%f", &a, &b, &c); 所以你的输入应该是类似“3,4,5”，VS2015+Windows10 64位运行的结果如下  如果不想输入逗号，则输入语句改为 scanf_s("%f%f%f", &a, &b, &c); 输入及输出的结果如下

引用 6 楼 qq_40430681 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] 或、且 不是一回事啊！ 引用 1 楼 liaoyaonline 的回复:我运行了一下，没发现错误啊 #include<stdio.h> #include<math.h> void main() { 	float a, b, c, s, area; 	printf("input 3 lengths:"); 	scanf_s("%f,%f,%f", &a, &b, &c); 	if (a == 0 && b == 0 && c == 0) 		printf("cannotconstitute a triangle!"); 	else if ((a + b)>c || a + c>b || b + c>a)这里有错误，你少打了括号，或者说多打了括号。 { 	s = 1.0 / 2 * (a + b + c); 	area = sqrt(s*(s - a)*(s - b)*(s - c)); 	printf("a=%7.2f,b=%7.2f,c=%7.2f", a, b, c); 	printf("s=%7.2f,area=%7.4f", s, area); } 	else; } 当我输入：3，4，5 输出：a=   3.00,b=   4.00,c=   5.00s=   6.00,area= 6.0000。。 符合你的表达式啊。  ---------------------------------------- 我看书上也没括号 ，我是vs 2015，你是什么[/quote] 我用的是vs2017 哦哦，是我看错了，不过我按照你的程序去运行了，结果和我自己按照你的算法的结果一致，没发现什么错误。 但是你要是按照这个来判断是不是三角形的话，你的第一个if就是错误的了，因为它判断的是如果三条边都是<=0输出cannotconstitute a triangle!

引用 2 楼 cfjtaishan 的回复:#include<stdio.h> #include<math.h>  int main() {     float a, b, c, s, area;     printf("input 3 lengths:");     scanf_s("%f,%f,%f", &a, &b, &c);     if (a == 0 || b == 0 || c == 0)    /* 三边有一个为0，则不能组成三角形*/         printf("cannotconstitute a triangle!");     else if (a + b > c && a + c > b && b + c > a)     {         s = 1.0 / 2 * (a + b + c);         area = sqrt(s*(s - a)*(s - b)*(s - c));         printf("a=%7.2f,b=%7.2f,c=%7.2f", a, b, c);         printf("s=%7.2f,area=%7.4f", s, area);     }      return 0; } 判断条件有问题，if 和else if的||和&&正好调换一下；    --------------------------------------------------- 把你的代码贴到我的vs2015上面也是得不到答案，可能是软件的问题？

引用 5 楼 zhao4zhong1 的回复:或、且 不是一回事啊！ 引用 1 楼 liaoyaonline 的回复:我运行了一下，没发现错误啊 #include<stdio.h> #include<math.h> void main() { 	float a, b, c, s, area; 	printf("input 3 lengths:"); 	scanf_s("%f,%f,%f", &a, &b, &c); 	if (a == 0 && b == 0 && c == 0) 		printf("cannotconstitute a triangle!"); 	else if ((a + b)>c || a + c>b || b + c>a)这里有错误，你少打了括号，或者说多打了括号。 { 	s = 1.0 / 2 * (a + b + c); 	area = sqrt(s*(s - a)*(s - b)*(s - c)); 	printf("a=%7.2f,b=%7.2f,c=%7.2f", a, b, c); 	printf("s=%7.2f,area=%7.4f", s, area); } 	else; } 当我输入：3，4，5 输出：a=   3.00,b=   4.00,c=   5.00s=   6.00,area= 6.0000。。 符合你的表达式啊。  ---------------------------------------- 我看书上也没括号 ，我是vs 2015，你是什么

或、且 不是一回事啊！

去看看运算符的优先级。不确定的情况下打括号，不然编译器不知道你要做什么

注意输入格式，如果判断是不是三角形，要任意两边之和大余第三边，用&&吧


Question: C语言

要输入什么内容才能触发第一个else后面那句话? 根据代码 if (s_gets(flower, SIZE)) { strcat(flower, addon); puts(flower); puts(addon); } else     puts("End of file encounted."); 要出发else语句，则if的条件语句为false，即s_gets(flower,SIZE)的返回值为NULL。 再来看s_gets()函数，返回值是ret_val，要想让该变量为NULL，则 ret_val = fgets(st, n, stdin); 需要fgets()函数返回值为NULL，在MSDN中提到了该函数返回NULL的条件 “Each of these functions returns str. NULL is returned to indicate an error or an end-of-file condition.” 正常情况下，fgets()返回值是输入的字符str；当发生错误或者EOF条件发生时，将返回NULL。 在Windows中，ctrl+Z表示EOF，所以输入ctrl+Z即可触发第一个else后面那句话，如图所示  另外，SIZE的值需要变大 #define SIZE 20 而在if的执行语句中 strcat_s(flower, addon); addon的长度就已经超过20了，此时会遇到越界问题，可以将SIZE设置为一个较大的值

输入ctrl+z（即EOF终止）则执行else的内容  http://en.cppreference.com/w/c/io/fgets

对于s_gets函数，主要是根据fgets函数， fgets(st, n, stdin); 若输入的字符小于n，那么会将'\n'加入缓存st中，并在'\n'后面加上'\0'； 若输入的字符等于n-1，那么不会将'\n'加入缓存st中，只是将'\0'加入到缓存末尾； 这个是fgets的函数的实现逻辑，详尽的建议查阅fgets函数的实现逻辑

#include <stdio.h> #include <string.h>  #define SIZE 20  char * s_gets(char * st, int n);  int main(void) {     char flower[SIZE];     char addon[] = "s smell like old shoes.";      puts("What is your favourite flower?");     if (s_gets(flower, SIZE))     {         strcat(flower, addon);         puts(flower);         puts(addon);     }     else         puts("End of file encounted.");     puts("bye.");      return 0; }  char * s_gets(char * st, int n) {     int i = 0;     char * ret_val;      ret_val = fgets(st, n, stdin);     if (ret_val)   //即 ret_val != NULL     {         while (st[i] != '\n' && st[i] != '\0')             i++;          if (st[i] == '\n')             st[i] = '\0';         else             while (getchar() != '\n')                 continue;     }      return ret_val; } 如果是在Linux下直接ctrl+d组合键，若是Windows下，直接ctrl+z组合键就可以执行else；

回车之前如果输入超过SIZE个字符，就会忽略部分输入


Question: （求大神解答）全局变量和局部变量，程序如下

嗦嘎！！感谢

理解和讨论之前请先学会如何观察！  http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

楼上是对的。就循环一次。 而且用的是局部变量。

1.局部变量与全局变量重名，优先使用局部变量 2.int fun(int array[]) 函数传递数组实际是传递array的首地址，也就是指针4字节 4/4=1，for循环执行1次， 故输出62


Question: __attribute__((align(n)))字节对齐问题,作用和#pragma不一致

对这个问题有不同意见的可以发我邮箱交流，就此结贴，谢谢大家。

struct B{     char a;     unsigned long b;     unsigned short c;     char d; }__attribute__((align(8))); 8字节对齐，a 和 b不足8个字节，补3个字节；c和d不足8个字节，补5个字节 个人理解

第一次发帖，各位技术大咖求教育０　０

理解和讨论之前请先学会如何观察！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

struct D{         char a;         char b;         char c;         char d;         char e;         char f;         char l;         char m; }__attribute__((aligned(8))); 发现一个有趣现象，如果结构体内都是相同类型变量的就会一直叠加，直到发现不同基本类型变量，开始进行字节对齐计算；毫无意外，sizeof( D ) = 8;

三楼是说attribute按相邻两个元素一起对齐么，可是我写了下面这个结构体C，sizeof( C ) = 8; struct C{         unsigned short a;         unsigned short b;         unsigned short c;         unsigned short d; }__attribute__((aligned(8)));


Question: 萌新求解，为什么在循环内对结构体数组变量进行赋值和累加等操作，结果为0？

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

对于double类型数据，建议还是用%lf输出，因为整型数据和浮点数在内存中的存放方式是不一样的。

输出格式错误     。


Question: 为什么一定得使用头文件才能编译成功，直接extern不行

extern一次只能引入一个函数或者是变量。如果你一个类里有200个函数。那你要extern 200次？

你没有把两个文件都编译 头文件不会被编译，cpp文件才会 你把b.h改成b.cpp

在main函数所在的源文件里，要引入b.h； 将func函数的声明放在b.h中； 将main函数里的extern int num;放到main函数外，对于全局变量的声明（所有全局变量的声明）都应该放在函数外；

extern 一般都是.c文件里的 .h里的就用include


Question: 关于静态局部变量和静态全局变量在循环中的问题求解。

http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

肯定不一样呢，第一次一样是因为输入的是2，那么couter函数里的else执行了2次（i==0时，else不执行），所以结果都是2；但是此时还执行了将局部静态变量赋值为0 的操作；所以，现在局部静态变量是0，全局惊天变量是2； 当第二次循环时，由于输入的是1，那么couter函数里的else执行了1次，（i== 0时，else不执行），所以局部静态变量是1，全局静态变量是3.  输出结果符合代码的逻辑呢

输出之后你给它重新赋值0了 当然不一样

静态变量赋值后之后可以再赋值的。

变量本来就可以变啊 感觉你没有分清 常量 和 静态变量 详情百度

我的意思是  全局静态变量 和局部静态变量 这两个值为什么会不一样。 不是很明白


Question: 怎么实现用输出的结束来终止循环

引用 4 楼 hou09tian 的回复:VS2015中需要输入三个ctrl+Z才可以结束while循环 那么dev c++呢？

引用 4 楼 hou09tian 的回复:VS2015中需要输入三个ctrl+Z才可以结束while循环 输入：Enter、Ctrl+Z、Enter不行？

EOF的输入，在Linux下和Windows不一样； Windows下，建议使用ctr+z，输入EOF Linux下，建议用ctrl+d，输入EOF， 要终止while循环输入，根据你的系统类型，输入对应的组合键

Windows：Enter、Ctrl+Z、Enter Linux：Ctrl+D

运行结果就是没有结果，，，


Question: 线索二叉树的问题

你使用这种方式，必须先给这个全局变量进行内存分配，才可以将该pre后继指向遍历序号的第一个结点，但是真正使用线索方式来遍历二叉树时，我们可以看作二叉树为一个双向链表来处理，给链表一个头结点，当此时头结点为pre时，可以指向第一个结点。


Question: 一个新的操作系统内核

牛逼啊，大兄弟，这年头研究内核的人才非常稀缺啊

厉害


Question: The C Programming Language讲课视频

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

可以尝试买书<<The C Programming language>>看


Question: 为什么这样初始化二维数组不对呢

因为scanf里面那个*(*(p+i)+j)是值，不是地址，应改为*（p+i)+j,这才是地址。

scanf那加个&.


Question: 简单的很，就是不知道拿错了 闰年找茬

今年是2017年。

#include <stdio.h>  int main() {     int year = 2014;      if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)         printf("%d年是闰年\n", year);     else         printf("%d 年不是闰年\n", year);     return 0; } 代码没什么问题，建议楼主说一下慕课网上是什么要求？


Question: 开辟内存之后用于输出，为什么会出错？

#include <stdio.h> #include <stdlib.h> //#include "conio.h"  int main(int argc, char *argv[]) {     double average;     double min;     double max;     double sum;     int nfailed;     int n;     double *p;     int i;      nfailed=0;     sum=0.0;     max=0.0;     min=100.0;      printf("请输入班级人数：");     scanf("%d", &n);   /*去掉d后面的空格*/     p = (double *)malloc(n * sizeof(double));     if (p == NULL)     {         printf("内存分配错误\n");         exit(1);     }      for (i = 0; i <n; i++)     {         printf("请输入第%d名学生成绩:",(i+1));         scanf("%lf", p+i);         //getchar();         sum = sum + *(p+i);         if (*(p+i)  > max)         {             max = *(p+i);         }         if (*(p+i) < min)         {             min = *(p+i);         }         if (*(p+i) < 60.0)         {             nfailed ++;         }     }      average = sum / n;     free(p);     printf("班级共有多%d学生\n", n );     printf("平均成绩为:%.1lf\n", average );     printf("最高分位:%.1lf\n", max );     printf("最低分为:%.1lf\n", min );     printf("不及格人数为:%d\n", nfailed);       return 0; } 程序基本上没问题，有一个地方需要注意下；在输入学生数时，%d后面的空格去掉。不然，输入后面的会有问题。

求解：那为什么多加了一个空格，下面的输入会变成第一个人的成绩，并且会出现把下面那个输出“吃掉”的情况啊？


Question: 能推荐个你们常用的html c解析库吗？

刚学pytho你，觉得pyquery解析库也很强


Question: PowerLink的demo主站如何打开并传文件到从站

百度搜相关关键字。


Question: go语言主要承担什么角色？c呢？

建议楼主继续疯狂迷恋C语言。 http://bbs.csdn.net/topics/380157851 http://bbs.csdn.net/topics/392094659

go语言我接触一些，go做并发操作很不错。做页面服务器后台也是很好的，具体的可以去网上查资料，然后对比一下。


Question: c语言菜鸟求助

百度搜“控制台光栅器”

完全看不懂，什么程度才能完成这样的程序呢

去查bmp的格式，了解怎么每一个像素的坐标和颜色在文件中怎么存储，然后设计读取分析程序； 把屏幕坐标映射到图片坐标，比如显示区域80*60字符，图片80*60大小，那就是一对一的关系，最简单，按颜色值输出字符即可；如果图片更大，比如160*120大小，那么每4个像素对应一个字符，你可以把组成正方形的4个像素的颜色值做一个平均，大于某个值即判断为黑，其他为白，对应输出。


Question: 问一个关于大于和小于符号的简单问题

a > b 好，还是 b < a 好？ 首先应该明确一下，什么是“好”。我能想到的，可以从两个方面考虑： 一、从程序执行速度角度出发，速度越快越好。     那，哪种写法运行速度更快呢？这得看a,b是什么数据类型。 	1. a,b都是内置类型，比如 int a,b; 	    这种情况下，几乎没区别，除了使用的CPU指令不同以外。当然这得看编译器如何使用内存、寄存器以及CPU指令。 	2. a,b是自定义类型，比如 struct Point2D{int x,y;} a,b; 		这种情况，不同于内置类型的比较。在C++中，可以通过重载运算符实现对自定义类型对象的比较。 //以下代码定义Point2D这种类型，并且支持<,>,==3种比较运算符： #include <cassert> struct Point2D { 	int x,y; 	bool operator< (const Point2D& p)const{ 		return (x + y) < (p.x + p.y); 	} 	bool operator> (const Point2D& p)const{ 		return p < *this; 	} 	bool operator== (const Point2D& p)const{ 		return !(p < *this) && !(*this < p); 	} }; int main(){ 	Point2D a,b; 	a.x = 1, a.y = 1; 	b.x = 2, b.y = 2; 	assert(a < b); 	assert(b > a); 	assert(!(a==b)); 	return 0; } 		在上例代码中，大于(>)和等于(==)操作是通过重用小于(<)的操作实现的，这也是惯用手法。如果要修改比较的定义，只需要修改operator<中的比较就能自动应用于大于和等于中了。 		在这个实现中来说a<b和b>a哪个速度快的话，是比较明显的。a<b要比b>a快，因为大于操作是通过函数调用小于操作实现的，相比直接用小于操作，多了函数调用产生的时间开销，自然运行时间较长。 		这也是STL库中随处可见用 a<b 代替 b>a 的写法，因为STL中的模板算法不知道具体参与比较是对象是内置类型还是自定义类型。 二、从程序员阅读代码的角度出发，越符合逻辑越好。 	是否符合逻辑就是一个不确定因素了。有人喜欢说“我的年纪比你大”，也有人喜欢说“你的年纪比我小”，我不讨论这种情况的好坏。如果写代码的人和读代码的人是同一类型，那就是好的！

引用 11 楼 baidu_37097818 的回复:反对类似于if(nullptr == p)的写法。 这与阅读习惯背道而驰，看似能避免意外赋值，实则违反人的天性，而且，对于重载了operator==的类来说，这种写法可能就是错的。例如我写了一个类A，判断它与string是否相等，可以这样写a == str, 但写成str == a就是错的，因为std::string并没有重载operator==(A) friend bool operator==(const string& str,const A& rhs)

可以看看编程规范方面的书，最近在看c专家编程

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

for(i=0;i<m;i++){ 你会写成 for(i=0;m>i;i++) 吗？  由于LZ给的代码片段很少， for(i=0;i<m;i++){     for(j=0;j<n;j++){ 所以我只能断章取义的说，a[i] < a[j]要好些。  具体的原因，就是在 for(i=0;i<m;i++){ 中i是主语，所以i怎么怎么样，这样思维比较连贯；改成m > i，宾语变主语了，人称不一致了，先是我怎么怎么样，然后它怎么怎么样，然后又是我怎么怎么样。  而对于 for(i=0;i<m;i++){     for(j=0;j<n;j++){ 由于i是外层索引，j是内层索引，所以在没有别的上下文的情况下，我当然会觉得i比j怎样会自然些。  要点：读的人觉得自然就好。

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

这个应该没有硬性要求，因为判断的结果不变，不影响程序的编译，更不影响运行。  但对于等于判断，对于初学者或者刚接触编程语言来讲，可能会经常将等于判断写成赋值表达式。为了，减少出错率。一般会将等于判断表达式的两边调换位置。比如指针变量判断是否为NULL，可以写成  int *p; if (p == NULL)    /*很容易写成if (p = NULL)*/  如果写成如下形式就好，即将p和NULL交换位置 if (NULL == p) 即使错误写成 if (NULL = p)也没关系，因为编译器会提示你错误； 但是如果写成 if (p = NULL)编译器是不会提示错误的。

经验规则：便于理解，方便交流，符合正常的思维习惯，重要的表达式写在左边。

看情况吧 有要求的话按要求  自己编程随意吧

不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

引用 5 楼 prayer163 的回复:肇事老师你看下这个吧，一道考试题，答案是a[i]<a[j]，如果我写了a[j]>a[i] 是不是算我错? 肇事老师


Question: 哪里出错

s不赋初值为0？

#include<stdio.h> /*求1！+2！+3！+......+20!*/ int main() {     int n=20,i,j,k; double s;     for(i=1;i<=n;i++)    {j=1;k=1;      for(;j<=i;j++)     {           k =k*j;     }       s=s+k;}       printf("%22.15e",s);       return 0;   }


Question: 带参数的宏的问题

理解和讨论之前请先学会如何观察！  VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898

1、DDD的定义中 19,18,17,16,15,14,13,12,11,10, 这行后面少了个续行符\ 即，应该是 19,18,17,16,15,14,13,12,11,10,\  2、个人认为学习宏的最好方法就是用cpp或者gcc -E看宏展开后的结果:  $ cat main.c #define EXPAND(X) X #define AAA(...) EXPAND(BBB(__VA_ARGS__, DDD())) #define BBB(...) EXPAND(CCC(__VA_ARGS__))  #define CCC(\ _1,_2,_3,_4,_5,_6,_7,_8,_9,_10,\ _11,_12,_13,_14,_15,_16,_17,_18,_19,_20,\ _21,_22,_23,_24,_25,_26,_27,_28,_29,_30,\ _31,_32,_33,_34,_35,_36,_37,_38,_39,_40,\ _41,_42,_43,_44,_45,_46,_47,_48,_49,_50,\ _51,_52,_53,_54,_55,_56,_57,_58,_59,_60,\ _61,_62,_63,N,...) N  #define DDD()\ 63,62,61,60,\ 59,58,57,56,55,54,53,52,51,50,\ 49,48,47,46,45,44,43,42,41,40,\ 39,38,37,36,35,34,33,32,31,30,\ 29,28,27,26,25,24,23,22,21,20,\ 19,18,17,16,15,14,13,12,11,10,\ 9,8,7,6,5,4,3,2,1,0  EXPAND(hello)  $ cpp main.c # 1 "main.c" # 1 "<built-in>" # 1 "<command-line>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 1 "<command-line>" 2 # 1 "main.c" # 23 "main.c" hello   3、如上，EXPAND比较简单，即参数是什么，原封不动的替换成什么；  DDD也比较简单， DDD() 展开后为 63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0  CCC需要至少64个参数，返回第64参数，  CCC( 63,62,61,60,\ 59,58,57,56,55,54,53,52,51,50,\ 49,48,47,46,45,44,43,42,41,40,\ 39,38,37,36,35,34,33,32,31,30,\ 29,28,27,26,25,24,23,22,21,20,\ 19,18,17,16,15,14,13,12,11,10,\ 9,8,7,6,5,4,3,2,1,0) 展开后为 0  CCC(a, b, c,\ 63,62,61,60,\ 59,58,57,56,55,54,53,52,51,50,\ 49,48,47,46,45,44,43,42,41,40,\ 39,38,37,36,35,34,33,32,31,30,\ 29,28,27,26,25,24,23,22,21,20,\ 19,18,17,16,15,14,13,12,11,10,\ 9,8,7,6,5,4,3,2,1,0) 展开后为 3  4、由上类似分析BBB和AAA可以得到LS的结论，AAA用于返回参数的个数，即 AAA(1) 展开后为 1  AAA(a, b) 展开后为 2  但AAA有一个bug和一个限制： bug是 AAA() 展开后为 1 限制是最多能有64个参数，多了就不是这个意思了。

CCC 计算第 64 个参数的值，而这个参数就是 DDD 生成的。 如果 AAA 本身带几个参数，那么 DDD 的参数就会后移。 所以 AAA 就是计算 __VA_ARGS__ 的参数个数。  但是你的 AAA 不能计算 AAA() 参数的个数。 因为 (__VA_ARGS__, DDD()) 的时候，添加了一个逗号，此时会认为有一个参数。 所以 AAA() 和 AAA(1) 的个数都是 1。 你需要添加一个判断，而且还要注意处理多重宏的问题。

Visual C++ Language Reference  Variadic Macros   Variadic macros are function-like macros that contain a variable number of arguments.  Remarks To use variadic macros, the ellipsis may be specified as the final formal argument in a macro definition, and the replacement identifier __VA_ARGS__ may be used in the definition to insert the extra arguments. __VA_ARGS__ is replaced by all of the arguments that match the ellipsis, including commas between them.  The C Standard specifies that at least one argument must be passed to the ellipsis, to ensure that the macro does not resolve to an expression with a trailing comma. The Visual C++ implementation will suppress a trailing comma if no arguments are passed to the ellipsis.  Support for variadic macros was introduced in Visual C++ 2005.  Example   Copy Code  // variadic_macros.cpp #include <stdio.h> #define EMPTY  #define CHECK1(x, ...) if (!(x)) { printf(__VA_ARGS__); } #define CHECK2(x, ...) if ((x)) { printf(__VA_ARGS__); } #define CHECK3(...) { printf(__VA_ARGS__); } #define MACRO(s, ...) printf(s, __VA_ARGS__)  int main() {    CHECK1(0, "here %s %s %s", "are", "some", "varargs1(1)\n");    CHECK1(1, "here %s %s %s", "are", "some", "varargs1(2)\n");   // won't print     CHECK2(0, "here %s %s %s", "are", "some", "varargs2(3)\n");   // won't print    CHECK2(1, "here %s %s %s", "are", "some", "varargs2(4)\n");     // always invokes printf in the macro    CHECK3("here %s %s %s", "are", "some", "varargs3(5)\n");     MACRO("hello, world\n");    // MACRO("error\n", EMPTY);   would cause C2059 }     Copy Code  here are some varargs1(1) here are some varargs2(4) here are some varargs3(5) hello, world    See Also Concepts Macros (C/C++) Send feedback on this topic to Microsoft.


Question: C语言循环读取和输出有命名规则的txt文件，

引用 3 楼 qq_29846883 的回复: 	for (int i = 0; i < 10; i++) 	{ 		char file[64] = {0}; 		sprintf(file, "timu_%d", i); 		FILE* fp = fopen(file, "r"); 		memset(file, 0, 64); 		sprintf(file, "jieguo_%d", i); 		FILE* wp = fopen(file, "w"); 		if (fp && wp) 		{ 			char buf[1024] = {0}; 			fread(buf, 1, 1024, fp);  			//解析buf，重组buf  			fwrite(buf, 1, 1024, wp);  			fclose(fp); 			fclose(wp); 		} 	}  只是提供一个思路， 剩下的自己优化 fwrite不一定要写入1024个字节了。另外，源文件的内容不一定是小于等于1024个字节。

不是将文件全部筛选读出来，是每运算一次，就读一个txt文件，结果也是输出到一个文件

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


Question: 新手求教：这是一段输出最小字符串的程序，加粗的两行如果换成char ＊sx；char ＊smin；在Xcode里面就会运行不出结果，为什么呀？

换成char*sx后他只是一个指针，还没有指向一块有效的内存，所以不行

换成*sx, *smin，就是野指针；当然不可以了，对于能否输出结果还是未定义行为（可以理解为随机的）；运行时可能会直接提示段错误； 换成指针，可以这样做：  #include <stdio.h> #include <stdlib.h> #include <string.h>   int main() {     char *sx;     char *smin;       sx = (char *)malloc(sizeof(char) * 80);     smin = (char *)malloc(sizeof(char) * 80);      printf("Let us start!\n");     scanf("%s", sx);     strcpy(smin, sx);     for(int i=1;i<5;i++)     {         scanf("%s",sx);         if(strcmp(sx,smin) < 0)             strcpy(smin,sx);       }     printf("The smallest string is: %s\n",smin);     free(sx);     free(smin);      return 0; } 试一下能不能输出；

1楼正确了。

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


Question: "void __cdecl ungetch(int)" (?ungetch@@YAXH@Z)

我的不是ungetch()么，怎么变成ungetc（）了，今天试了一下又没有这个错误了。。。

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

第一，C标准库中没这个程序； 第二，不要在.cpp文件中写C的代码，在你搞清楚C++ name mangle是什么东西之前。

void ungetch(int); 这个函数你声明了，但没有实现，如果是要使用标准库中的同名函数，去掉这个声明  VS建议使用_ungetch  用法参看：https://msdn.microsoft.com/zh-cn/library/yezzac74.aspx

ungetc缺少参数 int ungetc(int c, FILE *stream);

ungetch的功能是把一个字符退回到键盘缓冲区中。 在较高版本的一些Visual Studio编译器中（如vs2015），ungetch 被认为是不安全的，应当该使用 _ungetch 代替 ungetch   摘自百度百科， 可能是基础库里移除了改函数的实现，但却能找到这个函数的定义，不知道是不是bug _ungetch这个没找到到，到是找到_ungettch， 效果我没试，你可以试试效果对不对

ungetc(*w,stdin);

将你的源代码扩展名由.cpp改为.c

int ungetc(int c, FILE *stream);


Question: 新手的一个小问题，想请大家看看

scanf_s("%s", &id);

引用 2 楼 qq_29846883 的回复: scanf_s("%s", &id);   这样我试了，还是不行啊，一楼那样能解决。 而且对指针这个地址不是应该直接用id， 不用&id取id的地址吧。

引用 1 楼 cfjtaishan 的回复:id是指向NULL的指针变量，所以不能直接使用，需要通过malloc或者new申请空间；或者直接将id定义为字符数组，这样就可以直接使用了。 另外，scanf_s对于输入的%s需要第三参数，即字符串长度（id的长度）；   谢谢了，解决了问题。


Question: onvif soap ptz AbsoluteMove error2

soap_get__tptz__AbsoluteMoveResponse这个函数应该是没什么问题的，主要还是通过SOAP.error 来看是错在哪了

我log 定位发现一直soap_get__tptz__AbsoluteMoveResponse(soap, tptz__AbsoluteMoveResponse, "tptz:AbsoluteMoveResponse", "");后出错

================= + dump__wsdd__ProbeMatches + >>> wsdd__ProbeMatches: (0xba28b8)    |- __sizeProbeMatch: 1    |- ProbeMatch: (0xba28bc)       |- 0          |- wsa__EndpointReference: (0xb9f04[251424.542672] [dm96-TxRound].19926 for LEN_ODD tail_room +1, rslt add 1 0)             |- Address: urn:uuid:0a518aa3-e430-11b4-8388-4cbd8fd0f378             |- ReferenceProperties: (null)             |- ReferenceParameters: (null)             |- PortType: (null)             |- ServiceName: (null)             |- __size: 0             |- __any: (null)             |- __anyAttribute:           |- Types: tdn:NetworkVideoTransmitter tds:Device          |- Scopes: (0xba29e0)             |- __item: onvif://www.onvif.org/type/video_encoder onvif://www.onvif.org/Profile/Streaming onvif://www.onvif.org/Profile/G onvif://www.onvif.org/type/audio_encoder onvif://www.onvif.org/type/ptz onvif://www.onvif.org/hardware/DS-2DC2204IW-D3/W onvif://www.onvif.org/name/HIKVISION%20DS-2DC2204IW-D3/W onvif://www.onvif.org/location/city/hangzhou             |- MatchBy: (null)          |- XAddrs: http://192.168.0.65/onvif/device_service http://[fe80::4ebd:8fff:fed0:f378]/onvif/device_service          |- MetadataVersion: 10 ================= - dump__wsdd__ProbeMatches - <<<  ================= + dump_tds__GetCapabilitiesResponse + >>> Capabilities: (0xbe0d28)    |- Analytics: (0xbe0d58)       |- XAddr: http://192.168.0.65/onvif/Analytics    |- Device: (0xbe0db8)       |- XAddr: http://192.168.0.65/onvif/device_service    |- Events: (0xbe1110)       |- XAddr: http://192.168.0.65/onvif/Events    |- Imaging: (0xbe1170)       |- XAddr: http://192.168.0.65/onvif/Imaging    |- Media: (0xbe11b8)       |- XAddr: http://192.168.0.65/onvif/Media    |- PTZ: (0xbe1300)       |- XAddr: http://192.168.0.65/onvif/PTZ    |- Extension: (0xbe1360)       |- DeviceIO: (0xbe13b8)          |- XAddr: http://192.168.0.65/onvif/DeviceIO       |- Display: (null)       |- Recording: (0xbe1438)          |- XAddr: http://192.168.0.65/onvif/Recording       |- Search: (0xbe14b8)          |- XAddr: http://192.168.0.65/onvif/SearchRecording       |- Replay: (0xbe1528)          |- XAddr: http://192.168.0.65/onvif/Replay       |- Receiver: (null)       |- AnalyticsDevice: (null) ================= - dump_tds__GetCapabilitiesResponse - <<<  ================= + dump_trt__GetProfilesResponse + >>> sizeProfiles: 3 Profiles: (0xbe6ef0)    |- 0       |- Name: mainStream       |- token: Profile_1       |- fixed: true       |- VideoSourceConfiguration: (0xbe0fc8)          |- Name: VideoSourceConfig          |- UseCount: 3          |- token: VideoSourceToken          |- SourceToken: VideoSource_1          |- Bounds: (0xbe1470)             |- x: 0             |- y: 0             |- width: 1920             |- height: 1080       |- VideoEncoderConfiguration: (0xbe1578)          |- Name: VideoEncoder_1          |- UseCount: 1          |- token: VideoEncoderToken_1          |- Encoding: H264          |- Quality: 3.000000          |- Resolution: (0xbe1620)             |- Width: 1920             |- Height: 1080          |- RateControl: (0xbe1638)             |- FrameRateLimit: 25             |- EncodingInterval: 1             |- BitrateLimit: 2048       |- AudioSourceConfiguration: (0xbe14c8)          |- Name: AudioSourceConfig          |- UseCount: 3          |- token: AudioSourceConfigToken          |- SourceToken: AudioSourceChannel       |- AudioEncoderConfiguration: (0xbe16e8)          |- Name: AudioEncoderConfig          |- UseCount: 3          |- token: MainAudioEncoderToken          |- Bitrate: 64          |- SampleRate: 8          |- Encoding: G711       |- PTZConfiguration: (0xbe2fb0)          |- Name: PTZ          |- UseCount: 3          |- token: PTZToken          |- NodeToken: PTZNODETOKEN          |- DefaultAbsolutePantTiltPositionSpace: http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace          |- DefaultAbsoluteZoomPositionSpace: http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace    |- 1       |- Name: subStream       |- token: Profile_2       |- fixed: true       |- VideoSourceConfiguration: (0xbe3700)          |- Name: VideoSourceConfig          |- UseCount: 3          |- token: VideoSourceToken          |- SourceToken: VideoSource_1          |- Bounds: (0xbe37a8)             |- x: 0             |- y: 0             |- width: 1920             |- height: 1080       |- VideoEncoderConfiguration: (0xbe38c0)          |- Name: VideoEncoder_2          |- UseCount: 1          |- token: VideoEncoderToken_2          |- Encoding: H264          |- Quality: 3.000000 [251424.938615] [dm96-TxRound].19927 for LEN_ODD tail_room +1, rslt add 1              |- Width: 704             |- Height: 576          |- RateControl: (0xbe3980)             |- FrameRateLimit: 25             |- EncodingInterval: 1             |- BitrateLimit: 1024       |- AudioSourceConfiguration: (0xbe3810)          |- Name: AudioSourceConfig          |- UseCount: 3          |- token: AudioSourceConfigToken          |- SourceToken: AudioSourceChannel       |- AudioEncoderConfiguration: (0xbe3a30)          |- Name: AudioEncoderConfig          |- UseCount: 3          |- token: MainAudioEncoderToken          |- Bitrate: 64          |- SampleRate: 8          |- Encoding: G711       |- PTZConfiguration: (0xbe4d20)          |- Name: PTZ          |- UseCount: 3          |- token: PTZToken          |- NodeToken: PTZNODETOKEN          |- DefaultAbsolutePantTiltPositionSpace: http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace          |- DefaultAbsoluteZoomPositionSpace: http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace    |- 2       |- Name: thirdStream       |- token: Profile_3       |- fixed: true       |- VideoSourceConfiguration: (0xbe5348)          |- Name: VideoSourceConfig          |- UseCount: 3          |- token: VideoSourceToken          |- SourceToken: VideoSource_1          |- Bounds: (0xbe53f0)             |- x: 0             |- y: 0             |- width: 1920             |- height: 1080       |- VideoEncoderConfiguration: (0xbe5508)          |- Name: VideoEncoder_3          |- UseCount: 1          |- token: VideoEncoderToken_3          |- Encoding: H264          |- Quality: 3.000000          |- Resolution: (0xbe55b0)             |- Width: 704             |- Height: 576          |- RateControl: (0xbe55c8)             |- FrameRateLimit: 25             |- EncodingInterval: 1             |- BitrateLimit: 1024       |- AudioSourceConfiguration: (0xbe5458)          |- Name: AudioSourceConfig          |- UseCount: 3          |- token: AudioSourceConfigToken          |- SourceToken: AudioSourceChannel       |- AudioEncoderConfiguration: (0xbe5678)          |- Name: AudioEncoderConfig          |- UseCount: 3          |- token: MainAudioEncoderToken          |- Bitrate: 64          |- SampleRate: 8          |- Encoding: G711       |- PTZConfiguration: (0xbe6968)          |- Name: PTZ          |- UseCount: 3          |- token: PTZToken          |- NodeToken: PTZNODETOKEN          |- DefaultAbsolutePantTiltPositionSpace: http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace          |- DefaultAbsoluteZoomPositionSpace: http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace ================= - dump_trt__GetProfilesResponse - <<< AbsoluteMove.ProfileToken = Profile_1 AbsoluteMove.Position->PanTilt->space = http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace ptzxaddr = http://192.168.0.65/onvif/PTZ move error flag 6 [soap] AbsoluteMove error: 2, (null), (null)  detect end! It has detected 1 devices! 详细的log


Question: 用递归构建二叉树，递归无法停止的问题

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

引用 5 楼 zhao4zhong1 的回复:在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。 我修改了代码，但是每次输入@之后，虽然值能正确获取，但会出现一个异常，这个异常是怎么产生的？该怎样修改代码？

ab@@c@@ 去掉输入中间的空格试试，因为是%c输入，所以空格也会被会赋值给value，所以输入@后，不是又输入一次@，而是@空格@

引用 1 楼 ccssddnn218 的回复:scanf读取的第2个字符是' '(SPACE)，不是'@'我发现了这个问题。无论是在字符后面输入空格还是回车，都会它存入当前结点左子树的数据中，而且跳过了下一次的输入。 我在输入一个字符后，程序并不向下执行，还是在等待我输入。那我怎么结束字符的获取呢？ 让scanf不获取 回车/空格 只能用判断语句来实现吗？有没有其他方法？

仅供参考：#include <iostream> #include <stack> #include <queue> #include <locale.h> using namespace std; typedef struct BiTNode {//二叉树结点     char data;                      //数据     struct BiTNode *lchild,*rchild; //左右孩子指针 } BiTNode,*BiTree; int CreateBiTree(BiTree &T) {//按先序序列创建二叉树     char data;     scanf("%c",&data);//按先序次序输入二叉树中结点的值（一个字符），‘#’表示空树     if (data == '#') {         T = NULL;     } else {         T = (BiTree)malloc(sizeof(BiTNode));         T->data = data;         //生成根结点         CreateBiTree(T->lchild);//构造左子树         CreateBiTree(T->rchild);//构造右子树     }     return 0; } void Visit(BiTree T) {//输出     if (T->data != '#') {         printf("%c ",T->data);     } } void PreOrder(BiTree T) {//先序遍历     if (T != NULL) {         Visit(T);               //访问根节点         PreOrder(T->lchild);    //访问左子结点         PreOrder(T->rchild);    //访问右子结点     } } void InOrder(BiTree T) {//中序遍历     if (T != NULL) {         InOrder(T->lchild);     //访问左子结点         Visit(T);               //访问根节点         InOrder(T->rchild);     //访问右子结点     } } void PostOrder(BiTree T) {//后序遍历     if (T != NULL) {         PostOrder(T->lchild);   //访问左子结点         PostOrder(T->rchild);   //访问右子结点         Visit(T);               //访问根节点     } } void PreOrder2(BiTree T) {//先序遍历(非递归) //访问T->data后，将T入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为T，出栈，再先序遍历T的右子树。     stack<BiTree> stack;     BiTree p = T;//p是遍历指针     while (p || !stack.empty()) {   //栈不空或者p不空时循环         if (p != NULL) {             stack.push(p);          //存入栈中             printf("%c ",p->data);  //访问根节点             p = p->lchild;          //遍历左子树         } else {             p = stack.top();        //退栈             stack.pop();             p = p->rchild;          //访问右子树         }     } } void InOrder2(BiTree T) {//中序遍历(非递归) //T是要遍历树的根指针，中序遍历要求在遍历完左子树后，访问根，再遍历右子树。 //先将T入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为T，出栈，访问T->data，再中序遍历T的右子树。     stack<BiTree> stack;     BiTree p = T;//p是遍历指针     while (p || !stack.empty()) {   //栈不空或者p不空时循环         if (p != NULL) {             stack.push(p);          //存入栈中             p = p->lchild;          //遍历左子树         } else {             p = stack.top();        //退栈，访问根节点             printf("%c ",p->data);             stack.pop();             p = p->rchild;          //访问右子树         }     } }  typedef struct BiTNodePost{     BiTree biTree;     char tag; } BiTNodePost,*BiTreePost; void PostOrder2(BiTree T) {//后序遍历(非递归)     stack<BiTreePost> stack;     BiTree p = T;//p是遍历指针     BiTreePost BT;     while (p != NULL || !stack.empty()) {//栈不空或者p不空时循环         while (p != NULL) {//遍历左子树             BT = (BiTreePost)malloc(sizeof(BiTNodePost));             BT->biTree = p;             BT->tag = 'L';//访问过左子树             stack.push(BT);             p = p->lchild;         }         while (!stack.empty() && (stack.top())->tag == 'R') {//左右子树访问完毕访问根节点             BT = stack.top();             stack.pop();//退栈             printf("%c ",BT->biTree->data);         }         if (!stack.empty()) {//遍历右子树             BT = stack.top();             BT->tag = 'R';//访问过右子树             p = BT->biTree;             p = p->rchild;         }     } }  void LevelOrder(BiTree T) {//层次遍历     if (T == NULL) return;     BiTree p = T;     queue<BiTree> queue;//队列     queue.push(p);//根节点入队     while (!queue.empty()) {    //队列不空循环         p = queue.front();      //对头元素出队         printf("%c ",p->data);  //访问p指向的结点         queue.pop();            //退出队列         if (p->lchild != NULL) {//左子树不空，将左子树入队             queue.push(p->lchild);         }         if (p->rchild != NULL) {//右子树不空，将右子树入队             queue.push(p->rchild);         }     } } int main() {     BiTree T;      setlocale(LC_ALL,"chs");     CreateBiTree(T);      printf("先序遍历        ：");PreOrder  (T);printf("\n");     printf("先序遍历(非递归)：");PreOrder2 (T);printf("\n");                                                printf("\n");     printf("中序遍历        ：");InOrder   (T);printf("\n");     printf("中序遍历(非递归)：");InOrder2  (T);printf("\n");                                                printf("\n");     printf("后序遍历        ：");PostOrder (T);printf("\n");     printf("后序遍历(非递归)：");PostOrder2(T);printf("\n");                                                printf("\n");     printf("层次遍历        ：");LevelOrder(T);printf("\n");      return 0; } //ABC##DE#G##F### //先序遍历        ：A B C D E G F //先序遍历(非递归)：A B C D E G F // //中序遍历        ：C B E G D F A //中序遍历(非递归)：C B E G D F A // //后序遍历        ：C G E F D B A //后序遍历(非递归)：C G E F D B A // //层次遍历        ：A B C D E F G //  ///       A ///      / ///     B ///    / \ ///   C   D ///      / \ ///     E   F ///      \ ///       G

scanf读取的第2个字符是' '(SPACE)，不是'@'


Question: 为什么每次写头文件都会遇到这样的问题？附上代码

什么问题？


Question: c语言读取txt文件二维数组中的相关数据后把相关数据存入一个新文件，求大神指点

#include <stdio.h> #include <stdlib.h> #include <math.h>  #define n    396 #define m  7  struct info {     double d1;     double d2;     int num[5]; };  int main(void) {     errno_t err0, err1;     FILE* fp0, *fp1;     if ((err0 = fopen_s(&fp0, "F:\\ a1.txt", "r")) != 0)     {         printf("Cannot open this file\n");         exit(0);     }     if ((err1 = fopen_s(&fp1, "F:\\6-0-1-0-0.txt", "w")) != 0)     {         printf("Cannot open this file\n");         exit(0);     }     int i, j;     int ret;     struct info tmp;     for (i = 0; i < n; i++)     {         for (j = 0; j < m; j++)         {             ret = fscanf_s(fp0, "%lf %lf %d %d %d %d\n", &tmp.d1, &tmp.d2, &tmp.num[0], &tmp.num[1], &tmp.num[2], &tmp.num[3], &tmp.num[4]);             if (ret == EOF)                 goto lable;             printf("%lf %lf  %d    %d    %d    %d    %d\n", tmp.d1, tmp.d2, tmp.num[0], tmp.num[1], tmp.num[2], tmp.num[3], tmp.num[4]);             if (tmp.num[0] == 6 && tmp.num[1] == 0 && tmp.num[2] == 1 && tmp.num[3] == 0 && tmp.num[4] == 0)                 fprintf(fp1, "%lf\t%lf\n", tmp.d1, tmp.d2);         }     } lable:     fclose(fp0);     fclose(fp1);     system("pause"); }

能讲讲你的思路吗？

#include <stdio.h> #include <stdlib.h> #include <math.h>  #define n    396 #define m  7  struct info {     double d1;     double d2;     int num[5]; };  int main(void) {     errno_t err0, err1;     FILE* fp0, *fp1;     if ((err0 = fopen_s(&fp0, "F:\\ a1.txt", "r")) != 0)     {         printf("Cannot open this file\n");         exit(0);     }     if ((err1 = fopen_s(&fp1, "F:\\6-0-1-0-0.txt", "w")) != 0)     {         printf("Cannot open this file\n");         exit(0);     }     int i, j;     struct info tmp;     for (i = 0; i < n; i++)     {         for (j = 2; j < m; j++)         {             fscanf_s(fp0, "%lf %lf %d %d %d %d\n", &tmp.d1, &tmp.d1, &tmp.num[0], &tmp.num[1], &tmp.num[2], &tmp.num[3], &tmp.num[4]);             //fscanf_s(fp0, "%d", &data[i][j]);             printf("%lf %lf  %d    %d    %d    %d    %d\n", tmp.d1, tmp.d2, tmp.num[0], tmp.num[1], tmp.num[2], tmp.num[3], tmp.num[4]);             if (tmp.num[0] == 6 && tmp.num[1] == 0 && tmp.num[2] == 1 && tmp.num[3] == 0 && tmp.num[4] == 0)                 fprintf(fp1, "%lf\t%lf\n", tmp.d1, tmp.d2);         }     }     fclose(fp0);     fclose(fp1);     system("pause"); } 借鉴一下吧。 头文件，对于系统库文件，建议用<>，自定义文件用""

在cmd中执行以下命令： cd /d in.txt文件所在盘符和文件夹路径 find "6    0    1    0    0" in.txt >out.txt type out.txt

比如这些数据： 2.040000    0.250000    6    0    1    0    0     2.030000    0.250000    6    0    1    0    0     2.020000    0.250000    6    0    1    0    0      2.000000    0.250000    6    0    1    0    0       1.980000    0.250000    6    0    1    0    0     1.970000    0.250000    6    0    1    0    0     把后缀为6    0    1    0    0的数据写入新的txt文件，里面的数据格式如下： 2.040000    0.250000        2.030000    0.250000      2.020000    0.250000       2.000000    0.250000           1.980000    0.250000       1.970000    0.250000

问题不是很清楚， 写完之后的文件格式应该是什么样的

不是很懂啊 。


Question: c语言不能正确识别输入

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

不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

while(scanf("%lf", &inf) == 0){    //提示重新输入 }

手机码字，排版有点问题，请见谅

先贴正确的代码吧，scanf的参数是需要地址的。

现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！

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

引用 4楼赵4老师 的回复:printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。是码字的错误，实际上有&，可是还是输出0.0000

不知楼主是一个什么环境？  试了这个，是没有问题！（Ubuntu 12.04 32 和windows 7 64）

引用 4楼赵4老师 的回复:printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。我直接赋值inf为2.0就有输出，用scanf就没有输出

引用 3楼自信男孩 的回复:#include<stdio.h>  double inf; int main() {     scanf("%lf", &inf);    /*少一个 &，因为第二个参数要求是地址，即inf的地址*/     printf ("%lf",inf);      return 0; } scanf参数有问题，试一下上面的修改；不行，是我码字的错误，是有&的，打字的时候没注意

输入1 在屏幕上打印的0么? return 0 返回的就是0啊

引用 12楼赵4老师 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。老师，你理解错了，我并不是让你看整个函数，我的意思是，想让大家帮我看看为什么我这个程序所有变量只能在程序里赋值，此时能正常运行，但是如果用scanf赋值，就不能运行，并不是这整个程序对不对，我的表达能力有所欠缺，向大家道歉，给出程序只是为了构建一个环境，并且我附上的这个程序是我简化调试过的，将无关的函数都剔除了。并不是想让大家帮我调试程序。只是想问问大家有没有遇到过这种事情。如果造成了不便，请老师原谅。

#include <stdio.h> #include <math.h> #define max 100 #define p 3.1415926  int n=5; char ex[max]; double x; double ret=10; double epsllon=0.0001; double compvalue(); void trans(); double PolynomialLegendre(); double derva(); double Pn; double DPn; double val=0;     int main() { double dn=1; double up; double x1,x0; int i; double AK; double xn; double add; double cut; scanf("%lf",&up); add=dn+up; cut=dn-up; for(i=1;i<=n;i++)    {     x0=cos(p*(i-(1.0/4.0))/(n+(1.0/2.0)));     do{     x=(add+cut*x0)/2.0;     PolynomialLegendre();     derva();     xn=x0-(Pn)/(DPn);     x1=x0;     x0=xn;     }     while(xn-x1>=epsllon||xn-x1<=(-epsllon));     x=xn;     n=n-1;     PolynomialLegendre();     n=n+1;     derva();     AK=(2.0/n)*(1.0/(Pn*DPn));     val=val+ret*AK;}     printf("\n %lf \n",val);     return 0;}  double PolynomialLegendre() {  double k=1;  double P0,P1;  P0=1;  P1=x;  if(n==0){Pn=P0;return Pn;}  if(n==1){Pn=P1;return Pn;}  for(k=2;k<=n;k++)  {Pn=((2.0*k-1.0)*x*P1-(k-1.0)*P0)/k;  P0=P1;  P1=Pn;}  return Pn;  }   double derva()   {int k;   double DP0,DP1,Pn,P0,P1;   P0=1;   P1=x;   if(n==0){Pn=P0;return DPn;}   if(n==1){Pn=P1;return DPn;}   for(k=2;k<=n;k++)  {   Pn=((2.0*k-1.0)*x*P1-(k-1.0)*P0)/k;   P0=P1;   P1=Pn;   DPn=k*(x*P1-P0)/(x*x-1.0);   DP0=DP1;   DP1=DPn;   }   return DPn;   } 就这个程序，编译没问题，但是运行不了。您帮我看一下，谢谢


Question: c语言读取txt文件二维数组中的相关数据后把相关数据存入一个新文件，求大神指点

能讲讲你的思路吗？

#include <stdio.h> #include <stdlib.h> #include <math.h>  #define n    396 #define m  7  struct info {     double d1;     double d2;     int num[5]; };  int main(void) {     errno_t err0, err1;     FILE* fp0, *fp1;     if ((err0 = fopen_s(&fp0, "F:\\ a1.txt", "r")) != 0)     {         printf("Cannot open this file\n");         exit(0);     }     if ((err1 = fopen_s(&fp1, "F:\\6-0-1-0-0.txt", "w")) != 0)     {         printf("Cannot open this file\n");         exit(0);     }     int i, j;     struct info tmp;     for (i = 0; i < n; i++)     {         for (j = 2; j < m; j++)         {             fscanf_s(fp0, "%lf %lf %d %d %d %d\n", &tmp.d1, &tmp.d1, &tmp.num[0], &tmp.num[1], &tmp.num[2], &tmp.num[3], &tmp.num[4]);             //fscanf_s(fp0, "%d", &data[i][j]);             printf("%lf %lf  %d    %d    %d    %d    %d\n", tmp.d1, tmp.d2, tmp.num[0], tmp.num[1], tmp.num[2], tmp.num[3], tmp.num[4]);             if (tmp.num[0] == 6 && tmp.num[1] == 0 && tmp.num[2] == 1 && tmp.num[3] == 0 && tmp.num[4] == 0)                 fprintf(fp1, "%lf\t%lf\n", tmp.d1, tmp.d2);         }     }     fclose(fp0);     fclose(fp1);     system("pause"); } 试一下改过的这个程序。然后给我回馈一下是否可行。 如果还有问题，继续提出来。 既然是将a文件的部分内容转移到b文件中，那么就不需要定义那么长的二位数组，只需要一个临时变量作为中转即可。

在cmd中执行以下命令： cd /d in.txt文件所在盘符和文件夹路径 find "6    0    1    0    0" in.txt >out.txt type out.txt

比如这些数据： 2.040000    0.250000    6    0    1    0    0     2.030000    0.250000    6    0    1    0    0     2.020000    0.250000    6    0    1    0    0      2.000000    0.250000    6    0    1    0    0       1.980000    0.250000    6    0    1    0    0     1.970000    0.250000    6    0    1    0    0     把后缀为6    0    1    0    0的数据写入新的txt文件，里面的数据格式如下： 2.040000    0.250000        2.030000    0.250000      2.020000    0.250000       2.000000    0.250000           1.980000    0.250000       1.970000    0.250000

坐等大神指点！！！


Question: C语言链表结点指针打印值与监视窗口值不同

原因应该是head->next为NULL，phead又指向了head->next，所以phead为NULL；所以tail = head;那么tail为NULL； phead = head->next; 这句会导致内存泄露，因为phead指向了堆上的一块内存区域，但是现在又让phead指向head->next;那么phead刚才申请的空间就找不到了，也不能释放了，只能等到程序退出才会被释放。

不要依赖调试器输出复杂数据结构！而要将复杂数据结构的整个内容在处理它的每一步使用一小段代码按自己很容易理解的格式输出，非常有助于调试！或者可以说是“基础设施”  数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

在DEBUG下调试程序，否则可能被优化了


Question: 疑问，求助！

引用 3 楼 paschen 的回复:while是个死循环，你应该把getchar放到循环里，但是你每次输入后都会在缓冲区中留下一个换行符\n，所以你在下一次输入前需要前清空缓冲区好像是这样的，太复杂以至于自己忘记了，  引用 9 楼 hou09tian 的回复:[quote=引用 7 楼 qq_38080117 的回复:] [quote=引用 4 楼 hou09tian 的回复:] 1 问题分析 getchar()在C程序中的功能是接收一个字符，所以，在程序中，假设输入是“XXOOOXOOOX” 此时， int  c=  getchar() ; 代码获取的只是输入字符串的第一个字符，即'X'，接下来 while (c!=EOF) 中,EOF的值是-1，而c的值是'X'，而在while循环体中c的值不可能是EOF，while循环没有满足退出条件，所以相当于while是死循环，所以无法输出后面的信息。 2 问题解决 将getchar()作为while循环的条件语句，当输入时EOF时，退出while循环 	int c; 	while ((c = getchar()) != EOF) 	{ 		v = c == 'O' ? v + 1 : 0; 		u += v;  	} 以下为输出界面 我的程序返回的是字符，你的反悔的是数字吗？我好像懂点了[/quote] 你说的返回值指的是。。。。[/quote]  引用 9 楼 hou09tian 的回复:[quote=引用 7 楼 qq_38080117 的回复:] [quote=引用 4 楼 hou09tian 的回复:] 1 问题分析 getchar()在C程序中的功能是接收一个字符，所以，在程序中，假设输入是“XXOOOXOOOX” 此时， int  c=  getchar() ; 代码获取的只是输入字符串的第一个字符，即'X'，接下来 while (c!=EOF) 中,EOF的值是-1，而c的值是'X'，而在while循环体中c的值不可能是EOF，while循环没有满足退出条件，所以相当于while是死循环，所以无法输出后面的信息。 2 问题解决 将getchar()作为while循环的条件语句，当输入时EOF时，退出while循环 	int c; 	while ((c = getchar()) != EOF) 	{ 		v = c == 'O' ? v + 1 : 0; 		u += v;  	} 以下为输出界面 我的程序返回的是字符，你的反悔的是数字吗？我好像懂点了[/quote] 你说的返回值指的是。。。。[/quote]就是与EOF比较的是数字还是字符

不要使用 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;  //... } 类似的例子还可以举很多。

引用 7 楼 qq_38080117 的回复:[quote=引用 4 楼 hou09tian 的回复:] 1 问题分析 getchar()在C程序中的功能是接收一个字符，所以，在程序中，假设输入是“XXOOOXOOOX” 此时， int  c=  getchar() ; 代码获取的只是输入字符串的第一个字符，即'X'，接下来 while (c!=EOF) 中,EOF的值是-1，而c的值是'X'，而在while循环体中c的值不可能是EOF，while循环没有满足退出条件，所以相当于while是死循环，所以无法输出后面的信息。 2 问题解决 将getchar()作为while循环的条件语句，当输入时EOF时，退出while循环 	int c; 	while ((c = getchar()) != EOF) 	{ 		v = c == 'O' ? v + 1 : 0; 		u += v;  	} 以下为输出界面 我的程序返回的是字符，你的反悔的是数字吗？我好像懂点了[/quote] 你说的返回值指的是。。。。

引用 4 楼 hou09tian 的回复:1 问题分析 getchar()在C程序中的功能是接收一个字符，所以，在程序中，假设输入是“XXOOOXOOOX” 此时， int  c=  getchar() ; 代码获取的只是输入字符串的第一个字符，即'X'，接下来 while (c!=EOF) 中,EOF的值是-1，而c的值是'X'，而在while循环体中c的值不可能是EOF，while循环没有满足退出条件，所以相当于while是死循环，所以无法输出后面的信息。 2 问题解决 将getchar()作为while循环的条件语句，当输入时EOF时，退出while循环 	int c; 	while ((c = getchar()) != EOF) 	{ 		v = c == 'O' ? v + 1 : 0; 		u += v;  	} 以下为输出界面 问个问题，为啥这个程序执行这么慢呢？还有人家回复我说运行结果不对，你知道错在哪里吗？

引用 4 楼 hou09tian 的回复:1 问题分析 getchar()在C程序中的功能是接收一个字符，所以，在程序中，假设输入是“XXOOOXOOOX” 此时， int  c=  getchar() ; 代码获取的只是输入字符串的第一个字符，即'X'，接下来 while (c!=EOF) 中,EOF的值是-1，而c的值是'X'，而在while循环体中c的值不可能是EOF，while循环没有满足退出条件，所以相当于while是死循环，所以无法输出后面的信息。 2 问题解决 将getchar()作为while循环的条件语句，当输入时EOF时，退出while循环 	int c; 	while ((c = getchar()) != EOF) 	{ 		v = c == 'O' ? v + 1 : 0; 		u += v;  	} 以下为输出界面 我的程序返回的是字符，你的反悔的是数字吗？我好像懂点了

引用 2 楼 qq_38204686 的回复:while循环的时候你倒是重新输入啊  重新getchar谢谢

while循环的时候你倒是重新输入啊  重新getchar

while (c!=EOF) 这个循环条件意义是什么， 这里一直死循环，没有退出条件


Question: c语言 堆排序 运行结果错误求教

各种排序算法动画演示http://www.webhek.com/misc/comparison-sort/

建议单步跟踪程序运行去找原因

堆排序？ 粗略的看了下你代码也没有对堆操作的函数啥的？ 你是要干嘛？ 到是看到你不少地方写int i; 不给初值，然后直接使用， 那本书介绍这样使用的，还是老师教的，这里先改了，程序还有问题的话 把问题说清楚


Question: ubuntu下 8位的灰度图 怎么转bmp

fwrite(&bfh, 14, 1, fp);  fwrite(&bih, 40,1,fp ); 这两句中的14,40换成sizeof表达式来计算大小试试。


Question: 下面的是我写的二分法查找程序，dubug已经成功，但是算不出结果，求指导

最后加上getchar();暂停下来才能看得到结果

#include<stdio.h>  int BinaryS(int b[],int s,int Arraysize);  int BinaryS(int b[],int s,int Arraysize) {     if (b[0]==s)         return 0;     else if(b[Arraysize-1]==s)         return Arraysize-1;     int L=0;     int R = Arraysize-1;     int Mid = L + (R-L)/2;      while(L<=R){         if(b[Mid]==s)             return Mid;         if(b[Mid]>s)             R=Mid-1;         if(b[Mid]<s)             L=Mid+1;         Mid=L+(R-L)/2;        }     return -1;  }  int main() {     int a[]={1,2,3,6,9,61,71,82,93,101,111,121,136};        int di=BinaryS(a,93,sizeof(a)/sizeof(int));     printf("Let us Start!!!\n");     printf("The Array point is: %d\n",di);      return 0;  } 代码应该没问题，问题可能出在输出之后立即退出了。试试加上system("pause");

现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！

代码没有任何问题，VS2013编译通过，结果正确！！！