Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: scanf取进来总是乱码，为什么

回复:
user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了  对电脑而言没有乱码，只有二进制字节。谢谢，理解了，

user: user-0
content: 引用 1 楼 user-6 的回复:代码对file文件操作，除了数字和字符是一样的，其他一律显示为乱码。如果重新读写出来就还是你原来输入的。 乱码没有原因的吧，就像1+1为什么等于2一样。 ---新手个人见解我觉得，乱码的原因是读取时，字节数不对，又不知道哪儿不对，乱码肯定是有原因的，

user: user-0
content: 引用 3 楼 qq423399099 的回复:在Debug 模式下，VC 会把未初始化的栈内存全部填成0xcc。会把未初始化的堆内存全部填成0xcd。未初始化的变量会被系统赋初值为0xCC,超过了ASCII码0-127这个范围，因此这个“字符串”被系统当成了宽字符组成的字符串，即两个字节数据组成一个字符，而0xCCCC表示的宽字符正好是乱码中的那个“烫”字。同理，0Xcdcd就是“屯”字。 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。原来这样，是因为后面的字节没有被覆盖，而只是初始化的结果，谢谢了，

user: user-1
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了  对电脑而言没有乱码，只有二进制字节。

user: user-2
content: 如果希望写入文件的东西人可读，一般应该仅用 fprintf 。

user: user-3
content: t 方式（文本文件）打开 fread,fwrite 本来就容易出问题，应该用 fscanf,fprintf 读写 二进制应该用 b方式打开fread,fwrite读写

user: user-4
content: 在Debug 模式下，VC 会把未初始化的栈内存全部填成0xcc。会把未初始化的堆内存全部填成0xcd。未初始化的变量会被系统赋初值为0xCC,超过了ASCII码0-127这个范围，因此这个“字符串”被系统当成了宽字符组成的字符串，即两个字节数据组成一个字符，而0xCCCC表示的宽字符正好是乱码中的那个“烫”字。同理，0Xcdcd就是“屯”字。 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-5
content: fwrite(pp,sizeof(struct STU),2,pfile); 是向文件中写 35个字节，结构体中的name占用的值为zhang占用了6个字节(加上'\0'占用的一个字节)，但在写的时候也是要写10个字节。后面4个字节是垃圾数据

user: user-6
content: 代码对file文件操作，除了数字和字符是一样的，其他一律显示为乱码。如果重新读写出来就还是你原来输入的。 乱码没有原因的吧，就像1+1为什么等于2一样。 ---新手个人见解
user-0 提问: 额，现在在学数据结构，但是好像不会融会贯通

回复:
user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-1
content: fromtail函数需要用while来循环读入  #include<stdio.h> #include<stdlib.h> #define ElemType int typedef struct Node {ElemType data; struct Node *next; }Node,*Linklist;   void fromtail(Linklist H) { 	int c; 	Node *p,*s; 	s=H; 	while(1) 	{ 		scanf("%d", &c); 		p=(Node *)malloc(sizeof(Node)); 		p->data = c; 		p->next = NULL; 		s->next = p; 		s = p; 		if(getchar() == '\n') 			break; 	}  }   void Get(Linklist H) { 	Node *s; 	s=H->next;  	while(s!=NULL) 	{ 		printf("%d ",s->data); 		s=s->next; 	} 	//printf("%d",s->data); 	//return s->data;   }  void main() {  	struct Node  *H; 	H=(Node *)malloc(sizeof(Node)); 	H->next=NULL; 	fromtail( H);  	Get(H);  }

user: user-2
content: 下断点，调试
user-0 提问: 设计一个有 N个进程并发的进程调度程序----用c语言实现

回复:
user: user-1
content: 百度上搜，应该有现成的答案。

user: user-2
content: 第1个要求就很难，那么多的参数从哪儿来

user: user-3
content: 好牛的要求 问题是 资源ABC的作用是什么，和指令有何关系？ 这么 样的系统，可以很简单做出来？有多少东西没考虑进去？ 时间片和 指令是什么关系？ 有额外的东西管理指令和时间片？

user: user-3
content: 引用 4 楼 u010398728 的回复:引用 3楼user-4 的回复:可以肯定这是<<操作系统>>的课程设计, 主要考察操作系统内存管理, 进程管理等方面, 祝你好运楼主你会吗 他都祝你好运了，可定是会的

user: user-0
content: 引用 3楼user-4 的回复:可以肯定这是<<操作系统>>的课程设计, 主要考察操作系统内存管理, 进程管理等方面, 祝你好运楼主你会吗

user: user-4
content: 可以肯定这是<<操作系统>>的课程设计, 主要考察操作系统内存管理, 进程管理等方面, 祝你好运楼主

user: user-0
content: 引用 1楼lm_whales 的回复:好牛的要求 问题是 资源ABC的作用是什么，和指令有何关系？ 这么 样的系统，可以很简单做出来？有多少东西没考虑进去？ 时间片和 指令是什么关系？ 有额外的东西管理指令和时间片？你是这专业吗？题目完整
user-0 提问: huff_node *(int,int)' differs in levels of indirection from 'int ()'

回复:
user: user-1
content: 这样就没有编译错误了，但是没有Article.txt没法继续帮楼主调试了  #define _CRT_SECURE_NO_DEPRECATE #include <stdio.h> #include <string.h> #include <stdlib.h>    //**************树的 结构***************** typedef struct { 	char letter; 	int  rate; 	int  flag; }Value;  typedef struct { 	Value weight; 	int parent; 	int *child; }huff_node;  typedef struct { 	int rate;//记录字符出现次数 主要用来判断是否第一次出现 	int pos;//记录字符在 huffmanT中的位置 }flag; //**************编码的结构**************** typedef struct { 	char ch; 	char bit[96]; }codenode;  huff_node *create_huffnode(int k,int ch);  //codenode huffman_code[n];//编码 数组 int n = 0;//huffman数组游标 flag  rate[95] = { -1 };//存储字符出现概率 char letter[95];//‘\0填充’  存储字符 huff_node * huffmanT[189];  //***1***遍历文章，计算可打印的字符的权值 void new_huffmanT(int k) { 	FILE *fp;  	int ch; 	fp = fopen("Article.txt", "rt"); 	ch = fgetc(fp); 	while (ch != EOF) 	{ 		if (rate[ch - ' '].rate == -1)//第一次出现 		{ 			huffmanT[n] = create_huffnode(k,ch); 			rate[ch - ' '].rate = 1; 			rate[ch - ' '].pos = n; 			n++; 		} 		else//出现过 		{ 			rate[ch - ' '].rate++; 			huffmanT[rate[ch - ' '].pos]->weight.rate++; 		} 		//读下一字符 		ch = fgetc(fp); 	} 	fclose(fp); }   huff_node *create_huffnode(int k,int ch) { 	huff_node *p = (huff_node *)malloc(sizeof(huff_node) + k*sizeof(int)); 	p->weight.flag = 0;//查找最小 k 个rate值时使用 	p->weight.rate = 1;//rate值 	p->weight.letter = ch ; 	p->parent = -1; 	int i; 	for (i = 0; i < k; i++) 		p->child[i] = -1; return p; }   int main() { 	int m; 	int k; 	printf("请输入huffman树的叉数"); 	scanf("%d", &k); 	new_huffmanT(k); 	getchar(); 	return 0; }   崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 新人请教C语言问题，求解疑惑

回复:
user: user-1
content: while(*q!='\0')换成while(*p2)

user: user-2
content: while判断p2不是q

user: user-0
content: 明白了，谢谢。

user: user-3
content: 应该是死循环导致的；  #include<stdio.h> #include<string.h> void main() {     char *p1,s[25]="i am",*p2,q[20]="a student.";    //s的空间应该加大一些s[64]，保证能够容纳q的数据空间     p1=s+strlen(s);     p2=q;     while(*q!='\0')    //这个地方换成p2即while (0 != *p2)     {         *p1=*p2;          p1++;          p2++;     }     *p1 = 0;     puts(s); }

