Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: [SWU]如何求取变量所在的字节

回复:
user: user-1
content: sizeof(）；/*括号内为要求的字节的名称*/

user: user-2
content: printf("%p",&k);

user: user-3
content: sizeof(int)

user: user-0
content: 偶！希望我可以早点吃到这道菜

user: user-4
content: 遇到的时候自然就知道了。光看资料是很难明白的。你想一想食谱就明白了，如果看食谱就可以替代品尝的话...

user: user-0
content: 1、在网上查看了一下Big Endian 和 Little Endian的区别，Big Endian 是从小到大，Litle Endian  是从大到小。c/c++和编译平台的CPU有关，我们一般用的电脑都是Intel X86的处理器，他是由低到高也就是Litle Endian.但还是不是很清楚的干活！！！ 2、big endian：最高字节在地址最低位，最低字节在地址最高位，依次排列。 little endian：最低字节在最低位，最高字节在最高位，反序排列。 更是不是很明白了。 哎！可爱又可恨的计算机啊！！！！

user: user-4
content: 需要注意的是，有个字节序的问题：big indian和little indian。你可以自己搜索一下。

user: user-4
content: 楼上的理解正确。

user: user-0
content: 基地址是指从那个地址开始，一直往后计算多少个字节吗？比如说我用的编译器对于整形分配四个字节，也就是说从基地址开始往后数四个字节都是用来存放整形变量吗？

user: user-4
content: 占用哪两个字节是在运行时决定的。不过你可以看到： int a;  printf("%p", &a); 将打印a所占空间（两个字节）的基地址。

user: user-5
content: 针对你的： 2、0xff91470c是一串16进制数，这个就是它的地址。 3、sizeof就是用来求一个对象或者类型所占的内存字节数。

user: user-0
content: 1、我执行这条语句printf("%d\n", sizeof(int));的输出结果是4，在网上查了一下，针对不同的编译器对整形变量分配的字节数不同， 我用的是Linux下的编译器，所以不同于turboC是分配2个字节，这点我明白了。  2、执行这两条语句的输出结果是         int k;         printf("%p", &k); 0xff91470c，那这个结果（0xff91470c）又是什么意思呢？其中p又是什么意思？  3、针对三楼回复sizeof（）；/*括号内为要求的字节的名称*/，能将清楚一点吗？ 先谢过大家了。
user-0 提问: [求助]关于字符串和位操作符右移的问题

回复:
user: user-1
content: 连不连续是由设计决定的，没有“应该”“理所当然”，只有“规定” 在某些存储结构中，两个字节的第一位位于同一个存储芯片中，同一个字节内的不同位位于不同存储芯片中，你觉得哪些位是连续的？  数据的左移和右移只和这个数据本身有关，不影响其他数据 一个char进行左右移只影响一个字节，一个int进行左右移就影响四个字节

user: user-2
content: 这么说吧，像>>这些运算操作都是在CPU的寄存器中进行的，而变量都保存在存储器中。c = c >> 8 实际的操作过程是： 1 把变量c读入寄存器 2 在寄存器中把数据右移8位 3 把结果写入存储器中的c变量处  所以单纯执行 c>>8 你看不到任何效果，因为存储器没有变 字符数组是一组字符变量组织在一起，c[0]=c[0]>>8；所做的就是把c[0]右移后写回c[0]。注意，只写了c[0]，所以其它字符都不会变  union 的例子可以是因为操作的int变量（两个字节），所以写回去时改变了两个字符。如果改成u.c[0]=u.c[0]>>8 你再试试

user: user-0
content: 谢谢，我的意思是>>和空间之间应该是有联系的。 比如 union U { 	char c[2]; 	int i; };  	U u = {'a','b'}; 	cout << u.c[0];//输出是a 	 	u.i = u.i >> 8; 	cout << u.c[0];//输出是b  那么字符数组为什么不可以右移，变为字符右移？

user: user-3
content: c赋值为'a'，因为char占用一个字节，就是8个二进制位，右移8位，就会把a的二进制码全部移走，而每移一位高位的空缺都由0来补上。所以这时c的数值是0. 右移移位是电路操作，而指针移位是逻辑操作，这是两码事。
user-0 提问: C语言中文件输出问题

回复:
user: user-1
content: while(!feof(fb)) { ch=fgetc(fb); putchar(ch);  }  这种写法是比较典型的错误，很多书都在误导。  没有执行fgetc之前，FILE是不知道是否eof的，所以应该改为先fgetc，然后判断fgetc返回值。

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

user: user-3
content: fb=fopen("F:\新建文本文档.txt","r");中'\'改为'\\'

user: user-2
content: #include <stdio.h> #include <stdlib.h> int main() {     int ch;     FILE *fb;     fb=fopen("F:\\新建文本文档.txt","r");     if (NULL==fb) {         printf("找不到文件[F:\\新建文本文档.txt]!\n");         return 1;     }     while(1) {         ch=fgetc(fb);         if (EOF==ch) break;         putchar(ch);     }     fclose(fb);     return 0; }

user: user-4
content: 没有问题啊，我用vs2010编译执行没有问题。代码稍微修改了一点，应该是不会有影响的。 #include "stdafx.h" #include <stdio.h> #include <stdlib.h> int test_32() { 	char ch; 	FILE*fb; 	fb=fopen(".\\ReadMe.txt","r"); 	while(!feof(fb)) 	{ 		ch=fgetc(fb); 		putchar(ch);  	} 	fclose(fb); 	return 0; }
user-0 提问: c函数返回为void*指针，在cpp文件中无法识别

回复:
user: user-1
content: 跟C和C++没有关系的，看看错误的具体提示吧。  引用 楼主 luoyanghero 的回复:在Image.c文件中有函数 void* MaPU_Malloc(int SIZE) { 	return (void*)malloc(SIZE); } 在ImgProc.cpp中调用，无法识别该函数，请问是什么原因？（该函数在同一文档中调用能识别，*.cpp文件中调用其他*.c的函数可以。已包含extern“C”）

user: user-2
content: 估计没将Image.c和ImgProc.cpp放在一个项目中。

user: user-3
content: 无法识别是什么报错
user-0 提问: win32程序问题

回复:
user: user-1
content: StaticProc=(WNDPROC)SetWindowLong(GetDlgItem(hDlg,IDC_STC8),GWL_WNDPROC,(LONG)ProcLink); 编译器没找到 StaticProc 的声明。

user: user-0
content: 代码是从网上搜到的，然后再加到自己代码里的，我只想实现静态文本框的超链接功能，有人能直接上代码吗？ 注：mingw编译的

user: user-1
content: 引用 2 楼 zxh707wk 的回复:具体怎么改？ 那要看代码有没有定义StaticProc： 如果有，就要在引用的文件里面声明下,extern ... StaticProc； 如果没有，就要先定义，然后再在引用的地方声明。

user: user-2
content: 你没定义staticproc吧

user: user-0
content: 具体怎么改？
user-0 提问: 关于浦风投针的C语言

回复:
user: user-1
content: lz代码本身有问题啊——   这是我随便输的数得到的结果，你的两个答案是怎么得出来的啊 关于浦风投针，lz可以看看这个——http://blog.csdn.net/zmazon/article/details/8199357（这个我是真看不懂）
user-0 提问: 异或后 还原不回去 大家帮忙看看啊

回复:
user: user-1
content: 引用 6 楼 Automation_dmu 的回复:将descrypt_file（）中的key ^= ch 改成 key ^= x 这个好像正解

user: user-2
content: 将descrypt_file（）中的key ^= ch 改成 key ^= x

user: user-0
content: key ^= ch; 每次改变key的值啊

user: user-3
content: key ^= ch;  是不是把key的值改变了？

user: user-1
content: 完全不对？还是有些地方不对？ 跟踪一下应该很容易查的。

user: user-4
content: 'a' - 256 = -1不等于-1，反正就是这意思

user: user-4
content: while( (ch=fgetc(fp_dstTxt)) != EOF )     {         x = (ch - i) ^ key;         fputc(x, fp_srcTxt);         key ^= ch;         i++;     }    while( (ch=fgetc(fp_srcTxt)) != EOF )     {         x = (ch ^ key) + i;         fputc(x, fp_dstTxt);         key ^= ch;         i++;     }   i如果大于255怎么办？ 例如： 'a' - 256 = -1，你写的文件里是什么？ 可以改成： i = i %255
user-0 提问: 关于管道echo的小白问题

回复:
user: user-1
content: 1)echo 20|abc 应该没问题，可能是没有生成 可执行程序 2）试试 echo 20|abc.exe 3）编译了没有，看到可执行文件了么 4）abc.cbp 貌似 code::block 项目文件，不是可执行程序

user: user-2
content: 可以把n的值打印出来看下
user-0 提问: 求高手指点一下小弟一个关于星期几的问题

回复:
user: user-0
content: 不好意思！我对这个网站不是很熟悉，所以结了零分给你！你重新给我回复我再把结贴分给你吧。

user: user-0
content: 谢谢您的指点！我知道我错在什么地方了！if (totaldays == 1) printf("星期四");我这个是从八月十号算起的所以是星期六

user: user-1
content: 求每月天数我做了一点优化，也可以在全局弄一个每个月的数组： int days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int getMonthDay(int year, int month){ 	if (month == 2 && isLeapYear(year)) 		return 29; 	return day[month - 1]; }

