Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 处理字符串的时候假如出现结束符该怎么办

回复:
user: user-1
content: 引用 9 楼 sasuke38 的回复:[quote=引用 8 楼 NexTor 的回复:] 我的思路是既然data[i] == s会出现0，而0是不需要的，那么就用0的加密的结果来替换掉。 解密的时候第一次解密肯定是0，而0对你来说肯定是不用的，所以出来0就说明是data[i] == s的情况。 前提是\0是不会被用到加密中的。  你的意思是当   data[i] == s  的时候  就   data[i] == 0^s 是吧   0^s的结果就是s  没什么变化  于是我直接跳过就行了  和我的方式是一样的    加密的内容是字符串   所以中间肯定没有 \0[/quote] 是的，我想到的最简单的方法就是这样吧，解密的话如果data[i]^s的结果是0的话，就说明加密前的data[i]应该就是s值，因为加密前的字符串中没有\0 不知道这样的方法可不可行

user: user-0
content: 引用 8 楼 NexTor 的回复:我的思路是既然data[i] == s会出现0，而0是不需要的，那么就用0的加密的结果来替换掉。 解密的时候第一次解密肯定是0，而0对你来说肯定是不用的，所以出来0就说明是data[i] == s的情况。 前提是\0是不会被用到加密中的。  你的意思是当   data[i] == s  的时候  就   data[i] == 0^s 是吧   0^s的结果就是s  没什么变化  于是我直接跳过就行了  和我的方式是一样的    加密的内容是字符串   所以中间肯定没有 \0

user: user-1
content: 我的思路是既然data[i] == s会出现0，而0是不需要的，那么就用0的加密的结果来替换掉。 解密的时候第一次解密肯定是0，而0对你来说肯定是不用的，所以出来0就说明是data[i] == s的情况。 前提是\0是不会被用到加密中的。

user: user-1
content: 如果data[i] == s的情况，那你就再做一次^操作，得出的结果就是s 当解密的时候，做第一次解密的时候会得出0，如果是0的话就再做一次解密操作，应该能得到原值吧

user: user-0
content: 引用 5 楼 q3733353520 的回复:该怎么处理能说一下么    由于过程是可逆的  所以我觉得比较简单的做法是避免出现相等的情况    至于当出现相等的时候如果做特别的处理那么反过来操作的时候也要有对应的处理   这点对我来说更难一些 这个只是加一种情况而已，解密的时候也加一种情况就OK了，没有你想的那么难[/quote]  该怎么说呢   unsigned char 的范围是0~255吧    你说处理一下  但是毕竟数据类型是 unsigned char   不过你如何处理他都是0~255 假如   data[i]==s   我把data[i]=8    那么解密的时候我该怎么做？   难道是判断data[i]==8不成  这个显然不行了    该怎么处理你又不说出来  我这边不会搞啊   毕竟我是新手    现在我的处理方式是  if(data[i]==s){continue;}   也就是什么都不处理这个位置的内容  那么我就结贴吧

user: user-2
content: 引用 4 楼 sasuke38 的回复:[quote=引用 3 楼 q3733353520 的回复:] 那么，你也可以判断当data[i] == s的时候，作别的处理  该怎么处理能说一下么    由于过程是可逆的  所以我觉得比较简单的做法是避免出现相等的情况    至于当出现相等的时候如果做特别的处理那么反过来操作的时候也要有对应的处理   这点对我来说更难一些   [/quote] 这个只是加一种情况而已，解密的时候也加一种情况就OK了，没有你想的那么难

user: user-0
content: 引用 3 楼 q3733353520 的回复:那么，你也可以判断当data[i] == s的时候，作别的处理  该怎么处理能说一下么    由于过程是可逆的  所以我觉得比较简单的做法是避免出现相等的情况    至于当出现相等的时候如果做特别的处理那么反过来操作的时候也要有对应的处理   这点对我来说更难一些

user: user-2
content: 判断，如果结果是'\0'，再另外处理，直到不为'\0'  引用 2 楼 sasuke38 的回复:[quote=引用 1 楼 q3733353520 的回复:] 判断，如果结果是'\0'，再另外处理，直到不为'\0' 我这个是处理字符串的    原理是  data[i]^=s     s是在一个 unsigned char数组中获取      假如我的data内容超多的话  总有碰到  data[i]=s的时候     当data^s=0  的时候该怎么处理呢     处理字符肯定是要可逆的    既然做相应的处理  到时候反过来处理的时候我又如何判断呢[/quote]  那么，你也可以判断当data[i] == s的时候，作别的处理

user: user-0
content: 引用 1 楼 q3733353520 的回复:判断，如果结果是'\0'，再另外处理，直到不为'\0' 我这个是处理字符串的    原理是  data[i]^=s     s是在一个 unsigned char数组中获取      假如我的data内容超多的话  总有碰到  data[i]=s的时候     当data^s=0  的时候该怎么处理呢     处理字符肯定是要可逆的    既然做相应的处理  到时候反过来处理的时候我又如何判断呢

user: user-2
content: 判断，如果结果是'\0'，再另外处理，直到不为'\0'
user-0 提问: 关于数组与指针的问题

回复:
user: user-1
content: 这么简单的问题，居然也七嘴八舌，莫衷一是，真是奇观。 首先，指针运算的意义在于，如果指针P指向数组的第n个元素，则P + e的结果也是指针，指向数组的第n + e个元素。 显然，指针& array和& array + 4间隔4个元素。 关键是这两个指针所指向的元素类型。& array是指向数组的指针 int (*) [20]。这意味着，这两个指针所指向的位置间隔4个数组的大小。 已知 sizeof (int) == 4，则每个数组80个字节，共4个数组，一共是320个字节。 100 + 320 = 420。 完毕。  问：以下两行，将第一行的两个输出相减，应该等于第二行的输出，不是吗？ printf ("%p, %p\n", & array, & array + 4); printf ("%d\n", (& array + 4) - & array); 答：它们肯定不同。第一行是分别输出两个指针的地址，相减后是两个地址之间相差的字节数，和数组元素的类型有关；第二行是两个指针相减，得到的是它们间隔的数组元素数量，和元素的类型无关。

user: user-2
content: 对的！作者估计以为是指针，移动一次加4！但是内存地址是16进制啊！题目没表达清楚，也没算对！

user: user-3
content: 事实证明你是对的。

user: user-4
content: 另外，代码也是有地址的， 这就是C，C++中函数地址的概念  至于，成员指针，是成员变量，成员函数，指针这些概念的结合 分为 指向数据成员的  成员指针  和指向成员函数的 成员函数指针  成员指针，是对指针的一种抽象模拟，其实不太象C的指针。

user: user-4
content: 数组的地址，和数组的首地址之间的区别，是类型的区别。 本质上指的是同一位置 类型，和指针的关系，是高级语言才有的、  对于汇编语言， 一个指令，有两类地址寄存器， 以及 内存地址 其中内存地址，是和指针相关的： 一般内存地址分成两个部分（有些CPU更多）  ----- 段， （实模式：段地址，保护模式 ：选择子，描述符） 和 偏移量 的数字值----- 才是看得见了。  高级语言（带指针类型的） 中 指针的类型，主要指的是地址所示的，内存中的数据的类型。  指针变量的类型 是  1）指向某种类型数据的 2）指针 这两回事的结合。  所以，看待指针这样的东西，不能仅仅看书上，甚至与标准上怎么说。 要看它实际是怎么回事。 然后，结合书上，或者标准中的描述，就很好懂了

user: user-5
content: 我简单的实际运行了下，和我预想的差不多，你的想法不对。你可以实际编个程序，运行对比一下。

user: user-5
content: 我觉得书上是对的。 因为你推理出来的，都是基于一个事实， “理由是&array是表示数组本身的地址，实际为一个指向包含20个int型元素的数组的指针，也就是数组指针，对该指针进行数字的加减操作” 你推理的第一步是这个，但是地址是地址，指针是指针。&表示的是地址，结果数值是和指针数值是一样，但是不是一样的概念。所以你第一步推理错误，后面的都错了。 我是这么觉得的。

user: user-6
content: 我觉得还应该迷信C语言的标准 比如C99这些东西。

user: user-7
content: 你的理解是对的,相差320, 书上错的

user: user-8
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！ #include <stdio.h> int array[20]={     10,20,30,40,50,60,70,80,90,100,     110,120,130,140,150,160,170,180,190,200 }; int main() {     printf("0x%p,0x%p\n",&array[0],&array+4);//0x00403010,0x00403150     return 0; }
user-0 提问: VS2012编译开源项目opus出错

回复:
user: user-1
content: 补充一句：你这编译成功了，只是启动的时候失败，自己找到输出目录，试着从输出目录启动看能不能成功

user: user-1
content: 1、lib库是不能作为启动项的 2、.exe启动时，系统要加载exe依赖的dll、ocx等库，如果缺少了这些，exe是无法启动的

user: user-2
content: 估计是.lib 没编译，先编译.lib  添加进去，然后再编译工程
user-0 提问: 新手请教大家，帮我看看这个问题吧！

回复:
user: user-1
content: 不要迷信书……

user: user-1
content: 书本为什么不可以错呢？

user: user-2
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？

user: user-3
content: 结果才是真理，书本不是真理

