Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 万能的大神们 帮忙改错下这题

回复:
user: user-1
content: 引用 2楼user-2 的回复:请问下，这个函数是干嘛用的，输出的m值有什么意义。统计子串的个数. 比如你输入： aaaasdsdf sd 输出: 2 表示：字符串"aaaasdsdf"中，包含两个子串"sd"

user: user-2
content: 请问下，这个函数是干嘛用的，输出的m值有什么意义。

user: user-1
content: if (r == '\0')应该是if (*r == '\0') 你这个仅仅只是统计子串的个数，而不是位置对吧？  #include  <conio.h> #include  <stdio.h> #include  <string.h> int fun(char *s, char *t) { 	int n;   char *p, *r; 	n = 0; 	while (*s) 	{ 		p = s;   r = t; 		while (*r) 		if (*r == *p) 		{ 			r++; 			p++; 		} 		else 			break; 		if (*r == '\0') 			n++; 		s++; 	} 	return  n; } void main() { 	char s[100], t[100];   int m; 	//clrscr(); 	printf("\nPlease enter string S:"); 	scanf("%s", s); 	printf("\nPlease enter substring t:"); 	scanf("%s", t); 	m = fun(s, t); 	printf("\nThe result is : m = %d\n", m); }  单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 哈夫曼树编码

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

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

user: user-2
content: 检查错误码....运行期错误就要这么干
user-0 提问: codeblocks 16.01版才运行就说编译器不行，电脑是win7的

回复:
user: user-0
content: 按要求下了带有mingw的一个，应该是带有编译器的

user: user-1
content: 编译器设置有问题。楼主看一看自己是不是下载错了。我猜测楼主应该是下载了不带编译器的版本。
user-0 提问: 关于C代码运行中断

回复:
user: user-1
content: 新手容易犯的错误之一，取地址符

user: user-2
content: scanf_s("%d",&select,2);

user: user-3
content: 注意sacnf_s的参数 scanf_s("%d",select,2);   --->   scanf_s("%d",&select,2);

user: user-0
content: 请问下各位大神，这个要怎么调试，我按照平常调试代码的方法发现根本就调试不了、程序会中断
user-0 提问: 求帮忙   谢谢

回复:
user: user-1
content: 认真看书上结构的部分，看完完全能自己写。

user: user-2
content: 我用VS写了一个！好像还可以！  #include<stdio.h>  #include<iostream> #include<string> #define MAX 500  using namespace std;  class student { private: 	string name; 	string sex; 	long  Class; 	string  number; 	int chinese; 	int math; 	int English; 	int high; //存储最好成绩  public: 	student() {} 	student(string name_s, string sex_s, long Class_s, string number_s, int chinese_s, int math_s, int English_s); 	void show(); 	void gethigh();//找到最高成绩  };  student::student(string name_s, string sex_s, long Class_s, string number_s, int chinese_s, int math_s, int English_s) { 	name = name_s; 	sex = sex_s; 	Class = Class_s; 	number = number_s; 	chinese = chinese_s; 	math = math_s; 	English = English_s; } void student::show() { 	cout << name << "  " << sex   << " " << Class << " " << number << "     " << chinese << "   " << math << "   " << English << "   " << high << endl; }  void show_total(student *p, int j) { 	int i; 	cout << "姓名" << " " << "性别" << " " << " 班级" << "   " << "学号" << "          " << "语文" << " " << "数学" << "  " << "英语" << " " << "最高成绩" << endl; 	for (i = 0; i<j; i++) 		p[i].show(); }  void student::gethigh() {  	if (chinese>math) 		high = chinese; 	else high = math; 	if (high<English) 		high = English; }  int main() { 	student p[MAX]; 	int j = 0; 	string flat; 	string name; 	string sex; 	long  Class; 	string  number; 	int chinese; 	int math; 	int English; 	int high; //存储最好成绩  	while (1) 	{ 		cout << "是否停止输入,是请输入Yes,否请输入No" << endl; 		cin >> flat; 		if (flat == "Yes") 			break; 		cout << "请输入姓名:"; 		cin >> name; 		cout << "请输入性别："; 		cin >> sex; 		cout << "请输入班级："; 		cin >> Class; 		cout << "请输入学号："; 		cin >> number; 		cout << "请输入语文成绩："; 		cin >> chinese; 		cout << "请输入数学成绩："; 		cin >> math; 		cout << "请输入英语成绩："; 		cin >> English; 		p[j] = student(name, sex, Class, number, chinese, math, English); 		p[j].gethigh(); 		j++; 	} 	show_total(p, j); 	system("pause"); 	return 0; }

user: user-2
content: 嗯，挺简单的！…………
user-0 提问: 动态链表输入并存入文件

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

user: user-0
content: 不知道问什么只能运行到输入那个地方，回车存储就会出错 请帮忙看一看
user-0 提问: 如何调用该接口地址，提取出数据到数据库，并且显示数据，请写出代码，在线等，急！