user: user-1
content: 你的代码格式为什么空行这么多，还有，语块里如果只有一条语句，那么没有用花括号的必要。 2009年第一天是周四，循环计算日期中有错误。  #include<stdio.h> //判断是否是闰年 int isLeapYear(int year) { 	int flag = 0; 	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) 		flag = 1; 	else 		flag = 0; 	return flag; } //求出该月的天数 int getMonthDay(int year, int month) { 	int day; 	if (month % 2) 		day = 31; 	if (!month % 2) 		day = 30; 	if (month == 2){ 		if (isLeapYear(year)) 			day = 29; 		else 			day = 28; 	} 	return day; } //求出距离2008年的总天数 int gettotalDays(int year, int month, int day) { 	int totaldays = 0, i, j; 	if (year>2008){ 		for (i = 2009; i<year; i++){ 			if (isLeapYear(year) == 1) 				totaldays += 366; 			else 				totaldays += 365; 		}  		for (j = 1; j<month; j++) 			totaldays += getMonthDay(year, j);    //totaldays += getMonthDay(year, month);  		totaldays += day; 		printf("总天数为%d:\n", totaldays); 	} 	else if (year == 2008){ 		if (month>8) 		{ 			for (i = 8; i<month; i++) 				totaldays += getMonthDay(year, month);  			totaldays += day - 8; 			printf("总天数为%d:\n", totaldays); 		} 		else if (month == 8){ 			if (day>8){ 				totaldays += day - 8; 				printf("总天数为%d:\n", totaldays); 			} 			else 				printf("您输入有误!请重新输入!\n"); 		} 		else 			printf("请重新输入!您输入的月份小于8月!\n"); 	} 	else 		printf("请您重新输入!您输入的年份小于2008年!\n");  	return totaldays; }  void main(){ 	int year, month, day, totaldays, monthday, week; 	printf("请您输入年月日:"); 	scanf("%d%d%d", &year, &month, &day); 	printf("您输入的是%d年%d月%d日", year, month, day);  	if (isLeapYear(year) == 1) 		printf("该年是闰年\n"); 	else 		printf("该年是平年\n");  	totaldays = gettotalDays(year, month, day);  	if (totaldays == 1) 		printf("星期四");   //printf("星期六"); 	else{ 		week = totaldays% 7;  		switch (week){ 		case 3: printf("星期日\n"); 			break;  		case 4: printf("星期一\n"); 			break;  		case 5: printf("星期二\n"); 			break;  		case 6: printf("星期三\n"); 			break;  		case 0: printf("星期四\n"); 			break;  		case 1: printf("星期五\n"); 			break;  		case 2: printf("星期六\n"); 			break; 		} 	} }
user-0 提问: 求大神帮忙，怎么用C 语言编写一个登陆界面

回复:
user: user-1
content: 一定要用C？我觉得用C#更简单点。

user: user-2
content: 引用 楼主 u013995628 的回复:刚开学大2老师要求我们做一个管理系统的项目，求大神帮忙登陆界面怎么制作，大一开学第一节课老师讲解了下，都这么久了已经忘了T T     RT就像这种的  随便找个前端做个界面 然后用C写实现啊

user: user-3
content: 最好还是学系较新的技术，现在还用c+win32是不是有点……浪费时间

user: user-4
content: 搜索C 语言WIN32编程

user: user-5
content: 你们的老师肯定也没有教过用C语言写界面这种东西。你真得好好反省大一时你听了什么课。

user: user-6
content: 用MFC不就搞定了  用c写...

user: user-7
content: 找MFC看看吧 一看这样子就是MFC做的

user: user-8
content: MFC容易。。。。

user: user-9
content: 引用 2 楼 u013995628 的回复:额这倒不是，只是我们小组让我做登陆界面。我想做到那种程度。 怎么用C语言写windows界面啊？  你可以去找那种特别的老的Win32程序设计的书，基本就是你要的东西 （C语言+系统API）。

user: user-10
content: 你去百度文库看看。。

user: user-0
content: 额这倒不是，只是我们小组让我做登陆界面。我想做到那种程度。 怎么用C语言写windows界面啊？

user: user-9
content: 用C语言写Windows界面，你确定这是你们老师的要求？
user-0 提问: 新手求助！！求大神解答！！

回复:
user: user-1

user: user-1
content: 引用 5 楼 u012928672 的回复:[quote=引用 1 楼 u012421456 的回复:] lz你代码从哪儿弄来的啊？ 第4行已经给 n 赋值为 0，而第9行i的值被赋为1，for循环的条件又是i<=n,结果根本没有一次循环啊，还有第10行的len从哪儿来的啊？上面没有啊这个代码是我自己写的，n第一遍的时候是不进循环的，后面不是有个n+=2么，等第二遍的时候n就等于2了，然后1en是xen就是x的n次方的意思，我看书上写的e前面必须有个数字，然后我就乘了个1。[/quote] 看错了

user: user-0
content: 引用 1 楼 u012421456 的回复:lz你代码从哪儿弄来的啊？ 第4行已经给 n 赋值为 0，而第9行i的值被赋为1，for循环的条件又是i<=n,结果根本没有一次循环啊，还有第10行的len从哪儿来的啊？上面没有啊这个代码是我自己写的，n第一遍的时候是不进循环的，后面不是有个n+=2么，等第二遍的时候n就等于2了，然后1en是xen就是x的n次方的意思，我看书上写的e前面必须有个数字，然后我就乘了个1。

user: user-1
content: lz还是参考一下别人的吧——http://bbs.bccn.net/thread-335083-1-1.html http://zhidao.baidu.com/link?url=0rtQKG_fEjDF1hUwJYz62NQ9zg-wraSeJNioP1aYRVVIhg7aWxkq0UpsF1wmLOka8OUArvUmoFXIGAnjVmgYsa

user: user-2
content: 首先你前面已经将n初始化为0，你在for循环的时候，条件是i<=n;这样for循环是不能运行的，而且你的for循环是{b=b*i}，后面的代码根本没有参与循环运算，总的来说，这段程序的算法不对，而且差好多

user: user-3
content: 仅供参考：  #include <iostream> using namespace std ; //get the an  double x_an(double x,int i) {     double res = 1.0;     for(int t = i ; t > 0; t--)     {         res*=(x/t) ;     }     return res ; }  //cos(x)=1-(x^2/2!)+(x^4/4!)-(x^6/6!).. double x_cos(double x,double rate = 1e-6) {     int i = 2 ;     int ct = 1 ;     double res = 1 ;     double sig = -1;     double an = 0 ;     while(1)     {         sig = (ct%2 == 0 ? 1.0 : -1.0);         i=2*ct;         an = x_an(x,i);         if(an < rate)break;         an *= sig;         res += an ;         ct++;     }     return res; } int main() {     double x ;    while(cin>>x){         cout<<x_cos(x)<<endl;    }    return 0; }

user: user-1
content: lz你代码从哪儿弄来的啊？ 第4行已经给 n 赋值为 0，而第9行i的值被赋为1，for循环的条件又是i<=n,结果根本没有一次循环啊，还有第10行的len从哪儿来的啊？上面没有啊
user-0 提问: 纯新手求解三道题

回复:
user: user-1
content: 请问第一题的正确是什么...他给的有c和c++，怎么编译呢？

user: user-2
content: 第二题  #include <iostream> #include<conio.h> using namespace std;  void main() { 	int t=0; 	cout<<"请输入要输出的组数T："<<endl; 	cin>>t; 	char **hit; 	hit=(char**)malloc(sizeof(char*)*t); 	for (int j=0;j<t;j++) 	{ 		hit[j]=(char*)malloc(sizeof(char)*100); 		memset(hit[j],0,100); 		cout<<"请输入第"<<j+1<<"组数据'g'或'l'，否则退出："<<endl; 		int i=0; 		while(1) 		{ 			char str; 			str=getche(); 			if (str!='g'&&str!='l') 			{ 				break; 			} 			hit[j][i]=str; 			i++; 		} 		cout<<endl; 	}  	for (int j=0;j<t;++j) 	{ 		int recordg=0; 		int maxg=0; 		for (int i=0;i<strlen(hit[j]);++i) 		{ 			if ('g'==hit[j][i]) 			{ 				recordg++; 				if (maxg<recordg) 				{ 					maxg=recordg; 				} 			}else 			{ 				recordg=0; 			} 		}  		cout<<"第"<<j+1<<"组最大连击数："<<maxg<<endl; 	} 	system("pause"); }

user: user-2
content: 第一个题，会10,100会超过int的最大存储范围，用浮点数表示不了这么长的数位，可以把数字转化为字符串比较。下面写的是直接计算的  #include <iostream> #include <iomanip> using namespace std;  int linknum(int num1,int num2) { 	int len=1; 	while(num2%10>10) 	{ 		len++; 		num2/=10; 	} 	for (int i=0;i<len;++i) 	{ 		num1*=10; 	} 	num1+=num2; 	return num1; }  void main() { 	int t,*n,*k; 	cout<<"请输入组数T:"; 	cin>>t; 	n=(int *)malloc(sizeof(int)*t); 	k=(int *)malloc(sizeof(int)*t); 	for (int i=0;i<t;i++) 	{ 		cout<<"请输入第"<<i+1<<"组n,k:"<<endl; 		cin>>n[i]>>k[i];cout<<endl; 	}  	for (int i=0;i<t;i++)//遍历组数 	{ 		int **array; 		int re=1; 		array=(int **)malloc(sizeof(int*)*n[i]);//分配矩阵空间 		for (int x=0;x<n[i];++x) 		{ 			array[x]=(int *)malloc(sizeof(int)*n[i]); 		} 		for (int j=0;j<n[i];++j)//矩阵赋值 		{ 			for (int l=0;l<n[i];++l) 			{ 				array[j][l]=re; 				re++; 				if (k[i]<re) 				{ 					re=1; 				} 			} 		}  		int **arraytotal;; 		arraytotal=(int **)malloc(sizeof(int*)*2); 		for (int x=0;x<n[i];++x) 		{ 			arraytotal[x]=(int *)malloc(sizeof(int)*n[i]); 			memset(arraytotal[x],0,sizeof(int)*n[i]); 		} 		for (int j=0;j<n[i];++j) 		{ 			for (int l=0;l<n[i];++l) 			{ 				arraytotal[0][j]=linknum(arraytotal[0][j],array[j][l]); 				arraytotal[1][l]=linknum(arraytotal[1][l],array[j][l]); 			} 		}  		int maxnum=0; 		for (int j=0;j<2;++j) 		{ 			for (int l=0;l<n[i];++l) 			{ 				if (maxnum<arraytotal[j][l]) 				{ 					maxnum=arraytotal[j][l]; 				} 			} 		} 		cout<<"第"<<i+1<<"组最大数为："<<maxnum<<endl; 	}; 	system("pause"); }
user-0 提问: Android屏幕解锁图案有多少种？

回复:
user: user-0
content: 不好意思，不知道怎么给分。点了无满意结贴然后就这样了。。。。。