user: user-4
content: 时间在流逝，可能vs的编译器改了，书本可能未更新。 要在实践中检验。（实践是检验真理的唯一标准）

user: user-5
content: 以你认为自由的方式去写，有时候就是对的，因为C/C++本质是灵活的。
user-0 提问: C语言函数传递参数问题

回复:
user: user-1
content: 你只是调试找错了地方，这很正常啊， 一眼看出问题，就不用调试了  加油吧

user: user-2
content: 这个我觉得可能是，有时候指针越界访问，如果其非法访问的地址在该程序开辟的内存区，且是可写属性，就不会报错，因为在自家院里搞破坏，不影响别人，别人也不会报警，但比较危险

user: user-0
content: 引用 1 楼 ant2012 的回复:而采用 下面代码中——被注释的 那两行的 做法时，不会崩溃！！  会不会是凑巧，楼主，arry[i].name.buffer指向的空间是什么  这样会不会崩溃 char *p = NULL;  //作用是多占点栈表空间 name = mxmlNewElement(table_belong, arry[i].name.buffer);  arry[i].name.buffer 指向了一个常量字符串 “Name”，这个空间是切确存在的 您说的对，这个还真是凑巧！  我代码是在 WM -- Unbuntu 上编译的，我质疑是否是虚拟机带来的问题，这个真让我迷惑..... 问题根结出在 table_belong 这个变量上，它是 NULL （真是无语了.... ）  但楼顶问题，却怎么也解释不清楚，该现象（也许真是虚拟机带来的影响）。

user: user-3
content: 结构体中的buffer只是一个指针，需要申请类存

user: user-2
content: 而采用 下面代码中——被注释的 那两行的 做法时，不会崩溃！！  会不会是凑巧，楼主，arry[i].name.buffer指向的空间是什么  这样会不会崩溃 char *p = NULL;  //作用是多占点栈表空间 name = mxmlNewElement(table_belong, arry[i].name.buffer);
user-0 提问: C语言问题

回复:
user: user-1
content: 引用 1 楼 ant2012 的回复:if(hnode->next==NULL)  在这个条件体中，并没有对hnode->next进行设定，导致hnode->next一直为空，当然就不会执行else  p=(Nodes*)malloc(sizeof(Nodes)); tail->next=p; tail=tail->next; scanf("%c",&p->c); getchar(); printf("\t"); 改为 ：  Nodes *tail; for(tail=hnode;tail->next!=NULL;tail=tail->next); p=(Nodes*)malloc(sizeof(Nodes)); tail->next=p; tail=tail->next; tail->next=NULL; scanf("%c",&p->c); getchar(); printf("\t"); free(p);  试试。（printf("链表创建成功!\n");前的tail->next=NULL;可去）

user: user-2
content: 不知道你那个tail是哪里来的

user: user-3
content: 菜鸟一名原来如此，学习了

user: user-4
content: if(hnode->next==NULL)  在这个条件体中，并没有对hnode->next进行设定，导致hnode->next一直为空，当然就不会执行else
user-0 提问: c语言如何初始化倒三角数组

回复:
user: user-1
content: //直接用函数模拟数组arr int arr(int x,int y,int n) {//返回nxn倒三角数组arr[x][y]处的值，x=0..n-1，y=0..n-1  if (x+y>=n) return -1;//右下角无数据返回-1  return x+y; }

user: user-0
content: 感谢楼上两位，我开始一直想着使用静态数组一次分配空间，后来又想用数据结构，还是指针学的不透彻。。。。。。。

user: user-2
content: 这样可好：  /* 0   1   2   3   4  1   2   3   4 2   3   4 3   4 4 */ int main(void) { 	int i, j; 	int n[5] = {5, 4, 3, 2, 1}; 	int **pArray = (int**)malloc(sizeof(int*)*5); 	//赋值 	for(i = 0; i < 5; i++) 	{ 		pArray[i] = (int*)malloc(sizeof(int)*n[i]); 		for(j = 0; j < n[i]; j++) 			pArray[i][j] = i + j; 	} 	//打印 	for(i = 0; i < 5; i++) 	{ 		for(j = 0; j < n[i]; j++) 			printf("%d  ", pArray[i][j]); 		printf("\n"); 	} 	//释放空间 	for(i = 0; i < 5; i++) 		free(pArray[i]); 	free(pArray); 	return 0; }

user: user-3
content: 二级指针  int **ppData = new int* [n]; for(int i = 0; i < n; i++) {       ppData[i] = new int [n - i]; }  记得用完释放

user: user-2
content: 引用 4 楼 zhao4zhong1 的回复://直接用函数模拟数组arr int arr(int x,int y,int n) {//返回nxn倒三角数组arr[x][y]处的值，x=0..n-1，y=0..n-1  if (x+y>=n) return -1;//右下角无数据返回-1  return x+y; } 好方法！  #include <stdio.h> int main(void) { 	int i, j; 	for(i = 0; i < 5; i++) 	{ 		for(j = 0; j < 5; j++) 			printf("%4d", arr(i, j)); 		printf("\n"); 	} 	return 0; } int arr(int x, int y) { 	if(x + y >= 5) 		return -1; 	return x + y; } // 0   1   2   3   4 // 1   2   3   4  -1 // 2   3   4  -1  -1 // 3   4  -1  -1  -1 // 4  -1  -1  -1  -1
user-0 提问: 字符串数组在内存中的存储位置？

回复:
user: user-1
content: 1、首先str和str2不可能指向相同的地址。楼主请确定。 2、str2的地址比str低10位。两者的地址是连在一起的。我是在linux环境下gcc编译的。 3、str的大小为sizeof("hello")=6;所以楼主输入一个字符串给str时，不应该输入大于6的字符串，不然会产生段错误。 4、根据我的实验，str2有10个字节，并且未初始化。所以当你puts (str2)显示str2 的内容时，会出现以下情况：        a. 如果str2中的10的char 中的内容有‘\0’的ASCII码值，即为0，则会显示长度小于10的乱码。        b.. 如果str2中的10的char 中的内容没有‘\0’的ASCII码值，则会显示10个乱码+str显示的内容。 请注意：字符串输出是以’\0‘为结束的。字符串输入是默认加上'\0'的。

user: user-2
content: 同意3楼， 对于字符串的相关操作，推荐使用scanf_s,gets_s等 如果没有长度约束，就会一直向后找"\0"，很多时候就越界了

user: user-3
content: 引用 4 楼 lm_whales 的回复:你这个例子里，编译器安排  str2，在低地址，str在高地址（不是任何时候，任何编译器都这么做的） 二者邻接 ，当输入越界的时候 后面的字符恰好输入到str中了 于是就成为你看到的样子。 抱歉，高低反了str低，str2 高

user: user-3
content: 你这个例子里，编译器安排  str2，在低地址，str在高地址（不是任何时候，任何编译器都这么做的） 二者邻接 ，当输入越界的时候 后面的字符恰好输入到str中了 于是就成为你看到的样子。

user: user-3
content: scanf 某些时候很不靠谱，gets 函数也是， 对于输入字符串， 只要用户输入，它就会全部输入到对应的字符数组中 从来不考虑输入会溢出 解决方案，微软等给出了 scanf_s,gets_s等函数，只能输入一定长度的字符串，多余的不在输入到字符数组中。 自己做的话，直接按需读取字符，放到数组中

user: user-4
content: 基本字符串认识。 当你char str[] = "hello";对str进行初始化的时候，编译器认为str包括6个字节。而str2包括11个字节。 str读入是5个（加\0），而str2读入是10个。 你这里没懂就是因为没懂初始化的规则。

user: user-5
content: 越界了，结果是不确定的。
user-0 提问: C语言题目

回复:
user: user-1
content: void chang_number(char *buf,short num);  int main(int argc, char *argv[]) { 	char buf[20],*ch="hello"; 	char str[50]={0}; 	short num=0xA0B0; 	chang_number(buf,num); 	strcat(strcat(str,ch),buf); 	printf("%s",str); 	return 0; } //0xA0B0转成"A0B0" 00 -00 void chang_number(char *buf,short num){ 	int count=sizeof(num)*2,i;// 一个字节8位 2个16进制位 	short temp; 	for(i=count-1;i>=0;i--){ 		temp=num&0x0F; 		buf[i]=temp < 9 ? (temp+'0'):(temp-10+'A'); 		num>>=4; 	} 	buf[count]='\0'; }

user: user-2
content: sprintf

user: user-3
content: 来一个：  #include <stdio.h> int main(void) { 	char *ch = "hello"; 	short a = 0xA0B0; 	char buf[100]; 	sprintf(buf, "%s%04X", ch, (unsigned short)a); 	printf("%s\n", buf); 	return 0; }

user: user-4
content: 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

user: user-0
content: 引用 3 楼 user-7 的回复:粗略一看有个思路，先将a分别与0xf000,0x0f00,0x00f0,0x000f与，然后做移位处理，提取每个数，最后阿丝克码转化字符，晕，手机回帖真蛋疼能给简单代码么，不用库函数完成

user: user-5
content: 把printf改为sprintf即可。  引用 2 楼 yexin99 的回复:[quote=引用 1 楼 walkiz 的回复:]  #include <stdio.h>  int main(int argc, char* argv[]) {     char* ch = "hello";     short a = 0xA0B0;      printf("%s%04X\n", ch, (unsigned short)a);      return 0; } 先谢过，那如果我想将结果存入另一个char数组呢[/quote]

user: user-6
content: sprintf......都不看书或者这些书都不写么

user: user-7
content: 粗略一看有个思路，先将a分别与0xf000,0x0f00,0x00f0,0x000f与，然后做移位处理，提取每个数，最后阿丝克码转化字符，晕，手机回帖真蛋疼

user: user-0
content: 引用 1 楼 walkiz 的回复: #include <stdio.h>  int main(int argc, char* argv[]) {     char* ch = "hello";     short a = 0xA0B0;      printf("%s%04X\n", ch, (unsigned short)a);      return 0; } 先谢过，那如果我想将结果存入另一个char数组呢

user: user-5
content: #include <stdio.h>  int main(int argc, char* argv[]) {     char* ch = "hello";     short a = 0xA0B0;      printf("%s%04X\n", ch, (unsigned short)a);      return 0; }
user-0 提问: AES加密 运行结果不一致

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

回复:
user: user-1
content: 引用 4 楼 yajuie 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 重建所有后再试试。 对赵老师的话不信任的后果是，花了四个小时最后还是他说对了 在结帖之前向后来的同学现身说下法[/quote]

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:重建所有后再试试。 对赵老师的话不信任的后果是，花了四个小时最后还是他说对了 在结帖之前向后来的同学现身说下法

user: user-0
content: 引用 1 楼 赵4老师的回复:重建所有后再试试。 最少能证明，代码语法上没问题

user: user-0
content: 代码应该不会错，这是linux的一部分，对过好几遍了，而且能编译通过

user: user-1
content: 重建所有后再试试。
user-0 提问: Expression：nptr !=NULL该怎么解决啊？

回复:
user: user-1
content: 说的很清楚了，atof函数的参数（形式参数nptr）是空指针NULL了

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

user: user-0
content: 没人...
user-0 提问: 偏移量是什么？

回复:
user: user-1
content: 虚拟模式下的程序，操作系统只提供了 flat  模式，地址本身就是一种偏移量 当然，偏移量在汇编语言里面，还是有不同解释的 .另外，不同场合偏移量含义，略有不同

user: user-1
content: 虚拟模式下的程序，操作系统只提供了 flat  模式一种编程模式 这种模式下，只有线程局部存储。还在用 fs 寄存器，作为段寄存器使用 CS,DS,ES,SS, 已经不是程序主要关心的了（用户程序不用关心，这些段本质上指向同一地址）， 至少C程序大多都已经不在关心了

user: user-2
content: 在c语言层面已经无所谓“段地址”了，现代的操作系统没有“实模式”运行的了

user: user-3
content: 我是自然的搬运工： http://bbs.csdn.net/topics/380202112 为什么汇编8086CPU段地址*16+偏移＝物理地址

user: user-4
content: 偏移量就是相对地址，段地址是基地址，比如段地址为100，偏移5个地址就是105，

user: user-5
content: offset

user: user-6
content: “偏移量就是偏移量”
user-0 提问: 新人...请问在win32 SDK中如何选中其他程序中listview的复选框？

回复:
user: user-1
content: 找到窗口，向其发消息  CWnd *pWnd=CWnd::FindWindow(NULL,_T("XXX"));      if(pWnd==NULL)     {         AfxMessageBox("接收程序没有运行!");         return ;     }      pWnd->SendMessage(WM_XXX,NULL,0);

user: user-2
content: 就是send, 同一进程也差不多是send的

user: user-0
content: 引用 1 楼 fly_dragon_fly的回复:就是send, 同一进程也差不多是send的 就是send, 同一进程也差不多是send的[/quote] 就是send, 同一进程也差不多是send的[/quote] 那既然是用sendmessage那么要发送一个什么消息过去? 我在网上找这么久都没找到。帮帮忙咯

user: user-0
content: 引用 2 楼 西伯利亚冰的回复:找到窗口，向其发消息  CWnd *pWnd=CWnd::FindWindow(NULL,_T("XXX"));      if(pWnd==NULL)     {         AfxMessageBox("接收程序没有运行!");         return ;     }      pWnd->SendMessage(WM_XXX,NULL,0);  要发送什么消息过去咯，你这样xxx的我也不知你在说什么。

user: user-0
content: 引用 4 楼 赵4老师的回复:学会使用Spy++软件是楼主的当务之急。 这个有什么相关的吗？ 控件句柄已经获取到，就是不知怎么用代码代码去控制listview中复选框的状态

user: user-3
content: 学会使用Spy++软件是楼主的当务之急。

user: user-0
content: 问题的关键是要发个什么消息给他
user-0 提问: 关于间接访问符和自增自减操作符结合使用的问题

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:后++优先级比*高,前++才跟*一样 strings是char ** 1) **strings++, 先执行++, 因为是后++, 先取地址值, 所以返回的是strings[0][0], 而strings本身+=4 2) *(*strings)++,这次先执行括号, 得到strings[0], 然后执行++, 返回的依然是strings[0][0],但是strings[0]+=1,不改变strings 解释得很经典，非常感谢！