user: user-4
content: 你判断的是*q而++的是p2.....  #include<stdio.h> #include<string.h> void main() { 	char *p1,s[25]="i am",*p2,q[20]="a student."; 	p1=s+strlen(s); 	p2=q; 	while(*p2!='\0') 	{ 		*p1=*p2; 		p1++; 		p2++; 	} 	puts(s); }

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

回复:
user: user-1
content: 反正不要返回局部变量的地址..

user: user-2
content: C++ 对象有构造和析构过程 C没有  函数中中定义的局部变量 ，实际上子函数中只能传递引用，指针，或者 拷贝 通过这些方式使用  main 函数 或者任何一个函数 在调用另一个函数 返回后 继续执行 调用者（main）函数 main 并没有结束。 而被调函数的执行已经结束 函数一次结束后，这些函数使用的栈内存（函数定义的非静态变量，以及形参占用的） 会被清理回收掉，也就是内存恢复成没调用前的状态，以方便内存重新利用。 C,C++ 一个正在执行的函数，是不存在这个问题的。  函数调用，是替换跳转的解决方案 比跳转实用  函数调用，是中断当前程序执行，跳转到函数体内部执行，函数执行完毕，跳回中断处继续执行

user: user-2
content: 函数返回后，除非静态变量， 函数内定义所有其它类型变量占用的空间，都会被系统收回， 否则，空间一直占用下去 很快系统就没有可用空间了   实际上，早期的编程语言，是命令式编程语言 只有跳转 没有堆栈结构  后来有了堆栈 才发展成为 过程式编程语言 函数和过程调用成为主流  有了堆栈

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。很深啊 谢谢要研究下  为什么在main（）中定义的局部变量，可以在子函数中调用，没有销毁丢失那？可以用指针在其他函数中访问，而其他函数里的局部变量，在回到main函数后就被销毁那？

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

user: user-4
content: 这种返回局部变量的地址属于未定义行为

user: user-0
content: 引用 2 楼 wang0635 的回复:p所指的空间b在函数point()中相当于是自动变量，函数返回后其位置已经释放，后面的printf()函数调用时，一般会再次使用那些位置，当然原来的东西就被冲掉了。可以这样  static int     b[6] = { ... };只 有在调用一次printf()函数后才会冲掉吗？我单步看到没有调用printf（）前还在栈中，难道不是退出调用函数后立刻销毁吗？谢谢你，加static 变为静态变量后一直存在，没什么问题啦，只是对二级指针不太懂，在实验一些自己的想法，更了解指针。

user: user-0
content: 只 有在调用一次printf()函数后才会冲掉吗？我单步看到没有调用printf（）前还在栈中，难道不是退出调用函数后立刻销毁吗？谢谢你，加static 变为静态变量后一直存在，没什么问题啦，只是对二级指针不太懂，在实验一些自己的想法，更了解指针。

user: user-5
content: p所指的空间b在函数point()中相当于是自动变量，函数返回后其位置已经释放，后面的printf()函数调用时，一般会再次使用那些位置，当然原来的东西就被冲掉了。可以这样  static int     b[6] = { ... };

user: user-6
content: 怎么还有人返回局部变量的地址，编译器还是太好心了。
user-0 提问: 数据结构迷宫

回复:
user: user-1
content: S->top为 0xCCCCCCCC是因为指针没有初始化 VC的DEBUG版会把未初始化的指针自动初始化为0xCCCCCCCC  崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: 仅供参考：/**  * @Title  老鼠走迷宫的拓展探究  * @Author 孙琨  * @Date   2013-11-16  * @At     XUST  * @All Copyright by 孙琨  *  */  #include <iostream> using namespace std;  int maze[9][9] = { // 初始化迷宫，英文maze为“迷宫”     {2,2,2,2,2,2,2,2,2},     {2,0,0,0,0,0,0,0,2},     {2,0,2,2,0,2,2,0,2},     {2,0,2,0,0,2,0,0,2},     {2,0,2,0,2,0,2,0,2},     {2,0,0,0,0,0,2,0,2},     {2,2,0,2,2,0,2,2,2},     {2,0,0,0,0,0,0,0,2},     {2,2,2,2,2,2,2,2,2} };  int startI = 1,startJ = 1; // 入口行列坐标 int endI = 7,endJ = 7;     // 出口行列坐标  void visit(int i,int j)  // 自动搜寻路径 {     int m,n;      maze[i][j] = 1;      if((i == endI) && (j == endJ))     {         cout << endl << "显示路径:" << endl;         for(m=0; m<9; m++)         {             for(n=0; n<9; n++)             {                 if(maze[m][n] == 2)                     cout << "■";                 else if(maze[m][n] == 1)                     cout << "♀";                 else                     cout << "  ";             }             cout << endl;         }     }      if(maze[i][j+1] == 0)         visit(i,j+1);     if(maze[i+1][j] == 0)         visit(i+1,j);     if(maze[i][j-1] == 0)         visit(i,j-1);     if(maze[i-1][j] == 0)         visit(i-1,j);      maze[i][j] = 0;  }  int main(void) {     int i,j;      cout << "显示迷宫: " << endl;     for(i=0; i<9; i++)     {         for(j=0; j<9; j++)         {             if(maze[i][j] == 2)                 cout << "■" ;             else                 cout << "  " ;         }         cout << endl;     }      visit(startI,startJ);      return 0; }

user: user-0
content: 这是还没有写完的
user-0 提问: 求大神帮我解一道题，是在是搞不会。

回复:
user: user-0
content: 感谢。。。。。。。。。。

user: user-1
content: #include<stdio.h> #include<math.h>  int main(){      double eps, cur_num, last_num = 1.0; 	scanf("%lf", &eps); 	int i = 0; 	double S = 1.0; 	while(++i) 	{ 		cur_num = ((i % 2) * -2 + 1) / double(i * 3 + 1); 		S += cur_num; 		 		if(abs(last_num) - abs(cur_num) < eps) 			break; 		last_num = cur_num; 	} 	printf("%.4lf\n", S); }
user-0 提问: char*s  和 char s[]的问题

回复:
user: user-1
content: to只有7个字节的空间，你硬要往里塞9个字节。

user: user-2
content: 越界操作，你可以通过sizeof看一下b的空间（会算上'\0')，然后strlen()看一下a的长度（不算'\0'）；拷贝到的目的空间要足够大；

user: user-3
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-4
content: 学习了，感谢讲解

user: user-3
content: 判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

user: user-5
content: 数组b下标越界#include<stdio.h> char *copy(char *,char *); int main() { char *a = "123456789"; char b[10] = "abcdefg"; printf("%s\n%s\n", a, b); char *p = b;  copy(a, p);  printf("%s\n%s\n", a,p);  return 0; }  char *copy(char *from, char *to) { char *p=to; while (*from) 	{*to++ = *from++; 	} *to = '\0'; return p; }

user: user-6
content: copy函数里to越界写入了 照理a指针的值应该是不会有影响的，因为a指向的是常量区的字符串 这是我VS调试的结果：

user: user-7
content: 感觉是whlie循环出错，条件*from不满足进不了循环

user: user-8
content: 因为越界写，a被覆盖了 printf("a = %p\n",a); 看看，指针 a的值 是否有变化

user: user-9
content: gcc下没什么问题，我也没看出来有什么问题

user: user-5
content: 你的while循环的条件根本不成立，所以一调用你自己写的copy函数直接把a[0]赋值为结束符”/0“

user: user-10
content: 引用 6 楼 fornetuse123 的回复:[quote=引用 5 楼 fornetuse123 的回复:] *to++ = *from++;           \\你的想法：b数组的各个元素被改写为f；实际上：b数组的第一个元素被改写为f后，执行下面语句  *to = '\0';                             \\这里错了，应该是最后一个*（to+1）指向了一个野指针，所以报错 *（to+1）位于栈中b变量的高地址处已经是别的数据了，比如可能是EBP或者返回地址了，这个位置有可能也是栈保护随机数的位置，所以报告说b变量崩溃了