回复:
user: user-1
content: char url[1024]; char ph[3][128]={ "999-2394153274", "781-8548199520", "784-1788467127", }; for (int i=0;i<3;i++) {  sprintf(url,"http://...ticket=%s",ph[0]);  //TODO:调用curl库相应函数提取url对应链接返回的html网页 }

user: user-0
content: 那如何调用接口地址，提取数据。

user: user-1
content: 使用curl库。
user-0 提问: 关于使用指针的一个问题

回复:
user: user-0
content: 引用 1楼user-2 的回复:#include <stdio.h> void main() { 	int a[10] = { 9,4,5,6,1,10,2,3,7,8 }; 	int *p, i, t; 	p = a; 	for (i = 0; i < 10; i++) 	{ 		if (*p < a[i]) 			p = &a[i]; 	} 	t = a[0]; a[0] = *p; *p = t; 	for (i = 0; i<10; i++) 		printf("%d ", a[i]); }明白啦，谢谢啦！^_^

user: user-0
content: 引用 2楼小灸舞 的回复:1.if (*p > a[i])你这样变成找最大值了 2.t = &a[0]; a[0] = *p; p = t;你这三句也没法交换值 你让t指向a的第一个元素，然后将p指向的元素的值赋值给a[0],然后p指向t（也就是指向了a[0]）？？ 这三句造成的效果仅仅就是a[0]的值被修改了  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。谢谢啦，我明白了，多谢。*p>a[i]，是我测试的时候忘记改了。^_^还是很谢谢您，我会改进的

user: user-1
content: 1.if (*p > a[i])你这样变成找最大值了 2.t = &a[0]; a[0] = *p; p = t;你这三句也没法交换值 你让t指向a的第一个元素，然后将p指向的元素的值赋值给a[0],然后p指向t（也就是指向了a[0]）？？ 这三句造成的效果仅仅就是a[0]的值被修改了  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: #include <stdio.h> void main() { 	int a[10] = { 9,4,5,6,1,10,2,3,7,8 }; 	int *p, i, t; 	p = a; 	for (i = 0; i < 10; i++) 	{ 		if (*p < a[i]) 			p = &a[i]; 	} 	t = a[0]; a[0] = *p; *p = t; 	for (i = 0; i<10; i++) 		printf("%d ", a[i]); }
user-0 提问: 请问如果函数是int main(int argc,char *argv[])这样，哪些算参数，哪些算变元呢

回复:
user: user-0
content: 谢谢大家。。

user: user-1
content: http://bbs.csdn.net/topics/390469280

user: user-2
content: 命令行参数，不是 应用程序本身的输入 而是shell环境中，以及其他可以执行别的程序的环境中 输入的带有参数的 命令行 命令 中的 参数 widows 中，cmd下执行的程序，可以带有 命令行参数 一个程序，调用可执行程序，可以传递命令行参数 应用程序执行时，不再需要额外输入命令行参数。  在 windows 中，批处理文件 .bat，命令文件 .cmd 中，每一行都是命令 应用程序，可以在批处理文件中执行  批处理文件，每一行就是一个命令行 可以执行内部命令，外部命令（可执行文件.exe）,以及脚本语言指令

user: user-3
content: argc是命令行总的参数个数      argv[]是argc个参数，其中第0个参数是程序的全名，以后的参数      命令行后面跟的用户输入的参数，比如：    int   main(int   argc, char*   argv[]) { 	int   i; 	for (i = 0; i < argc; i++) 		cout << argv[i] << endl; 	cin >> i; 	return   0; }     执行时敲入      F:\MYDOCU~1\TEMPCODE\D1\DEBUG\D1.EXE   aaaa   bbb   ccc   ddd      输出如下：      F:\MYDOCU~1\TEMPCODE\D1\DEBUG\D1.EXE      aaaa      bbb      ccc      ddd

user: user-2
content: 参数，变元，C,C++语言函数，不是数学物理方程  C,C++ 有变量 这种 语法成分 有 函数参数（实参 和形参）这一类 函数定义，声明，调用 相关的概念  对于函数，形参相当于 ，函数内部定义的 变量。 只是数组的有点小小的不同。 函数定义，函数声明 的参数表中的内容，为形式参数。 函数调用的参数表中的内容，为实际参数。 函数的每个实参，是个表达式 函数的每个形参，可以看作变量  argc，argv[] 是main 函数的形式参数 是 C,C++标准库中的初始化代码，调用 main 函数传递过来的参数。  其中 argc 是 初始化代码获取的命令行参数的  字符串个数 argv 是每个命令行参数（空格分隔的）  通过处理命令行参数，应用程序在命令行 执行的时候，可以 传递一些命令参数 应用程序，根据这些参数，产生不同的运行结果。  这些参数，是命令行这种执行方式 传递的 这是 C 语言程序，对 执行环境（shell 程序）的响应  举例  假设程序编译后，生成 a.exe  命令行输入a.exe x y z 应用程序，就可以得道 argc 的值，为 4  argv[0] ="a.exe",argv[1] ="x",argv[2]="y",argv[3] ="z"; 假设，应用程序，简单的依序输出 argv 就会输出 a.exe x y z 一般来说，编译器都是这种带 参数的程序 可以 在命令行输出编译参数。根据不同参数产生不容的编译结果
user-0 提问: 这几个用C语言怎么实现啊

回复:
user: user-1
content: 第一题，最近学了一段时间C语言，这是我的HELLO WORD,望多指教。用的主函数，经调试成功，代码如下： #include "stdio.h" #define N 9 #define NUM N*(N+1)/2 void main() {   int t[N][N]={0},array[NUM],i,j,m=0;   for(i=0;i<N;i++)   {   t[i][0]=i+1;   for(j=1;j<=i;j++)   t[i][j]=t[i][j-1]+t[i-1][j-1];   } printf("二维参照数组:\n"); for(i=0;i<N;i++)  for(j=0;j<i+1;j++)  { array[m]=t[i][j]; m++; } for(i=0;i<N;i++)   {  for(j=0;j<N;j++)   printf("%8d",t[i][j]);  printf("\n"); } printf("%s\n","最终数组:"); for(m=0;m<NUM;m++)    if (!m) printf("%8d\n", array[m]);       else if (array[m]>=array[m+1]) printf("%8d\n",array[m]);        else printf("%8d",array[m]); }

user: user-2
content: 第一题： void get_funny_array(int* a, int ns) { 	int i = 0, j = 0; 	int idx = 0; 	 	for (i = 0; i < ns; i++) { 		a[idx] = i+1; 		printf("%4d ", a[idx]); 		idx++; 		for (j = 1; j <= i; j++) { 			a[idx] = a[idx-1] + a[i*(i-1)/2+j-1]; 			printf("%4d ", a[idx]); 			idx++; 		} 		printf("\n"); 	} }
user-0 提问: 没啥思路，求大神解读一下

回复:
user: user-1
content: Do not let me think！ 仅供参考：#include <stdio.h> #define MAXN 100 int m[MAXN+2][MAXN+2]; char d; int x,y,k,n,w; char str[10]; void main() {     while (1) {         printf("Input n(1..%d):",MAXN);         fflush(stdout);         rewind(stdin);         if (1==scanf("%d",&n)) {             if (1<=n && n<=MAXN) break;         }     }     y=0  ;for (x=0;x<=n+1;x++) m[y][x]=1;     y=n+1;for (x=0;x<=n+1;x++) m[y][x]=1;     x=0  ;for (y=0;y<=n+1;y++) m[y][x]=1;     x=n+1;for (y=0;y<=n+1;y++) m[y][x]=1;     for (y=1;y<=n;y++) {         for (x=1;x<=n;x++) {             m[y][x]=0;         }     }     x=1;     y=1;     k=0;     d='D';     while (1) {         k++;         if (k>n*n) break;         m[y][x]=k;         switch (d) {             case 'D':                 if (0==m[y+1][x])  y++;                 else              {x++;d='R';}             break;             case 'R':                 if (0==m[y][x+1])  x++;                 else              {y--;d='U';}             break;             case 'U':                 if (0==m[y-1][x])  y--;                 else              {x--;d='L';}             break;             case 'L':                 if (0==m[y][x-1])  x--;                 else              {y++;d='D';}             break;         }     }     w=sprintf(str,"%d",n*n);     for (y=1;y<=n;y++) {         for (x=1;x<=n;x++) {             printf(" %0*d",w,m[y][x]);         }         printf("\n");     } }

user: user-2
content: 定义一个二维数组  维度为矩形高和宽，定义一个方向变量。 for循环    确定是第几个走的格子。 IF  下一格为矩形之外或大于0    方向变换     下一格等于这格加1     输出二维数组

user: user-2
content: 数字是螺旋形排列

user: user-3
content: 写下代码好吗亲
user-0 提问: 【请教】能不能这样设置二维数组？

回复:
user: user-1
content: 然而初始化方式，和赋值方式，还是不一样的

user: user-1
content: 结构是可以的

user: user-0
content: 引用 14 楼 cyfcsd 的回复:这个问题没那么复杂，两个数和最小，肯定是他们就是数组中最小的两个数，用两次循环找一下就行了，时间复杂度为O(n)，你每两个数相加一下时间复杂度就变成O(n^2)了，参考代码如下 #include "stdio.h" #include "string.h" #include "stdlib.h"  #define N 5 int main() { 	int a[N]; 	int i = 0; 	int j = 0; 	int minIndex1 = 0; 	int minIndex2 = 1; 	printf("请输入五个数：(用空格或回车隔开)\n"); 	for(i=0; i<N; i++){ 		scanf("%d", &a[i]); 	} 	for(j=0; j<N; j++){ 		if(a[minIndex1] > a[j]){ 			minIndex1 = j; 		} 	} 	for(j=0; j<N; j++){ 		if(a[minIndex2]>a[j] && minIndex1!=j){ 			minIndex2 = j; 		} 	} 	printf("和最小的两个数为：%d和%d\n", a[minIndex1], a[minIndex2]); 	//system("pause"); 	return 0; }谢谢你的耐心解答！！！！真是万分感谢  谢谢你！

user: user-2
content: 这个问题没那么复杂，两个数和最小，肯定是他们就是数组中最小的两个数，用两次循环找一下就行了，时间复杂度为O(n)，你每两个数相加一下时间复杂度就变成O(n^2)了，参考代码如下 #include "stdio.h" #include "string.h" #include "stdlib.h"  #define N 5 int main() { 	int a[N]; 	int i = 0; 	int j = 0; 	int minIndex1 = 0; 	int minIndex2 = 1; 	printf("请输入五个数：(用空格或回车隔开)\n"); 	for(i=0; i<N; i++){ 		scanf("%d", &a[i]); 	} 	for(j=0; j<N; j++){ 		if(a[minIndex1] > a[j]){ 			minIndex1 = j; 		} 	} 	for(j=0; j<N; j++){ 		if(a[minIndex2]>a[j] && minIndex1!=j){ 			minIndex2 = j; 		} 	} 	printf("和最小的两个数为：%d和%d\n", a[minIndex1], a[minIndex2]); 	//system("pause"); 	return 0; }

user: user-0
content: 引用 10 楼 cyfcsd 的回复:引用 7 楼 xujin12368 的回复:[quote=引用 3 楼 cyfcsd 的回复:] 能不能行楼主输出看一下就知道了啊，不要离开编译器学习啊我就是因为编译不了 ， 才来请教的。。 好吧，那你应该说明白你的要求，然后我们才能给你想办法啊[/quote]我就是想输出这个  输入5个数，输出和最小的两个数（由小到大输出）   然后我的想法就是，把每两个数相加的和存储到数组sum[m]中，然后算出最小的sum ， sum[m]=sum[I]+sum[j]，然后求出最小sum后，找到与m对应的 i 和 j  ,输出 这两个数。

user: user-1
content: 数组没啥好招，还是逐个设置比较简单

user: user-1
content: 估计不成，你可以试试

user: user-2
content: 能不能行楼主输出看一下就知道了啊，不要离开编译器学习啊

user: user-2
content: 引用 7 楼 xujin12368 的回复:引用 3 楼 cyfcsd 的回复:能不能行楼主输出看一下就知道了啊，不要离开编译器学习啊我就是因为编译不了 ， 才来请教的。。 好吧，那你应该说明白你的要求，然后我们才能给你想办法啊

user: user-0
content: 引用 5 楼 lm_whales 的回复:数组没啥好招，还是逐个设置比较简单我用结构体行吗？ 我就是想输出这个 输入5个数，输出和最小的两个数（由小到大输出）  然后我的想法就是，把每两个数相加的和存储到数组sum[m]中，然后算出最小的sum ， sum[m]=sum[I]+sum[j]，然后求出最小sum后，找到与m对应的 i 和 j  ,输出 这两个数。

user: user-0
content: 引用 6 楼 qq423399099 的回复:自己试下就知道了。 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！谨听版主教诲

user: user-0
content: 引用 3 楼 cyfcsd 的回复:能不能行楼主输出看一下就知道了啊，不要离开编译器学习啊我就是因为编译不了 ， 才来请教的。。

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

user: user-4
content: 又看了一遍，有点明白了。楼主大概是想这样？ jihe[m][0] = i; jihe[m][1] = j;

user: user-4
content: 没看懂你的意图，不过这么写从语法上是不行的。 首先，这种用大括号的写法只能用于数组的定义和初始化，而且大括号里面必须都是常数。 其次，如果jihe是二维数组，比如 int jihe[8][9]，那么jihe[m][2]应该是个int类型，只能保存一个数。
user-0 提问: 求助！！用C语言实现一个简单的数据库

回复:
user: user-0
content: 数据库结构化语句分析引擎系统  C语言   程序设计 数据结构  算法(时间复杂度,空间复杂度)  数据库:SQL_Servler2008  ,MySQL,ORACLE, DB2                           PHP, JAVA  实训目的：1.C语言知识的熟练应用           2.理解数据结构,努力写出高质量的算法           3.预备数据库知识   文件名：  .c   (不能.cpp为扩展名   C++源程序才是.cpp)    1.创建表 2.查询表 3.插入数据 4.删除数据 5.修改数据   一。创建表 语法： create table  表名 ( 字段名1 字段1的数据类型,字段名2 字段名2数据类型.....  )  create table studinfos (sn int,name varchar(20),sex char,age int);  create table student ( sn varchar(3), name varchar(32),age int ,sex char);  create table  teacher ( sn varchar(3), name varchar(32),age int ,sex char);    sn  	name		sex	age 001	张三		M	19 002 	 李四		N	20 998  	王麻子		M   	12 009	王老伍		M	90 010     大明    type  struct {     char[4]  sn;    char[33] name;    int age;    char sex;  }StudentType   1.接入输入的SQL语句 create table student ( sn varchar(3), name varchar(32),age int ,sex char)       create table student(sn varchar(3), name varchar(32),age int ,sex char)       create table student ( sn varchar(3), name varchar(32),age int ,sex char )       create index snid ;  2.解析字符串:空格解析 左右括号的解析   关键字：确定是一个什么操作   通过关键字就能确定表名   确定所有字段   确定每个字段名称及数据类型.数据类型的大小  3.构造相应的结构体  4.创建表.(C语言来创建)         StudnetType s1; StudnetType s2;   type struct {   StudentType *data ;//数据的首地址   int count;//表中实际有多少记录   int  lenght; //表可以存放最大记录数 }TableType   TableType  studentinfo;  //初始化表 inittalbe( TableType * t) {   t->count=0;   t->lenght=1000;  这是老师给我们的一些参考 但是看不太懂。。 我们还没具体的学习数据库，大部分要用都还是C语言的一些知识  但是这些SQL语句怎么在VC 6.0++  里面实现完全不知道  大神求帮助啊！！！

user: user-1
content: 参考SQLite源代码？

user: user-1
content: 引用 1 楼 zhao4zhong1 的回复:参考SQLite源代码？ 赵4老师的话一句顶一万句。
user-0 提问: 请教声明指针的问题。

回复:
user: user-1
content: 指针只要保证在使用之前初期化过就行。

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

user: user-3
content: 这只是一种习惯问题，只有在你使用了指向不确定的指针才可能出错

user: user-4
content: 就是避免野指针了，你不把指针指向合法的内存，它乱指一齐，甚至指向系统内存或其他程序的内存，导致访问越界。

user: user-5
content: 赋初值是一种好的习惯，使程序更加安全，就像去除安全隐患一样，但不是说不赋初值就一定会有错。

user: user-6
content: 楼主对那句话还没有完全理解，这里说的初始化并不是狭义上的“在定义同时赋值”这个意思 而是说不要使用指向不明的指针，一个指针对应一个内存地址，如果你定义了一个变量，然后用指针指向它，那可以保证这个指针所指空间是可以供你使用的，因为定义的那个变量的内存是系统分配的，系统不会把不能用的内存分配给你 但是如果你直接给指针付一个值，或者说干脆没有赋值，那里面就存了一个随机值，这个值对应的内存空间不一定是可用的，应该说一定是不可用的，如果这个时候你往这个内存里写或者读，那就会出现读取内存异常错误，这是非常常见的一种C语言错误 这句话的意思是不要使用指向不明的指针，即野指针，而避免这种情况的一种方法是初始化指针变量 由于C语言变量定义只能放在函数起始位置，可能会出现指针还不知道指向哪儿的问题，这个时候最好将指针置为NULL，这样会避免以后误操作。 总之，为了防止指针误操作，要么将指针指向一个已定义的变量，要么将其置为NULL 最后你应该明白了，你定义的指针在下面马上赋了一个正确的值，中间并没有其他操作，所以代码是可以的，没有问题

user: user-7
content: 没有要求指针变量一定要初始化，但一定要先对指针变量有效赋值，再用指针变量间接访问

user: user-0
content: 有一本书教我应该这么写 long num1 = 0L; long *pnum1 = 0; pnum1 = &num1;
user-0 提问: 请教++*pum写法哪种比较好。

回复:
user: user-1
content: ++*pum 干净清爽，没有歧义，敲键最少，最简洁 添加括号和空格实属多余，并且容易出错（敲键盘，复制，修改代码容易出错）

user: user-1
content: 引用 8 楼 zhao4zhong1 的回复:v=pum[0];pum++;  这个要拆成 auto v =*pnum; //建立一个临时变量 ++v; //对它自增 *pnum = v;//结果赋值给 *pnum 这只是马马虎虎，符合 ++*pnum 这个表达式的意思 这种表达式，还是不用拆分的好。

user: user-2
content: v=pum[1];pum++;

user: user-3
content: 除非必要，我一般都写作 ++ 后置的方式：int *p = array; int n = *p++; (*p)++;其他就是必须用左 ++ 的结果来进行判断的时候：如：while (--i > 0)对指针对象进行左 ++，我也会写成第二种方式，也就是跟我这里风格一致。

user: user-4
content: ++(*pum) 明确地用括号表示先取指针的数据，再递增 尽量用括号来表示优先级

user: user-2
content: v=pum[0];pum++;

user: user-5
content: 效率一样的 个人习惯写成：++*pum，因为这种写法并不会产生歧义

user: user-1
content: 这个C几乎没法分成两步 C++经过引用转换除外 不是所有表达式，都是可拆分，并且保持意义良好的。 要么表现很笨拙，要么根本就不可能

user: user-6
content: 为了让大脑简单，我很多时候将这种写法写成两条语句，无歧义，适应所有编译器，对性能无任何影响。

user: user-7
content: 第二种最好，简单直接，没有歧义，任何人都可以很快看懂，不需要思考，这是我喜欢的代码

user: user-8
content: 可能分成两步最好。 可读性好。 PS：有些公司按有效代码行数算工资的，你懂的

user: user-1
content: 敲键盘最少的最好
user-0 提问: sqlite3

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:查询不到，就不会回调。sqlite3_exe的返回值只是表示是否成功执行，不表示查询的结果 嗯,测试了一下确实不会回调,但官方帮助文档又没说明,还以为程序搞错了呢, 这样的话,如何知道数据表是否有这条记录,我的想法是查询出结果会调用回调函数,在回调函数里修改全局变量,虽然麻烦点应该也可以

user: user-1
content: 查询不到，就不会回调。sqlite3_exe的返回值只是表示是否成功执行，不表示查询的结果
user-0 提问: 如何用简便的方式在C语言程序里实现每个函数入口加debug log?

回复:
user: user-1
content: WinAPIOverride http://jacquelin.potier.free.fr/winapioverride32/

user: user-0
content: 我的问题可能没有描述清楚，希望在已有的原文件里在每个函数入口处加 debug log, 如果写一个define， 手动插入每一个函数开头，这样比较耗时耗力

user: user-2
content: 歪个楼，楼主可以这样： #define begin {debug(); #define end } 然后： int main(void) begin //... return 0; end

user: user-3
content: #include <stdlib.h> #include <stdio.h>  #define WARN(format, args...) printf("%s,%s,%d:"format, __FILE__,  __func__, __LINE__, ##args)  int main(int argc, char* argv[]) {     WARN("this is %s", "WARN");     return 0; } 可以自定义一个宏，用于输出信息

user: user-4
content: 做个脚本试试

user: user-1
user-0 提问: 通讯录管理系统的 load 函数找错

回复:
user: user-1
content: 好好看下我的代码，这个问题已经解决

user: user-2
content: v=pum[0];pum++;

user: user-3
content: 请教下楼主，在新建一条记录后，显示会有乱码，这个是为为啥，与输入的格式有关吗？

user: user-0
content: 引用 4 楼 adusuccessfully 的回复:请教下楼主，在新建一条记录后，显示会有乱码，这个是为为啥，与输入的格式有关吗？ 不会啊！我没有出现这种情况

user: user-1
content: 你这代码写的实在。。。不能调试？说明你断点打的不对 我试了下查询,load()出来居然有乱码，我改了下load加载文件部分，你看看，希望对你有帮助    printf("    -------------------------------------------\n");     while(fgets((char*)t1, sizeof(struct ADS), fp))        {           sscanf((char*)t1,"%s %s %s %s",t1->name,t1->street,t1->city,t1->tele);          printf("\t%s\t%s\t%s\t%s\t\t\n",t1->name,t1->street,t1->city,t1->tele);           total++;          t1->next = t1; 		 memset(t1, 0, sizeof(struct ADS));         }      free(t1);

user: user-4
content: 啥错误信息？可能是函数没写对或者参数不对吧，楼上怎么跟赵老师挺像的

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

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:free(current);         current = current->next;  // 前面一行已经释放了current，那么这里就不能再使用current->next了 应该是这样：         tmp = current->next;         free(current);         current = tmp; 非常感谢，完美的解决了问题

user: user-1
content: free(current);         current = current->next;  // 前面一行已经释放了current，那么这里就不能再使用current->next了 应该是这样：         tmp = current->next;         free(current);         current = tmp;
user-0 提问: 【求助】为什么无论我怎么输入，最后的结果都是包含5呢？

回复:
user: user-0
content: 引用 5 楼 user-1 的回复:[quote=引用 4 楼 xujin12368 的回复:] 我还不怎么会调试，能简单说明一下吗。。我是小白。。。谢谢 调试是必须要学会的。不难。 调试的思路都是一样的，具体过程取决于你用的环境。比如如果你用的是visual studio 2012，那就搜“visual studio 2012 调试”，然后照着学就行了。[/quote]谢谢！

user: user-1
content: 引用 4 楼 xujin12368 的回复:我还不怎么会调试，能简单说明一下吗。。我是小白。。。谢谢 调试是必须要学会的。不难。 调试的思路都是一样的，具体过程取决于你用的环境。比如如果你用的是visual studio 2012，那就搜“visual studio 2012 调试”，然后照着学就行了。

user: user-0
content: 引用 2 楼 user-1 的回复:这两行在编译器看来是这样的： if(digit==5)   ; i=1; 这种问题，单步调试一下会更容易看出来我还不怎么会调试，能简单说明一下吗。。我是小白。。。谢谢

user: user-0
content: 引用 1 楼 user-1 的回复:if(digit==5); // 这行结尾多了个分号             i=1;  // 所以这行永远会执行谢谢你哈。我今天写太多代码了，眼都瞎了。。。。

user: user-1
content: 这两行在编译器看来是这样的： if(digit==5)   ; i=1; 这种问题，单步调试一下会更容易看出来

user: user-1
content: if(digit==5); // 这行结尾多了个分号             i=1;  // 所以这行永远会执行
user-0 提问: 求大神：邻接表实现普利姆算法的c语言实现

回复:
user: user-1
content: 仅供参考：  #include<stdio.h> #include<stdlib.h> #include<string.h> typedef int VRType; typedef char InfoType; #define MAX_NAME 3 /* 顶点字符串的最大长度+1 */ #define MAX_INFO 20 /* 相关信息字符串的最大长度+1 */ #define INT_MAX  100 #define INFINITY INT_MAX      //最大值 #define MAX_VERTEX_NUM 20    // 最大顶点个数  typedef char VertexType[MAX_NAME]; typedef enum {DG,DN,UDG,UDN} GraphKind; typedef struct  	/* 记录从顶点集U到V-U的代价最小的边的辅助数组定义 */ { 	VertexType adjvex; 	VRType lowcost; }minside[MAX_VERTEX_NUM];  typedef struct { 	VRType adj;             // 顶点关系类型。对无权图，用1(是)或0(否)表示相邻否；  	// 对带权图，c则为权值类型  	InfoType *info;         // 该弧相关信息的指针(可无) }ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];  typedef struct { 	VertexType vexs[MAX_VERTEX_NUM];   //顶点向量  	AdjMatrix arcs;                    // 邻接矩阵  	int vexnum,arcnum;                 // 图的当前顶点数和弧数  	GraphKind kind;                    //图的种类标志 }MGraph;  int LocateVex(MGraph G,VertexType u) {  	int i; 	for(i=0;i<G.vexnum;++i) 		if(strcmp(u,G.vexs[i])==0) 			return i; 	return -1; }  int CreateUDN(MGraph *G) 	/* 采用数组(邻接矩阵)表示法,构造无向网G。*/ { 	int i,j,k,w,IncInfo; 	char s[MAX_INFO],*info; 	VertexType va,vb; 	printf("请输入无向网G的顶点数,边数,边是否含其它信息(是:1,否:0): "); 	scanf("%d,%d,%d",&(*G).vexnum,&(*G).arcnum,&IncInfo); 	printf("请输入%d个顶点的值(<%d个字符):\n",(*G).vexnum,MAX_NAME); 	for(i=0;i<(*G).vexnum;++i)  // 构造顶点向量  		scanf("%s",(*G).vexs[i]); 	for(i=0;i<(*G).vexnum;++i) // 初始化邻接矩阵  		for(j=0;j<(*G).vexnum;++j) 		{ 			(*G).arcs[i][j].adj=INFINITY; /* 网 */ 			(*G).arcs[i][j].info=NULL; 		} 		printf("请输入%d条边的顶点1 顶点2 权值(以空格作为间隔): \n",(*G).arcnum); 		for(k=0;k<(*G).arcnum;++k) 		{ 			scanf("%s%s%d%*c",va,vb,&w); /* %*c吃掉回车符 */ 			i=LocateVex(*G,va); 			j=LocateVex(*G,vb); 			(*G).arcs[i][j].adj=(*G).arcs[j][i].adj=w; /* 无向 */ 			if(IncInfo) 			{ 				printf("请输入该边的相关信息(<%d个字符): ",MAX_INFO); 				gets(s); 				w=strlen(s); 				if(w) 				{ 					info=(char*)malloc((w+1)*sizeof(char)); 					strcpy(info,s); 					(*G).arcs[i][j].info=(*G).arcs[j][i].info=info; /* 无向 */ 				} 			} 		} 		(*G).kind=UDN; 		return 1; }   int minimum(minside SZ,MGraph G) { /* 求closedge.lowcost的最小正值 */ 	int i=0,j,k,min; 	while(!SZ[i].lowcost) 		i++; 	min=SZ[i].lowcost; /* 第一个不为0的值 */ 	k=i; 	for(j=i+1;j<G.vexnum;j++) 		if(SZ[j].lowcost>0) 			if(min>SZ[j].lowcost) 			{ 				min=SZ[j].lowcost; 				k=j; 			} 			return k; }  void MiniSpanTree_PRIM(MGraph G,VertexType u) { /* 用普里姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边  */ 	int i,j,k; 	minside closedge; 	k=LocateVex(G,u); 	for(j=0;j<G.vexnum;++j) /* 辅助数组初始化 */ 	{ 		if(j!=k) 		{ 			strcpy(closedge[j].adjvex,u); 			closedge[j].lowcost=G.arcs[k][j].adj; 		} 	} 	closedge[k].lowcost=0; /* 初始,U={u} */ 	printf("最小代价生成树的各条边为:\n"); 	for(i=1;i<G.vexnum;++i) 	{ /* 选择其余G.vexnum-1个顶点 */ 		k=minimum(closedge,G); /* 求出T的下一个结点：第K顶点 */ 		printf("(%s-%s)\n",closedge[k].adjvex,G.vexs[k]); /* 输出生成树的边 */ 		closedge[k].lowcost=0; /* 第K顶点并入U集 */ 		for(j=0;j<G.vexnum;++j) 			if(G.arcs[k][j].adj<closedge[j].lowcost) 			{ /* 新顶点并入U集后重新选择最小边 */ 				strcpy(closedge[j].adjvex,G.vexs[k]); 				closedge[j].lowcost=G.arcs[k][j].adj; 			} 	} }  void main() { 	MGraph G; 	CreateUDN(&G); 	MiniSpanTree_PRIM(G,G.vexs[0]); }
user-0 提问: 大家好，我想用C语言写一段程序，但是没有头绪，求大神来教教我！

回复:
user: user-1
content: python吧.

user: user-2
content: 使用curl库下载网页内容 使用regex正则表达式查找关键字 正则表达式速查 正则表达式举例 正则表达式学习 (4页A4纸)http://download.csdn.net/detail/zhao4zhong1/1808549 正则表达式参考下面：//凡是？。！后面跟1～1000后面跟半角.的，在？。！后面加回车换行。 //in.txt: //1.测试。2.测试2？3.测试3！4.测试 //四。5.测试。6.测试6？7.测试3！8.测试 //运行该程序将输出重定向到比如out.txt即可将输出保存到文件out.txt中 #include <iostream> #include <fstream> #include <string> #include <regex> using namespace std; int main() {     wifstream wifs("in.txt");     wifs.imbue(locale("chs"));     wstring wstr(L""),wln;     while (wifs) {         getline(wifs,wln);         wstr+=wln;     }     wifs.close();     wcout.imbue(locale("chs"));     wcout << wstr << endl;      wstring rs = L"([？。！])(\\d{1,3}\\.)";     wregex expression(rs);     wstr = regex_replace(wstr, expression, wstring(L"$1\r\n$2"));     wcout << wstr << endl;      return 0; } //1.测试。2.测试2？3.测试3！4.测试四。5.测试。6.测试6？7.测试3！8.测试 //1.测试。 //2.测试2？ //3.测试3！ //4.测试四。 //5.测试。 //6.测试6？ //7.测试3！ //8.测试 //

user: user-0
content: 引用 3 楼 talkdream 的回复:关注  thank关注

user: user-3
content: 关注

user: user-0
content: 引用 1 楼 bjym1987 的回复:爬虫，正则，curl  听不懂额。。怎么做呢？

user: user-4
content: 爬虫，正则，curl

user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:在百度搜“C源代码 curl regex”  好的

user: user-2
content: 在百度搜“C源代码 curl regex”

user: user-5
content: 看起来有点复杂哦，

user: user-0
content: 引用 1 楼 bjym1987 的回复:爬虫，正则，curl  只会C是不是写不出来。。？

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:使用curl库下载网页内容 使用regex正则表达式查找关键字 正则表达式速查 正则表达式举例 正则表达式学习 (4页A4纸)http://download.csdn.net/detail/zhao4zhong1/1808549 正则表达式参考下面：//凡是？。！后面跟1～1000后面跟半角.的，在？。！后面加回车换行。 //in.txt: //1.测试。2.测试2？3.测试3！4.测试 //四。5.测试。6.测试6？7.测试3！8.测试 //运行该程序将输出重定向到比如out.txt即可将输出保存到文件out.txt中 #include <iostream> #include <fstream> #include <string> #include <regex> using namespace std; int main() {     wifstream wifs("in.txt");     wifs.imbue(locale("chs"));     wstring wstr(L""),wln;     while (wifs) {         getline(wifs,wln);         wstr+=wln;     }     wifs.close();     wcout.imbue(locale("chs"));     wcout << wstr << endl;      wstring rs = L"([？。！])(\\d{1,3}\\.)";     wregex expression(rs);     wstr = regex_replace(wstr, expression, wstring(L"$1\r\n$2"));     wcout << wstr << endl;      return 0; } //1.测试。2.测试2？3.测试3！4.测试四。5.测试。6.测试6？7.测试3！8.测试 //1.测试。 //2.测试2？ //3.测试3！ //4.测试四。 //5.测试。 //6.测试6？ //7.测试3！ //8.测试 //    只会C是不是写不出来。。？

user: user-6
content: http://blog.csdn.net/charlessimonyi/article/details/45849257
user-0 提问: 谁帮我看下这多线程错在哪里！

回复:
user: user-1
content: 仔细看了一下，char array[100] = { 0 };这句替换成int array[100];，不然你的指针就乱了

user: user-0
content: 引用 4 楼 qq423399099 的回复: #include<stdio.h> #include<stdlib.h> #include<time.h> #include<process.h> struct mystruct { 	int *p;//传递线程的头 	int intel;//长度 	int sum;//需要查找的值 	int id;//编号 };  void lens(void *pd) { 	struct mystruct *ps = (struct mystruct *)pd;  	for (int *pi = ps->p; pi < ps->p + ps->intel; pi++) 	{ 		if (*pi == ps->sum) 		{ 			printf("线程%d已经找到值%d，地址为%p\n", ps->id, *pi, pi); 			return; 		} 	} 	printf("线程%d查找结束，未找到！\n", ps->id); }  void main() { 	int sum = 0; 	int array[100] = { 0 }; 	time_t ts; 	unsigned int times = time(&ts); 	srand(times); 	for (int i = 0; i < 100; i++) 	{ 		array[i] = rand() % 100; 	} 	for (int i = 0; i < 100; i++) 	{ 		printf("%3d", array[i]); 		if ((i + 1) % 10 == 0) 		{ 			printf("\n"); 		} 	}   	scanf("%d", &sum); 	struct mystruct xc[10]; 	for (int i = 0; i < 10; i++) 	{  		xc[i].p = array + 10 * i; 		xc[i].intel = 10; 		xc[i].id = i; 		xc[i].sum = sum; 		_beginthread(lens, 0, &xc[i]); 	} 	system("pause"); }  非常感谢！

user: user-0
content: 引用 3 楼 cutmelon 的回复:仔细看了一下，char array[100] = { 0 };这句替换成int array[100];，不然你的指针就乱了  感谢  疏忽了！

user: user-2
content: #include<stdio.h> #include<stdlib.h> #include<time.h> #include<process.h> struct mystruct { 	int *p;//传递线程的头 	int intel;//长度 	int sum;//需要查找的值 	int id;//编号 };  void lens(void *pd) { 	struct mystruct *ps = (struct mystruct *)pd;  	for (int *pi = ps->p; pi < ps->p + ps->intel; pi++) 	{ 		if (*pi == ps->sum) 		{ 			printf("线程%d已经找到值%d，地址为%p\n", ps->id, *pi, pi); 			return; 		} 	} 	printf("线程%d查找结束，未找到！\n", ps->id); }  void main() { 	int sum = 0; 	int array[100] = { 0 }; 	time_t ts; 	unsigned int times = time(&ts); 	srand(times); 	for (int i = 0; i < 100; i++) 	{ 		array[i] = rand() % 100; 	} 	for (int i = 0; i < 100; i++) 	{ 		printf("%3d", array[i]); 		if ((i + 1) % 10 == 0) 		{ 			printf("\n"); 		} 	}   	scanf("%d", &sum); 	struct mystruct xc[10]; 	for (int i = 0; i < 10; i++) 	{  		xc[i].p = array + 10 * i; 		xc[i].intel = 10; 		xc[i].id = i; 		xc[i].sum = sum; 		_beginthread(lens, 0, &xc[i]); 	} 	system("pause"); }

user: user-1
content: 看你的代码，意思是随机产生100个数，然后启动10个线程，每个线程负责10个数字，在这10个数字中找到输入的一个数，是吧？这里头有随机的，只有一个线程能找到不是很正常吗？你要输入大于100的数，一个都找不到呢

user: user-0
content: 没人帮我看看啊？
user-0 提问: 对递归不是很懂，求看下一段小代码（好人一生平安 求助大神）

回复:
user: user-1
content: 这个就是一个放的规律问题，也就是所谓的“右上方”，其实放置规则是这样的（来着百度） (1) 将1放在第一行中间一列; 　　 (2) 从2开始直到n×n止各数依次按下列规则存放： 　　 按 45°方向行走，如向右上 　　 每一个数存放的行比前一个数的行数减1，列数加1 　　 (3) 如果行列范围超出矩阵范围，则回绕。 　　 例如1在第1行，则2应放在最下一行，列数同样加1; 　　 (4) 如果按上面规则确定的位置上已有数，或上一个数是第1行第n列时，则把下一个数放在上一个数的下面。 弄懂了规则就是转化成代码的问题了，先吃饭去了，下午在告诉你吧，，，，

user: user-0
content: 引用 1 楼 qq423399099 的回复:“给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出  我是新手  您那个操作还能更简单的点么？》？ 我用的是DEC 编译器

user: user-0
content: 引用 3 楼 yd2011222 的回复:[quote=引用 2 楼 cyfcsd 的回复:] 你得把问题说一下啊，没办法从你的代码推导你的业务逻辑啊  您好   这个问题就是求一个  一个 n 阶方阵的元素是1,2,...,n^2,它的每行，每列和2条对角线上元素的和相等，这样 的方阵叫魔方。n为奇数时我们有1种构造方法，叫做“右上方” ，例如下面给出n=3，5，7时 的魔方. 3 8 1 6 3 5 7 4 9 2 5 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 7 30 39 48 1 10 19 28 38 47 7 9 18 27 29 46 6 8 17 26 35 37 5 14 16 25 34 36 45 13 15 24 33 42 44 4 21 23 32 41 43 3 12 22 31 40 49 2 11 20 第1行中间的数总是1，最后1行中间的数是n^2,他的右边是2，从这三个魔方，你可看出“右 上方”是何意。      Input 包含多组数据，首先输入T,表示有T组数据.每组数据1行给出n(3<=n<=19)是奇数。     Output 对于每组数据，输出n阶魔方，每个数占4格，右对齐     Sample Input 2 3 5    Sample Output    8   1   6    3   5   7    4   9   2   17  24   1   8  15   23   5   7  14  16    4   6  13  20  22   10  12  19  21   3   11  18  25   2   9   [/quote]  我想请问下       这个程序到底怎么运行的

user: user-0
content: 引用 2 楼 cyfcsd 的回复:你得把问题说一下啊，没办法从你的代码推导你的业务逻辑啊  您好   这个问题就是求一个  一个 n 阶方阵的元素是1,2,...,n^2,它的每行，每列和2条对角线上元素的和相等，这样 的方阵叫魔方。n为奇数时我们有1种构造方法，叫做“右上方” ，例如下面给出n=3，5，7时 的魔方. 3 8 1 6 3 5 7 4 9 2 5 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 7 30 39 48 1 10 19 28 38 47 7 9 18 27 29 46 6 8 17 26 35 37 5 14 16 25 34 36 45 13 15 24 33 42 44 4 21 23 32 41 43 3 12 22 31 40 49 2 11 20 第1行中间的数总是1，最后1行中间的数是n^2,他的右边是2，从这三个魔方，你可看出“右 上方”是何意。      Input 包含多组数据，首先输入T,表示有T组数据.每组数据1行给出n(3<=n<=19)是奇数。     Output 对于每组数据，输出n阶魔方，每个数占4格，右对齐     Sample Input 2 3 5    Sample Output    8   1   6    3   5   7    4   9   2   17  24   1   8  15   23   5   7  14  16    4   6  13  20  22   10  12  19  21   3   11  18  25   2   9

user: user-1
content: 继续 递归过程是一个“环环相套”过程，难点在于找到合适的分界点。我的经验是先用自己的话描述一下，我们写的递归函数到底是干啥的 这里的函数很简单，就是将第step个数放到第i行第j列的位置上 如果这个地方没有放数字，体现在程序中为等于0，那么就把step放到这个位置上，然后这一步就完成了，调用自身放step+1到i-1行，j+1列，这里为了防止出现负数，各加一个n 如果这个地方已经有了数字，那么step不能在这儿放了，我们就就把step放到前一个的下一个，也就是i+2，j-1的地方 最后是递归出口，当step达到最大n*n+1时，证明已经放完了，退出程序即可，于是便有了下面的代码  void gen_cube(int i, int j, int step){ 	if (step == n * n + 1){//已经放满了，结束程序 		return ; 	} 	if (matrix[i][j] == 0){ //如果这个地方是0，即没有数字，直接放上就可以了 		matrix[i][j] = step;  		gen_cube((n + i - 1) % n, (n + j + 1) % n, step + 1);//放下一个 	} 	else{	//否则，则将step放到前一个的下面 		gen_cube((n + i + 2) % n, (n + j - 1) % n, step); 	} }  你的那份代码大概也是这个意思，但代码不太清晰，你主要理解一下吧

user: user-1
content: 你得把问题说一下啊，没办法从你的代码推导你的业务逻辑啊

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

回复:
user: user-1
content: 又建一楼

user: user-2
content: 基于libcurl实现的HTTP客户端 https://hewei.blog.csdn.net/article/details/80828974

user: user-3
content: libcurl

user: user-4
content: MFC的内裤

user: user-5
content: http://blog.csdn.net/haifengzhilian/article/details/43669909  一大把

user: user-6
content: pico算是个现成的库，C++的。

user: user-7
content: http://git.oschina.net/1050676515/http-test/tree/master/http-test?dir=1&filepath=http-test&oid=be70dc3cf2d6f06bee9a4a3834da75ff0aeaa4c7&sha=6861130379832e97c2a69e60ac47b042ff31791a 以前写过一点Demo

user: user-0
content: 好像可以使用WinInet来开发，不过这方面的资料太少了，有没有什么书籍或者详细点的资料啊？

user: user-8
content: curl 凑字数
user-0 提问: 求救 把一个目录下的所有.bmp和.jpg文件找到， 包含路径的文件名添加到一个文件列表(链表)中

回复:
user: user-1
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命令不会。 如果嫌system黑窗口一闪，将system("...")替换为WinExec("cmd /c ...",SW_HIDE);

user: user-2
content: FILE* pf_path_file; // 搜索lp_path目录包括子目录所有文件名，保存到输出out_file_name int find_path_save_file(const char* lp_path , const char* out_file_name) {     pf_path_file = fopen(out_file_name, "w");     int cnt = find_path(lp_path);     fclose(pf_path_file);     return cnt; }  // 遍历搜索目录 int find_path(const char* lp_path) {     static int cnt = 0;     HANDLE hFile;  // windows对文件的操作首先要得到一个文件句柄     FILETIME ft;  SYSTEMTIME st; // 文件时间 和 系统时间     WIN32_FIND_DATAA wfd;  // WIN32_FIND_DATAA 是windows定义的查找文件的结构     char sz_path[MAX_PATH] = {0};     char buf[MAX_PATH * 2 ] = {0};     strcpy(sz_path, lp_path);     strcat(sz_path, "\\*.*");     hFile = FindFirstFile(sz_path, &wfd);  // FindFirstFile函数查找一个文件，sz_path是要查找的文件名，可以是全路径或相对路径，也可以写通配符，如“c:/*.*”      if (hFile != INVALID_HANDLE_VALUE) {         while (FindNextFile(hFile, &wfd)) {  // 利用第一次找到的文件句柄，继续寻找下个文件，如果找到下个文件，则函数填充wfd结构，并返回true             if (wfd.cFileName[0] == '.') continue; // . 当前目录 .. 上级目录符号  跳过去              if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // 判断，得出找到的文件名是否是一个文件夹，如果是，则递归调用查找函数，由此实现深度全文件夹搜索                 strcpy(sz_path, lp_path);                 strcat(sz_path, "\\");                 strcat(sz_path, wfd.cFileName);                 find_path(sz_path);   // 调用递归查找              } else {                 ft = wfd.ftLastWriteTime;                 FileTimeToSystemTime(&ft, &st);                  sprintf(buf , "%d-%02d-%02d  %02d:%02d  %10u | ", st.wYear, st.wMonth, st.wDay, st.wHour + 8, st.wMinute , wfd.nFileSizeLow); //                 sprintf(buf + 32, "%s | %s", wfd.cFileName , lp_path);                  fprintf(pf_path_file , "%s\n" , buf);    ++cnt;   // 保存记录out_file_name ， 返回保存的记录数             }         }     }     return cnt; }

user: user-3
content: 用 _findfirst 和 _findnext 查找文件
user-0 提问: 问：如何判断当前是否已设定种子数

回复:
user: user-1
content: 你重新再初始化一次并不会影响什么

user: user-0
content: 引用 13 楼 zhao4zhong1 的回复:[quote=引用 11 楼 ccssddnn218 的回复:] [quote=引用 7 楼 zhao4zhong1 的回复:] 啥叫“合理的”随机数？ 谢谢“赵4老师”关注。我认为的“合理”随机数，就是程序启动到结束只设置一次种子数，以后获取随机数时都是根据这个初始种子数来的，中间没有修改过种子的值。再次启动时随机数产生的顺序不和上次相同。[/quote] 试试Inline Hook msvcrt.dll 中的srand函数，在其中判断如果当前进程调用srand当且仅当一次且参数不是0 不是VC6 Release版exe的话，msvcr*.dll[/quote] 您隐含的意思是这样吗？放弃在标准C的srand上继续纠结了，有其他库可以完成想要的结果。

user: user-0
content: 引用 14 楼 zhao4zhong1 的回复:WinAPIOverridehttp://jacquelin.potier.free.fr/winapioverride32/ 谢谢！很不错的工具，要好好学习一下。

user: user-2
content: 我这句话的意思很直白，没有隐含意思。

user: user-2
content: 仅供参考：#include <conio.h> void main() {     int r,k;     cprintf("Press any key to get a real random number(0..99) ...");     r=0;     while (1) {         r=(r+1)%100;         if (kbhit()) {             k=getch();             if (0==k || 0xe0==k) getch();             break;         }     }     cprintf("\r\n%d\r\n",r); }

user: user-2
content: 啥叫“合理的”随机数？

user: user-2
content: WinAPIOverridehttp://jacquelin.potier.free.fr/winapioverride32/

user: user-2
content: 引用 11 楼 ccssddnn218 的回复:[quote=引用 7 楼 zhao4zhong1 的回复:] 啥叫“合理的”随机数？ 谢谢“赵4老师”关注。我认为的“合理”随机数，就是程序启动到结束只设置一次种子数，以后获取随机数时都是根据这个初始种子数来的，中间没有修改过种子的值。再次启动时随机数产生的顺序不和上次相同。[/quote] 试试Inline Hook msvcrt.dll 中的srand函数，在其中判断如果当前进程调用srand当且仅当一次且参数不是0 不是VC6 Release版exe的话，msvcr*.dll

user: user-3
content: static bool check = true; if(check) {     rand(); //你的取随机数代码     check = false; } 再你的函数内部，加入这样一段代码，即可保证rand只执行一次

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:啥叫“合理的”随机数？ 谢谢“赵4老师”关注。我认为的“合理”随机数，就是程序启动到结束只设置一次种子数，以后获取随机数时都是根据这个初始种子数来的，中间没有修改过种子的值。再次启动时随机数产生的顺序不和上次相同。

user: user-4
content: 可以在 main 的第一句设置一次。 以后也不用判断。

user: user-5
content: 如果仅仅是随机数的话，可以自定义随机数发生器 C++可以定义随机数发生器类 C就定义一个结构和 跟结构关联的算法就可以了 这样随机数就成为为 对象而不是 库函数了 随机数发生器对象和其他随机数发生器对象互不干扰 C++11库中就有这种随机数发生器类

user: user-6
content: 随机数算法的随机就在于别人不知道种子和调用次数，只要两者做到隐藏其中一个，算法就是随机的。

user: user-6
content: 随机和均匀是两回事。对外部来讲，就算你重置了种子，结果还是随机的。(种子通常是时间，比较难准确定位)

user: user-0
content: 引用 3 楼 qq423399099 的回复:好像没啥特别的方法。 不过有个取巧的办法，调用rand()时，如果用户在此之前没有调用过srand(seed)，它会自动调用srand(1)一次。  所以，如果楼主不想破坏原本的种子，那么自己提前手动在文件中先保存种子为1时，rand() % 100产生的10个随机数 然后运行程序后：直接调用rand() % 100产生10个随机数，看看和之前文件中保存的10个数一样吗，如果一样就有理由相信之前的代码没有srand过 方法可行、合理，略显复杂。依然谢谢你！

user: user-7
content: 好像没啥特别的方法。 不过有个取巧的办法，调用rand()时，如果用户在此之前没有调用过srand(seed)，它会自动调用srand(1)一次。  所以，如果楼主不想破坏原本的种子，那么自己提前手动在文件中先保存种子为1时，rand() % 100产生的10个随机数 然后运行程序后：直接调用rand() % 100产生10个随机数，看看和之前文件中保存的10个数一样吗，如果一样就有理由相信之前的代码没有srand过

user: user-8
content: 标准C肯定不行，不过特定的实现可以.实际换个随机数发生器，c++11这么多....  不过比较在意"如果再次设置，那就影响了原来的随机分布了"这句，一般就是用时间做为种子，不管怎样都会影响....

user: user-9
content: 无解。（6个字凑数）
user-0 提问: 请求帮助

回复:
user: user-1
content: https://www.baidu.com/s?wd=C源代码%20统计指定文件中的某个特定英文字符 https://www.baidu.com/s?wd=CPP源代码%20学生类。其中有5个数据成员有学号、姓名、C语言程序设计成绩 https://www.baidu.com/s?wd=C源代码%20保存一批数（质数、奇数、水仙花数）到一个指定的文本文件 https://www.baidu.com/s?wd=CPP源代码%20三角形、矩形和圆形的面积与周长。……关于虚基类。

user: user-0
content: 搜不到呀....

user: user-1
content: 在百度搜题目内容。
user-0 提问: 【江湖救急】为什么我输入的这段代码运行后，我的数组的值都变成了-1

回复:
user: user-0
content: 引用 2 楼 qq423399099 的回复:sum += digit[i];应该是sum += digit[j];  #include<stdio.h> int main(void) { 	int digit[100]; 	int sum = 0; 	float ave = 0.0; 	int i = 0, j = 0; 	for (i = 0; i < 100; i++) 	{ 		scanf("%d", &digit[i]); 		if (digit[i] == -1) 			break; 	} 	for (j = 0; j < i; j++) 	{ 		sum += digit[j]; 	} 	ave = sum / i; 	printf("%d\n", sum); 	printf("%.2f\n", ave); 	return 0; } 谢谢你1

user: user-1
content: sum += digit[i];应该是sum += digit[j];  #include<stdio.h> int main(void) { 	int digit[100]; 	int sum = 0; 	float ave = 0.0; 	int i = 0, j = 0; 	for (i = 0; i < 100; i++) 	{ 		scanf("%d", &digit[i]); 		if (digit[i] == -1) 			break; 	} 	for (j = 0; j < i; j++) 	{ 		sum += digit[j]; 	} 	ave = sum / i; 	printf("%d\n", sum); 	printf("%.2f\n", ave); 	return 0; }

user: user-2
content: #include<stdio.h> int main(void) {     int digit[100];     int sum=0;     float ave=0.0f;     int i=0,j=0;     for (i=0;i<100;i++) printf("%d ",digit[i]);     printf("\n");     for(i=0;i<100;i++)     {         printf("Input digit[%d]:",i);fflush(stdout);         scanf("%d",&digit[i]);         if(digit[i]==-1)             break;     }     for(j=0;j<i;j++)     {         sum +=digit[j];     }     ave = (float)sum/i;     printf("sum:%d\n",sum);     printf("ave:%.2f\n",ave);     return 0; } //1311096 27 32 0 35 -1473595837 1311096 0 0 1 2090180133 268435456 1244912 2090180013 1315560 2090180041 1244976 13241797 -2136591274 3623968 3604840 56 3623968 3623976 3605848 -1995983848 56 0 3604480 1244244 0 1244828 2090172640 2090180464 -1 2090180460 270589708 3604480 0 48 0 0 2147348480 -1999473920 1244884 270609247 1244932 270608376 0 270609891 3624008 205 12 0 0 2147348480 0 2147348480 0 1244892 270579140 270944128 1244948 270609028 9 270609019 0 0 2147348480 36240080 1318752 1245104 270608376 270889264 -1 1244980 270608879 0 0 0 270887808 1320147 1245024 270579359 1320144 3624016 3624020 1245012 1245020 1320144 1320144 2 3624008 4 1245032 270577712 1245120 4199150 //Input digit[0]:9 //Input digit[1]:8 //Input digit[2]:7 //Input digit[3]:6 //Input digit[4]:-1 //sum:30 //ave:7.50 //
user-0 提问: 菜鸟 跪求大神解决 浮点数精度还有小数怎样存储？

回复:
user: user-1
content: float  格式为 1位符号位, 8位解码, 23 位尾数,  加上隐含的 1,  只有 24 的位的精度...   16.11 转化 为二进制为  1 0000. 0001 1100 0010 1000 1111,  最后一位四舍五入,  尾数就是 1. 0000 0001 1100 0010 1001 000,  阶码 4 (+128),  转成 10进制表示就是  16 +  1/16 + 12/256 + 2 / 4096 + 9 / 65536  = 16.1100006103515625

user: user-2
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-3
content: 因为浮点数在内存中无法精确存储，只是存一个近似值。 所以我们在比较浮点数的时候，会设置一个误差值，如果小于这个误差我们就认为这两个浮点数相等。 http://blog.csdn.net/juanjuan888/article/details/6672517 http://bbs.csdn.net/topics/390676437

user: user-4
content: https://zh.wikipedia.org/zh/IEEE_754
user-0 提问: linux下c语言gsoap传递结构体数组

回复:
user: user-0
content: struct ns1__ArrayOfSeat { int __sizeSeat;	/* sequence of elements <Seat> */ struct ns1__Seat *Seat;	/* optional element of type ns1:Seat */ };  对这个数据进行赋值要怎么写呢?

user: user-1
content: 搜“序列化和反序列化”
user-0 提问: runtime error 问题

回复:
user: user-1
content: #include<stdio.h> #include<string.h> #include<stdlib.h> int main() {     int n,i,j,m;     char str[81];     while((n=atoi(gets(str)))!=0) {         i=0;         while(i<n) {             gets(str);             m=strlen(str);             for(j=0;j<m;j++) {                 if((str[j]>='a'&&str[j]<='z')||(str[j]<='Z'&&str[j]>='A')) {                     if(str[j]=='Z')                         str[j]='A';                     else if(str[j]=='z')                         str[j]='a';                     else str[j]++;                 }             }             i++;             printf("%s\n",str);         }     }     return 0; }
user-0 提问: 初学者求助

回复:
user: user-0
content: 初学者理解能力差点，见谅哈

user: user-0
content: 为何scanf中要改%f为%lf

user: user-1
content: double对应%lf 你用%f读入double,可能只写入了8个字节中的4个字节，所以输出的值不对。 scanf("%lf",&b);

user: user-2
content: %lf  printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
user-0 提问: 关于结构体动态分配内存的问题

回复:
user: user-1
content: 有没有错自己编译器里试下就知道了 什么叫不知道分配多大的内存。

user: user-0
content: 会提示出错吧，这样的话实际上不是还不知道该分配多大内存吗？

user: user-1
content: 这样才对：  *stack = (Stack*)malloc(sizeof(Stack));

user: user-0
content: 我想明白了，*arr只是一个地址而已。
user-0 提问: 关于[指向数组的指针]和[指向数组首元素的指针]的问题

回复:
user: user-1
content: int array[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };//array指向该数组第一个元素的地址         int (*pa)[] = &array;//[]下标引用的优先级高于间接访问*,但是由于（）d的存在，首先执行的还是间接引用*pa;所以p是一个指针。接下来是下标引用[]，所以p指向一个数组。 初始化应该为int(*pa)[10]=&array;保证类型相同；此时p表示指向一个拥有10个整型元素的数组的指针。  array是数组名，数组名的值是一个指向该数组第一个元素的指针。第一个元素的指针和该数组的指针值是相等的。          printf( "pa = %d\n", pa );         printf( "&array = %d\n", &array );         printf( "array = %d\n", array );

user: user-2
content: 你的例子中，1和2是同一种类型，3是一种类型，1、2与3类型是不同的，不过值是相同的

user: user-2
content: 1、array不是指针，array是数组类型，数组类型不等于指针，最多说某些情况下可以退化为指针  2、int (*pa)[] = &array; 是错的，实际应该写成：int (*pa)[10] = &array; 此时pa指向的是int[10]类型的数组，而不是指向一个指针， pa的值就是数组的值  3、pa的类型是，int(*)[10]，不等于int**，不是二级指针

user: user-3
content: http://bbs.csdn.net/topics/391965841

user: user-3
content: http://edu.csdn.net/huiyiCourse/detail/134

user: user-4
content: &array和&array[0]只是值相同，但意义和类型都是不同的。 其实&array和&array[0]结果都是数组的首地址，但他们的类型是不一样。 &array[0]也即对数组首元素取地址，array+1表示首地址+sizeof(元素类型)。 &array虽然值为数组首元素地址，但类型为：类型 (*)[数组元素个数],所以&array+1大小为：首地址+sizeof(array)。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:http://edu.csdn.net/huiyiCourse/detail/134  待到夜深人静时，好好学习下老师的课程
user-0 提问: 窗口过程和对话框过程中的WM_PAINT的差别

回复:
user: user-1
content: 学会使用Spy++软件。

user: user-0
content: 就是想知道他的消息时怎么循环的

user: user-2
content: 不明白楼主想研究什么？
user-0 提问: 求教，使用unsigned int总是显示错误，但总找不到原因

回复:
user: user-1
content: 。。。。。真是无语

user: user-2
content: 楼主为什么不 unsigned int k=(unsigned int)-3.1416; 呢？

user: user-3
content: 无符号整型啊。。。。怎么能赋值负数呢？？？无符号整型只能赋值大于等于0的整数啊

user: user-4
content: unsigned int k=-2;有的编译器可以过编译，而有的编译器则不行。 楼主究竟想干嘛呢？

user: user-5
content: 好负责任的编译器！你为什么要给一个无符号数赋值负数-2呢？-2是有符号整数。

user: user-0
content: 系统显示  converting of negative value `-0x000000002' to `unsigned int' 求大神指导
user-0 提问: 编写一个程序，要求从键盘上输入50个同学的学号和C语言成绩，然后按照成绩从高到低进行排序，并将成绩写入到score.txt中

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

user: user-1
content: 两个很明显的错误： 1.strcpy(stemp, name[i]);，你的stemp是char类型的，strcpy需要的是char *类型（strcpy(name[j], stemp);同理） 2.if (fp = (fopen("e:\\score.txt", "w") == NULL))改成if ((fp = (fopen("e:\\score.txt", "w") )== NULL)) 因为==的优先级大于=
user-0 提问: 测试发现malloc申请空间超过60字节,free之后,内存的内容不会清除,,这是为什么

回复:
user: user-1
content: 你们都没说到本质,本质是  printf函数内部里面很可能也使用了malloc 函数 申请了60以内的内存并覆盖了hellow world使用的内存,如果大于60 就不覆盖啦,

user: user-2
content: 这个很正常，一般如果自己实现内存池的话，也是不会对释放的内存做处理的。操作系统也是一样

user: user-3
content: malloc和free 对应 借和还 不对应 创建和销毁。

user: user-4
content: 引用 8 楼 yuanleiming 的回复:[quote=引用 1 楼 cyfcsd 的回复:] 释放后再 输出是未定义行为，跟60没啥关系 内存回收后指针还是指向原申请空间首址,回收后内存不会清除,按道理应该打印原字符串, 但为什么申请60字节以下,输出就是空,申请60字节以上输出就还是原来字符串,这一点还是不理解..[/quote] 你换个机器或者编译器试一下就知道了，跟60没关系的，free以后那块内存会不会被覆盖取决于你的机器和编译器，甚至是运行时的某些状态。 建议你理解一下语言标准和编译器实现的关系，语言标准是一种规定，比如if后面是真的话就执行if语句，这是肯定会发生的，否则就乱套了，编译器必须这么做才可以 但是标准并没有说你free内存之后，那块儿内存会怎么样，这就取决于你的编译器实现了，它可以去覆盖，也可以不去覆盖，而现在的编译器一般比较智能，即会根据具体情况去判断是不是该覆盖，而判断标准你是不知道的 总之，你free以后那块儿内存就不能用了，没有任何人可以保证内存小于60或者小于30就不会被覆盖

user: user-5
content: 这个是操作系统管理的，标准库大多并不干预这些事，只是直接调用系统的释放接口即可。就像 Windows 文件恢复一样，系统只是把文件标记为删除，但实际上这块记录仍然存在，因此如果数据没有被改写的情况下，是可以恢复文件，是一样的道理。如果你在 C 盘里不小心删了文件，你就很难恢复，因为 C 盘是系统级别频繁读写的，所以数据被改写的可能性也很大。

user: user-0
content: 引用 1 楼 cyfcsd 的回复:释放后再 输出是未定义行为，跟60没啥关系 内存回收后指针还是指向原申请空间首址,回收后内存不会清除,按道理应该打印原字符串, 但为什么申请60字节以下,输出就是空,申请60字节以上输出就还是原来字符串,这一点还是不理解..

user: user-6
content: 引用 5 楼 yuanleiming 的回复:在网上查到确实是不会清空,malloc申请的空间大于60 字节后,输出的结果为什么和申请空间小于60的结果不一样,这一点不明白... 本身就是不支持这样用的，出了奇怪的结果，就不应该奇怪了。如果是偶然事件，那就不需要解释了，如果是必然事件你倒可以去查一查。

user: user-7
content: 和编译器有关，VS下得不出楼主你的60字节结论

user: user-0
content: 在网上查到确实是不会清空,malloc申请的空间大于60 字节后,输出的结果为什么和申请空间小于60的结果不一样,这一点不明白...

user: user-8
content: 标准并没有规定，如何对待这块内存编译器可以有自己的行为  http://en.cppreference.com/w/c/memory/free

user: user-9
content: 这就像你一不小心把文件删了, 只要没有放新的文件, 还是可以用数据恢复软件恢复出来的

user: user-10
content: free 以后，清空内存，是个吃力不讨好的事情，编译器一般都不会去做。 和文件删除一个道理，编译器只是把这块内存登记为可用，如此而已

user: user-7
content: 当free一块内存后，free(即运行库)会将这块内存标记为未使用。 清不清空这块内存都是可以的（因为标准并没有规定），一般编译器出于效率考虑往往不清空.

user: user-11
content: free后要让string指向空，要不就成野指针了

user: user-4
content: 释放后再 输出是未定义行为，跟60没啥关系
user-0 提问: C语言：英文算数计算系统，求大神帮忙！！！怎样才能输出像输出样例那样，我只会输出结果。

回复:
user: user-1
content: 引用 4 楼 Nicky_Chardin 的回复:版主好 我也想问问这个程序，但是给的代码不知道为何我用除法或是取余数运算就会崩溃 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-2
content: 版主好 我也想问问这个程序，但是给的代码不知道为何我用除法或是取余数运算就会崩溃

user: user-0
content: 谢谢老师啦！

user: user-3

user: user-1
content: for(i=0;i<n;i++) {     if (val[i]>0) {          itoa(val[i], str, 10);//整数转换为字符串          printf("%s ",a[i]);//输出原表达式          for(j=0;j<strlen(str);j++)             printf("%s ",comp[str[j]-0x30]);     }     printf("\n"); }
user-0 提问: 结构体中对字符数组初始化为0的问题

回复:
user: user-1
content: 俗人们总是热衷于做加法； 哲人们关键时候会做减法。

user: user-2
content: 支持C++11编译器可以，比如VS2015  否则可以在构造函数里自己初始化为0

user: user-3
content: 每增加一些东西，往往编译器要同样增加一些对这个东西相关的处理 比如C++11初始化表类型，就是为了统一初始化方式 C++ typeinfo 结构，对应 typeid C++ 模板的分离编译，这个能力最终被放弃了 数组迄今为止，不能互相赋值 new,delete 运算符，在库里需要实现内存分配算法， 编译器把分配内存。和初始化对象，这两个步骤糅合到 new 表达式 销毁对象，和释放内存 糅合到 delete 表达式

user: user-3
content: 每种语言，都有他的哲学，甚至有些库也有，比如STL 并且随着版本的不同，不断的修改，完善 早期，C 语言的哲学是尽量简单，贴近硬件，贴近汇编 包括写成的语句，和语言内核本身 当时C是关键字最少的语言 当时提倡代码简短，标识符名字尽量的简短（哦，那个时代，编程语言，普遍只能识别8个字符） 这点，可以从C标准库看出来 当然。编译器实现起来，也要尽量简单 当时，自动数组都不能初始化 结构内的数组。自然也不能初始化了

user: user-4
content: 你找个支持C++11的编译器才支持你这种写法

user: user-5
content: C语言中不允许这么做，在结构体里面和外面赋值是完全不同的概念 外面定义的，无论是局部变量还是全局变量，都是有内存被分配的，初始化就是初始化那块儿内存 而结构体本身的定义并不分配内存，只有定义结构体变量时才会分配内存，所以在里面的初始化语句并不是在编译结构体定义时起作用，而是要等到用结构体定义变量时才起作用，所以就显得不那么“自然了”，所以C就没有支持这种方法 C++中先是用构造函数的方法给出了一种折衷手段，但也不允许直接初始化，而是用一个函数来完成你要的初始化工作，原因同上，就是为了避免写的代码和底层操作“不协调” 后来到C++11，可能是为了方便程序员，标准也开始支持这种类内直接初始化了 顺便说一下，Java是支持的，C++“抄袭”了Java也不是没有可能

user: user-6
content: 难道你可以对 那个 top 赋值吗？ 也是不可以的。  你那个不是定义变量，而是定义了一个类型。  不过最新的 C++ 就可以了。

user: user-7
content: http://blog.csdn.net/heyabo/article/details/8846662 http://blog.csdn.net/a_ran/article/details/44755759

user: user-7
content: 简单说，就是不允许。 复杂的说呢，那就是猜了： 不在结构体里面的时候，不管是局部变量还是全局变量，编译器都要立即给他分配空间。分配了空间之后明确的知道这个变量的位置，那么顺便清0也可以做到。 在结构体里面，只是声明了一个类型而已，想清0也不知道该去哪清。当然你可以说真正定义变量的时候再清0，那就有点象c++构造函数的概念了，c大概是不行吧
user-0 提问: C编程中switch...case 问题

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

user: user-2
content: 你代码都跑完了，程序结束了它当然退出了

user: user-0
content: 这个应该是加上getchar（）之后的把。我说的是没加的时候为什么会自动退出 呢？,break只是 跳出循环，并不是跳出程序啊

user: user-2

user: user-0
content: 2.然后程序没有输出自动关闭

user: user-2
content: 你输入了啥?

user: user-0
content: 程序不是应该会有所输出，在控制台里面程序会让我们按建才会退出啊

user: user-2
content: 看不到输出是因为程序正常退出了，你ctrl+F5运行就能看到了 或者代码最后加上getchar();或者system("pause");   #include<stdio.h> int main() { 	int imonth; 	printf("请输入月份:\n"); 	scanf_s("%d",&imonth,2); 	 	switch (imonth) 	{ 	case 1: 	case 8: 	case 3: 		case 5: 		case 7: 		case 10: 		case 12:printf("31.\n"); break; 		case 2:printf(" 28\n"); break; 		case 6: 		case 9:printf("30\n"); break; 		default: 			printf("wrong\n"); break; 	} 	getchar(); 	getchar();  }