user: user-0
content: 学习了楼上大神的程序，向你学习，向你致敬！ 但效率上还是和第二个程序差不多，看来有时还是简单方法效率高一点！ 非常感谢！

user: user-1
content: // 389112 // 65 #include <cstdio> #include <iostream> #include <ctime> #include <algorithm> using namespace std; #define X first #define Y second typedef pair<int, int> Pt; int solve(Pt* data, int n) { 	int ret = 0; 	do 	{ 		int ok = 1; 		int used[9] = {0}; 		for (int i = 0; i + 1 < n; ++i) 		{ 			if ((data[i].X+data[i+1].X) % 2 == 0 && (data[i].Y+data[i+1].Y) % 2 == 0) 			{ 				int a = data[i].X+data[i+1].X >> 1; 				int b = data[i].Y+data[i+1].Y >> 1; 				int id = a*3+b; 				if (used[id] == 0) 				{ 					ok = 0;  					break; 				} 			} 			used[data[i].X*3+data[i].Y] = 1; 		} 		ret += ok; 	} while (next_permutation(data, data+n)); 	return ret; } int main() { 	int ans = 0; 	for (int i = 1; i < 1 << 9; ++i) 	{ 		if (__builtin_popcount(i) < 4) continue; 		Pt data[9]; 		int top = 0; 		for (int j = 0; j < 9; ++j) 		if (i & 1 << j) data[top].X = j / 3, data[top++].Y = j % 3; 		ans += solve(data, top); 	} 	cerr << ans << endl; 	cerr << clock() << endl; 	return 0; }
user-0 提问: 吃回车问题

回复:
user: user-1
content: scanf(" %c" ,xxxx);// %c前面加个空格，可以过滤掉空白符

user: user-2
content: 使用getchar()，scanf()来读取一个字符之前，最好使用getchar()来接收之前输入时的回车，如果不确定之前是否有输入，最保险的就是使用fflus(stdin);来清空缓存区
user-0 提问: 我用Ubuntu 下的vim 遇到一个诡异的问题

回复:
user: user-0
content: 引用 2 楼 zmlovelx 的回复:好像这个跟ub vim没有半毛钱的关系。我还以为是我的编译器有问题

user: user-1
content: 改成这样就行了 #include<stdio.h> #include<stdlib.h>    void arr_print(int *arr, int len) {     int i;         for (i=0;i<len;i++)     printf("%d ", arr[i]);           printf("\n"); } void swap(int *p, int *q) {     int temp=*p;     *p=*q;     *q=temp; }   void bubble_sort( int *arr, int len) {     int i, j;      //for (i=0;i<9;i++)//这里如果改成  	for(i=0;i<len-1;i++)                   //for(j=0; j<9-i; j++)//这里改成  		for(j=0; j<len-1-i; j++)         {             if (arr[j]>arr[j+1])             {                 swap(&arr[j], &arr[j+1]);                 }             }             }   int main() {     int arr[] = {2, 10, 3, 5, 6, 9, 4, 7, 8, 1};     bubble_sort(arr, sizeof(arr)/sizeof(int));           arr_print(arr, sizeof(arr)/sizeof(int));               return 0; }

user: user-2
content: 好像这个跟ub vim没有半毛钱的关系。

user: user-3
content: 因为LEN计算有问题  (sizeof(arr))/(sizeof(arr[0]))这个计算对数组来说是没问题的，但是对指针来说就没用了  arr在传递前是数组，这样计算是没问题的。但把数组做参数传递时，会退化成指针，只有地址，长度会被丢弃。所以(sizeof(arr))/(sizeof(arr[0]))算出来的就是(sizeof(int*))/(sizeof(int))也就是4/4=1，排序当然就没用了。  在C里，数组做函数参数，还是手动传递一个长度比较好
user-0 提问: 从一个数组中搜到一个关键的数字，并返回该数组的下标

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

user: user-2
content: 打印int要使用 %d.我感觉你这个数组没越界，只是循环不到索引为0的元素

user: user-3
content: 重点是%d,不是%c

user: user-4
content: 长度为5，n最大只能为4

user: user-5
content: 编译器是不检查数组越界。

user: user-0
content: 刚发上去，就看到问题了，编译器也不报错 哎  ~~
user-0 提问: 这个单链表程序在visual C++上有错误，还是我的visual C++编译器有问题，求大神指点

回复:
user: user-1
content: 楼主，不是建立一个头结点就建立链表的，最后用一个单独函数建立

user: user-2
content: 我看不懂，你的链表是怎么建立的啊

user: user-3
content: 你的程序很有问题..insert函数明明有返回值,却用的是void ..返回的是head,  那么前面函数的返回值应该是node型 继续的下面就没法看了..main函数里面的head让人不知道怎么回事.. 比较粗糙很粗糙,都得改...
user-0 提问: 刚接触C语言，在编写的时候遇到问题，不懂得如何修改，希望大家能帮帮忙，谢谢 ~

回复:
user: user-1
content: char * ch=a+b>c&&a+c>b&&b+c>a?"yes":"no";  这句中，是定义了一个字符型指针ch。 "yes"和"no"在编译的时候实际上是存储在程序中的，（a+b>c&&a+c>b&&b+c>a?"yes":"no"）返回的是这两个字符串的首地址。

user: user-1
content: 1.char ch[]; 2.char ch[]=a+b>c&&a+c>b&&b+c>a?"yes":"no"; 这两句是错的： 1.重复定义了一个变量ch。 2.第一句看起来你是想定义一个数组，但是你没有指定数组元素的个数，语法错误。 3.第二句给字符串变量赋初值的时候，等号后面只能跟字符串。  ———————— 按照你的意思，这两句修改成下面的语句，应该就对了： char * ch=a+b>c&&a+c>b&&b+c>a?"yes":"no";

user: user-2
content: 另外，我想问一下lz，你觉得这里的sqrt合适吗？

user: user-2
content: 除了楼上说的，还有就是scanf中最好不要加非输入控制符（这里指的是逗号），因为非输入控制符必须原样输出，关于scanf，lz可以看看这个——http://blog.csdn.net/u012421456/article/details/18501309

user: user-3
content: char ch[]=a+b>c&&a+c>b&&b+c>a?"yes":"no";  这个地方，重复定义，而且赋值不能这样赋。 "yes":"no"在编译器看来是个指向"yes"或“no”的字符串指针，所以不能赋值给字符串数组，如果用指针接收的话，可以这样char* p; p=a+b>c&&a+c>b&&b+c>a?"yes":"no";  如果非要用字符串数组接收的话，可以拷贝到字符串数组，比如： char ch[16]; a+b>c&&a+c>b&&b+c>a?strcpy_s(ch,"yes"):strcpy_s(ch,"no");

user: user-4
content: 引用 2 楼 PDD123 的回复:char * ch=a+b>c&&a+c>b&&b+c>a?"yes":"no";  这句中，是定义了一个字符型指针ch。 "yes"和"no"在编译的时候实际上是存储在程序中的，（a+b>c&&a+c>b&&b+c>a?"yes":"no"）返回的是这两个字符串的首地址。 还有，这个似乎是根据三个边长判断三角形的，应该放在scanf语句给a,b,c赋值以后
user-0 提问: scanf 和gets吃回车问题

回复:
user: user-1
content: 查看MSDN和调试吧

user: user-2
content: gets()会将回车一起读进字符数组里 scanf("%s")不会读回车 scanf("%c")会将空格和回车留在输入流里，下一次读取，读输入流里的下一个字符

user: user-3
content: 第一个输入读取一个整数，输入时你会输入（例如）： 3 \n(回车)，此时这两个输入会被放在输入缓冲区中，第一个3被 scanf("%d",&a) 获取，第二个回车 被 gets(str1)获取，当再一次输入时（例如）：asdjfsdjf \n 会被 gets(str3)全部读取,因为gets()读取的是字符串以\n为结尾的，总结即为楼上所说。

user: user-4
content: gets函数会吃掉输入字符串的回车符 scanf %d 会将回车符留在输入字符串中
user-0 提问: PKU北大ACM 1007 DNA Sorting 

回复:
user: user-0
content: 我重新改了代码，还是不行，求助啊 #include<stdio.h> #include<string.h> int main() { 	char a[101][52]; 	int c[51]; 	int m,n,i,j,s,b,k; 	scanf("%d%d",&m,&n); 	for(i=0;i<n;i++) 	{	 			scanf("%s",a[i]); 			a[i][m]='\0'; 	} 	for(s=0;s<n;s++) 	{ 		c[s]=0; 		for(i=0;i<m-1;i++) 			for(j=i+1;j<m;j++) 			{	 			if(a[s][i]>a[s][j]) 				c[s]++; 			} 	} 	for(i=0;i<n;i++) 	{ 	    b=c[0]; 		s=0; 		if(c[0]==-1) 		{     			k=1; 			while(c[k]==-1) 			{ 				if(k==n) return 0; 				k++; 			} 			b=c[k]; 			s=k; 		} 		for(j=0;j<n;j++) 		{	 			if(b >c[j] && c[j]!=-1) 			{ 				b=c[j]; 				s=j; 			} 		} 		c[s]=-1; 		//for(j=0;j<m;j++) 		//	printf("%c",a[s][j]); 		printf("%s\n",a[s]); 	 	 	} return 0; }

user: user-0
content: 谢谢各位的帮助 错误的原因 int c[51];要改成int c[101]; 看来太粗心了 谢谢

user: user-0
content: 是的，用char会溢出，我的算法确实不好，但是我还是想知道我的算法错误的原因 我已经有修改了，但是还是不能，wrong answer 我没有找到错误的原因，求大家帮帮忙  #include<stdio.h> #include<string.h> int main() { 	char a[101][52]; 	long c[51]={0}; 	int m,n,i,j,s,b,k; 	scanf("%d%d",&m,&n); 	for(i=0;i<n;i++) 	{	 			scanf("%s",a[i]); 			a[i][m]='\0'; 	} 	for(s=0;s<n;s++) 		for(i=0;i<m-1;i++) 			for(j=i+1;j<m;j++) 			{	 			if(a[s][i]>a[s][j]) 				c[s]++; 			} 	for(i=0;i<n;i++) 	{ 	    b=c[0]; 		s=0; 		if(c[0]==-1) 		{     			k=1; 			while(c[k]==-1) 			{ 				if(k==n) return 0; 				k++; 			} 			b=c[k]; 			s=k; 		} 		for(j=0;j<n;j++) 		{	 			if(b >c[j] && c[j]!=-1) 			{ 				b=c[j]; 				s=j; 			} 		} 		c[s]=-1; 		//for(j=0;j<m;j++) 		//	printf("%c",a[s][j]); printf("%s\n",a[i]); 	 	}											 return 0; }    谢谢各位的帮助了