user: user-10
content: [quote=引用 5 楼 fornetuse123 的回复:] *to++ = *from++;           \\你的想法：b数组的各个元素被改写为f；实际上：b数组的第一个元素被改写为f后，执行下面语句  *to = '\0';                             \\这里错了，应该是最后一个*（to+1）指向了一个野指针，所以报错

user: user-10
content: *to++ = *from++;           \\你的想法：b数组的各个元素被改写为f；实际上：b数组的第一个元素被改写为f后，执行下面语句  *to = '\0';                             \\b数组的第一个元素被改写为终止符；随后的各个元素也都是终止符  这样你打印a、b将只显示a，而b是一个都是终止符元素的数组，所以什么都不显示

user: user-11
content: gcc和vc2012编译通过，没问题
user-0 提问: 0xC0000005: 写入位置 0x0000000C 时发生访问冲突

回复:
user: user-1
content: 没有对申请内存空间就往里写数据肯定出错了！

user: user-2
content: 没有分配内存就写入数据了

user: user-3
content: 调试一下就行了，这些还要靠自己。

user: user-4
content: 0x0000000C很接近0x00000000位置。这个错误肯定是对某个NULL指针进行了写入操作 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-5
content: 它前面一行 s = top = base; 这不把s的值又变成NULL了吗
user-0 提问: C语言怎么调用Active X 对象？？

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

user: user-2
content: 作为com对象来调用，有很多接口的。

user: user-3
content: 参考http://www.educity.cn/develop/479155.html
user-0 提问: 字符串和字符串函数

回复:
user: user-1
content: 建议把char c；换成int c;用m也是建议:int *m;此时m为野指针哦，用之前献给其分配空间，因为野指针其只想的地址可能是不可写的；所以用之前先给其分配一个可读可写的内存区域，使用malloc吧

user: user-2

user: user-3
content: c是char类型变量，可以存储一个char数据 m是char*类型变量，可以存储一个指针数据，*m就是这个指针表示地址的单元。m值是多少？那个单元在什么地方？不知道。就往里面存东西，当然要出问题了

user: user-0
content: 刚刚用这个软件不咋太会调试，见笑了，嗯记住你的话了

user: user-4
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 一直循环输出地址一样的数据,找不到哪里错了,着急啊啊,在线等大神快来拯救我...

回复:
user: user-0
content: 感谢您的建议,长远来看肯定受用不少 不过这是今晚十二点前要交的项目的一部分,您介意帮忙看看吗?

user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 编写一个程序，输入N个用户的姓名和电话号码，按照用户姓名的词典顺序排列输出用户的姓名和电话号码。

回复:
user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

user: user-0
content: 在设立断点之后要printf里面的东西添加监视为0

user: user-0
content: 改了scanf在后边加了一个getchar吞掉回车 但是还是不明白

user: user-2
content: 你的scanf("%s %d\n",&info[i].name,&info[i].phone); scanf里面不要加\n 写入字符串不用加&,你的phone为什么要一个200大小的数组？感觉一个int就行了 楼主可以单步观察一下每部的变量的值以及结果 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）

user: user-0
content: 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 #include<stdio.h> #include<string.h> struct Person{ 	char name[50]; 	int phone[200]; }tmp,array[100]; void byname(struct Person array[],int n) { 	int i,j; 	struct Person tmp; 	for(i=0;i<n;i++){ 		for(j=i;j<n;j++) 		{ 			if(strcmp(array[i].name,array[j].name)>0) 			{ 				tmp=array[i]; 				array[i]=array[j]; 				array[j]=tmp;			 			} 		} 	} } int main() { 	struct Person info[100]; 	int i,n; 	scanf("%d",&n); 	for(i=0;i<n;i++) 		scanf("%s %d\n",&info[i].name,&info[i].phone); 	byname(info,n); 	for(i=0;i<n;i++) 		printf("%12s %12d\n",array[i].name,&array[i].phone);	 	return 0; } 又写了一个还是不行
user-0 提问: 一个C语言问题  有一点点没明白 指向结构体数组的引用

回复:
user: user-1
content: 楼主先入为主了，觉得第一个stu_p[0][i]对应第一个%d,第二个stu_p[0][i]对应第二个%d是这样想的么？ 其实下面那样就行了，后面的参数都是没用的，楼主是不是明白了什么呢  for (i = 0; i < 3; ++i)    printf("%d,%d,%d,%c\n", stu_p[0][i]);

user: user-0
content: 第三条printf不明白 for (i = 0; i < 3; ++i) printf("%d,%d,%d,%c\n", stu_p[0][i], stu_p[0][i], stu_p[0][i], stu_p[0][i]);
user-0 提问: uva1589 测试过很多数据没问题 但就是wa

回复:
user: user-1
content: wrong answer 不知道错在哪的话，几个办法： 1. 找个正确的程序来比对，一般能看出问题来。 2. 假设没看出来，那么自己制造一些数据进行测试，用两个程序都跑一遍，看看输出是否一致。这个做数据的话，范围得做得大一些，样本做多一些。 3. 还是没发现的话，找别人来给你看一下，去OJ相关的网上到处贴，总有热心人士会来给看看的。 (直接第三步会比较省力, 不过时间上没保证)

user: user-0
content: 能不能帮我看下 数据测试过很多了 也去udebug上提交过
user-0 提问: 请教一个简单问题，关于vs2010中自定义函数。

回复:
user: user-1
content: 类型定义， 常量定义 外部变量定义 函数声明 inline 函数 模板函数和模板类 等等 这些东西，对C,C++来说，属于接口性质的东西 可以放在头文件里  函数定义， 类静态变量定义 以及一些文件自己使用的 接口性质的代码，放在实现文件.c,.cpp 中

user: user-0
content: 引用 6 楼 qq423399099 的回复:Myh.cpp第一行写#include"Myh.h" 同时你的.h以及.cpp文件也要包含需要的另外的头文件  感谢~明白了 嘿嘿

user: user-2
content: Myh.cpp第一行写#include"Myh.h" 同时你的.h以及.cpp文件也要包含需要的另外的头文件

user: user-0
content: 引用 3 楼 lm_whales 的回复:其实如果不是临时起意，可以先规划好 .cpp，.h 的名字 直接在 .cpp 写程序 外部接口，写在.h 内部接口，实现 写在.cpp  谢谢热心回复，但是我不太理解，能不能通俗点，我觉得自定义函数越来越多的时候，每次创建新自定义函数都要下拉很久很麻烦，所以想把自定义函数放进一个.cpp，但是一引用，就无法打开包括文件。

user: user-0
content: 引用 1 楼 qq423399099 的回复:源文件上右键，添加--新建项 取名为Myh.cpp 第一行写上#include"Myh.h" 然后将main函数里的自定义函数直接ctrl+x,ctrl+v过去 完成！！  谢谢回复  另外我想知道新建Myh.cpp之后，第一行写#include"Myh.cpp"对吧，但是我试了下发现不行啊。 我把自定义函数放进myh.cpp，在里面会有很多未定义标识符。

user: user-1
content: 剪切，复制，整理。 就这么简单

user: user-1
content: 其实如果不是临时起意，可以先规划好 .cpp，.h 的名字 直接在 .cpp 写程序 外部接口，写在.h 内部接口，实现 写在.cpp

user: user-2
content: 源文件上右键，添加--新建项 取名为Myh.cpp 第一行写上#include"Myh.h" 然后将main函数里的自定义函数直接ctrl+x,ctrl+v过去 完成！！
user-0 提问: c语言 1+1*2+1*2*3+......

回复:
user: user-1
content: 循环内还要再嵌套一层循环求1*2*3*... 外层循环是把每个加起来