user: user-1
content: 后++优先级比*高,前++才跟*一样 strings是char ** 1) **strings++, 先执行++, 因为是后++, 先取地址值, 所以返回的是strings[0][0], 而strings本身+=4 2) *(*strings)++,这次先执行括号, 得到strings[0], 然后执行++, 返回的依然是strings[0][0],但是strings[0]+=1,不改变strings
user-0 提问: C语言中，怎么从字符串中提取数字，并将其存入整型数组中？

回复:
user: user-1
content: I'm turning my head up and down.  #include <stdio.h> int main(void) { 	char str[] = "0-123-41562-4"; 	char *p = str; 	int num[100]; 	int i, r, v, n; 	i = 0; 	//从字符串中读取出内容 	while (1) 	{ 		r = sscanf(p, "%d-%n", &v, &n); 		if (1 == r) 		{ 			num[i++] = v; 			p += n; 		} 		else if (0 == r) 		{ 			p++; 		} 		else 		{ 			break; 		} 	} 	//打印读取到的内容 	for (n = 0; n < i - 1; n++) 		printf("%d ", num[n]); 	printf("%d\n", num[i - 1]); 	return 0; }

user: user-2
content: 参考代码如下：  #include <stdio.h>  void main (void) { 	char a[15]={'0','-','1','2','3','-','4','1','5','6','2','-','4','\0','\0'}; 	int b[10]; 	int i,j; 	j=0; 	for(i=0;a[i]!='\0';i++) 	{ 		if(a[i]>='0'&&a[i]<='9') 		{ 			b[j]=a[i]-'0'; 			j++; 		} 	} 	for(i=0;i<j;i++) 	{ 		printf("b[%d]:%d\n",i,b[i]); 	} }

user: user-3
content: 使用“-”来切分字符串 如果除了“-”之外都是数字， 那么使用atoi()对子串进行转换即可