user: user-1
content: 这么一堆for,即使正确也超时，想想算法。。。

user: user-2
content: a[s][m]++;感觉char当数字用不牢靠吧，测试数据较大会溢出，最好改用int...

user: user-3
content: #include <iostream> #include <vector> #include <string> #include <algorithm> #include <windows.h> using namespace std;  size_t countUnsortedness(const string &s) {     int sum = 0;     for(int i = 0;i < s.size();i++)         for(int j = i+1; j <s.size(); j++)             if (s[j] < s[i] )                 sum++;     return sum; }  bool comp(const string &s1,const string &s2) {     return countUnsortedness(s1) < countUnsortedness(s2) ? true : false; }  int main() {     vector< string > DNAs;     int n,m;     cin >> n >> m;     for(string s;m--;cin>>s,DNAs.push_back(s));     stable_sort(DNAs.begin(),DNAs.end(),comp);     for(int i = 0; i < DNAs.size(); i++)         cout << DNAs[i] << endl;     system("pause");     return 0; }
user-0 提问: 不用指针编写出顺序线性表的输入输出，以及排序，插入，删除。 可以用学生信息系统来存放数据。 用C编译

回复:
user: user-1
content: 数据结构好像都是用指针实现的吧，不用指针有意义吗？非要的话用动态数组吧，也可以实现
user-0 提问: 不用指针实现顺序线性表的输入输出，以及排序，插入，删除功能。

回复:
user: user-1
content: 引用 楼主 u013465397 的回复:不用指针编写出顺序线性表的输入输出，以及排序，插入，删除。 可以用学生信息系统来存放数据。 用C编译 都顺序表了，malloc一块内存，把那块内存当数组来用

user: user-2
content: 用动态数组，应该行吧

user: user-3
content: 数组可以解决的

user: user-4
content: 写一个结构体数组，利用下标访问。
user-0 提问: 刚学习C语言，编写的这个程序，自己找不出 错误，希望大家能指教指教，谢谢~

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

user: user-2
content: #include <stdio.h>  void main () { float a,b,c,d; printf("a,b,c="); scanf("%f,%f,%f",&a,&b,&c);  /* d=a>b?b:a; //首先对这种语句结构进行批判，一行语句应该只写一个操作运算，否则容易引起错误而且难以调试，所以?:这种操作符一般都是不推荐使用的 d>c?c:d ;   //错误在这里没有赋值 */  printf ("min=%f\n",d);  }  改成 #include <stdio.h> #include <math.h>  void main () { float a,b,c,d; printf("a,b,c="); scanf("%f,%f,%f",&a,&b,&c);  d=min(a, b); d=min(d, c); printf ("min=%f\n",d);  }

user: user-3
content: d>c?c:d ; 这句没有要干啥？

user: user-4
content: 引用d=（a>b?b:a）； d=(d>c?c:d) ; 赞同这个！

user: user-5
content: 这句话d>c?c:d ;  没有意义

user: user-6
content: #include <stdio.h>  void main () { float a,b,c,d; printf("a,b,c="); scanf("%f,%f,%f",&a,&b,&c);  d=a>b?b:a; d>c?c:d;//这句话应该修改为d=d>c?c:d;三目表达式的结果应该赋值给一个变量，由变量b接收该值 printf ("min=%f\n",d);  }

user: user-7
content: d=（a>b?b:a）； d=(d>c?c:d) ;

user: user-8
content: 关于scanf的用法，lz可以看看这个——http://blog.csdn.net/u012421456/article/details/18501309

user: user-8
content: 注释的释打错了

user: user-8
content: #include <stdio.h>  void main () { 	float a, b, c, d, min;      // 	printf("a,b,c="); 	scanf("%f,%f,%f",&a,&b,&c); 	 	d = a>b?b:a; 	min = d>c?c:d;              // 这里  	printf ("min = %f\n", min);	//还有这里  lz看看注视的地方，看能明白不 } /*另外，最好输入时输入小数，毕竟你定义的都是float 还有就是尽量不要在scanf中使用非输入控制符（这里指的是逗号）*/
user-0 提问: [SWU]自己定义连接字符串的函数的思路

回复:
user: user-1
content: 引用 6 楼 u013990248 的回复:1 #include<stdio.h>   2   3 void main()   4 {   5         char *str1      = "cs";   6         char *str2      = "dn";   7         char str3[10];   8         int i, j;   9         for(i=0; *(str1+i)!='\0'; i++){  10                 str3[i] = str1[i];  11         }  12         for(j=0; *(str2+j)!='\0'; j++){  13                 str3[j+i]       = str2[j];  14         }  15         str3[j+i]       = '\0';  16         for(i=0; str3[i]!='\0'; i++){  17                 printf("%c", str3[i]);  18         }  19         putchar('\n');  20 } 针对楼上说的解决数据溢出，我采用的字符型指针的方法，这样似乎简单了一点，但是为什么，我把str3也定义为char *str3就不行了呢？求解释！！！ 只定义指针没有分配内存，要再加一句 str3 = malloc(10); 你才有空间放数据啊

user: user-2
content: 比我强我都不喜欢做注释的

user: user-3
content: 1 #include<stdio.h>   2   3 void main()   4 {   5         char *str1      = "cs";   6         char *str2      = "dn";   7         char str3[10];   8         int i, j;   9         for(i=0; *(str1+i)!='\0'; i++){  10                 str3[i] = str1[i];  11         }  12         for(j=0; *(str2+j)!='\0'; j++){  13                 str3[j+i]       = str2[j];  14         }  15         str3[j+i]       = '\0';  16         for(i=0; str3[i]!='\0'; i++){  17                 printf("%c", str3[i]);  18         }  19         putchar('\n');  20 } 针对楼上说的解决数据溢出，我采用的字符型指针的方法，这样似乎简单了一点，但是为什么，我把str3也定义为char *str3就不行了呢？求解释！！！

user: user-3
content: 1 #include<stdio.h>   2 #include<string.h>   3   4 void main()   5 {   6         char str1[]     = "cs";   7         char str2[]     = "dn";   8         char str3[10];   9         int i, j;  10         int len1, len2;  11         len1    = strlen(str1);  12         len2    = strlen(str2);  13         for(i=0; i<len1; i++){  14                 str3[i] = str1[i];  15         }  16         for(j=0; j<len2; j++){  17                 str3[j+len1]    = str2[j];  18         }  19         str3[j+len1]    = '\0';  20         for(i=0; str3[i]!='\0'; i++){  21                 printf("%c", str3[i]);  22         } 楼上的同学，你觉得有解决你的问题吗？

user: user-4
content: 楼上这种代码风格是非常反人类的，即使正确，也会被团队所厌恶的，道理很简单：大家看起来不容易懂。

user: user-5
content: void String_Catenate(char *p1, char *p2) { 	while(*p1++); 	p1--; 	while(*p1++ = *p2++); }

user: user-4
content: 没明白楼主想问什么问题啊？ 是说怎么实现strcat吗？ 要将两个字符串连接起来，至少要给出这两个字符串的地址吧，假设为str1和str2，那么函数返回时，生成的连接后字符串放在哪里？str2吗？那么调用此函数时必须保证str2指向足够大的缓存，否则就会溢出。 也可以动态分配内存来存放，返回时将传入的指针指向分配的内存，但这种方式必须手动释放动态分配的内存。 所以，strcat选择了前者，而且还有一个strncat，限定长度。 请man strcat

user: user-6
content: Strcat函数原型如下：  //将源字符串加const，表明其为输入参数 char *strcat(char *strDest, const char *strSrc)  {   // 后文return address，故不能放在assert断言之后声明address   char *address = strDest;   assert((strDest != NULL) && (strSrc != NULL)); //对源地址和目的地址加非0断言   while(*strDest)             //是while(*strDest!=’\0’)的简化形式   {     //若使用while(*strDest++)，则会出错，因为循环结束后strDest还会执行一次++,     //那么strDest将指向'\0'的下一个位置。/所以要在循环体内++；因为要是*strDest最后指     //向该字符串的结束标志’\0’。     strDest++;   }     while(*strDest++ = *strSrc++)   {     NULL;             //该循环条件内可以用++，   }                   //此处可以加语句*strDest=’\0’;无必要   return address;     //为了实现链式操作，将目的地址返回 } 百度百科里面就有
user-0 提问: C语言 二进制文件存储读取数据结构的一个疑问

回复:
user: user-1
content: debug模式中调试器会在内存中加入一些调试信息

user: user-0
content: 为什么两个连续结构体数组就无法读取？

user: user-0
content: 引用 2 楼 user-2 的回复:2进制读取用模式"rb"... 打错。。。

user: user-2
content: 2进制读取用模式"rb"...

user: user-0
content: 求解答。。。
user-0 提问: 一个typedef看不懂

回复:
user: user-1
content: 确实比较难 看懂, 请高手来解释一下吧，全面的，不能只说个大概，我觉得PFUN有两层括号就比较难懂了。

user: user-2
content: typedef int (*(*PFUN)(int a[2],int (*(*)(int [2]))[2]))[2] ; PFUN是一个返回值为指向一个 int[2]的数组指针的函数指针。它拥有两个参数，第一个是 int [2], 另一个也是一个返回值为指向一个 int[2]的数组指针的函数指针，不过它只有一个参数，即 int [2]. 这个蹩脚的声明，估计只能出现在面试题中吧。
user-0 提问: 最短路算法求助