user: user-2
content: 多用用for , 理解理解. 参考代码如下:  #include<stdio.h>  int main()  {       int i,n,m=1,s=0;  //修改      printf("Please input the number:\n");      scanf("%d",&n);      printf("n=%d\n",n);      for(i=1;i<=n;i++)     //修改      {        m=m*i;   //修改       s=s+m;  //修改      }      printf("s=%d\n",s);      return 0; }

user: user-3
content: #include<stdio.h>  int main()  {       int i,n,m=1;  //修改      printf("Please input the number:\n");      scanf("%d",&n);      printf("n=%d\n",n);      for(i=1;i<=n;i++)     //修改      {        int s=0;    //修改       m=m*i;   //修改       s=s+m;  //修改      }      printf("s=%d\n",s);      return 0; }

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

回复:
user: user-0
content: 引用 1 楼 CharlesSimonyi 的回复:66行：printf("Connected in!"); exit(0); 退出程序，后面的         if((pid = fork()) == 0) {             char cnt[] = "HTTP/1.1 403 Forbidden\r\nServer:Cary\r\nContent-Type:text/html\r\nContent-Length: 25727\r\nConnection:close\r\n\r\n";             write(client_sock, cnt, strlen(cnt));             close(client_sock);  永远不会执行 谢谢版主 , 问题已解决 , centos7 firewalld 没关 , 我一直以为是 firewall , 少了个 d  , 所以只关了 iptables , firewalld 没关 , 于是外面无法访问 , nc 也无法穿透 ...

user: user-0
content: 引用 1 楼 CharlesSimonyi 的回复:66行：printf("Connected in!"); exit(0); 退出程序，后面的         if((pid = fork()) == 0) {             char cnt[] = "HTTP/1.1 403 Forbidden\r\nServer:Cary\r\nContent-Type:text/html\r\nContent-Length: 25727\r\nConnection:close\r\n\r\n";             write(client_sock, cnt, strlen(cnt));             close(client_sock);  永远不会执行 在 if((pid=fork())==0)  现在代码被我改成 if(pid < 0) {             perror("Error in fork!");         } else if(pid ==0) {             char cnt[] = "HTTP/1.1 403 Forbidden\r\nServer:Cary\r\nContent-Type:text/html\r\nContent-Length: 3\r\nConnection:close\r\n\r\nHi!";             write(client_sock, cnt, strlen(cnt));             printf("Has sent!\r\n");             close(client_sock);             exit(1);         } 这样了 , 在本机使用 curl 127.0.0.1:99 一点问题都没有 , 其它机器则不行 , 防火墙是关闭状态的

user: user-0
content: 引用 1 楼 CharlesSimonyi 的回复:66行：printf("Connected in!"); exit(0); 退出程序，后面的         if((pid = fork()) == 0) {             char cnt[] = "HTTP/1.1 403 Forbidden\r\nServer:Cary\r\nContent-Type:text/html\r\nContent-Length: 25727\r\nConnection:close\r\n\r\n";             write(client_sock, cnt, strlen(cnt));             close(client_sock);  永远不会执行 谢谢，忘记说了，那句是为了调试的，那一句就永远不会执行了

user: user-1
content: 66行：printf("Connected in!"); exit(0); 退出程序，后面的         if((pid = fork()) == 0) {             char cnt[] = "HTTP/1.1 403 Forbidden\r\nServer:Cary\r\nContent-Type:text/html\r\nContent-Length: 25727\r\nConnection:close\r\n\r\n";             write(client_sock, cnt, strlen(cnt));             close(client_sock);  永远不会执行
user-0 提问: 求助，结构体引用变量初始化问题

回复:
user: user-0
content: 为什么VS编译后显示拒绝访问，其他软件可以

user: user-1
content: shuru函数里XiShuJuZhen&t;改为XiShuJuZhen t;

user: user-1
content: 关闭UAC和杀毒软件。 以管理员身份运行 以XP兼容模式运行 重新build-重建工程-重装vs-重装系统
user-0 提问: 用c调用linux指令

回复:
user: user-1
content: 就算你要分析结果，也可以凑合用 system("指令 <in.txt >out.txt");//然后读out.txt的内容

user: user-2
content: 如果你要分析执行结果, 用popen; 如果不要, 为什么不用system呢?

user: user-3
content: int create_procress(const char *path,const char *name,const char *arg) {     pid_t pid;      pid=fork();     if(pid == 0)     {         if(execl(path,name,arg,NULL) == -1)         {             perror(path);             _exit(-1);         }     }     else if(pid == -1)         return -1;      return 0; } 参数path为执行外部程序的路径 name为运行程序的名称（argv[0]） arg为命令行参数（从argv[1]开始）

user: user-4
content: 给一个不用system的理由

user: user-5
content: 引用 4 楼 user-8 的回复:[quote=引用 1 楼 qq423399099 的回复:] 方法1：popen()会调用fork()产生子进程，然后从子进程中调用/bin/sh -c来执行参数command的指令。 方法2：使用vfork()新建子进程，然后调用exec函数族 参考：http://blog.sina.com.cn/s/blog_8043547601013rxf.html  int execl(const char *path, const char *arg, ...);  int execlp(const char *file,  const char *arg, ...);   int execle(const char *path, const char *arg,  ..., char * const envp[]);  int execv(const char *path,  char *const argv[]); int execvp(const char *file,  char *const argv[]);  int execve(const char *file,char *const argv[], char *const envp[]);[/quote] +++ 这些也可以完成system的功能； system还是比较简单的；

user: user-6
content: 推荐popen()，还可以获取执行后返回的输出内容并进行分析和处理

user: user-0
content: 进程还不会，先留着，过两天再回来看

user: user-7
content: 方法1：popen()会调用fork()产生子进程，然后从子进程中调用/bin/sh -c来执行参数command的指令。 方法2：使用vfork()新建子进程，然后调用exec函数族 参考：http://blog.sina.com.cn/s/blog_8043547601013rxf.html

user: user-8
content: 引用 1 楼 qq423399099 的回复:方法1：popen()会调用fork()产生子进程，然后从子进程中调用/bin/sh -c来执行参数command的指令。 方法2：使用vfork()新建子进程，然后调用exec函数族 参考：http://blog.sina.com.cn/s/blog_8043547601013rxf.html  int execl(const char *path, const char *arg, ...);  int execlp(const char *file,  const char *arg, ...);   int execle(const char *path, const char *arg,  ..., char * const envp[]);  int execv(const char *path,  char *const argv[]); int execvp(const char *file,  char *const argv[]);  int execve(const char *file,char *const argv[], char *const envp[]);

user: user-1
content: 用system("make")不会死人的。
user-0 提问: 数组在栈中存储问题

回复:
user: user-0
content: 引用 6 楼 qq423399099 的回复:整个数组。。。连续的一片内存 可以打印地址来验证。。。  int arr[10]; printf("%p %p %p\n", &arr[0], &arr[1], &arr[2]);

user: user-1
content: 整个数组。。。连续的一片内存 可以打印地址来验证。。。  int arr[10]; printf("%p %p %p\n", &arr[0], &arr[1], &arr[2]);

user: user-0
content: 数组在栈里面是怎样存储的，是单个元素存储还是直接存整个数组

user: user-1
content: 楼主是想问分配以后的存储情况呢还是正在分配时候的存储情况

user: user-0
content: 还是没有说明原因，而且全局变量是在静态区的，不是在堆里面

user: user-1
content: 参考：http://blog.csdn.net/gaoxin1076/article/details/6930040

user: user-2
content: 看你数组类型定义呀  栈中存储整个数组，每个数组元素又是根据你定义的类型决定的。
user-0 提问: C语言多次调用DLL接口后申请不到函数句柄问题

回复:
user: user-1
content: 要看DLL的接口是怎么export出来的，或者是调用方式是什么。

user: user-2
content: 无代码铁定无法分析，有代码，也需要有心人来分析。

user: user-3
content: 检查是否资源泄漏的办法之一： 在任务管理器 进程 查看 选择列 里面选择：内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍，越多越好，比如1000000次甚至无限循环，记录以上各数值，再隔至少一小时，越长越好，比如一个月，再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加，则铁定有对应资源的资源泄漏！
user-0 提问: 字符串指针

回复:
user: user-1

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

user: user-0
content: 嗯，对着呢

user: user-3
content: char alter_ar(char *ar) {  int i; char tmp[100] = {0}; int a = strlen(ar);  	char *p = ar+a-1; printf("now p is %p",p); for(i = 0;i<a;i++,p--) {  tmp[i]=*p; printf("now p is %p\n",p); } //ar[i]='\0'; p = tmp; return p; }

user: user-0
content: 明白了明白了谢了

user: user-4
content: 引用 5 楼 lck898989 的回复:谢谢耐心的回复！还是不太明白，为啥会覆盖呢， 楼主你想想，第一次进for循环，此时i是0，而p指着最后一个字符（即'a'）,然后你进行ar[i]=*p;的操作 也就是说原来的"hellosda"被你改成了"aellosda" 第二次循环后"aellosda"变成了"adllosda" ..... 等到p移动到了前半段字符串以后，此时原来前半段的字符串"hell"早就被之前的四次循环而修改成了"adso"了

user: user-0
content: 谢谢耐心的回复！还是不太明白，为啥会覆盖呢，

user: user-5
content: 你char *alter_ar(char *ar)函数的实参是char so[SIZE]数组的指针  所以你ar[i]=*p;实际上是对原数组char so[SIZE]="hellosda";进行前后置换，有没有临时存储区，所以前3个都被后3个覆盖掉了

user: user-4
content: 楼主不能直接这样覆盖掉ar[i]=*p; 这样的话，原来的前半段的字符都被后面的字符给覆盖了  #include<stdio.h> #include<string.h> #define SIZE 60 char *alter_ar(char *ar);  int main(void) { 	char so[SIZE]="hellosda"; 	printf("the location of so is %p\n",so); 	puts(so); 	//alter_ar(so); 	puts(alter_ar(so)); 	return 0; } char *alter_ar(char *ar) { 	int i; 	int a = strlen(ar); 	char *p = ar+a-1; 	char arr[32] = {0}; 	printf("now p is %p",p); 	for(i = 0;i<a;i++,p--) 	{  		arr[i]=*p; 		printf("now p is %p\n",p); 	} 	arr[i]='\0'; 	strcpy(ar, arr); 	 	return p+1; }

user: user-0
content: 谢谢！地址是连着的啊，但是输出的结果好像有点问题

user: user-4
content: 哪里不完整了 打印出的地址不是连着的么
user-0 提问: DEVC运行一个程序会死机

回复:
user: user-0
content: 引用 4 楼 qq423399099 的回复:我上面贴代码了啊。。。 你少了一句s=h; 要删除第一个元素，必须有这句，因为删除第一个元素他不会进入while循环，s也就不会被赋值到，是个野指针由衷感谢，谢谢你。

user: user-1
content: 我上面贴代码了啊。。。 你少了一句s=h; 要删除第一个元素，必须有这句，因为删除第一个元素他不会进入while循环，s也就不会被赋值到，是个野指针

user: user-0
content: 引用 1 楼 qq423399099 的回复:崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。我刚才改了下，正确了可是不能删除第一个位置的数 void shanchu(struct node *h,int y)  {  	 	struct node *p,*s; 		p=h->next ; 		while(p->data !=y&&p!=NULL) 		{ 			s=p; 			p=p->next ; 		} 		s->next=p->next; 		free(p);  } 应该怎么修改，麻烦你了

user: user-1
content: insert和shanchu函数都有问题  #include<stdlib.h> #include<stdio.h> struct node { 	int data; 	struct node *next; } ; struct node *create()	//用头插法创建一个链表 { 	int x; 	struct node *head,*p; 	head=(struct node*)malloc(sizeof(struct node));	//建立头节点  	head->next =NULL; 	scanf("%d",&x); 	while(x!=-999) 	{ 		p=(struct node*)malloc(sizeof(struct node)); 		p->data=x; 		p->next=head->next;	//将p放在头节点之后 		head->next=p; 		scanf("%d",&x);  	} 	return(head); }  void outline(struct node *h)	//输出一个链表 { 	struct node *p; 	p=h->next; 	printf("\n"); 	while(p!=NULL) 	{ 		printf("%5d",p->data ); 		p=p->next; 	} }  void insert(struct node *h,int x,int y)	//将y插到x后面 { 	struct node *p,*s; 	p=h->next; 	while(p->data!=x&&p!=NULL) 	{ 		p=p->next ;  	} 	s=(struct node*)malloc(sizeof(struct node)); 	s->data =y; 	s->next =p->next ; 	p->next =s; }  void shanchu(struct node *h,int x)	//删除链表中数据为x的节点 { 	struct node *p,*s; 	s=h; 	p=h->next ; 	while(p->data!=x&&p!=NULL) 	{ 		s=p;//s指向前一个节点 		p=p->next ; 	} 	s->next=p->next ; 	free(p); }  int main() { 	int a,b; 	struct node *h; 	h=create(); 	outline(h);  	printf("\ninput a,b:"); 	scanf("%d%d",&a,&b);  	insert(h,a,b); 	outline(h); 	shanchu(h,a); 	outline(h); }

user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 关于存储含空格的字符串

回复:
user: user-1
content: 楼主是没有把ii的值重新置为0吧

user: user-2
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];
user-0 提问: 帮忙看个问题Cpp2.obj : error LNK2001: unresolved external symbol "int __cdecl max(int,

回复:
user: user-1
content: 代码没问题的，我这里可以编译运行 楼主是不是创建工程有问题？ 要创建控制台程序才行

user: user-0
content: max_test.cpp #include<stdio.h> #include "max.h" int main() {     int x=2,y=5;     int s;     s=mymax(2,5);     printf("%d  ",s);     return 0; } max_fa.cpp #include"max.h"   int mymax(int x,int y) {     if(x>y) return x;     else return y; } max.h #ifndef MAX_H #define MAX_H   int mymax(int x,int y); #endif

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复://max_test.cpp #include<stdio.h> #include "max.h" int main() {     int x=2,y=5;     int s;     s=mymax(2,5);     printf("%d  ",s);     return 0; }   //max.h: #ifndef MAX_H #define MAX_H  int mymax(int x,int y); #endif  //max_fa.cpp: #include"max.h"  int mymax(int x,int y) {     if(x>y) return x;     else return y; }   Compiling... Skipping... (no relevant changes detected) max_fa.cpp Linking... LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 Debug/wj.exe : fatal error LNK1120: 1 unresolved externals 执行 link.exe 时出错.  wj.exe - 1 error(s), 0 warning(s) 完全复制代码后重新建立又出现了这个问题

user: user-2
content: //max_test.cpp #include<stdio.h> #include "max.h" int main() {     int x=2,y=5;     int s;     s=mymax(2,5);     printf("%d  ",s);     return 0; }   //max.h: #ifndef MAX_H #define MAX_H  int mymax(int x,int y); #endif  //max_fa.cpp: #include"max.h"  int mymax(int x,int y) {     if(x>y) return x;     else return y; }

user: user-2
content: //Cpp2.cpp #include<stdio.h> #include "max.h" int main() {     int x=2,y=5;     int s;     s=mymax(2,5);     printf("%d  ",s);     return 0; }   //max.h: #ifndef MAX_H #define MAX_H  int mymax(int x,int y); #endif  //max_fa.cpp: #include"max.h"  int mymax(int x,int y) {     if(x>y) return x;     else return y; }   将max_fa.cpp添加到项目源代码中？

user: user-3
content: 目测没有链接max_fa.obj

user: user-0
content: 是哪个max换成mymax？

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:请将max替换为mymax 是哪个max替换成mymax？

user: user-2
content: 请将max替换为mymax

user: user-1
content: 楼主是自己编译链接的吗，建议贴一下指令
user-0 提问: 烦人的LNK2019

回复:
user: user-1
content: 没把相关cpp放在同一个项目中。 笔误写错了，函数原型和函数实现不一致。 ……

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项 不行 作业交cpp给老师 把自己电脑环境设置了没用啊 应该不是这个的问题吧  老师给的代码

user: user-1
content: 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项

user: user-0
content: 引用 1 楼 qq423399099 的回复:LNK2019一般是链接问题，只有声明而找不到实现 建议楼主贴一下几个文件开头的几句include 同时是用的是IDE还是自己手动编译链接的 能不能求个联系方式 project太长了 我贴不上去

user: user-2
content: LNK2019一般是链接问题，只有声明而找不到实现 建议楼主贴一下几个文件开头的几句include 同时是用的是IDE还是自己手动编译链接的
user-0 提问: 那位大神可以解读一下UNIX环境高级编程第三版第四章22节的那个递归读目录的程序啊

回复:
user: user-1
content: 第一遍看都费劲，这个别人帮不了你，还得看

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

user: user-3
content: 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命令不会。  UNIX下改用ls命令。
user-0 提问: C语言编程求组

回复:
user: user-1
content: #define LENGTH 10 #define NUM 10 struct avaiable{     char name[LENGTH];     int encrypted; };   struct current{     int mode;     char name[LENGTH];     char name1[LENGTH];     char pass[LENGTH]; };   struct setting{     struct avaiable avaiable_w[NUM];     struct current current_w; };   struct setting *info_st;   int main() {     char name1[10]={"dasd"};    //以下两句也是可以的，只是这个是在栈上（也可以直接使用alloca)，如果使用malloc是在堆上申请；     struct setting info_val;     info_st = &info_val;     info_st->current_w.mode = 22;     printf("%d\n",info_st->current_w.mode);       memcpy(info_st->avaiable_w[0].name,name1,sizeof(name1));     info_st->avaiable_w[0].encrypted=1;       printf("%s\n",info_st->avaiable_w[0].name);     printf("%d\n",info_st->avaiable_w[0].encrypted);     return 0; }  出现端错误的原因是因为info_st是指向NULL，即不可读不可写的区域，那么你对其赋值是对其进行写操作，所以会出现内存访问出错，所以就会出现端错误；

user: user-2
content: #define LENGTH 10 #define NUM 10 struct avaiable{     char name[LENGTH];     int encrypted; };   struct current{     int mode;     char name[LENGTH];     char name1[LENGTH];     char pass[LENGTH]; };   struct setting{     struct avaiable avaiable_w[NUM];     struct current current_w; };   struct setting info_st;   int main() {     char name1[10]={"dasd"};     info_st.current_w.mode = 22;     printf("%d\n",info_st.current_w.mode);       memcpy(&info_st.avaiable_w[0].name,name1,sizeof(name1));     info_st.avaiable_w[0].encrypted=1;       printf("%s\n",info_st.avaiable_w[0].name);     printf("%d\n",info_st.avaiable_w[0].encrypted);      return 0; }

user: user-2
content: 刚试了这样也行的，呵呵，

user: user-2
content: 学习中，楼上回复太好了，感觉要用它，info_st->avaiable_w[0].name，要给其开辟空间的，因为其定义是指针的，不像struct setting  info_st[100],之类的吧，呵呵，也在学习之中，望指点

user: user-3
content: 要为指针先malloc一个空间才行  #define LENGTH 10 #define NUM 10 struct avaiable{     char name[LENGTH];     int encrypted; };   struct current{     int mode;     char name[LENGTH];     char name1[LENGTH];     char pass[LENGTH]; };   struct setting{     struct avaiable avaiable_w[NUM];     struct current current_w; };   struct setting *info_st;   int main() {     char name1[10]={"dasd"}; 	info_st = (struct setting *)malloc(sizeof(struct setting));     info_st->current_w.mode = 22;     printf("%d\n",info_st->current_w.mode);       memcpy(info_st->avaiable_w[0].name,name1,sizeof(name1));     info_st->avaiable_w[0].encrypted=1;       printf("%s\n",info_st->avaiable_w[0].name);     printf("%d\n",info_st->avaiable_w[0].encrypted);     return 0; }

user: user-4
content: Linux： 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令  Windows： 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-0
content: 给自己顶一下
user-0 提问: 为什么我的嵌入式SQL读不到double类型的数据

回复:
user: user-1
content: 不知道你的嵌入式SQL有没有CAST或CONVERT函数。

user: user-1
content: 引用 4 楼 litch008 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] 如果有，可以select CAST(SCALE AS char(20)),…… 您真的是太厉害了，按您说的这样一改果真查出正确的数据来了，谢谢您[/quote]

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:如果有，可以select CAST(SCALE AS char(20)),…… 您真的是太厉害了，按您说的这样一改果真查出正确的数据来了，谢谢您

user: user-1
content: 如果有，可以select CAST(SCALE AS char(20)),……

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:不知道你的嵌入式SQL有没有CAST或CONVERT函数。没看见有，是跟数据的转换有关吗？
user-0 提问: 新手小白学C该用什么IDE

回复:
user: user-1
content: notepad, cmd 免下载，免安装

user: user-2
content: cygwin,gcc

user: user-3
content: Dev C++异常适合初学者

user: user-4
content: 推荐使用编辑器，C语言没必要用IDE  推荐VIM 。  我个人使用Emacs写代码，超好用， 写文档可以用Emacs的org-mode，太强大了。

user: user-5
content: Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt 这个比官网上的小。

user: user-6
content: Visual C++ 2015 Community

user: user-7
content: WIN下试试code block :http://www.codeblocks.org/downloads Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt LINUX下试试clang PS：都可以去官网下的

user: user-8
content: 用VS，2010版本比较适合初学者吧 http://blog.csdn.net/cometnet/article/details/19551125

user: user-9
content: 引用 5 楼 sinservice 的回复:Emacs 可见   Emacs中文网 http://emacser.com/  其实，我还是推荐在GNU/Linux上使用Emacs，用linux做你的工作/开发/娱乐环境。  也能玩windows大型3D游戏（占硬盘10G以上的，吃显卡性能的）。  推荐 Ubuntu 14.04 Desktop 操作系统。  下载Emacs：     sudo apt-get install emacs24  或者从“Ubuntu软件中心”安装。  老机器吧？  现在的计算机，买的时候，大多是正版windows， 你只装linux，不浪费windows授权了吗？    再说了， 对一些开源项目，基本上是没有工程文件，  用ide,如何导入文件夹？   ide大多是居于工程文件的，当然也有基于文件夹的，如source insigh

user: user-4
content: Emacs 可见   Emacs中文网 http://emacser.com/  其实，我还是推荐在GNU/Linux上使用Emacs，用linux做你的工作/开发/娱乐环境。  也能玩windows大型3D游戏（占硬盘10G以上的，吃显卡性能的）。  推荐 Ubuntu 14.04 Desktop 操作系统。  下载Emacs：     sudo apt-get install emacs24  或者从“Ubuntu软件中心”安装。
user-0 提问: 关于scanf函数输入的问题

回复:
user: user-1
content: 你用了while循环，每次都只是一个int被负值，并不是楼主理解的那样。 第二个问题应该是编译器设置的问题。

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

user: user-3
content: 1.scanf的返回值是接收到的变量值的个数，第一次输入28，读到了c变量里（成功读入），所以返回1，判断while(1==1)为真， 然后继续进入while循环，scanf继续等待输入........... 2.int型是2/4个字节???是什么

user: user-4
content: 因为while==1总是为真，相当于这是一个无限循环， 他就不断读入intc

user: user-5
content: while 一个蹲坑，为什么一天可以去4个人上厕所？
user-0 提问: c语言问题

回复:
user: user-1
content: 我这里的sum是对的，不知道楼主是用什么数据测出来不对的？ gt70值是0是因为*count++;用法不对，++的优先级比*要高，由于是后++ 所以可以看成先执行*再执行++（但是++针对的是count指针，即指针向后移了一位，不是针对*count的++） 改成(*count)++就行了  #include <stdio.h>  /* userCode(<80字符): 自定义函数之原型声明 */ void scanfArr(float a[],int n,float *sum,int *count);  int main(void) { 	float arr1[6], arr2[8], arr3[12], sumA, sumB, sumC; 	int gt70A, gt70B, gt70C;  	scanfArr(arr1,6,&sumA,>70A);  /* userCode(<80字符): 调用函数读 6个数到arr1中，并计算和及>70的个数 */ 	scanfArr(arr2,8,&sumB,>70B);  /* userCode(<80字符): 调用函数读 8个数到arr2中，并计算和及>70的个数 */ 	scanfArr(arr3,12,&sumC,>70C);  /* userCode(<80字符): 调用函数读12个数到arr3中，并计算和及>70的个数 */  	printf("\narr1[ 5]=%4.1f, sum(arr1)=%5.1f, cnt(arr1)=%d",   arr1[5],  sumA, gt70A); 	printf("\narr2[ 7]=%4.1f, sum(arr2)=%5.1f, cnt(arr2)=%d",   arr2[7],  sumB, gt70B); 	printf("\narr3[11]=%4.1f, sum(arr3)=%5.1f, cnt(arr3)=%d\n", arr3[11], sumC, gt70C);  	return 0; }  /* User Code Begin：考生在此后完成自定义函数的设计，行数不限 */ void scanfArr(float a[],int n,float *sum,int *count) { 	int i; 	float *p; 	p=a; 	*sum=0; 	*count=0; 	printf("请输入%2d个数: ",n); 	for(i=0;i<n;i++) 	{ 		scanf("%f",p+i); 		*sum=*sum+*(p+i); 		if(*(p+i)>70) 		{ 			(*count)++; 		} 	} 	return; }
user-0 提问: 大家帮我看下这样理解有啥问题？

回复:
user: user-1
content: 像printf("%2s","goto");这样的打印着实没搞过，几乎都直接printf("%s","goto");了，学习了

user: user-2
content: 1.%5.3s"表示最少输出5位，最多输出3位,如果字符串长度小于3那么，这个3相当于没有作用，不够5位，则在左侧用空格补充 2.%2s表示最少输出2位长度的字符串，不够在字符串左侧用空格补充 3."%2.3s"表示最少输出2位，最多输出3位,所以输出了got

user: user-3
content: 请通读MSDN中的“Format Specification Fields: printf and wprintf Functions”。
user-0 提问: 读可执行文件二进制问题

回复:
user: user-1
content: 你在上面不是用fgets的方式计算文件大小吗，那是不对的  fp = fopen("1.exe", "rb"); fseek(fp, 0, SEEK_END); //fp指针移动的文件尾 size = ftell(fp); //计算文件大小 fseek(fp, 0, SEEK_SET);//fp指针移动的文件头 while (!feof(fp)) {//开始读取文件     fread(buf, 1, n, fp); }

user: user-0
content: 我没有fgets,我用的就是dread

user: user-2
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-1
content: 二进制不能用fgets读取，fgets是读一行的。  fp = fopen('1.exe", "rb"); while (!feof(fp)) {     fread(buf, 1, n, fp); }
user-0 提问: 如何用c或c++在unicode的txt文件中添加内容？

回复:
user: user-0
content: 3楼lgbxyz的方法很好，昨晚试了一下就解决问题。 本想也花时间尝试一下1楼的方法，但是实施细节不清楚，因此向他提问，但是等不到回答。 既然问题已解决，就不想在这问题上花太多时间纠缠了。1楼对此问题提供了线索，开拓了我的眼界，因此也给点分。 由于我英文太差，所以二楼的就不给分了。

user: user-0
content: 是不是要写成“FILE* out_file = fopen("test.txt", "w+,ccs=Unicode");”？ 有这样的教材吗？什么书名？有连接吗？  引用 1 楼 user-3 的回复:fopen函数可以指定编码格式呀  	wchar_t* data = L"测试"; 	FILE* out_file = fopen("test.txt", "w+,ccs=UTF-8"); 	fwrite(data, wcslen(data) * sizeof(wchar_t), 1, out_file); 	fclose(out_file);  写入和读取的编码格式一致，就没有问题 是不是要写成“FILE* out_file = fopen("test.txt", "w+,ccs=Unicode");”？ 有这样的教材吗？什么书名？有连接吗？

user: user-0
content: 引用 1 楼 user-3 的回复:fopen函数可以指定编码格式呀  	wchar_t* data = L"测试"; 	FILE* out_file = fopen("test.txt", "w+,ccs=UTF-8"); 	fwrite(data, wcslen(data) * sizeof(wchar_t), 1, out_file); 	fclose(out_file);  写入和读取的编码格式一致，就没有问题 是不是要写成“FILE* out_file = fopen("test.txt", "w+,ccs=UTF-8");”？ 有这样的教材吗？什么书名？有连接吗？

user: user-1
content: 你新写的文件应该用wb模式打开，而不应该是“w”模式。

user: user-2
content: fopen supports Unicode file streams. A flag specifying the desired encoding may be passed to fopen when opening a new file or overwriting an existing file, like this:  fopen("newfile.txt", "rw, ccs=<encoding>");  Allowed values of the encoding include UNICODE, UTF-8, and UTF16-LE. If the file is already in existence and is opened for reading or appending, the Byte Order Mark (BOM) is used to determine the correct encoding. It is not necessary to specify the encoding with a flag. In fact, the flag will be ignored if it conflicts with the type of the file as indicated by the BOM. The flag is only used when no BOM is present or if the file is a new file. The following table summarizes the modes used in for various flags given to fopen and Byte Order Marks used in the file.  Encodings Used Based on Flag and BOM Flag  No BOM (or new file)  BOM: UTF-8  BOM: UTF-16   UNICODE  ANSI  UTF-8  UTF-16LE   UTF-8  UTF-8  UTF-8  UTF-16LE   UTF-16LE  UTF-16LE  UTF-8  UTF-16LE

user: user-3
content: fopen函数可以指定编码格式呀  	wchar_t* data = L"测试"; 	FILE* out_file = fopen("test.txt", "w+,ccs=UTF-8"); 	fwrite(data, wcslen(data) * sizeof(wchar_t), 1, out_file); 	fclose(out_file);  写入和读取的编码格式一致，就没有问题
user-0 提问: 一个奇怪的C语言问题

回复:
user: user-1
content: 不知道楼主想验证什么？ scanf("%s",&op);应该是scanf("%c",&op); 栈是向下生长的，在Windows下,栈是向低地址扩展的数据结构，是一块连续的内存的区域。 楼主不妨打印printf("%p %p %p", &left, &right, &op); 就算输入一个字符串给op,应该也不会造成left和right的值被清零

user: user-2
content: scanf("%c",&op);  如果要用字符串，你应该申请一个char [2] 否则结尾的\0会越界

user: user-0
content: 引用 5 楼 qq423399099 的回复:用getchar和%c就行了 楼主用%p打印下三个变量的地址，用%s写入的话，因为有2个字节，可能破坏了别的变量的存储空间 我看了下地址，char一个字节，然后跟的是left，用%s的话是会覆盖掉left的内存空间。谢谢

user: user-3
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

user: user-1
content: 用getchar和%c就行了 楼主用%p打印下三个变量的地址，用%s写入的话，因为有2个字节，可能破坏了别的变量的存储空间

user: user-0
content: 引用 3 楼 qq423399099 的回复:[quote=引用 2 楼 Ysniper 的回复:] [quote=引用 1 楼 qq423399099 的回复:] 不知道楼主想验证什么？ scanf("%s",&op);应该是scanf("%c",&op); 栈是向下生长的，在Windows下,栈是向低地址扩展的数据结构，是一块连续的内存的区域。 楼主不妨打印printf("%p %p %p", &left, &right, &op); 就算输入一个字符串给op,应该也不会造成left和right的值被清零 我试过%c，程序不会等你输出就直接执行完毕了，所以采用%s。我调试时发现被清零的，你可以自己编译试试看，我也觉得很奇怪[/quote] %c来不及看到输出就结束了，是因为之前输入缓冲区有遗留的回车符，所以%c会直接读掉回车符 在第一个scanf后面加上getchar();或者fflush(stdin);来清除掉遗留的回车符  我这里就算用%s也不会被清零，用%s由于会越界写入，程序结束的时候会报错 [/quote] ubuntu，使用getchar()和%c没有问题，但是fflush不行，如果用getchar和%s还是会清零，但不会报错。这个真是奇怪

user: user-0
content: 引用 1 楼 qq423399099 的回复:不知道楼主想验证什么？ scanf("%s",&op);应该是scanf("%c",&op); 栈是向下生长的，在Windows下,栈是向低地址扩展的数据结构，是一块连续的内存的区域。 楼主不妨打印printf("%p %p %p", &left, &right, &op); 就算输入一个字符串给op,应该也不会造成left和right的值被清零 我试过%c，程序不会等你输出就直接执行完毕了，所以采用%s。我调试时发现被清零的，你可以自己编译试试看，我也觉得很奇怪

user: user-1
content: 引用 2 楼 Ysniper 的回复:[quote=引用 1 楼 qq423399099 的回复:] 不知道楼主想验证什么？ scanf("%s",&op);应该是scanf("%c",&op); 栈是向下生长的，在Windows下,栈是向低地址扩展的数据结构，是一块连续的内存的区域。 楼主不妨打印printf("%p %p %p", &left, &right, &op); 就算输入一个字符串给op,应该也不会造成left和right的值被清零 我试过%c，程序不会等你输出就直接执行完毕了，所以采用%s。我调试时发现被清零的，你可以自己编译试试看，我也觉得很奇怪[/quote] %c来不及看到输出就结束了，是因为之前输入缓冲区有遗留的回车符，所以%c会直接读掉回车符 在第一个scanf后面加上getchar();或者fflush(stdin);来清除掉遗留的回车符  我这里就算用%s也不会被清零，用%s由于会越界写入，程序结束的时候会报错
user-0 提问: C:求同构数

回复:
user: user-0
content: 引用 3 楼 qq423399099 的回复:主要是值每次循环前没有把count和k的值重新置为0和1 while循环用一个新的变量t来保存i的值，不要直接改变i的值，这样会导致最外层的for循环出错  #include<stdio.h> int main() { 	 	int count=0; 	int i,j,k=1;  	for(i=0; i<=10000; i++) 	{ 		count = 0; 		int t = i; 		while(t != 0) 		{ 			count++; 			t /= 10; 		} 		k=1; 		for(j=0; j<count; j++) 			k *= 10;  		if( i*i%k == i) 			printf("%d\n",i); 	} }  太感谢了，自己经常因为一些小问题停在那儿，思维还是没能跳出来。

user: user-1
content: 主要是值每次循环前没有把count和k的值重新置为0和1 while循环用一个新的变量t来保存i的值，不要直接改变i的值，这样会导致最外层的for循环出错  #include<stdio.h> int main() { 	 	int count=0; 	int i,j,k=1;  	for(i=0; i<=10000; i++) 	{ 		count = 0; 		int t = i; 		while(t != 0) 		{ 			count++; 			t /= 10; 		} 		k=1; 		for(j=0; j<count; j++) 			k *= 10;  		if( i*i%k == i) 			printf("%d\n",i); 	} }

user: user-0
content: 感谢1楼指导 ~~~~ #include<stdio.h> int countBits(int x) { 	int counter=0; 	while(x) 	{ 		counter++; 		x /= 10; 	} 	return counter; }  int Pow10(int n) { 	int p =1,i; 	for(i=0; i<n;i++) 	{ 		p *= 10; 	} 	return p; }   int main(void) { 	int i,j,p=1; 	int count=0; 	for(i=0; i<=10000; i++) 	{ 		if( i*i % Pow10(countBits(i)) == i) 		{ 			printf("%d\n",i); 		} 	} 	return 0; }

user: user-1
content: 建议楼主也贴下写成的函数 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 关于二维数组的乘法请教

回复:
user: user-0
content: 各位帮忙看一下哪里出问题了，数组要先改小了才能在编译器的运行，但是oj中没这种限制

user: user-1
content: 什么问题，栈溢出？ 光这3个数组所占用的栈空间就有301*301*3*8/1024/1024=2.08M左右 一般栈的默认大小是1M到几M

user: user-0
content: Description 天才少女Alice，哦，不，应该叫天才幼儿才对，她才1岁7个月，就开始学习线性代数了。她很快就掌握了矩阵加法、减法，马上又学乘法。  矩阵乘法是这样定义的： 一个m行n列的矩阵A 与 一个n行p列的矩阵B 的乘积，是一个m行p列的矩阵C。  C的第i行第j个元素是这样算出来的： C(i,j) = A(i,1)*B(1,j) + A(i,2)*B(2,j) + ... + A(i,k)*B(k,j) + ... + A(i,n)*B(n,j) 即，C的第i行第j个元素，是由A的第i行与B的第j列的元素相应做乘法，最后求和所得。  矩阵A与矩阵B可以做乘法的前提是：A的列数等于B的行数。  对于m、n、p比较小的情况，Alice很快就能计算完毕。算出来的结果如果没有错，那么就会嚷嚷着要奖励吃蛋糕。并且常常以做矩阵乘法为理由，向爸爸索要蛋糕吃。坏坏的爸爸于是出了一些矩阵让Alice做，但m、n、p的值可能很大（ 1 ≤ m、n、p ≤ 300 ），那么Alice就没有那么快计算完了。  Alice一看那么大的矩阵，立刻傻眼了，心想：算一个礼拜也算不完啊。。。。于是，狡猾的Alice又用水汪汪的大眼睛向你发出哀求的目光。请大哥哥/大姐姐快点编个程序帮Alice算出来吧。  Input 输入的第一行是三个数m、n、p （ 1 ≤ m、n、p ≤ 300 ），接下来的m行每行是n个用空格分隔的整数，组成一个m*n的矩阵A。  接下来是n行，每行是p个用空格分隔的整数，组成一个n*p的矩阵B。  Output 输出 A*B的积矩阵C  ：m行，每行p个整数（空格分隔）。C的元素不超unsigned long的表示范围。  Sample Input 3 3 2 7 5 0 0 2 1 1 3 0 1 1 0 1 19 23  Sample Output 7 12 19 25 1 4  这是题目

user: user-0
content: 解决了，中间一个循环错了

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 我把数组定义换到全局变量还是Wrong Answer #include<stdio.h> double a[301][301],b[301][301],c[301][301]; int main() {  	double sum; 	int m,n,p; 	int i,j,k; 	while(scanf("%d%d%d",&m,&n,&p)!=EOF) 	{ 		for(i = 1;i <= m;i++) 		for(j = 1;j <= n;j++) 		scanf("%lf",&a[i][j]); 		 		for(i = 1;i <= n;i++) 		for(j = 1;j <= p;j++) 		scanf("%lf",&b[i][j]); 		 		for(i = 1;i <= m;i++) 		{ 		   for(j = 1;j <= p;j++) 		  { 		  	sum = 0; 			for(k = 1;k <= m;k++) 			sum += a[i][k] * b[k][j]; 			c[i][j] = sum; 		  } 	    } 		for(i = 1;i <= m;i++) 		{ 		    for(j = 1;j <= p;j++) 		    { 		      if(j != p) 			  printf("%.0f ",c[i][j]); 			  else 		      printf("%.0f",c[i][j]); 		    } 		    printf("\n"); 	    } 	} 	return 0; }

user: user-2
content: 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。