user: user-4
content: int num = 0; int len = strlen(a); int i,j; for(i=0; i< len; i++) {     if(a[i]>= '0' && a[i] <= '9')     {//将原字符串存入char 类型数组a，结果保存到数组b，成员个数为num             b[num] = fun(a[i]);//fun:将char 转为int             num++;     } }

user: user-2
content: 思路是读取字符串数组，判断是否是0-9，是就将其存到整型数组中。
user-0 提问: setsockopt

回复:
user: user-0
content: 不是，是ubuntu14.04

user: user-1
content: 引用 2 楼 w87510255 的回复:不是，是ubuntu14.04 ubuntu14.04是开源的吧，单步调试到setsockopt里面一探究竟？

user: user-2
content: 啥系统下, 不会是 M$ WIN 下吧, M$ 总搞这些稀奇古怪的, 它没设置 errno, 要用 WSAGetLastError 才行..
user-0 提问: switch选择结构中，不论输入什么default后的语句总是执行，代码如下

回复:
user: user-1
content: 修改：  rewind(stdin); c = getchar();

user: user-0
content: 问题已经解决了，确实是有一个换行符留在了缓冲区

user: user-2
content: 不太明白你的目的究竟是想干什么，你需要明确的说出来，才好为你解决问题。 我根据你的描述，大概猜测，你的目的是想在屏幕上出现提示：“请输入代号！”，那么， 就把这句：printf ("请输入代号！\n"); 放在c=getchar();这句的前面就可以了。 因为，每个case语句后边都有break，会被中断，从而跳出switch语句，只有当所有的case语句 都没有被执行，default语句才能被执行，否则，只要由一个case语句被执行，执行完后，立马就 跳出了switch{}了，不会再执行default了，所以，解决办法就是把printf ("请输入代号！\n"); 放在c=getchar();这句的前面。 不知上面的分析是否是你需要的。

user: user-3
content: 输入字符后，有个回车留在输入缓冲了，清除掉或者做下判断

user: user-0
content: 引用 6 楼 赵4老师的回复: default: printf ("您输入了'\\x%02x‘，请输入代号！\n",(unsigned char)c); 能否解释一下你加的东西是干什么的，本人属于c语言刚入门阶段

user: user-0
content: 引用 7 楼 qq_30446977的回复:我看了你的代码，我觉得你说的问题出在了你的循环上。 第一次你输入一个值，被getchar（）读取。但是有一个回车留在了输入流上。你的for继续循环，getchar（）读取了回车，然后进行下面的程序，肯定会执行default。 在循环中一开始地方加一个fflush（stdin）应该就可以了。 你可以试试。 我看了你的代码，我觉得你说的问题出在了你的循环上。 第一次你输入一个值，被getchar（）读取。但是有一个回车留在了输入流上。你的for继续循环，getchar（）读取了回车，然后进行下面的程序，肯定会执行default。 在循环中一开始地方加一个fflush（stdin）应该就可以了。 你可以试试。[/quote] 再问一下，fflush(stdin)这个是干什么用的？

user: user-4
content: 我看了你的代码，我觉得你说的问题出在了你的循环上。 第一次你输入一个值，被getchar（）读取。但是有一个回车留在了输入流上。你的for继续循环，getchar（）读取了回车，然后进行下面的程序，肯定会执行default。 在循环中一开始地方加一个fflush（stdin）应该就可以了。 你可以试试。

user: user-5
content: default: printf ("您输入了'\\x%02x‘，请输入代号！\n",(unsigned char)c);

user: user-0
content: 引用 2 楼 user-7 的回复:getchar()的返回值类型为int, 用char去接收， 数据可能被截断。   你的问题是什么？ 如果我想用char型来接收getchar(),该怎么做？我的问题是default后的语句不论我输入哪个字符，都会执行

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复: default: printf ("您输入了'\x%02x‘，请输入代号！\n",(unsigned char)c); 我用VC++6.0，编译后出现error C2153: hex constants must have at least one hex digit 怎么解决

user: user-6
content: 用赵老师的方法把default的情况打印出来看看，不就知道为什么

user: user-7
content: getchar()的返回值类型为int, 用char去接收， 数据可能被截断。   你的问题是什么？

user: user-5
content: default: printf ("您输入了'\x%02x‘，请输入代号！\n",(unsigned char)c);
user-0 提问: 条件运算符求解

回复:
user: user-0
content: 引用 3 楼 ipqtjmqj 的回复:1. MAX(a++, ++a) a++ > ++a ?, 大于运算符(>)两边的表达式的计算顺序是未定义,  假设编译器是先计算左边的, 则左边返回6, a = 7. 再计算右边, 则右边返回8, a = 8. 6 > 8为假,所以执行冒号后边的表达式, 即++a, 则a = 9, 返回9, 与结果相符  假设编译器是先计算右边的 则右边返回7, a = 7. 再计算左边, 则左边返回7, a = 8. 7 > 7为假,所以执行冒号后边的表达式, 即++a, 则a = 9, 返回9, 与结果相符 /////////////////////////////// 2. MIN(b++, ++b) b++ > ++b ? 假设编译器是先计算左边的, 则左边返回6, b = 7. 再计算右边, 则右边返回8, b = 8. 7 < 8为真,所以执行冒号前边的表达式,即b++, 则b = 9, 返回8, 与结果不符  假设编译器是先计算右边的 则右边返回7, b = 7. 再计算左边, 则左边返回7, b = 8. 7 > 7为假,所以执行冒号后边的表达式, 即++b, 则b = 9, 返回9, 与结果相符 //////////////////////////// 3. MIN(c++, 10) 从2的两个假设及结果可以推测,楼主编译器是先计算大于号右边的 所以c++ < 10 ? 先计算右边, 返回10, 再左边, 返回6, c = 7 6 < 10为真,所以执行冒号前边的表达式,即c++, 则c = 8, 返回7谢谢你啊，我明白了。

user: user-1
content: 1. MAX(a++, ++a) a++ > ++a ?, 大于运算符(>)两边的表达式的计算顺序是未定义,  假设编译器是先计算左边的, 则左边返回6, a = 7. 再计算右边, 则右边返回8, a = 8. 6 > 8为假,所以执行冒号后边的表达式, 即++a, 则a = 9, 返回9, 与结果相符  假设编译器是先计算右边的 则右边返回7, a = 7. 再计算左边, 则左边返回7, a = 8. 7 > 7为假,所以执行冒号后边的表达式, 即++a, 则a = 9, 返回9, 与结果相符 /////////////////////////////// 2. MIN(b++, ++b) b++ > ++b ? 假设编译器是先计算左边的, 则左边返回6, b = 7. 再计算右边, 则右边返回8, b = 8. 7 < 8为真,所以执行冒号前边的表达式,即b++, 则b = 9, 返回8, 与结果不符  假设编译器是先计算右边的 则右边返回7, b = 7. 再计算左边, 则左边返回7, b = 8. 7 > 7为假,所以执行冒号后边的表达式, 即++b, 则b = 9, 返回9, 与结果相符 //////////////////////////// 3. MIN(c++, 10) 从2的两个假设及结果可以推测,楼主编译器是先计算大于号右边的 所以c++ < 10 ? 先计算右边, 返回10, 再左边, 返回6, c = 7 6 < 10为真,所以执行冒号前边的表达式,即c++, 则c = 8, 返回7

user: user-2
content: 好好看看书就知道了，没有为什么，1+1=2就是这样

user: user-3
content: 看看置顶帖吧....
user-0 提问: 请问下面这段代码一但输入有误为什么就会出现无限循环？

回复:
user: user-0
content: 这个方法我也用过，但是没效果，输入错误还是无限循环，用的是gcc

user: user-1
content: do  19     {  20         scanf( "%d,%d,%d", &a, &b, &c );  21         sj = sjx( a, b, c );  22        fflush( stdin );   //清空输入缓冲区  23         if( sj == 0 )               {  24           printf( "bug" );                 break;  //出错,中断循环               }  25   26     }while( sj == 0 );

user: user-2
content: 一误永误，因为你循环里，没考虑怎么处理输入错误  当出现错误的时候，循环内部解决不了 而 读数的时候，错误的数据，不会被读走，依然留在缓冲区中，下次读数，依然读取出错，于是就无限制循环了  另一个原因是，你本来就根据正确读取的数据，来结束循环的， 现在没有正确读取，结束条件永远达不到，只能死循环

user: user-3
content: 输入函数scanf在循环体内，循环的时候当然会有输入了

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

user: user-0
content: 不对，那我循环的时候还有输入啊

user: user-5
content: 输入有误 sj==0 while条件成立 无限循环啊 这种问题就适合我这菜鸟回答
user-0 提问: 菜鸟问题_word counting

回复:
user: user-0
content: 谢谢大神指导， <Enter>,<Ctrl+Z>,<Enter> 这样确实显示出来结果，不过闪一下就退出来了.. 怎样让它一直停留在输出界面? 谢谢..

user: user-1
content: <Enter>,<Ctrl+Z>,<Enter>

user: user-2
content: 引用 8 楼 kim88521 的回复:谢谢大神指导， <Enter>,<Ctrl+Z>,<Enter> 这样确实显示出来结果，不过闪一下就退出来了.. 怎样让它一直停留在输出界面? 谢谢.. #include <conio.h> getch();

user: user-3
content: EOF其实就是 -1，而从键盘上。以字符形式输入的话，好像是输不进-1，个人观点，欢迎，高手指证

user: user-0
content: 我试过把  else if (c == ' ' || c == '\n' || c = '\t'  改成 else if (c == ' ' || c == '\n' || c == '\t'  结果还是一样，啥都没出来，即使我输进去什么字符，回车之后啥都没有..  究竟是什么问题呢? 在你们电脑上试的时候没有问题吗？

user: user-4
content: ctrl+d会读到EOF

user: user-5
content: 我想说的是以什么为循环终止呢？ 而且 if (c == ' ' || c == '\n' || c = '\t')  state = OUT;  else if (state == OUT) {  state = IN;  ++nw; 这里 if (c == ' ' || c == '\n' || c = '\t')那么state = OUT;if (state == OUT)那么  这里的意思就成了if (c == ' ' || c == '\n' || c = '\t')                              state = IN;++nw; 这个思路是以空格，回车为分界符，那么已什么为循环终止条件呢？

user: user-6
content: 同意楼上的……

user: user-7
content: if (c == ' ' || c == '\n' || c = '\t') 应该改为 if (c == ' ' || c == '\n' || c == '\t')
user-0 提问: 初学C语言要编个小程序

回复:
user: user-1
content: #include<stdio.h> #define TIME 30          //一个月30天 #define KAIXUE 271        //9.1号开学的时间 int main(void) { 	int y, r;                	printf("/*日期格式  月.日，  例3.1*/\n"); 	printf("请输入一个日期："); 	scanf("%d.%d", &y, &r);           	r = y*TIME + r;         //月和日转换成天数 	r = KAIXUE - r;         //开学天数减去输入天数 	y = r / TIME;           //开学天数和日期天数差除于30天，保留整数 	r = r%TIME;            //取r/TIME的小数部分 	printf("距离开学还有%d个月%d日\n", y, r); 	getch(); 	return 0; } 希望对您有所帮助

user: user-2
content: #include <time.h>  百度一下 time的含义. 	time_t tNow = time(NULL); 	tm * pTm = localtime(&tNow); 	// 修改pTm的成员 	time_t tNew = mktime(pTm);  这俩时间该来改去, 这俩函数颠来倒去,就能得到你要的时间了.
user-0 提问: 关于c语言的小问题

回复:
user: user-0
content: 但是我的答案是2466，标准答案是2468

user: user-1
content: 用pow函数会有精度误差，把 pow(10, n); 改为以下的方式：  int s = 1; int i; for(i = 0; i < n; i++) {     s *= 10; }

user: user-2
content: 怎么就不对了，楼主？你看看输入数据格式是否有问题，由于你的 scanf("%d,%d",&x,&n);记得两个数之间敲一个逗号

user: user-3
content: 难道pow参数语言double型？？难道编译器没有任何提示么

user: user-3
content: 为啥我的跑是好的呀
user-0 提问: 请问谁能怎么学C语言的数据结构？

回复:
user: user-1
content: C语言版的数据结构方面的书应该是最简单的了  数据结构本来和任何编程语言都没有直接的关系的   最多是用伪码给你展现一下数据结构    但是如果是C语言版本的数据结构，说明它里面直接用C语言给你实现了   多么仁慈..........你都不用自己写........  比如，数组是一种数据结构吧  数据结构里讲的时候，只需要告诉你：这里有一个数组 至于是C的数组还是java的数组还是别的什么语言的数组，它不关心，因为数据结构是设计层面的东西，和具体某种语言无关

user: user-2
content: 大话数据结构 怎么样？ 不过里面接收指针用的是指针的指针变量，而不是用引用，也就是C语言传统的写法。

user: user-3
content: 高一凡的数据结构。。。

user: user-4
content: 《数据结构（C语言描述）》 《算法精解（C语言描述）》

user: user-5
content: 张乃孝的《算法与数据结构》 真正C语言版

user: user-6
content: 严蔚敏《数据结构（c语言版）》 加上我的专栏：数据结构与算法

user: user-7
content: 伪代码更容易看懂。

user: user-8
content: 推荐去看看郝斌的数据结构视频，看书太费时间。
user-0 提问: 这程序请赐教..

回复:
user: user-0
content: 引用 1 楼 yanpingzaizai的回复:你这个程序是要实现什么功能？？ 老师你好，这个程序是我自己写的。题目是用合数求素数，以前我用两个for循环一个累计总数，一个循环值的倍数。就可以求出来，我现在想用一个for循环总数，用几个if判断合数输出素数，数组用1和0判断下标是否是素数。程序怎么修改都不好。数组元素调大就会无限循环，调小就不会，但是第一个下标i应该是2输出确是1。for循环最后的else函数x=2，重新循环x确变成0。老师点解我里面是哪里出错了？谢谢

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

user: user-0
content: 引用 3 楼 赵4老师的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 [/quote] 老师你好，这个程序是我自己写的。题目是用合数求素数，以前我用两个for循环一个累计总数，一个循环值的倍数。就可以求出来，我现在想用一个for循环总数，用几个if判断合数输出素数，数组用1和0判断下标是否是素数。程序怎么修改都不好。数组元素调大就会无限循环，调小就不会，但是第一个下标i应该是2输出确是1。for循环最后的else函数x=2，重新循环x确变成0。老师点解我里面是哪里出错了？谢谢

user: user-2
content: for(i=2;i<composite;)这一句，没有i++难道不会一直无限循环下去？？？？？

user: user-3
content: 你这个程序是要实现什么功能？？
user-0 提问: 为什么typedef可以实现在函数的形参中对数组的引用?

回复:
user: user-0
content: 引用 1 楼 adlay 的回复:void fun1(int &arr[8]) ==> void fun1(int (&arr)[8])  谢谢啦~

user: user-1
content: void fun1(int &arr[8]) ==> void fun1(int (&arr)[8])
user-0 提问: C语言关于哨兵顺序查找的疑问？

回复:
user: user-0
content: 明白了，谢谢

user: user-1
content: 引用 2 楼 ruying1389279 的回复:[quote=引用 1 楼 adlay 的回复:] 就是赋值了，这样就保证在数组里面的查找的时候一定能找到。 由于是从后向前找的，如果数组里面本身有要找的值，找到的值的位置是大于 0 的。如果一直到 a[0] 才找到要找的值，说明从 1~n 都没有要找的值，就是数组里面没有。那要是va[0]本身就是要查找的值呢？ 比如va[4] = {5,4,3,2,1} 要查找的值key为5;这样的话不就错了么[/quote] 这种方法表明，你要把数组元素的值放到下标1...n的位置上，而不是0...n-1，a[0得空出来，用于存放哨兵。

user: user-0
content: 引用 1 楼 adlay 的回复:就是赋值了，这样就保证在数组里面的查找的时候一定能找到。 由于是从后向前找的，如果数组里面本身有要找的值，找到的值的位置是大于 0 的。如果一直到 a[0] 才找到要找的值，说明从 1~n 都没有要找的值，就是数组里面没有。那要是va[0]本身就是要查找的值呢？ 比如va[4] = {5,4,3,2,1} 要查找的值key为5;这样的话不就错了么

user: user-2
content: 就是赋值了，这样就保证在数组里面的查找的时候一定能找到。 由于是从后向前找的，如果数组里面本身有要找的值，找到的值的位置是大于 0 的。如果一直到 a[0] 才找到要找的值，说明从 1~n 都没有要找的值，就是数组里面没有。
user-0 提问: 指针指向字符串

回复:
user: user-1
content: 注意 char *s="123"; 和char s[]="123";的区别。 后者等同于char s[]={'1', '2', '3', '\0'};

user: user-2
content: 你的字符指针指向的是一个常量字符串，你修改肯定出错  char string[]="123456";就可以了

user: user-3
content: char *string="123456"; 中的 "123456"是存在程序的“常量区”，而常量区的内容默认是不允许修改的，因此string[2]='a';修改了常量区的内容，会报错。 解决办法是不要定义在常量区，而是定义在堆或者栈区： char string[] = "123456";

user: user-4
content: 实际是char const *string = "123456"; 字符串的内存在常量区，不能变
user-0 提问: C语言字符串查找问题

回复:
user: user-1
content: 这样可好：  #include <stdio.h> #include <math.h> char s[] = "qwertyuiop"; int pos[256]; int i, j, k, L, dis; char buf[256]; int main(void) { 	dis = 0; 	scanf("%s", buf); 	L = strlen(s); 	for (i = 0; i < L; i++) 		pos[s[i]] = i; 	L = strlen(buf); 	for (i = 0; i < L - 1; i++) 	{ 		dis += abs(pos[buf[i]] - pos[buf[i + 1]]); 	} 	printf("dis=%d\n", dis); 	return 0; }

user: user-0
content: 写成函数形式呢int minDistance(char* szKeyBoard,char* szWord)？
user-0 提问: C语言用scanf清理输入缓存的一个程序,程序运行结果不理解

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  提醒：scanf是开源的。你可以单步到scanf的实现中一探究竟。  先 http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装  再参考： C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\input.c

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];  scanf("%*[^\n]"); scanf("%*e");这两句上面一个是去掉\n前的所有字符,后面是去掉\n,你是否运行过我那段程序?结果也是那么怪吗?能解释为什么结果那么怪吗?

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

回复:
user: user-1
content: 我觉得lz应该再看看书或者教程 struct STU {     int a;     int b; };  void input(STU* p) {     p->a = 0; }  int main(void) {     STU stu[50];     STU *pstu = stu;     input(pstu);     return 0; }
user-0 提问: 求大神帮忙，最高悬赏！！

回复:
user: user-1
content: 引用 10 楼 赵4老师的回复:倒推法？ 嗯，是的，不过手机党真的无力，帮忙把代码补全吧，反正程序简单直接goto省事，

user: user-2
content: 第一眼也想到从后往前推。应该可以用递推，让我看看楼上的大神们

user: user-3
content: 倒推法？

user: user-0
content: 能不能直接实现一下，把代码写出来？

user: user-1
content: long last,sum; last=0; loop: last++; sum=last*m+1; for(int i=1;i<m;i++) { if(sum%(m-1)) goto loop;  sum=sum/(m-1)*m+1; }  最后剩下的桃子数为last*m+1; 猴子数为m 总桃子数为sum 我是用手机答的，所以比较麻烦，就直接使用goto语句了，正常情况你可以用变量来控制

user: user-4
content: 首先，只把它看成是一个数学题。貌似，这题小学生估计也能解吧？  然后，将数学题得到的式子，用计算机表达出来。

user: user-5
content: 引用 7 楼 adusuccessfully 的回复:[quote=引用 6 楼 u014444402 的回复:] 抛砖引玉，出个暴力算法。  #include <stdio.h>  int GetPeachNum( int monkey ); int GetLastNum( int m, int n ); int main() { 	int i; 	for ( i=3; i<=9; i++ ) 	{ 		printf( "%d ", GetPeachNum(i) ); 	}  	printf( "\r\n" ); 	getchar(); 	return 0; }  int GetPeachNum( int monkey ) { 	int i, j; 	int temp;  	for ( i=1;; i++ )//这里可以设置超时，以防找不到死循环 	{ 		temp = i; 		for ( j=1; j<monkey; j++ ) 		{ 			temp = GetLastNum( monkey, temp );  			if ( temp < 0 ) break; 		}  		if ( temp > 0 ) return temp * monkey + 1;   	} }  //获取上个猴子的桃数，如果不满足条件那返回-1 //m猴子数，n当前这个猴子拿到的桃数 int GetLastNum( int m, int n ) { 	int total; 	 	total = m * n + 1; 	 	if (total % (m - 1) != 0) return -1;  	return total / (m - 1); }   请教楼上，猴子每次分分到的桃子数，为啥那样计算？？？我没想明白……[/quote] 假设有m只猴子，当前猴子分到的桃子数是n, 1 那当前猴子没拿前总数就是m*n+1 2 在1的基础上我们得出 上个猴子拿的数量是 (m*n+1) / (m-1) 3 根据1，2点我们只要保证   (m*n+1) / (m-1) 结果是个整数就OK了。 4 因为至少所以n我认为从1开始。

user: user-6
content: 引用 6 楼 u014444402 的回复:抛砖引玉，出个暴力算法。  #include <stdio.h>  int GetPeachNum( int monkey ); int GetLastNum( int m, int n ); int main() { 	int i; 	for ( i=3; i<=9; i++ ) 	{ 		printf( "%d ", GetPeachNum(i) ); 	}  	printf( "\r\n" ); 	getchar(); 	return 0; }  int GetPeachNum( int monkey ) { 	int i, j; 	int temp;  	for ( i=1;; i++ )//这里可以设置超时，以防找不到死循环 	{ 		temp = i; 		for ( j=1; j<monkey; j++ ) 		{ 			temp = GetLastNum( monkey, temp );  			if ( temp < 0 ) break; 		}  		if ( temp > 0 ) return temp * monkey + 1;   	} }  //获取上个猴子的桃数，如果不满足条件那返回-1 //m猴子数，n当前这个猴子拿到的桃数 int GetLastNum( int m, int n ) { 	int total; 	 	total = m * n + 1; 	 	if (total % (m - 1) != 0) return -1;  	return total / (m - 1); }   请教楼上，猴子每次分分到的桃子数，为啥那样计算？？？我没想明白……

user: user-5
content: 抛砖引玉，出个暴力算法。  #include <stdio.h>  int GetPeachNum( int monkey ); int GetLastNum( int m, int n ); int main() { 	int i; 	for ( i=3; i<=9; i++ ) 	{ 		printf( "%d ", GetPeachNum(i) ); 	}  	printf( "\r\n" ); 	getchar(); 	return 0; }  int GetPeachNum( int monkey ) { 	int i, j; 	int temp;  	for ( i=1;; i++ )//这里可以设置超时，以防找不到死循环 	{ 		temp = i; 		for ( j=1; j<monkey; j++ ) 		{ 			temp = GetLastNum( monkey, temp );  			if ( temp < 0 ) break; 		}  		if ( temp > 0 ) return temp * monkey + 1;   	} }  //获取上个猴子的桃数，如果不满足条件那返回-1 //m猴子数，n当前这个猴子拿到的桃数 int GetLastNum( int m, int n ) { 	int total; 	 	total = m * n + 1; 	 	if (total % (m - 1) != 0) return -1;  	return total / (m - 1); }

user: user-7
content: 引用 3 楼 均陵鼠侠的回复:朕能解这道题，但你要保证把100分全给朕。 皇上，你得先解题，再要分。

user: user-8
content: 可以用递归实现你要说的函数功能

user: user-9
content: 朕能解这道题，但你要保证把100分全给朕。
user-0 提问: 急急急！！

回复:
user: user-1
content: 这次用真身。  引用 4 楼 adusuccessfully 的回复:[quote=引用 3 楼 walkiz 的回复:] 什么小号？  [quote=引用 2 楼 adusuccessfully 的回复:] [quote=引用 1 楼 walkiz 的回复:]  #include <ctype.h> #include <stdio.h>  void fliter(const char* src, char* dst) {     char* p = (char*)src;     char* q = dst;      while(*p){         if(isalpha(*p)){             *q++ = *p;         }         p++;     }     *q = '\0'; }  int main(int argc, char* argv[]) {     char src[51];     char dst[51];      for(;;){         scanf("%s", src);         fliter(src, dst);         printf("%s\n", dst);     }      return 0; }  楼上的大牛用的是个小号吧 [/quote][/quote]  有个“图灵狗”的账号跟你的头像是一样的……[/quote]

user: user-2
content: 引用 3 楼 walkiz 的回复:什么小号？  [quote=引用 2 楼 adusuccessfully 的回复:] [quote=引用 1 楼 walkiz 的回复:]  #include <ctype.h> #include <stdio.h>  void fliter(const char* src, char* dst) {     char* p = (char*)src;     char* q = dst;      while(*p){         if(isalpha(*p)){             *q++ = *p;         }         p++;     }     *q = '\0'; }  int main(int argc, char* argv[]) {     char src[51];     char dst[51];      for(;;){         scanf("%s", src);         fliter(src, dst);         printf("%s\n", dst);     }      return 0; }  楼上的大牛用的是个小号吧 [/quote][/quote]  有个“图灵狗”的账号跟你的头像是一样的……

user: user-1
content: 什么小号？  引用 2 楼 adusuccessfully 的回复:[quote=引用 1 楼 walkiz 的回复:]  #include <ctype.h> #include <stdio.h>  void fliter(const char* src, char* dst) {     char* p = (char*)src;     char* q = dst;      while(*p){         if(isalpha(*p)){             *q++ = *p;         }         p++;     }     *q = '\0'; }  int main(int argc, char* argv[]) {     char src[51];     char dst[51];      for(;;){         scanf("%s", src);         fliter(src, dst);         printf("%s\n", dst);     }      return 0; }  楼上的大牛用的是个小号吧 [/quote]

user: user-2
content: 引用 1 楼 walkiz 的回复: #include <ctype.h> #include <stdio.h>  void fliter(const char* src, char* dst) {     char* p = (char*)src;     char* q = dst;      while(*p){         if(isalpha(*p)){             *q++ = *p;         }         p++;     }     *q = '\0'; }  int main(int argc, char* argv[]) {     char src[51];     char dst[51];      for(;;){         scanf("%s", src);         fliter(src, dst);         printf("%s\n", dst);     }      return 0; }  楼上的大牛用的是个小号吧

user: user-1
content: #include <ctype.h> #include <stdio.h>  void fliter(const char* src, char* dst) {     char* p = (char*)src;     char* q = dst;      while(*p){         if(isalpha(*p)){             *q++ = *p;         }         p++;     }     *q = '\0'; }  int main(int argc, char* argv[]) {     char src[51];     char dst[51];      for(;;){         scanf("%s", src);         fliter(src, dst);         printf("%s\n", dst);     }      return 0; }
user-0 提问: C语言用三级指针接受二级指针问题

回复:
user: user-0
content: 引用 1 楼 ant2012 的回复:这个是符号优先级的问题 []的优先级比*高，所以*p[i]，实际上是先p[i]，再* 这样p[1]已经越界了  解决办法：将*p[i]全部改成 (*p)[i]  如果换成这二种，就可以避免这个问题 非常感谢，实现了。

user: user-1
content: 这个是符号优先级的问题 []的优先级比*高，所以*p[i]，实际上是先p[i]，再* 这样p[1]已经越界了  解决办法：将*p[i]全部改成 (*p)[i]  如果换成这二种，就可以避免这个问题
user-0 提问: 学习中遇到一道题

回复:
user: user-1
content: #include<stdio.h> #include<string.h> int main() {     int c;     while((c=getchar())!='\n') 		if(isalpha(c)) 			putchar(c);     putchar('\n');     return 0; }

user: user-0
content: 输入：dssd212 输出：dssd1 没有完全去掉啊

user: user-2
content: 对于1sec的限制，用最笨的方法就行了。  /* 字符串过滤 描述: 输入一个字符串，对字符串中非字母类型的字符(字母类型例如a、B、C等，非字母类型例如#、&、1等),  全部移除掉。输入的字符串中最少包含一个字母类型的字符。字符长度不超过50. 运行时间限制:	1 Sec */ #include<stdio.h> #include<string.h> #define MAXLEN 51 char buf[MAXLEN]; int i, L; int main(void) { 	scanf("%51s", buf); 	L = strlen(buf); 	for (i = 0; i < L; i++) 	{ 		if (!((buf[i] >= 'A' && buf[i] <= 'Z') || (buf[i] >= 'a' && buf[i] <= 'z')))//非字母类型 		{ 			memmove(buf + i, buf + i + 1, L - i + 1); 			L = strlen(buf); 		} 	} 	printf("%s\n", buf); 	return 0; } //abc1def2ghi3 //abcdefghi

user: user-2
content: 引用 5 楼 u010284226 的回复: #include <stdio.h> #include <time.h> int main(void){ 	char str[51]; 	int i=0,j=0; 	printf("输入字符：\n"); 	gets(str); 	while((str[i]=str[j++])!='\0'){ 		if((str[i]>='a' && str[i] <='z')|| (str[i]>='A' && str[i]<='Z')){ 			i++; 		} 	} 	printf("%s",str); 	return 0; }   使用i,j同时指向字符串，j负责不断符读取字符，i保存字符， 是个好方法！

user: user-3
content: 可以参考这个帖子中牛人的回复：http://bbs.csdn.net/topics/391828543  #include <ctype.h> #include <stdio.h>   void fliter(const char* src, char* dst) {     char* p = (char*)src;     char* q = dst;       while(*p){         if(isalpha(*p)){             *q++ = *p;         }         p++;     }     *q = '\0'; }   int main(int argc, char* argv[]) {     char src[51];     char dst[51];       for(;;){         scanf("%s", src);         fliter(src, dst);         printf("%s\n", dst);     }       return 0; }

user: user-4
content: #include <stdio.h> #include <time.h> int main(void){ 	char str[51]; 	int i=0,j=0; 	printf("输入字符：\n"); 	gets(str); 	while((str[i]=str[j++])!='\0'){ 		if((str[i]>='a' && str[i] <='z')|| (str[i]>='A' && str[i]<='Z')){ 			i++; 		} 	} 	printf("%s",str); 	return 0; }   使用i,j同时指向字符串，j负责不断符读取字符，i保存字符，

user: user-2
content: 引用 2 楼 wwwssshhh2014 的回复:输入：dssd212 输出：dssd1 没有完全去掉啊 有bug，多添一行 改为  if (!((buf[i] >= 'A' && buf[i] <= 'Z') || (buf[i] >= 'a' && buf[i] <= 'z')))//非字母类型 { 	memmove(buf + i, buf + i + 1, L - i + 1); 	i--;   //添一行 	L = strlen(buf); }
user-0 提问: 没见过的错误，请帮忙解决，谢谢！

回复:
user: user-0
content: 引用 1 楼 adlay 的回复:menu 里面的 return 0 改成 return; input 函数放到 menu 函数的前面去 解决了，谢谢

user: user-1
content: menu 里面的 return 0 改成 return; input 函数放到 menu 函数的前面去
user-0 提问: 初学C语言基础

回复:
user: user-1
content: 基础至关重要，建议从《C Prime Plus》学起。

user: user-2
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  查MSDN是Windows程序员必须掌握的技能之一。  MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl  英语也是一门计算机语言的说。  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-3
content: 我推荐这本书 [C语言程序设计_现代方法(第2版)].（美）King

user: user-4
content: 就是把327L强制看成long。而把327看成int。
user-0 提问: C语言，请问为什么扩展分配内存后，再释放指针程序就无法退出了？

回复:
user: user-1
content: 引用 7 楼 u014626834 的回复:可是我输入了11个数据，还是正常显示了呢？ 1）C内存分配策略，是分配足够的内存，而不是恰到好处的内存。 2）内存越界的结果，可能是破坏为管理内存，而设定的数据结构，未必一定会抛出异常。 3）编译期间，和程序运行期间不报错，不代表程序没有错误。

user: user-2
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。  崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-3
content: 内存访问越界的后果是行为未定义的，程序可能产生这种异常，也可能产生那种异常，也可能没有异常

user: user-0
content: 可是我输入了11个数据，还是正常显示了呢？

user: user-3
content: realloc 的参数不是增加多少内存，而是增加到多少 你永远只分配 10 个 int，当数据超过 10 个就出现内存访问越界了

user: user-0
content: 请帮我看看，谢谢！

user: user-0
content: #include <stdio.h> #include <malloc.h>  int main(void) { 	int *p = (int*)calloc(10, sizeof(int)); 	if (!p) 	{ 		printf("内存分配错误!\n"); 		return 0; 	}  	int *ptemp = { NULL };  	int i = 0; 	int j = 0;  	printf("请输入:\n");  	for (i = 0;;) 	{ 		scanf_s("%d", (p + i)); 		getchar();  		++j;  		if (i % 9 == 0) 		{ 			ptemp = (int*)realloc(p, 10 * sizeof(int)); 			if (!ptemp) 			{ 				printf("上限内存分配错误!\n"); 				free(p); 				p = NULL; 				return 0; 			} 			p = ptemp; 		}  		if (*(p + i) == 9999) 		{ 			break; 		}  		++i;  	}  	printf("\n\n下面进行输出:\n\n");  	for (i = 0; i < j; ++i) 	{ 		printf("%d ", *(p + i));  	}  	free(p); 	p = NULL;  	return 0; }

user: user-4
content: 说明内存分配和指针应用上出问题了。

user: user-5
content: show me the code

user: user-3
content: 因为程序中有 BUG
user-0 提问: 新人菜鸟用VS2015做C语言出现问题，求各位大神解答！！！1

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

user: user-0
content: 引用 3 楼 user-2的回复:fp是空指针么, fopen你不检查返回值么 明白了些，感谢大神的解答！！

user: user-2
content: fp是空指针么, fopen你不检查返回值么

user: user-0
content: 引用 1 楼 user-2 的回复:lz没用过断言么, 断言失败, 空指针截断, 点击重试，再点击中断，顺着调用栈找空指针   以前一直用VC++6.0的，这个真的不知道。。。 提示好像是这个出了问题，但是我还是不知道怎么改。。		n = fread(txl, sizeof(tongxunlu), 200, fp);

user: user-2
content: lz没用过断言么, 断言失败, 空指针截断, 点击重试，再点击中断，顺着调用栈找空指针
user-0 提问: 程序在linux环境中会出错，在win7下正常

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  不要使用 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-0
content: 引用 5 楼 fly_dragon_fly 的回复:[quote=引用 4 楼 ly0303521 的回复:] [quote=引用 2 楼 fly_dragon_fly 的回复:] 这是判断[i,j]之间是否回文, 但有 temp += 2; p ++;  用递归吧, 回文天生就是为递归准备的 我将之前的程序改成用递归的方法，还是会出现这样的问题，测试用的字符串：abbacabbaab[/quote]  while (*p == *q)  /* ==> 换成 */ for (p=&str[i];*p == *q;) [/quote] 这样该，不行吧

user: user-0
content: 引用 4 楼 ly0303521 的回复:[quote=引用 2 楼 fly_dragon_fly 的回复:] 这是判断[i,j]之间是否回文, 但有 temp += 2; p ++;  用递归吧, 回文天生就是为递归准备的 我将之前的程序改成用递归的方法，还是会出现这样的问题，测试用的字符串：abbacabbaab[/quote] 这样改，不行吧

user: user-2
content: 引用 4 楼 ly0303521 的回复:[quote=引用 2 楼 fly_dragon_fly 的回复:] 这是判断[i,j]之间是否回文, 但有 temp += 2; p ++;  用递归吧, 回文天生就是为递归准备的 我将之前的程序改成用递归的方法，还是会出现这样的问题，测试用的字符串：abbacabbaab[/quote]  while (*p == *q)  /* ==> 换成 */ for (p=&str[i];*p == *q;)

user: user-0
content: 引用 2 楼 fly_dragon_fly 的回复:这是判断[i,j]之间是否回文, 但有 temp += 2; p ++;  用递归吧, 回文天生就是为递归准备的 我将之前的程序改成用递归的方法，还是会出现这样的问题，测试用的字符串：abbacabbaab

user: user-0
content: 引用 1 楼 user-3 的回复:你确定在win7下正常    for (j = len_str -1; j >= i; j--) { ------》这个每次循环，指针p要重新赋值的 不然就是从上次错误的地方开始比较 我使用的测试例子：abbacabbaab 。在WIN7 32位 VC ，显示长度为9，是正确的，在linux下就不对

user: user-2
content: 这是判断[i,j]之间是否回文, 但有 temp += 2; p ++;  用递归吧, 回文天生就是为递归准备的

user: user-3
content: 你确定在win7下正常    for (j = len_str -1; j >= i; j--) { ------》这个每次循环，指针p要重新赋值的 不然就是从上次错误的地方开始比较
user-0 提问: 关于枚举类型的应用

回复:
user: user-1
content: #include <stdio.h>  typedef enum {     MON,     TUE,     WED,     THU,     FRI,     SAT,     SUN, }week_t;  static const char* names[] = {     "MON",     "TUE",     "WED",     "THU",     "FRI",     "SAT",     "SUN", };  int main(int argc, char* argv[]) {     week_t week;      printf("Please input a day number: ");     scanf("%d", (int*)&week);     printf("The day is %s\n", names[week % 7]);      return 0; }

user: user-2
content: #include <stdio.h>    //定义一个枚举类型  enum Weekday{MON,TUE,THU,FRI,SAT,SUN}Weekday;  int main(int argc, char* argv[]) {	 	enum Weekday week; 	printf("输入数字：\n"); 	scanf("\n%d",&week); 	while(week>7){ 		printf("输入不正确：\n"); 		scanf("\n%d",&week); 	} 	switch(week){ 		case 0:printf("MON");break; 		case 1:printf("TUE");break; 		case 2:printf("WED");break; 		case 3:printf("THU");break; 		case 4:printf("FRI");break; 		case 5:printf("SAT");break; 		case 6:printf("SUN");break; 	}     return 0; }

user: user-0
content: #include<iostream.h> int main() { 	enum Week{MON, TUE, WED, THU, FRI, SAT, SUN}; 	int day; 	cout<<"请输入一个0-6的整数："; 	cin>>day; 	switch((Week)day) 	{ 	case 0: cout<<"MON"<<endl;	break; 	case 1: cout<<"TUE"<<endl;	break; 	case 2: cout<<"WED"<<endl;  break; 	case 3: cout<<"THU"<<endl;	break; 	case 4: cout<<"FRI"<<endl;	break; 	case 5: cout<<"SAT"<<endl;	break; 	case 6: cout<<"SUN"<<endl;	break; 	default: 		cout<<"输入有误！"<<endl; 	 	} 	return 0; 	 }    这样对吗

user: user-3
content: 开学了, 教得挺快的, 都教到枚举了?
user-0 提问: 如何真正解决VS c++6.0在win7(32位）中流畅运行

回复:
user: user-1
content: 有免安装版的，不过只能打开工作空间，不能新建别的东西，要不直接崩溃

user: user-2
content: 不要光盘版的，下载VC6 sp6的。

user: user-3
content: FileTool.exe 替换打开和添加到项目中 Visual C++ 的新功能 http://support.microsoft.com/kb/241396/zh-cn  "我就要走在老路上，我就要回到老地方。"

user: user-4
content: 真正解决问题的办法是换XP或 win98

user: user-4
content: 引用 3 楼 relaxisland 的回复:计算机等级考试还用vs6.0？ 这不知道 不都是TC么?啥时候改的VC6啊

user: user-5
content: 加个内存条，装个虚拟机。

user: user-6
content: 安装虚拟机，在xp中使用vc6.0是比较可行的方法

user: user-7
content: 如果只是为了计算机等级考试而用VC6.0的话，还是装虚拟机，装XP，在虚拟机中使用VC6.0吧

user: user-2
content: 引用 10 楼 u010165006 的回复:不要光盘版的，下载VC6 sp6的。  VC6有个地方很讨厌，比如：  for(int i=0;...) 	for(int j=0;...) 。。。  for(int i=0;...) 	for(int j=0;...) 。。。 编译会出错。

user: user-8
content: 会用后续版本的vs，也是一样的。

user: user-9
content: 计算机等级考试还用vs6.0？ 这不知道

user: user-10
content: 保守残缺vc6.0
user-0 提问: VS C++调试的时候不会出现哪里错误

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

user: user-2
content: 好好贴代码：  #include<stdio.h> int main() { 	int a = 1, b = 2; 	for(; a < 8; a++) 	{ 		b+=a;  		a+=2; 	} 	printf("a=%d,b=%d\n", a, b); 	return 0; } //a=10,b=14

user: user-3
content: 全部都是全角字符，能够编译通过才怪了。

user: user-4
content: 代码全 是全角字符
user-0 提问: C语言，关于printf()输出字符串（数组）出现乱码的解释，求给个比较专业、略微详细的解释？

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

user: user-2
content: 引用 4 楼 weishen2011 的回复:[quote=引用 2 楼 q3733353520 的回复:] 方式一：在数组str[7]后的内存区域中也是有值的，虽然你没有赋值，那些你打印的乱码就是那些区域里的值，直到遇到'\0' 方式二：同方式一 方式三; 也一样 也就是说跟定义时分配的空间大小毫无关系了？ 不管空间小于字符串长度，还是大于字符串长度，总之只要最后printf()和puts()没有获取到‘\0’ 这两个函数就会继续读取给定空间之外的变量，因为这个变量是随机的，不可预知的，所以很多时候就会是乱码？ 是这个意思么？[/quote] 是的

user: user-3
content: 1. 都是一直往后遍历，直到遇到内存中第一个 0 为止，在之前输出的就都是乱码。 2. 和上面一样。

user: user-4
content: 建议，下断点，查看内存

user: user-0
content: 引用 2 楼 q3733353520 的回复:方式一：在数组str[7]后的内存区域中也是有值的，虽然你没有赋值，那些你打印的乱码就是那些区域里的值，直到遇到'\0' 方式二：同方式一 方式三; 也一样 也就是说跟定义时分配的空间大小毫无关系了？ 不管空间小于字符串长度，还是大于字符串长度，总之只要最后printf()和puts()没有获取到‘\0’ 这两个函数就会继续读取给定空间之外的变量，因为这个变量是随机的，不可预知的，所以很多时候就会是乱码？ 是这个意思么？

user: user-5
content: 声明时初始化，输出时限定输出长度，可以有效的减少输出溢出问题。

user: user-2
content: 方式一：在数组str[7]后的内存区域中也是有值的，虽然你没有赋值，那些你打印的乱码就是那些区域里的值，直到遇到'\0' 方式二：同方式一 方式三; 也一样
user-0 提问: str1=""条件下strcmp(str1,str2)不会core,而int n=str(str1,str2)会core?

回复:
user: user-0
content: char *str1=NULL; 这样试下。

user: user-1
content: 兄弟，你这代码真的会dump么？我跑了好几次都没复现bug啊

user: user-0
content: 首先，很感谢各位的回复。 很想说下，这里只是讨论问题，不涉及水平问题。对于#4 很明显这是手误，是#include<string.h>，有必要刷帖吗。  再回复下其他回复问题的人，不要套理论回复别人的问题，你怎么知道别人就是小白呢。针对问题请给出针对性的回答，套话就别刷了吧。  程序中写成strcmp(str1,str2); 这种形式，程序压根就不会执行这一行代码，这才是问题的所在！

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

user: user-2
content: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

user: user-3
content: #incude<stdio.h> #incude<string.h>//incude是什么鬼

user: user-4
content: 不同编译器对这个函数返回值不同，你可以看看strcmp这个函数的源码是什么，看看返回值是什么类型什么值，有可能bug就是这了

user: user-0
content: 请大家帮助看下为什么init n=strcmp...为什么会产生coredump,多谢了。

user: user-5
content: 从代码看来，没问题。
user-0 提问: 请教一个形参类型的warning

回复:
user: user-1
content: 把uint8_t 改为char。

user: user-2
content: #include <stdio.h> typedef unsigned char   uint8_t;   uint8_t 和char 是不兼容的

user: user-3
content: uint8_t 一般来说就是unsigned char，与char自然是不兼容的, 需要    强制转换, 一般来说uint8_t*用来存储二进制数据, lz这里声明字符串为什么要用uint8_t

user: user-4
content: const char*与const unsigned char*不兼容的警告。不要用uint8_t，直接用char
user-0 提问: 一个课本上的题目请大家帮忙，谢谢

回复:
user: user-1
content: 加  delete pN;

user: user-1
content: 得在加一行：  void main() { 	int *pN = new int; 	cin >> *pN; 	int *arr = new int[*pN]; 	for (int i = 0; i < *pN; i++) 	{ 		arr[i] = i + 1; 	} 	for (i = 0; i < *pN; i++) 	{ 		cout << arr[i] << endl; 	} 	delete[] arr; 	delete pN; }

user: user-0
content: 引用 1 楼 ant2012 的回复:void main() {     int *pN;     cin>> *pN;   //pN没有开辟空间，就对其赋值，很危险     int *arr = new int[*pN];     for(int i=0;i<*pN;i++)     {         arr[i] = i+1;     }     for(i=0;i<*pN;i++)     {         cout<<arr[i]<<endl;     }     delete arr;       //释放空间方式不对，这种方式只能释放一个元素 }  正确代码  void main() {     int *pN = new int;     cin>> *pN;     int *arr = new int[*pN];     for(int i=0;i<*pN;i++)     {         arr[i] = i+1;     }     for(i=0;i<*pN;i++)     {         cout<<arr[i]<<endl;     }     delete[] arr; }谢谢

user: user-2
content: void main() {     int *pN;     cin>> *pN;   //pN没有开辟空间，就对其赋值，很危险     int *arr = new int[*pN];     for(int i=0;i<*pN;i++)     {         arr[i] = i+1;     }     for(i=0;i<*pN;i++)     {         cout<<arr[i]<<endl;     }     delete arr;       //释放空间方式不对，这种方式只能释放一个元素 }  正确代码  void main() {     int *pN = new int;     cin>> *pN;     int *arr = new int[*pN];     for(int i=0;i<*pN;i++)     {         arr[i] = i+1;     }     for(i=0;i<*pN;i++)     {         cout<<arr[i]<<endl;     }     delete[] arr; }
user-0 提问: c语言问题

回复:
user: user-1
content: 参考C语言书上，代码如下：  #include "stdio.h" int hcf(int m,int n) { 	int t,r; 	if(n>m) 	{ 		t=m; 		m=n; 		n=t; 	} 	while((r=m%n)!=0) 	{ 		m=n; 		n=r; 	} 	return n; } int lcd(int m,int n,int h) { 	return m*n/h; } void main() { 	int m,n,h,l; 	printf("请输入m,n:\n"); 	scanf("%d,%d",&m,&n); 	h=hcf(m,n); 	l=lcd(m,n,h); 	printf("最大公约数是:%d\n最小公倍数是:%d\n",h,l); }

user: user-2
content: 搜＂最大公约数＂代码

user: user-0
content: 有谁能给个能用的算法吗？我对比看看错在哪

user: user-2
content: for (i = x; i < 1; i--) 改为： for (i = x; i > 1; i--)

user: user-3
content: 况且你找最大公约数的方法，大概看了一下，问题挺多的，希望再认真斟酌

user: user-3
content: i你已经定义为整数，for循环那又给了i＜1的限制，i--肯定要出问题啊

user: user-4
content: 粗略一看，for循环的条件是否有问题