回复:
user: user-1
content: 引用 10 楼 buyong 的回复:引用 8 楼 M173475237 的回复:[quote=引用 7 楼 M173475237 的回复:] [quote=引用 6 楼 u012421456 的回复:] [quote=引用 5 楼 h15757160454 的回复:] [quote=引用 4 楼 u012421456 的回复:] 这个。。。lz代码问题太多啊！远的不说，先说你代码的第四五行，在C 语言中数组的长度能是这样吗？（个人见解，如有错误，敬请指正）可以啊，我记得这样好像是叫做 变长数组，C99标准定义的C语言新特性。 这个。。。lz用的什么编译器啊？ 这是VS2012的情况——  这是VC6.0的情况——[/quote]  变长数组不能是二维的。[/quote]  微软做的编译器是不支持的。。GCC阔以~[/quote]  gcc是神仙？[/quote] 你可能理解错了，gcc支持一维的边长数组。但数组在定义了以后长度就固定了，只是可以用变量定义长度而已。

user: user-2
content: 引用 8 楼 M173475237 的回复:引用 7 楼 M173475237 的回复:[quote=引用 6 楼 u012421456 的回复:] [quote=引用 5 楼 h15757160454 的回复:] [quote=引用 4 楼 u012421456 的回复:] 这个。。。lz代码问题太多啊！远的不说，先说你代码的第四五行，在C 语言中数组的长度能是这样吗？（个人见解，如有错误，敬请指正）可以啊，我记得这样好像是叫做 变长数组，C99标准定义的C语言新特性。 这个。。。lz用的什么编译器啊？ 这是VS2012的情况——  这是VC6.0的情况——[/quote]  变长数组不能是二维的。[/quote]  微软做的编译器是不支持的。。GCC阔以~[/quote]  gcc是神仙？

user: user-2
content: 引用 5 楼 h15757160454 的回复:引用 4 楼 u012421456 的回复:这个。。。lz代码问题太多啊！远的不说，先说你代码的第四五行，在C 语言中数组的长度能是这样吗？（个人见解，如有错误，敬请指正）可以啊，我记得这样好像是叫做 变长数组，C99标准定义的C语言新特性。  从这回答看lz有当政治家的潜质。但不适和程序员。程序员都是先编译看是否出错。然后查C99标准里在哪说可以这样写了。 lz这一句，楼下的把这些都给做了。

user: user-1
content: 引用 7 楼 M173475237 的回复:引用 6 楼 u012421456 的回复:[quote=引用 5 楼 h15757160454 的回复:] [quote=引用 4 楼 u012421456 的回复:] 这个。。。lz代码问题太多啊！远的不说，先说你代码的第四五行，在C 语言中数组的长度能是这样吗？（个人见解，如有错误，敬请指正）可以啊，我记得这样好像是叫做 变长数组，C99标准定义的C语言新特性。 这个。。。lz用的什么编译器啊？ 这是VS2012的情况——  这是VC6.0的情况——[/quote]  变长数组不能是二维的。[/quote]  微软做的编译器是不支持的。。GCC阔以~

user: user-1
content: 引用 6 楼 u012421456 的回复:引用 5 楼 h15757160454 的回复:[quote=引用 4 楼 u012421456 的回复:] 这个。。。lz代码问题太多啊！远的不说，先说你代码的第四五行，在C 语言中数组的长度能是这样吗？（个人见解，如有错误，敬请指正）可以啊，我记得这样好像是叫做 变长数组，C99标准定义的C语言新特性。 这个。。。lz用的什么编译器啊？ 这是VS2012的情况——  这是VC6.0的情况——[/quote]  变长数组不能是二维的。

user: user-0
content: 引用 9 楼 buyong 的回复:引用 5 楼 h15757160454 的回复:[quote=引用 4 楼 u012421456 的回复:] 这个。。。lz代码问题太多啊！远的不说，先说你代码的第四五行，在C 语言中数组的长度能是这样吗？（个人见解，如有错误，敬请指正）可以啊，我记得这样好像是叫做 变长数组，C99标准定义的C语言新特性。  从这回答看lz有当政治家的潜质。但不适和程序员。程序员都是先编译看是否出错。然后查C99标准里在哪说可以这样写了。 lz这一句，楼下的把这些都给做了。[/quote] 我是用C-FREE的。。它没报错。。我还以为这样就是可以的说。。

user: user-3
content: 引用 5 楼 h15757160454 的回复:引用 4 楼 u012421456 的回复:这个。。。lz代码问题太多啊！远的不说，先说你代码的第四五行，在C 语言中数组的长度能是这样吗？（个人见解，如有错误，敬请指正）可以啊，我记得这样好像是叫做 变长数组，C99标准定义的C语言新特性。 这个。。。lz用的什么编译器啊？ 这是VS2012的情况——  这是VC6.0的情况——

user: user-0
content: 引用 4 楼 u012421456 的回复:这个。。。lz代码问题太多啊！远的不说，先说你代码的第四五行，在C 语言中数组的长度能是这样吗？（个人见解，如有错误，敬请指正）可以啊，我记得这样好像是叫做 变长数组，C99标准定义的C语言新特性。

user: user-3
content: 这个。。。lz代码问题太多啊！远的不说，先说你代码的第四五行，在C 语言中数组的长度能是这样吗？（个人见解，如有错误，敬请指正）

user: user-0
content: 不开心

user: user-4
content: 1111肯定不对。1e9不行是说明其他地方有问题。 算法也不用看了。你这个就算写对了也肯定是超时/爆内存的。

user: user-0
content: 把缩放循环中的min变量初始化为1e9也不行.
user-0 提问: c初学者，请大家帮忙下，关于哥德巴赫猜想的问题。谢谢。

回复:
user: user-0
content: 引用 4 楼 Falleyes 的回复:在这里要简单地组织逻辑就要使用goto  #include <stdio.h> #include<math.h>  int main(void) { 	int m, i,j;  	for (m = 6; m <= 100; m = m + 2) 	for (i = 2; i < m - 1;){ 		for (j = 2; j <= sqrt(i); j++){ 			if (i%j == 0){ 				goto next; 			} 		} 		for (j = 2; j <= sqrt(m - i); j++){ 			if ((m - i) % j == 0) 				goto next; 		} 		printf("%d=%d+%d\n", m, i, m - i); 		break; 	next:++i; 	} 	return 0; }谢谢你，终于不用纠结了。

user: user-1
content: 在这里要简单地组织逻辑就要使用goto  #include <stdio.h> #include<math.h>  int main(void) { 	int m, i,j;  	for (m = 6; m <= 100; m = m + 2) 	for (i = 2; i < m - 1;){ 		for (j = 2; j <= sqrt(i); j++){ 			if (i%j == 0){ 				goto next; 			} 		} 		for (j = 2; j <= sqrt(m - i); j++){ 			if ((m - i) % j == 0) 				goto next; 		} 		printf("%d=%d+%d\n", m, i, m - i); 		break; 	next:++i; 	} 	return 0; }

user: user-0
content: 引用 2 楼 Falleyes 的回复:为什么要改成纯嵌套循环呢？一般都是把多层嵌套改成函数调用来简化错误检查，你这是背道而驰，练习不是这样练的。只是想这样弄下，以及知道错在哪里。

user: user-1
content: 为什么要改成纯嵌套循环呢？一般都是把多层嵌套改成函数调用来简化错误检查，你这是背道而驰，练习不是这样练的。

user: user-2
content: 哥们，你和我一样，我也是小白，也是来学习的。
user-0 提问: 新人小问：关于the c programming language和 c primer plus

回复:
user: user-1
content: The C++ Programming Language太厚， 如果是纯粹学习c语言，还是看看 The C Programming Language.

user: user-2
content: the c++ programmming language 不建议初学者看，建议先看c++ primer
user-0 提问: 新手，求大神帮忙，急急急急急~~！

回复:
user: user-1
content: 嗯，这应该是自带的，你按一楼的话试试吧，二楼的怕是不行，有可能会出现更多错误

user: user-2
content: 找到这两个函数的位置，全部注释或者删除掉就可以了。

user: user-3
content: 这两个函数应该是别人自己写的，你需要包含他的C/C++源文件或者是库文件。  引用 楼主 z356675143 的回复:c:(.text+0x87a): undefined reference to `DebugHex' c:(.text+0x8b4): undefined reference to `Debug'  linux环境下编译报错， 是这个函数没有包含头文件吗？   DebugHex和Debug我在C语言里从来没见到过，麻烦大神告诉我这个是要包含哪个头文件？ 或者是被的错误，急急急~~！
user-0 提问: 问了一群人都没搞定的蛋疼socket

回复:
user: user-1
content: 主线程 listen（s，5） 创建线程传入s，将线程置为挂起 将线程恢复   第一个记录得到000，去GetLastError  看下是什么错误

user: user-2
content: accept以后用newfd工作, 那个self里的值不代表新接入的连接.

user: user-0
content: 放到线程里 accept 就有这个问题，但是放到主进程里 界面会卡死。。。 求大神解决下

user: user-0
content: 问题解决 我再主进程先accept了一次  后来开线程出的问题  不能这么干 谢谢大家！

user: user-0
content: user-3 我只单独开辟了一个线程循环accept 新来的链接 怎么会产生惊群现象呢？ 而且我查看了accept返回值 0000:0的也是正常的。。。唯独这个含对方ip信息的结构体是空的。。

user: user-3
content: 多线程accept一个fd会惊群，而你没有检查accept的返回值。
user-0 提问: 代码看不懂啊, 求助! 

回复:
user: user-1
content: 应该是初始化这个结构体数组所有值都为0

user: user-2
content: 猜一猜也能猜出来是什么意思吧

user: user-3
content: gnu c对c90的扩充语法。在这里的作用就把0~NUM_MEM_AREAS-1范围内的数组元素初始化为{.start...}的值，即全为0。  看参考gcc编译器手册获取更多细节，或者网络搜索“Designated Initializers”关键字获取帮助信息。

user: user-4
content: 引用 1 楼 zmlovelx 的回复:初始化整个数组中的结构体成员为0 第一次见到，学习了

user: user-5
content: 看不懂没办法。

user: user-6
content: 引用 16 楼 JiMoKuangXiangQu 的回复:gcc编译器提供的支持。如果使用内嵌在Dev C++，或mSys，minGW之类的环境也包含由gcc的支持。 只是编译器一种实现，未必只有gcc支持，不过我所知道的编译器里面，暂时还只有gcc支持，可能一些我不知道的编译器也提供这样的语法支持，得参看编译器的文档，呵呵。高手啊

user: user-7
content: 共同关注~~~

user: user-8
content: 嵌入式语言的某种扩展吧

user: user-3
content: gcc编译器提供的支持。如果使用内嵌在Dev C++，或mSys，minGW之类的环境也包含由gcc的支持。 只是编译器一种实现，未必只有gcc支持，不过我所知道的编译器里面，暂时还只有gcc支持，可能一些我不知道的编译器也提供这样的语法支持，得参看编译器的文档，呵呵。

user: user-0
content: 引用 13 楼 JiMoKuangXiangQu 的回复:gnu c对c90的扩充语法。在这里的作用就把0~NUM_MEM_AREAS-1范围内的数组元素初始化为{.start...}的值，即全为0。  看参考gcc编译器手册获取更多细节，或者网络搜索“Designated Initializers”关键字获取帮助信息。 高手这个是不是只用于linux上啊?windows可以吗?

user: user-9
content: 楼主，这种写法能通过编译么？

user: user-10
content: 不能直接翻译的描述性语言吧 意思是在声明定义变量的时候，同时对它进行初始化整个数组中的结构体成员为0

user: user-11
content: 在声明定义变量的时候，同时对它进行初始化

user: user-12
content: 我也第一次见这样的写法

user: user-13
content: 初始化整个数组中的结构体成员为0

user: user-14
content: 楼主，哪抄来的代码啊。。。  memory_map.used = 0;  这句明显也有错啊

user: user-15
content: 引用 楼主 winnerid 的回复:memory_area_t memory_map[NUM_MEM_AREAS] = {     [0 ... (NUM_MEM_AREAS - 1)] = {              .start = 0,                            .size = 0,                            .used = 0       },}; 还真没见过这种情况 不过，我引用lz的话的最后面的两个大括号中间是个逗号，这个。。。这样怕是不行吧（个人见解）

user: user-16
content: [0 ... (NUM_MEM_AREAS - 1)]  这么写还真没见过，不一定能编译

user: user-0
content: 引用 5 楼 PDD123 的回复:楼主，这种写法能通过编译么？ 书上写的应该是可以的,这个是嵌入式里面的代码,难道这个是C语言新支持的写法? 我也头一次见,意思能懂,但真不知道还有这种怪语法
user-0 提问: 有时间的请帮我看下这个程序  谢谢    错误我不会找了

回复:
user: user-1
content: 楼主，建议你发完贴子后看一下排版。。。有点乱。。。一般看到这么乱，没人看的。这道题是去年的蓝桥杯预赛的题，我做到过，建议你可以搜搜看

user: user-2
content: 这错误。。。 lz还是看看这个吧——http://www.cnblogs.com/shendiao/archive/2013/05/05/3061340.html
user-0 提问: 以下产生的效果，是什么原因造成的

回复:
user: user-1
content: i是unsigned char 类型，最大为255,二进制表示是1111 1111,255+1=256，二进制表示是1 0000 0000，i占8位，有成了 0000 0000，继续循环，这样就无限循环了 把i改成int就好了
user-0 提问: 请看下面的代码，运行Test之后是否存在问题？为什么？

回复:
user: user-1
content: 第二个是局部变量吧

user: user-0
content: 引用 2 楼 user-4 的回复:GetMemory2类型也不对。那里不对，我看没错啊

user: user-2
content: GetMemory的参数的是二级指针。即GetMemory(char** p).在main函数调用时用GetMemory(&str).当然GetMemory函数内部还要改动一下。 GetMemory2函数里面的p2指向的内存是不可修改的。所以也不正确。要使用static char p2[20]这样的定义。

user: user-3
content: 引用 3 楼 u013085807 的回复:引用 2 楼 user-4 的回复:GetMemory2类型也不对。那里不对，我看没错啊 char* GetMemory2(void) {    const char p[] = "hello world";    return *p } 噗... *p返回的是p[0]也就是h，不是整个字符串 而且p是局部变量，返回时被销毁了，另一边使用了一个无效的地址（假设你正确的返回p，不是*p），是很危险的

user: user-0
content: 引用 5 楼 Adol1111 的回复:引用 3 楼 u013085807 的回复:[quote=引用 2 楼 user-4 的回复:] GetMemory2类型也不对。那里不对，我看没错啊 char* GetMemory2(void) {    const char p[] = "hello world";    return *p } 噗... *p返回的是p[0]也就是h，不是整个字符串 而且p是局部变量，返回时被销毁了，另一边使用了一个无效的地址（假设你正确的返回p，不是*p），是很危险的[/quote]是的，以前我做过这样的，那个时候我写对了，今年忘了很多东西

user: user-4
content: GetMemory2类型也不对。

user: user-4
content: Void GetMemory(char* p) {     p=(char*)malloc(100);//编译器分配内存后，函数执行后，就销毁了 }  错了，应该使用 Void GetMemory(char** p) {     *p=(char*)malloc(100);//编译器分配内存后，函数执行后，就销毁了 } 或者 char* GetMemory() {     return malloc(100);//编译器分配内存后，函数执行后，就销毁了 }
user-0 提问: 小白，请问队列顺序存储结构这两种表述方法的区别

回复:
user: user-1
content: 3楼正解！！！！！！！！！

user: user-2
content: 第一种：因为数据项给的是指针（int *Base）所以可以动态分配 SqQuence q; q.base = (int *)malloc(?); 第二种：数据项是一个固定的数组，所以只要确定了int data[maxsize]中maxsize大小就固定了 两种情况没有优劣之分，只是应用的情况不同罢了，第一种一般是不清楚实际队列大小，可以动态的规划，所以不存在满队的情况

user: user-0
content: 各位大神，求指导

user: user-0
content: 在数据结构区没人回答，特来这里问问~~
user-0 提问: C语言先序建立二叉树 问题

回复:
user: user-1
content: 1 楼主的意思应该是结构体节点的指针吧，应该不是二级指针吧 2 同楼上，实际为递归调用，把自己有调用了一次，效果就是创建了右子树

user: user-2
content: 1.对，指针的指针 2.CreateBinTree(&(*T->rchild)); T的类型是BiTree指针，*T是BiTree，*T->rchild就是这个BiTree的右孩子，其类型也是BiTree，最后加上&，就是指向BiTree的指针了，这样才符合CreateBinTree函数的参数类型
user-0 提问: C语言，栈的初始化失败

回复:
user: user-1
content: 接2楼的,也可以采用下面的写法： SeqStack *s; s = (SeqStack *)malloc(sizeof(SeqStack));

user: user-2
content: SeqStack *s; 你在这里只是定义了一个指针，并没有真正的分配内存，所以当你把这个变量传给初始化函数的 时候在进行 s->base=(ElemType *)malloc(stack_size*sizeof(ElemType)); 这一步是 s->base是不能找到任何地址的，所有这次赋值操作就会失败  改成这样就好了 SeqStack s; Initial(&s);/*此处调用初始化函数失败*/

user: user-3
content: Initial(s);/*此处调用初始化函数失败*/ 这个s传进去是空指针，然后 s->base 这样肯定会出错吧
user-0 提问: 用宏定义写出swap xy,

回复:
user: user-1
content: 引用 6 楼 u013085807 的回复:[quote=引用 1 楼 JiMoKuangXiangQu 的回复:] #define swap(x, y) \ 	x = x + y; \ 	y = x - y; \ 	x = x - y; 是的，刚才那个是从网上复制的，别人写的，这个是反斜杠持续符，但是vim 编译说有游离的'\'的错误[/quote]  编译一下看看，不应该有什么错误，要注意直接复制。在'\'不能有任何字符（包含空格，TAB）。

user: user-0
content: 引用 1 楼 JiMoKuangXiangQu 的回复:#define swap(x, y) \ 	x = x + y; \ 	y = x - y; \ 	x = x - y; 是的，刚才那个是从网上复制的，别人写的，这个是反斜杠持续符，但是vim 编译说有游离的'\'的错误

user: user-2
content: 引用 3 楼 greatchina01 的回复:#define swap(x,y){y^=x^=y^=x;}

user: user-3
content: +-法的宏有可能会溢出的。

user: user-4
content: #define swap(x,y){y^=x^=y^=x;}

user: user-5
content: 引用 1 楼 JiMoKuangXiangQu 的回复:#define swap(x, y) \ 	x = x + y; \ 	y = x - y; \ 	x = x - y; 正解。

user: user-1
content: #define swap(x, y) \ 	x = x + y; \ 	y = x - y; \ 	x = x - y;
user-0 提问: C语言疑问 当函数参数是2个数组时

回复:
user: user-0
content: 上面那个程序自定义函数出现主调函数之前，所以在主调函数里面不需要对其作声明。我想请问的是，如果要对其作声明，该怎么做？？？麻烦自己调试下再说话，我在CB下总是出现错误。。。。。郁闷死了

user: user-1
content: 引用 9 楼 Adol1111 的回复:引用 8 楼 Automation_dmu 的回复:[quote=引用 6 楼 wq_vincent 的回复:] 上面那个程序自定义函数出现主调函数之前，所以在主调函数里面不需要对其作声明。我想请问的是，如果要对其作声明，该怎么做？？？麻烦自己调试下再说话，我在CB下总是出现错误。。。。。郁闷死了在函数体内是不允许声明函数，需放在全局域进行声明。 谁跟你说C中不能在函数体内声明函数的？？ 函数不能嵌套定义，但允许函数中包含其他函数的声明[/quote]我表述有误吧！

user: user-2
content: 你可以将函数定义放在主函数之前，这样就不用声明了，不然可以这样声明 vod fun(int arr1[] int arr2[])；

user: user-3
content: #include<stdio.h> #include<string.h>   int main() {     void constr(char *a,char *b);     char str1[50],str2[50];     gets(str1);     gets(str2);     constr(str1,str2);     puts(str1); }  void constr(char *a,char *b) {     strcat(a,b); }

user: user-3
content: 引用 8 楼 Automation_dmu 的回复:引用 6 楼 wq_vincent 的回复:上面那个程序自定义函数出现主调函数之前，所以在主调函数里面不需要对其作声明。我想请问的是，如果要对其作声明，该怎么做？？？麻烦自己调试下再说话，我在CB下总是出现错误。。。。。郁闷死了在函数体内是不允许声明函数，需放在全局域进行声明。 谁跟你说C中不能在函数体内声明函数的？？ 函数不能嵌套定义，但允许函数中包含其他函数的声明

user: user-1
content: 引用 6 楼 wq_vincent 的回复:上面那个程序自定义函数出现主调函数之前，所以在主调函数里面不需要对其作声明。我想请问的是，如果要对其作声明，该怎么做？？？麻烦自己调试下再说话，我在CB下总是出现错误。。。。。郁闷死了在函数体内是不允许声明函数，需放在全局域进行声明。

user: user-1
content: 引用 5 楼 wq_vincent 的回复:我有个程序 是关于字符串连接的。  constr(a,b) char a[50],b[50]; {     strcat(a,b); }   int main() {     char str1[50],str2[50];     gets(str1);     gets(str2);     constr(str1,str2);     puts(str1); } K&R的声明风格，兼容性不好，还是乖乖的用ANSI的风格吧

user: user-0
content: 我有个程序 是关于字符串连接的。  constr(a,b) char a[50],b[50]; {     strcat(a,b); }   int main() {     char str1[50],str2[50];     gets(str1);     gets(str2);     constr(str1,str2);     puts(str1); }

user: user-4
content: void fun1(int arr1[],int arr2[]);//函数形参为数组 参见《C primer plus》266页 把数组当做函数的参数的时候要注意保护数据，如果你不想数字里面的人数据被修改，你还可以这样申明void fun1(const int arr1[],const int arr2[]);//函数形参为数组

user: user-5
content: 这个简单 你实在不行可以声明成void* 你想怎么着都行  void func(void *array1, int size1, void *array2, int size2); 你到函数里可以进行强制类型转换。具体转成什么你就自己看着办吧。  搞定，给分！

user: user-6
content: 数组形参可以声明为指针类型

user: user-7
content: void Function(int *a,size_t aSize,int *b size_t bSize);
user-0 提问: 图示 指针与内存

回复:
user: user-0
content: 哈哈，赵大侠都出来了。 一幅图就想让新手搞懂所有的内存知识，我估计够呛。期盼高手出幅这样的内存图，就一幅，别整成蚊子大小的字啊。 从本质上讲，所有内存都是可读可写的。否则，某个内存中的值当初是如何写入的呢？只是有不同的权限限制而已。

user: user-0
content: 呵呵，当然是Debug环境啊，上图标的不是清清楚楚嘛, Win32 Debug，你要是换个环境，如BC, TC啥的，内存的值可能就变了，跟编译器密切相关。

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

user: user-2
content: 引用 7 楼 iamkconghua 的回复:另外，针对XP + VC6.0， “p1没有初始化,其值是不定的,是随机的” 这句话是不对的。 对上述环境而言，p1不是随机的，就是0xCCCCCCCC。 之所以将其初始化为许多CC，是因为0xCC是对应的汇编代码是3号中断即int 3，逆向工程中常用int 3来进行跟踪二进制代码。 不对。你还得指出是Debug。否则别指望烫烫烫烫。

user: user-0
content: 另外，针对XP + VC6.0， “p1没有初始化,其值是不定的,是随机的” 这句话是不对的。 对上述环境而言，p1不是随机的，就是0xCCCCCCCC。 之所以将其初始化为许多CC，是因为0xCC是对应的汇编代码是3号中断即int 3，逆向工程中常用int 3来进行跟踪二进制代码。

user: user-0
content: 这些知识都知道。我是问针对上图的具体环境，XP + VC6.0，上图的具体错误在哪？谢谢。

user: user-3
content: 简单的说就是: 一个进程中有从地址 0x0000 ~~  0xfff..fff (2^32 即4GB)大小的内存空间 粗略的可以认为这些内存一部分是空的,假的,没有对应实际的物理内存.另一部分是已经分配了的,比如装在了我们程序的内存. 在分配了的内存中,又有几种,有些内存只能读,有些内存只能写,有些内存可读写,还有一些内存可以执行代码,这些是对内存权限的设置,并且是可以修改的.   p1没有初始化,其值是不定的,是随机的,是历史上遗留下来的过期数据,可以指向任何一个地址,比如未分配的内存,或者只写的内存等.  我们的程序在编译生成时,会把字符串常量默认存储在只读的内存区域中,所以p2指向的是只读的,写会发生错误,但是可以修改这个内存变成可读写  p3是 栈内存,默认是可读写

user: user-0
content: 上述代码本身是有错误的，图中已经说过了。请指出其他错误。谢谢。

user: user-0
content: 引用 2 楼 u013573183 的回复:虽然1个小时弄完了,但是不得不告诉你,是错的... 请指教！

user: user-3
content: 虽然1个小时弄完了,但是不得不告诉你,是错的...

user: user-4
content: good，很直观~~~~~
user-0 提问: 请教大神们的一个二级程序问题

回复:
user: user-0
content: 各位大神，，这个我已经用tc编译过了，，，结果正确，是6，，，我也好疑惑那个，p【i】=i+1，，

user: user-1
content: 引用 6 楼 u013410838 的回复:1. 你那个for循环应该是for(i=0;i<9;i++) 吧 2. P为int*类型的，因此p指向二维数组的首地址时候，小标每加一，指针向后移动一个int大小的内存，举个例子：p[0]就是array[0][0],  p[1]就是array[0][1], p[2]就是array[0][2], p[3]就是array[1][0]  3. 数组结果如图     sorry！！！！ 行号和列号标反了

user: user-1
content: 1. 你那个for循环应该是for(i=0;i<9;i++) 吧 2. P为int*类型的，因此p指向二维数组的首地址时候，小标每加一，指针向后移动一个int大小的内存，举个例子：p[0]就是array[0][0],  p[1]就是array[0][1], p[2]就是array[0][2], p[3]就是array[1][0]  3. 数组结果如图

user: user-2
content: int array[3][3] 3*3数组 下标分别是[0-2][0-2]

user: user-3
content: 引用 2 楼 zhccl 的回复: for(i=p;i<9;i++) 这句代码应该编译不过吧，把一个 指针赋值给 int ？？你确认你编译器能编过？ ++, p 是int * 类型数据，i 是int型数据，这里会报错

user: user-4
content: void main() {    int array[3][3],*p,i;    p=&array[0][0];    for(i=0;i<9;i++)//感觉这里应该是i=0吧，怎么能把p指针赋值给i    {      p[i]=i+1;    }    printf("%d\n",array[1][2]); } p指针指向array数组的首地址，然后for循环为数组的9个元素依次赋值，(1,2,3),(4,5,6),(7,8,9) 之后输出array[1][2]，所以是6

user: user-5
content: for(i=p;i<9;i++) 这句代码应该编译不过吧，把一个 指针赋值给 int ？？你确认你编译器能编过？

user: user-6
content: 1 2 3 4 5 6 7 8 9
user-0 提问: 本人做了一个俄罗斯方块程序,但玩着玩着就变白了希望有大神帮调试或指点迷津

回复:
user: user-1
content: 我的出成绩了 就会解决滴

user: user-0
content: 引用 3 楼 u013670102 的回复:我也是 惶恐ING 引用 3 楼 u013670102 的回复:我也是 惶恐ING 你的跟我的也一样,有解决办法吗?

user: user-1
content: 我也是 惶恐ING

user: user-0
content: 引用 1 楼 derekrose 的回复: 新人出来咋到什么都不懂

user: user-2

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

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

回复:
user: user-1
content: 引用 1 楼 user-2 的回复:推荐Qt，语句简单 Qt用C？连标准C++都算不上。 纯C就GTK+，如果不想艹xlib之类。虽然没多少意思。

user: user-0
content: 那用qt时怎么在mainwindow里添加widget函数？？

user: user-2
content: 推荐Qt，语句简单
user-0 提问: 指向字符串的指针为何不能用来修改此字符串

回复:
user: user-1
content: 常量数据时无法修改的，只能先开辟内存并复制到开辟的内存内才行。

user: user-2
content: 不喜欢抠字眼，不过遇到抠字眼的，还是要更精确点说“常量字符串存放在静态存储区”,并没说他就是静态对象，也没说完全不能修改，通过某些手段也是可以的。只是不想扯太远。 引用 11 楼 KenZhang1031 的回复:我说常量对象位于静态存储区，没说它是静态对象。 [quote=引用 5 楼 FrankHB1989 的回复:] [quote=引用 1 楼 twhold 的回复:] char pa[50]="ABCDE";  "ABCDE"存储在常量区,pa指向常量区所以不能修改. 要改你可以给Pa申请一个空间,然后在COPY. pa = (char*)malloc(50 * sizeof(char)); 引用 3 楼 u012586257 的回复:char *pb="EFG" 我觉得问题是在这句。改成 char *pb; 或者 char pb[4]="EFG"；应该就好了 C什么时候告诉你们就放在“常量区”了。 GCC的-fwritable-strings是干什么吃的？  引用 4 楼 KenZhang1031 的回复:"ABCDE"常量字符串在静态数据区，无法修改。只能复制到栈或堆中，再做修改。  扯蛋。静态对象没法修改？唬谁呢？  修改字符串字面量的C程序行为未定义。 因此实现可以假定用户不修改这些字面量，可以作为常量对待（虽然没这个保证）。 要改就自己复制出来。 [/quote][/quote]

user: user-2
content: 我说常量对象位于静态存储区，没说它是静态对象。 引用 5 楼 FrankHB1989 的回复:[quote=引用 1 楼 twhold 的回复:] char pa[50]="ABCDE";  "ABCDE"存储在常量区,pa指向常量区所以不能修改. 要改你可以给Pa申请一个空间,然后在COPY. pa = (char*)malloc(50 * sizeof(char)); 引用 3 楼 u012586257 的回复:char *pb="EFG" 我觉得问题是在这句。改成 char *pb; 或者 char pb[4]="EFG"；应该就好了 C什么时候告诉你们就放在“常量区”了。 GCC的-fwritable-strings是干什么吃的？  引用 4 楼 KenZhang1031 的回复:"ABCDE"常量字符串在静态数据区，无法修改。只能复制到栈或堆中，再做修改。  扯蛋。静态对象没法修改？唬谁呢？  修改字符串字面量的C程序行为未定义。 因此实现可以假定用户不修改这些字面量，可以作为常量对待（虽然没这个保证）。 要改就自己复制出来。 [/quote]

user: user-3
content: 认罪..误导LZ了,感谢教育`!`

user: user-4
content: char pa[50]="ABCDE"; char *pb="EFG"; pb[1]='A';  pb只是一个指针，指向一个字符串，在这里pb指向的是字符串常量 LZ最好了解下微机原理和编译原理

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

user: user-6
content: pb=pa; pb[1]='A'; 这样就可以了

user: user-7
content: 引用 5 楼 FrankHB1989 的回复:[quote=引用 1 楼 twhold 的回复:] char pa[50]="ABCDE";  "ABCDE"存储在常量区,pa指向常量区所以不能修改. 要改你可以给Pa申请一个空间,然后在COPY. pa = (char*)malloc(50 * sizeof(char)); 引用 3 楼 u012586257 的回复:char *pb="EFG" 我觉得问题是在这句。改成 char *pb; 或者 char pb[4]="EFG"；应该就好了 C什么时候告诉你们就放在“常量区”了。 GCC的-fwritable-strings是干什么吃的？  引用 4 楼 KenZhang1031 的回复:"ABCDE"常量字符串在静态数据区，无法修改。只能复制到栈或堆中，再做修改。  扯蛋。静态对象没法修改？唬谁呢？  修改字符串字面量的C程序行为未定义。 因此实现可以假定用户不修改这些字面量，可以作为常量对待（虽然没这个保证）。 要改就自己复制出来。 [/quote]  引用错了。  引用 2 楼 ganpengjin1 的回复:char *pb="EFG";  因为指向了一个常量区，数据不能被修改 ↑3L不算，替换。

user: user-7
content: 引用 1 楼 twhold 的回复:char pa[50]="ABCDE";  "ABCDE"存储在常量区,pa指向常量区所以不能修改. 要改你可以给Pa申请一个空间,然后在COPY. pa = (char*)malloc(50 * sizeof(char)); 引用 3 楼 u012586257 的回复:char *pb="EFG" 我觉得问题是在这句。改成 char *pb; 或者 char pb[4]="EFG"；应该就好了 C什么时候告诉你们就放在“常量区”了。 GCC的-fwritable-strings是干什么吃的？  引用 4 楼 KenZhang1031 的回复:"ABCDE"常量字符串在静态数据区，无法修改。只能复制到栈或堆中，再做修改。  扯蛋。静态对象没法修改？唬谁呢？  修改字符串字面量的C程序行为未定义。 因此实现可以假定用户不修改这些字面量，可以作为常量对待（虽然没这个保证）。 要改就自己复制出来。

user: user-2
content: "ABCDE"常量字符串在静态数据区，无法修改。只能复制到栈或堆中，再做修改。

user: user-8
content: char *pb="EFG" 我觉得问题是在这句。改成 char *pb; 或者 char pb[4]="EFG"；应该就好了

user: user-9
content: char *pb="EFG";  因为指向了一个常量区，数据不能被修改

user: user-3
content: char pa[50]="ABCDE";  "ABCDE"存储在常量区,pa指向常量区所以不能修改. 要改你可以给Pa申请一个空间,然后在COPY. pa = (char*)malloc(50 * sizeof(char));
user-0 提问: 强制类型转换的疑问

回复:
user: user-0
content: 多谢提点，确实是我没搞清楚，小整型向大整型拓展时候的位拓展和它原本的有无符号有关系，这一点我之前没有弄清楚，多谢！所以(unsigned int)(signed short)y 会变成0xffffffff

user: user-1
content: #include <stdio.h>  int main(){ 	unsigned int x = 0xdeadbeef; 	unsigned short y = 0xffff; 	signed int z = -1;  	printf("0x%hx\n", y); 	printf("0x%hx\n", (signed short)y); 	return 0; }   格式描述符与实参类型要一一对应。

user: user-2
content: printf自作主张给你看转成int的结果了 y是unsigned short 的正数 转int 前面补全零 实际是把0x0000ffff输出了 y为unsigned short 的正数 0xffff 转short int 就成为 负数 再转int 前面就补全1.... 补码表示+小整形向大整形扩展的特点 你还是下断点、单步调试，看内存吧

user: user-0
content: 多谢指教啊，我把程序又改了下，变成了：  #include <stdio.h>  int main(){ 	unsigned int x = 0xdeadbeef; 	unsigned short y = 0xffff; 	signed int z = -1;  	printf("0x%x\n", y); 	printf("0x%x\n", (unsigned int)(signed short)y); 	return 0; }  得到的结果是一样的 但是我就不懂了 第二个printf输出的为什么不是0x0000ffff呢？

user: user-3
content: printf 把输入的参数中小域32bit的参数提升为 int进行处理， 无符号的0xffff执行0扩展即提升为 0x0000ffff ， 而有符号的0xffff执行符号位扩展则会提升为 0xffffffff
user-0 提问: 自己最近《学数据结构与算法》的一些笔记<一>----------连载（不定期更新）

回复:
user: user-1
content: 学习数据结构的目的是：怎么将数据存储在内存当中！ 目的是为算法服务，不是将数据存在内存中。

user: user-2
content: 写博客是首选！这里问问题解答问题为主战场

user: user-3

user: user-4
content: 长期占座，跟楼主一起学习数据结构~

user: user-5
content: 《数据结构（C语言版）》 《算法精解（C语言实现）》

user: user-5
content: 为什么要有数据结构这个东东？ 因为要将现实世界或者抽象理论中的各种数据保存在计算机外存（光盘、硬盘、U盘……）或内存（ROM、RAM、SRAM……）里面的二进制字节数组中。 然后让CPU这个只会执行预先保存好的加减乘除移位条件转移……等机器指令的家伙按照人的意志去处理这些数据。至于具体如何处理就是所谓算法。  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-6
content: 我们也是刚开数据结构课 lz，建议你还是写博客吧！，那样效果应该会更好
user-0 提问: 求C语言高手指教

回复:
user: user-1
content: lz你37、38行输入的m n 就相当于第4行的 m 和 k， 第9行到18行是判断是否为素数；19行到28行表示你输入的素数后边（这里你输入的是17）还要几个（这里你输入的是5）素数，然后将这些素数放到数组里，这样lz应该能看懂了吧？（如果我哪里说的不对，就请点出来，感激不尽，不说了，睡觉啊）

user: user-2
content: if (flag==1&&j>=i) 为什么这部分要j>=i? 因为正常循环结束时 j>=i,否则是break中断出来的 当然这里flag==1 j>=i 两个条件重复了，只判断一个应该也够了

user: user-1
content: 关于scanf的用法lz可以看看这个——http://blog.csdn.net/u012421456/article/details/18501309

user: user-1
content: #include <conio.h> #include <stdio.h>  void fun(int m, int k, int xx[]) { 	int g = 0, i, j, flag = 1; 	for(i=m+1; i<m*m; i++) 	{ 		for(j=2; j<i; j++) 		{ 			if (i%j != 0) 				flag = 1; 			else 			{  				flag = 0; 				break; 			}  		} 		if (flag==1 && j>=i) 		{ 			if (k >= 0) 			{ 				xx[g++] = i; 				k--; 			} 			else 				break; 		} 	} }  int main() {     int m, n, zz[1000];     FILE *out; 	printf("\nPlease enter two integers:"); 	scanf("%d %d",&m, &n);    //  scanf中不要加非输入控制符（这里指的是逗号），加了必须原样输出 	fun( m, n, zz); 	 	for(m=0; m<n; m++) 		printf("%d ", zz[m]); 	printf("\n"); 	fun(28, 20, zz); 	out = fopen("out.dat", "w"); 	 	for (m = 0; m < 20; m++) 		fprintf(out, "%d\n", zz[m]); 	fclose(out);	 	return 0; }
user-0 提问: C语言文件处理的问题

回复:
user: user-1
content: while(1){ 						fread(&c,sizeof(char),1,pFile); 						if(feof(pFile)){ 							break; 						} 						n++; 					} 					pMemory=(char *)malloc(n);		 					fseek(pFile,0,SEEK_SET); 					for(i=0;i<n;i++){ 						fread(&c,sizeof(char),1,pFile); 						*pMemory=c;						//数据存入动态缓冲区 						pMemory++; 					} 					pMemory-=n; 					fclose(pFile); 					//数据写操作，放在动态内存中 					if((pFile=fopen(szFileNameBuffer,"wb"))==NULL){ 						exit(0); 					} 					i=0; 					j=n; 					while(n--){ 						if(k==i){ 							i=0; 						} 						c=*pMemory; 						pMemory++; 						c+=szKey[i++]; 						fwrite(&c,sizeof(char),1,pFile); 					}

user: user-0
content: 我就是想读文件的一个数据，在把它加上一个数，在写到相应的位置

user: user-0
content: 我是fgetc（）后读出1，指针指向2，fseek()后又指向1，fputc（）后指向2，再次fgetc()，读的是2呀？不是么？

user: user-2
content: fseek会改变 文件的读写位置  注意是读和写 读了一个，然后退回去写一个，再读一个的时候其实读的就是退回去的那个，一直这样下去～ 假设文件内容为：12345 文件打开后，文件读指针指向1，fgetc后指向2，调用fseek之后，把读写位置又都指向1，又读1...

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

user: user-4
content: 而且从lz的代码看来，兼有读写操作fgetc(),fputc()。

user: user-4
content: lz多提供信息。  至于feof，常有误用，下面的代码feof的使用范例： /* feof example: byte counter */ #include <stdio.h>  int main () {   FILE * pFile;   int n = 0;   pFile = fopen ("myfile.txt","rb");   if (pFile==NULL) perror ("Error opening file");   else   {     while (fgetc(pFile) != EOF) {       ++n;     }     if (feof(pFile)) {       puts ("End-of-File reached.");       printf ("Total number of bytes read: %d\n", n);     }     else puts ("End-of-File was not reached.");     fclose (pFile);   }   return 0; }  该示例代码来自《C++ Reference》。