Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: pScanInfo->last_file_path3的内容为什么有时显示不正常

回复:
user: user-0
content: 奇怪， eLIBs_printf 在其它界面的输出信息是正确的.  个人认为：是不是嵌入式小系统 堆或栈方面分配内存有问题.

user: user-1
content: *nNandFileCount = pScanInfo->CurCnt;  eLIBs_printf("..%s..%d...pScanInfo->CurCnt=%d...path = %s;...path = %s;...path = %s;\n\n", __FILE__, __LINE__,  pScanInfo->CurCnt, pScanInfo->last_file_path1, pScanInfo->last_file_path2, pScanInfo->last_file_path3); //pScanInfo->last_file_path1, pScanInfo->last_file_path2, pScanInfo->last_file_path3 内容显示正常   上面的注释里，你声称程序到这里为止一直是正常的，那么后面如果出现不正常，妥妥是因为eLIBs_printf的问题，除非你上面的注释里是胡扯的。

user: user-0
content: 引用 1 楼 user-1 的回复:有时是啥时候呢？ 难道是当且仅当CurCnt >= 3的时候？ 不正常又是怎么个不正常，正常又是怎么个正常呢？  有时能正确的显示出内容, 有时显示出来的是乱。 这是什么原因呢?

user: user-0
content: eLIBs_printf 是小系统的自带的函数.  第一次显示正常，后来大多数不正常(有时是正常的).

user: user-1
content: eLIBs_printf 还有这东西是不是有问题，因为照你的说法，乱之前最近的那一次正常，就发生在这个函数里，而这个函数和后面发生乱码的情况之间根本就没隔其他语句，那唯一可能出问题的地方就妥妥是它了，何况这东西明显不是系统函数，是你们自己写的，出错也很正常~

user: user-1
content: 引用 2 楼 huabinsir 的回复:[quote=引用 1 楼 user-1 的回复:] 有时是啥时候呢？ 难道是当且仅当CurCnt >= 3的时候？ 不正常又是怎么个不正常，正常又是怎么个正常呢？  有时能正确的显示出内容, 有时显示出来的是乱。 这是什么原因呢?[/quote] 怎么个乱发，举个例子嘛，是部分乱，还是全部乱~

user: user-1
content: 有时是啥时候呢？ 难道是当且仅当CurCnt >= 3的时候？ 不正常又是怎么个不正常，正常又是怎么个正常呢？
user-0 提问: 关于c语言我有话说

回复:
user: user-1
content: 引用 21 楼 zhao4zhong1 的回复:[quote=引用 18 楼 u013545389 的回复:] 话说C的整型数组最大可以定义多少啊？   比如int a[10000],此时好像就不行了 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 [/quote]  多谢指教，，，const  好像也行吧

user: user-2
content: 引用 18 楼 u013545389 的回复:话说C的整型数组最大可以定义多少啊？   比如int a[10000],此时好像就不行了 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

user: user-3
content: 看看 Learn C The Hard Way http://c.learncodethehardway.org/book/

user: user-4
content: 下载一个C语言的手机开源项目，然后读懂它。

user: user-1
content: 话说C的整型数组最大可以定义多少啊？   比如int a[10000],此时好像就不行了

user: user-5
content: 曾经有本C语言的书，最后面带了五笔教程的。然后呢，C语言有没学会不清楚，五笔是学会了。吼吼。

user: user-6
content: 引用 8 楼 wIloverYou123456789 的回复:看大家的回复貌似不太热烈， 我就在加 60 分，希望大家踊跃发言 给出中肯的意见和建议！  看来大家的回复 有的说 看 The C Programming Language  有的是让下载看 “入门圣经”  还有的说 Win-TC   我说一下现在的情况吧，目前做手机开发 android 你们懂得 应用方面做了一些时间了，现在想往framework层努力，但是 framework中jni有些东西是c的东西，所以鉴于此想补习c，希望大家能从一个白痴的人学习c 这个角度看就行了，这样给出的学习思路应该是适合我的！ 我觉得楼主不妨看看郝斌老师的C语言视频，它将的浅显易懂，而且也很好，你可以边看视频边照着他说的敲代码

user: user-7
content: 手机，不是都在用安卓系统吗？不是Java开发吗？C的话，初学建议《C Primer Plus（第五版）中文版》，这本书带有练习题的，如果有基础，只是想复习一下，快速浏览一遍，做几道题就可以了。 引用 楼主 wIloverYou123456789 的回复:因为做手机开发现在想补习一下c语言，求大神知道学习路线！做好是务实的路线不要是纯理论，希望能一边看书一边又能写代码实践的

user: user-8
content: <<The C Programming Language>>

user: user-9
content: 我只是新手学习来着

user: user-10
content: 首先你需要下载android的源码和一台配套的手机 然后你需要在linux上编译过源码再烧到手机看看 如果没问题 之后你就可以选择一个自己喜欢的模块来研究framework层的代码 framework层貌似大部分是C++的代码 你需要懂得一些C++的技巧和设计模式 你还需要了解一些硬件的知识 这样你研究android的源码会事半功倍 再然后你就可以自己修改源码  编译 再烧机实践就可以了 具体的学习方法以及看什么书可以问搜索引擎

user: user-2
content: 引用 7 楼 supermegaboy 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm  唉，你看看六楼，都是你造的孽啊。[/quote] 哈！身后留下点“残渣余孽”总好过“雁过不留痕”吧。

user: user-11
content: 我觉着，要是深入学c的话可以看下c primer plus 这本书个人感觉还是很好的

user: user-12
content: 引用 8 楼 wIloverYou123456789 的回复:看大家的回复貌似不太热烈， 我就在加 60 分，希望大家踊跃发言 给出中肯的意见和建议！  看来大家的回复 有的说 看 The C Programming Language  有的是让下载看 “入门圣经”  还有的说 Win-TC   我说一下现在的情况吧，目前做手机开发 android 你们懂得 应用方面做了一些时间了，现在想往framework层努力，但是 framework中jni有些东西是c的东西，所以鉴于此想补习c，希望大家能从一个白痴的人学习c 这个角度看就行了，这样给出的学习思路应该是适合我的！ 作为有编程经验的人，你只需要了解C和Java的区别就可以了。

user: user-0
content: 看大家的回复貌似不太热烈， 我就在加 60 分，希望大家踊跃发言 给出中肯的意见和建议！  看来大家的回复 有的说 看 The C Programming Language  有的是让下载看 “入门圣经”  还有的说 Win-TC   我说一下现在的情况吧，目前做手机开发 android 你们懂得 应用方面做了一些时间了，现在想往framework层努力，但是 framework中jni有些东西是c的东西，所以鉴于此想补习c，希望大家能从一个白痴的人学习c 这个角度看就行了，这样给出的学习思路应该是适合我的！

user: user-13
content: 引用 5 楼 zhao4zhong1 的回复:先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm  唉，你看看六楼，都是你造的孽啊。

user: user-14
content: VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和 寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时 候。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-2
content: 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm

user: user-15
content: http://download.csdn.net/detail/max_min_/6333711 上面的例程，都敲敲，入门应该没问题了

user: user-16
content: 上机操作，操作再操作！相当务实！
user-0 提问: whlid 循环不起作用？ 

回复:
user: user-0
content: 谢谢！  给出我最新的实现，提供后来者参考 int main(int argc , char *argv[]) {     pthread_t thr[10];     for(int i=0;i<10;i++)     {          pthread_create(&thr[i],NULL,threadhander,(void *)i);      }     for(int i=0;i<10;i++)     {          pthread_join(thr[i], NULL);/*等待进程t_b结束*/     }   	return 0; }  void *threadhander(void * fid) {     while(1)     {        // toserver((int )fid);         pthread_t t1;         t1=pthread_self();          printf("fid=%d,threadid=%u\r\n",(int)fid,(int)t1);         sleep(1);     }     return 0; }

user: user-1
content: 引用 5 楼 xihu1364 的回复:main 中的 return 0 上一句 加一个 while（1）｛｝  或者加上 system("pause");

user: user-2
content: main 中的 return 0 上一句 加一个 while（1）｛｝

user: user-0
content: 请问xihu1364，truelance 两大哥，如何改进呢？

user: user-3
content: 主线程结束了, 所有的子线程都会被干掉.

user: user-2
content: main(int argc , char *argv[]) 父进程 结束了...   还有传参 是传的 局部变量pthread_create(&thr,NULL,threadhander,(void *)i);

user: user-4
content: void *threadhander(void * fid)   的return 0应该去删了吧;
user-0 提问: 为什么这个局部指针变量还可返回？

回复:
user: user-1
content: 地址可以传出来，但是栈上变量被回收了，这块地址就可能被再利用，地址中的值也就不确定了

user: user-2
content: 引用 5 楼 zmlovelx 的回复:说俗点吧： A上了次厕所， 过一会C进去了，这个时候可能A的那陀还在，也有可能已经被清洁工人清洁掉了。人才啊

user: user-3
content: 引用 楼主 u011323280 的回复:#include<stdio.h> #include<stdlib.h> int* S(int *a) { 	int *p,b; 	p=&b; 	*p=5;  	return p; }  int main(void) { 	int p[1],*a=p; 	p[0]=3; 	a=S(a); 	printf("%d",*a);//输出5 	return 0;  }  p和b都是子函数里面定义的局部变量啊，但是函数还是可以输出5，这不是表明p可以复制给主函数里面的a嘛  大家说得已经很到位了，能得到你想要的结果，只能说是侥幸，如果结果不对，你也没办法。 这就是所谓的未定义行为。  不能保证结果的程序，你敢用吗？

user: user-4
content: 引用 5 楼 zmlovelx 的回复:说俗点吧： A上了次厕所， 过一会C进去了，这个时候可能A的那陀还在，也有可能已经被清洁工人清洁掉了。

user: user-5
content: 引用 5 楼 zmlovelx 的回复:说俗点吧： A上了次厕所， 过一会C进去了，这个时候可能A的那陀还在，也有可能已经被清洁工人清洁掉了。  你能说的不这么恶心么？

user: user-6
content: 虽然能正常运行也不能这样写，就跟你new了一块内存，存入数据但是当你delete后通常还是能访问的，但是这个时候的指针是悬垂的，他的值可以是随机的，因为他所指向的内存空间可以被其他程序重新使用，所以，其他程序如果更改了这个地址中的值的话就会出错。但是咱们的计算机任务量太小了，那块内存可能很长时间用不着所以才会出现 假正确的现象。

user: user-7
content: 首先你应该理解返回值的内容，然后再理解这个指针所指向的内容。 不过我觉的实际使用的时候楼主应该不会这么写这么无稽的代码

user: user-8
content: 五楼是语言大师啊。

user: user-9
content: 引用 5 楼 zmlovelx 的回复:说俗点吧： A上了次厕所， 过一会C进去了，这个时候可能A的那陀还在，也有可能已经被清洁工人清洁掉了。 高手

user: user-10
content: 说俗点吧： A上了次厕所， 过一会C进去了，这个时候可能A的那陀还在，也有可能已经被清洁工人清洁掉了。   真生动的例子。。牛逼。。。

user: user-11
content: 可以 ! = 正确

user: user-12
content: 其实你逐步调试一下，跟踪一下就知道问题是出在哪里了

user: user-13
content: 引用 5 楼 zmlovelx 的回复:说俗点吧： A上了次厕所， 过一会C进去了，这个时候可能A的那陀还在，也有可能已经被清洁工人清洁掉了。+1

user: user-14
content: 引用 楼主 u011323280 的回复:#include<stdio.h> #include<stdlib.h> int* S(int *a) { 	int *p,b; 	p=&b; 	*p=5;  	return p; }  int main(void) { 	int p[1],*a=p; 	p[0]=3; 	a=S(a); 	printf("%d",*a);//输出5 	return 0;  }  p和b都是子函数里面定义的局部变量啊，但是函数还是可以输出5，这不是表明p可以复制给主函数里面的a嘛 这么说吧，p中存放的地址是子函数的局部变量b的，在子函数调用完的时候这个地址就被释放了，释放的意思是告诉计算机可以使用这块内存了，这块内存程序不在占有，然后你再主函数中调用的时候这个地址的值并没有被修改，所以调用的时候可以输出子函数中b的值，但是这个地址的值还有可能会被别的因素修改。属于非法访问内存，是未定义的行为。

user: user-15
content: 引用 5 楼 zmlovelx 的回复:说俗点吧： A上了次厕所， 过一会C进去了，这个时候可能A的那陀还在，也有可能已经被清洁工人清洁掉了。

user: user-16
content: 引用 5 楼 zmlovelx 的回复:说俗点吧： A上了次厕所， 过一会C进去了，这个时候可能A的那陀还在，也有可能已经被清洁工人清洁掉了。 这比喻亮了.

user: user-17
content: 引用 5 楼 zmlovelx 的回复:说俗点吧： A上了次厕所， 过一会C进去了，这个时候可能A的那陀还在，也有可能已经被清洁工人清洁掉了。 生动啊

user: user-18
content: 你是在质疑规则

user: user-19
content: 说俗点吧： A上了次厕所， 过一会C进去了，这个时候可能A的那陀还在，也有可能已经被清洁工人清洁掉了。

user: user-20
content: 系统没有必要把你用过的地址对应的内容特意去擦除（你这里用的是stack上的空间） 可能会在下个函数中使用时被覆写。
user-0 提问: 二叉树问题  望高手 解惑！！！

回复:
user: user-1
content: Segmentation fault is a specific kind of error caused by accessing memory that “does not belong to you.” It’s a helper mechanism that keeps you from corrupting the memory and introducing hard-to-debug memory bugs. Whenever you get a segfault you know you are doing something wrong with memory – accessing variable that has already been freed, writing to a read-only portion of the memory, etc. Segmentation fault is essentially the same in most languages that let you mess with the memory management, there is no principial difference between segfaults in C and C++.

user: user-2

user: user-3
content: tree inittree(tree t,int n) { //	static int num=0; if(n>=20){    puts("bianjiedaole");	 return; }  t = (struct node *)malloc(sizeof(struct node)); t->r=t->l=NULL; if(t!=NULL) { t->data = n; //	 printf("%d \n",t->data); //	 num++; inittree(t->l,2*n+1); puts("lllll"); inittree(t->r,2*n+2); puts("rrrrr"); } }  创建函数有问题啊。参数传的是指针的值，但是你又需要修改指针的值，所以你需要传指针的指针进去。
user-0 提问: 缓存代码问题

回复:
user: user-1
content: 这种替换，比较偏门，一般只有某些库代码会这么做。  正常的程序编写中，多半不会使用这样的代码。

user: user-1
content: 预编译的宏替换规则，不是这么做的。 你需要符号替换才行，需要用到 ##这个符号。 看看MFC的那些宏，是如何实现的，你就明白该怎么做了。 你这个替换，达不到你的目的。 单纯的宏替换，只是字符串的直接替换，不能做符号替换，除非使用 ##这个符号连接符。  也就是说： Cache(fib2) 被替换成 name_cache，而不是 fib2_cache CacheProc(fib2) 被替换成name_patch，而不是 fib2_patch  改成这样就可以了： #define PasteSym(x,y)     x##y #define  Cache(name)  PasteSym(name,_cache) #define  CacheProc(name)  PasteSym(name,_patch)  这样就会有如下替换效果： Cache(fib2) ---> fib2_cache CacheProc(fib2) ---> fib2_patch

user: user-0
content: 麻烦哪位能回答下红字的问题啊。

user: user-0
content: name_path 在下面代码中没找到，所以他如何被替换呢？

user: user-2
content: 引用 2 楼 robin622 的回复:name_path 在下面代码中没找到，所以他如何被替换呢？ 干么要找到呢?  替换就是

user: user-3
content: 编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E

user: user-4
content: #define就是简单的替换而已
user-0 提问: dlopen函数是否检查so文件的合法性

回复:
user: user-1
content: 看看用myhandle的地方吧

user: user-2
content: 只是open，应该不会有问题  看看其他的地方吧 32bit AIX程序可以malloc的内存上限默认为256M

user: user-0
content: 没人回啊！！
user-0 提问: doxygen有关宏定义的问题

回复:
user: user-1
content: doxygen配置问题吧

user: user-0
content: 引用 1 楼 user-2 的回复:仔细检查下各个宏定义，不知是你哪个头文件里写了相关宏定义  程序不是自己写的，是公司研发的几个人一起完成的，我现在需要把它做成html，对程序也不是特别了解。但是我试着使用doxygen的时候。做过这个样子的尝试，只打开其中的一个程序。 #if defined  (ABC) #include "aaa.h" #include "bbb.h" #include "ccc.h" #include "ddd.h" /** * 函数功能     : 初始化 * @param [in]  : 无 * @param [out] : 无 * @retval      : OK-成功 * @retval      : ERROR-失败 */ int abcd(void) {     return (abcde()); }     这个是程序的一部分。这样生成出来的html没有东西。但是我把开头的#if defined  (ABC)去掉之后，这样可以生成int abcd (void)的函数，并且可以链接到注释中的文字。     我就在想是不是配置的时候出了什么问题。。

user: user-2
content: 仔细检查下各个宏定义，不知是你哪个头文件里写了相关宏定义
user-0 提问: c新手 请帮我看下这个评委打分的程序 哪错了，谢谢

回复:
user: user-1
content: 同意上面所说，既然你要初始化三个变量，那为什么不直接用数字初始化呢

user: user-2
content: 最后一个输入数据没加上，如1楼所说，把输入和累加顺序换过来，并且循环外记得sum先把第一个值加上，这样就行了

user: user-3
content: #include<stdio.h> void main() { float x,max,min,sum=0; int n,i=1; printf("input people number:"); scanf("%d",&n); printf("input score:"); scanf("%f",&x); max=x; min=x; sum = x; while(i<n) {  i++; scanf("%f",&x); sum+=x; if(max<x)max=x;   else if(x<min)min=x;   } sum=sum-max-min; printf("%f\n",sum); }

user: user-4
content: LZ 的思路有点儿乱，是不是让 max 和 min 必须有初值给闹的。 其实可以有点小技巧处理一下。如果分数的范围是 0~100的话，可以初始化 min = 101; max = -1; 这两个数值显然都是没用的，最终肯定会被正确的值给替换掉的。 对于次数确定的循环，建议无论如何都要使用 for 结构，写的人心里有数，不易错，看的人也容易理解。

user: user-4
content: 逻辑上，应该先 scanf("%f", &x) ，再累加 sum += x。 LZ 把顺序搞反了。循环里最后少累加一次。
user-0 提问: 如何避免count重定义

回复:
user: user-0
content: 引用 7 楼 vipcxj 的回复: //dec.h extern int a1, a2, a3, a4;  //dec.cpp #include "dec.h" int a1 = 1, a2 = 2, a3 = 3, a4 = 4;  //main.cpp #include <iostream> #include "dec.h" int main() {    std::cout << a1 << a2 << a3 << a4 << std::endl;    return 0; }  忘记给dec.cpp加上#include "dec.h"了 thank you!就打算这样写了！！！

user: user-1
content: //dec.h extern int a1, a2, a3, a4;  //dec.cpp #include "dec.h" int a1 = 1, a2 = 2, a3 = 3, a4 = 4;  //main.cpp #include <iostream> #include "dec.h" int main() {    std::cout << a1 << a2 << a3 << a4 << std::endl;    return 0; }  忘记给dec.cpp加上#include "dec.h"了

user: user-1
content: 引用 5 楼 x565244538 的回复:[quote=引用 3 楼 turingo 的回复:] 在头文件中不要去直接定义变量实体，正确的做法应该是在某个.c文件中，即使在main.c中定义int count=100也是可以的，而在头文件中应该用extern int count仅仅进行声明而已。 主要是数据太多了...50多个结构体变量又声明，又定义的嫌麻烦!就想一次搞定！小弟我想偷个懒。50多个结构体代码量有1000多行。就是想每次包含以下头文件就可以了，省的每次都要包含头文件的同时都要对每个变量extern[/quote]  还是要用extern 你弄个头文件，里面用extern声明所有你需要的变量，弄个cpp，包含上面那个头文件，在cpp里面进行变量定义，然后将此cpp加入工程。具体使用时，你压根不用管那个cpp，只要包含头文件就够了。比如下面这样  //dec.h extern int a1, a2, a3, a4;  //dec.cpp int a1 = 1, a2 = 2, a3 = 3, a4 = 4;  //main.cpp #include <iostream> #include "dec.h" int main() {    std::cout << a1 << a2 << a3 << a4 << std::endl;    return 0; }

user: user-0
content: 引用 3 楼 turingo 的回复:在头文件中不要去直接定义变量实体，正确的做法应该是在某个.c文件中，即使在main.c中定义int count=100也是可以的，而在头文件中应该用extern int count仅仅进行声明而已。 主要是数据太多了...50多个结构体变量又声明，又定义的嫌麻烦!就想一次搞定！小弟我想偷个懒。50多个结构体代码量有1000多行。就是想每次包含以下头文件就可以了，省的每次都要包含头文件的同时都要对每个变量extern

user: user-2
content: 对你这个程序, 完全可以把int count=100; 移到a.c中 即时其他文件中需要访问count, 只需要在q.h中增加声明 extern int count; 即可

user: user-3
content: 在头文件中不要去直接定义变量实体，正确的做法应该是在某个.c文件中，即使在main.c中定义int count=100也是可以的，而在头文件中应该用extern int count仅仅进行声明而已。  引用 楼主 x565244538 的回复:小弟正在写一个C++的派生类，头文件中定义变量，在其他代码中调用出现重定义现象，代码简化如下。 麻烦看下怎么改进，才能避免count重定义！3----q! q.h  #ifndef _Q_H_ #define _Q_H_ #include <stdio.h> int count=100; #endif  a.h  #ifndef _A_H_ #define _A_H_ #include "q.h" void print(); #endif  a.c  #include "a.h" void print() {     int num=count;     printf("count=%d\n",num); }  z.h  #ifndef _Z_H_ #define _Z_H_ #include "a.h" void printz(); #endif  z.c  #ifndef _Z_H_ #define _Z_H_ #include "a.h" void printz(); #endif  w.h  #ifndef _W_H_ #define _W_H_ #include "a.h" void printw(); #endif  w.c  #include "w.h" void printw() {     printf("____WWWW____%s\n",__func__);     print(); }  test.c  #include "w.h" #include "z.h" int main() {     printz();     printw();     print(); }

user: user-0
content: 引用 1 楼 hwxy502 的回复:第一行加上#pragma once 还是不行。。。。。

user: user-4
content: 第一行加上#pragma once
user-0 提问: 转换算法

回复:
user: user-1
content: 搜“暴雪哈希算法”

user: user-0
content: 引用 9 楼 u013531919 的回复:基本上就是hash，要限定范围用%运算。  我就是这样办的，冲突太严重啦！！！

user: user-0
content: 引用 5 楼 dcw0402 的回复:帮顶一个,遇到类似的问题,没有很好的办法,我默认是用md5的  md5是唯一,但出来的都是乱串啊如何映射啊？

user: user-2
content: 引用 4 楼 zhenwo123 的回复:[quote=引用 3 楼 nice_cxf 的回复:] 要看字符串的长度，说实话多半是不可能完成的任务  那平常那些hash都干啥用的啊？[/quote] hash是有碰撞的，保证不了唯一 除非你字符串长度短，不然从信息论角度看，是不可能实现11对应的，就算只有8位只有大小写字母加数字，总数也已经是62^8,已经超过了整数的最大范围

user: user-3
content: 帮顶一个,遇到类似的问题,没有很好的办法,我默认是用md5的

user: user-0
content: 引用 3 楼 nice_cxf 的回复:要看字符串的长度，说实话多半是不可能完成的任务  那平常那些hash都干啥用的啊？

user: user-4
content: 引用 10 楼 vipcxj 的回复:一一映射理论上是可以的，也就是1L说的康托展开，但这只是理论，因为数学里面自然数可以是无穷，所以你一个足够长的字符串，可能就要映射到一个几M字节的整型上，显然这是毫无意义的。至于Hash算法，那更不可能一一映射了，因为Hash算法是有冲突滴~~~  不过如果LZ限定你字符串长度足够短，康托展开还是能够办到滴，因为康托展开对于n位的序列，至多到n!，这样n不是特别大，比如20以下，用long long就能存下所有的映射

user: user-4
content: 一一映射理论上是可以的，也就是1L说的康托展开，但这只是理论，因为数学里面自然数可以是无穷，所以你一个足够长的字符串，可能就要映射到一个几M字节的整型上，显然这是毫无意义的。至于Hash算法，那更不可能一一映射了，因为Hash算法是有冲突滴~~~

user: user-5
content: 基本上就是hash，要限定范围用%运算。

user: user-6
content: 哈希+链表？？

user: user-7
content: 我以前在CSDN也问过这个  都说不可能  会有冲突

user: user-2
content: 要看字符串的长度，说实话多半是不可能完成的任务

user: user-8
content: 字符串的经典hash算法 . http://blog.csdn.net/hengyunabc/article/details/5914934

user: user-9
content: 康托展开怎么样。
user-0 提问: 学习C语言时的一个小问题

回复:
user: user-1
content: 使用未初始化的数据，其结果是未定义的 lz你知道z变量一开始的值么

user: user-2
content: z没有初值没有计算进去的原因。这样写 #include"stdio.h" main() { int x,y,z; for(x=0;x<=20;x++) for(y=0;y<=50;y++) for(z=0;z<=100;z++) {  if(5*x+2*y+z==100)  printf("5分硬币有%d\t2分硬币有%d\t1分硬币有%d\n",x,y,z); } }

user: user-3
content: z呢，，，没初始化 也没for 循环~~
user-0 提问: 请问怎么用VS2010在里面写代码啊？

回复:
user: user-1
content: 8楼正解，新建控制台应用程序

user: user-2
content: 打开的话就找那个后缀名为.dsw 的文件就OK

user: user-3
content: 楼主可以看看vs2010的帮助。

user: user-3

user: user-4
content: win32或者空的也行，你要做MFC就选MFC

user: user-5
content: 加油吧 骚年

user: user-0
content: 引用 4 楼 u013470052 的回复:[quote=引用 3 楼 u013524589 的回复:] [quote=引用 1 楼 ganpengjin1 的回复:] 新建->项目 右击项目，添加文件。 然后写入代码 大神求告知在选项目的时候选什么？WIN32？常规？[/quote] win32  文件选cpp[/quote]OK,xiela

user: user-6
content: 引用 3 楼 u013524589 的回复:[quote=引用 1 楼 ganpengjin1 的回复:] 新建->项目 右击项目，添加文件。 然后写入代码 大神求告知在选项目的时候选什么？WIN32？常规？[/quote] win32  文件选cpp

user: user-0
content: 引用 1 楼 ganpengjin1 的回复:新建->项目 右击项目，添加文件。 然后写入代码 大神求告知在选项目的时候选什么？WIN32？常规？

user: user-6
content: 无非那几步，new->application->file。

user: user-7
content: 新建->项目 右击项目，添加文件。 然后写入代码
user-0 提问: 邻接多重表删除算法的问题

回复:
user: user-0
content: int DeleteVex(AMLGraph *G,VertexType v)   {       int i,j;       VertexType w;       EBox *p;          i=LocateVex(*G,v); // i为待删除顶点的序号        if(i<0)           return 0;       for(j=0;j<(*G).vexnum;j++) // 删除与顶点v相连的边(如果有的话)        {           if(j==i)               continue;           strcpy(w,*GetVex(*G,j)); // w是第j个顶点的值            DeleteArc(G,v,w);       }       for(j=i+1;j<(*G).vexnum;j++) // 排在顶点v后面的顶点的序号减1            (*G).adjmulist[j-1]=(*G).adjmulist[j];       (*G).vexnum--; // 顶点数减1        for(j=i;j<(*G).vexnum;j++) // 修改顶点的序号        {           p=(*G).adjmulist[j].firstedge;           if(p)           {               if(p->ivex==j+1)               {                   p->ivex--;                   p=p->ilink;               }               else               {                   p->jvex--;                   p=p->jlink;               }           }       }              return 1;   }    还有这个删除顶点的算法,其中第一个循环那里,为什么每次循环都要调用删除函数,不是应该是和v相连的才对吗?

user: user-0
content: while(p) // 向后查找弧<v,w>            {               if(p->ivex==i&&p->jvex!=j) // 不是待删除边                {                   q=p;                   p=p->ilink; // 找下一个邻接顶点                }               else if(p->jvex==i&&p->ivex!=j) // 不是待删除边                {                   q=p;                   p=p->jlink; // 找下一个邻接顶点                }               else // 是邻接顶点w                    break;    上面那个发的不好

user: user-0
content: while(p) // 向后查找弧<v,w>                if(p->ivex==j&&p->jvex!=i) // 不是待删除边                {                   q=p;                   p=p->ilink; // 找下一个邻接顶点                }               else if(p->jvex==j&&p->ivex!=i) // 不是待删除边                {                   q=p;                   p=p->jlink; // 找下一个邻接顶点                }               else // 是邻接顶点v                    break;    应该是这部分
user-0 提问: C99标准里面怎么没有规定C run-time library的内容

回复:
user: user-1
content: 等你去加规定了，顺便把图形界面的接口、多线程的接口都加上哈，bless

user: user-0
content: 引用 3 楼 jha334201553 的回复:[quote=引用 2 楼 inurlcn 的回复:] [quote=引用 1 楼 jha334201553 的回复:] 你想让C99把操作系统都定死么？这不是自掘坟墓么  在C99文档里面没找到对于 “C库初始化” 的部分内容[/quote]你能写一段代码，在各个操作系统下都能用的初始化代码？[/quote]  C99 不就是做了些规定接口的工作吗

user: user-1
content: 引用 2 楼 inurlcn 的回复:[quote=引用 1 楼 jha334201553 的回复:] 你想让C99把操作系统都定死么？这不是自掘坟墓么  在C99文档里面没找到对于 “C库初始化” 的部分内容[/quote]你能写一段代码，在各个操作系统下都能用的初始化代码？

user: user-0
content: 引用 1 楼 jha334201553 的回复:你想让C99把操作系统都定死么？这不是自掘坟墓么  在C99文档里面没找到对于 “C库初始化” 的部分内容

user: user-1
content: 你想让C99把操作系统都定死么？这不是自掘坟墓么
user-0 提问: 结构体，函数疑惑，我老师和我已跪

回复:
user: user-1
content: 引用 11 楼 u013523101 的回复:[quote=引用 6 楼 u013470052 的回复:] 在主函数中定义并调用aveger数组，把ave传进去就ok。 主函数中增加   folat aveger[5] = {0};  调用的时候 这样调用p = ave(aveger); 定义子函数加上参数  float *ave(float * aveger) 把子函数中对aveger的定义去掉 子函数中对sum数组还得清零 float sum[5] = {0}; 这样就ok~ 谢谢你，你的方法确实可以行得通。不过跟你讲的有点出入：我传入void ave（float *aveger）函数的是一个数组地址（主函数中的数组pj【5】）。ave（pj）后，printf（pj【i】）；[/quote] 条条大路通罗马，做出来总是好的。最好指针和数组分别都用下，体会下联系和区别~

user: user-0
content: 引用 6 楼 u013470052 的回复:在主函数中定义并调用aveger数组，把ave传进去就ok。 主函数中增加   folat aveger[5] = {0};  调用的时候 这样调用p = ave(aveger); 定义子函数加上参数  float *ave(float * aveger) 把子函数中对aveger的定义去掉 子函数中对sum数组还得清零 float sum[5] = {0}; 这样就ok~ 谢谢你，你的方法确实可以行得通。不过跟你讲的有点出入：我传入void ave（float *aveger）函数的是一个数组地址（主函数中的数组pj【5】）。ave（pj）后，printf（pj【i】）；

user: user-0
content: 在float *ave（）函数里修改      float *aveger;     aveger=(float*)malloc(20);       .       .       . *aveger=sum[0]/5;  *(aveger+1)=sum[1]/5; *(aveger+2)=sum[2]/5; *(aveger+3)=sum[3]/5; *(aveger+4)=sum[4]/5;

user: user-0
content: 引用 2 楼 bbs2241 的回复:忘了你是C了，malloc吧  谢谢了，虽然你说得有点简洁。 引用 4 楼 starytx 的回复:程序有几个问题如下： 1.sum[5]未初始化，应当这样初始化一下sum[5] = {0,0,0,0,0}; 但这个不是结果不正确的原因 2.你的函数返回的是一个局部数组的地址，这样的做法结果未定义，可以把float aveger[5]改为float指针，动态malloc，然后调用ave()后，保存这个指针(在p = ave();加一句float *pTemp = p;),最后free(pTemp);释放 谢谢，我采用您的方法做好了

user: user-2
content: 引用 6 楼 u013470052 的回复:在主函数中定义并调用aveger数组，把ave传进去就ok。 主函数中增加   folat aveger[5] = {0};  调用的时候 这样调用p = ave(aveger); 定义子函数加上参数  float *ave(float * aveger) 把子函数中对aveger的定义去掉 子函数中对sum数组还得清零 float sum[5] = {0}; 这样就ok~ 正解。

user: user-3
content: 引用 5 楼 derekrose 的回复:你老师？？？？+1

user: user-1
content: 在主函数中定义并调用aveger数组，把ave传进去就ok。 主函数中增加   folat aveger[5] = {0};  调用的时候 这样调用p = ave(aveger); 定义子函数加上参数  float *ave(float * aveger) 把子函数中对aveger的定义去掉 子函数中对sum数组还得清零 float sum[5] = {0}; 这样就ok~

user: user-4
content: 你老师？？？？

user: user-5
content: 程序有几个问题如下： 1.sum[5]未初始化，应当这样初始化一下sum[5] = {0,0,0,0,0}; 但这个不是结果不正确的原因 2.你的函数返回的是一个局部数组的地址，这样的做法结果未定义，可以把float aveger[5]改为float指针，动态malloc，然后调用ave()后，保存这个指针(在p = ave();加一句float *pTemp = p;),最后free(pTemp);释放

user: user-6
content: 嗯！ls正解，或者直接传递一个数组进去，建议楼主定义变量的时候对变量进行初始化

user: user-7
content: 忘了你是C了，malloc吧

user: user-7
content: float aveger[5],sum[5]; 这个是临时数组，return aver能返回吗？ new一下就可以了。
user-0 提问: 运算符++的计算时间问题

回复:
user: user-1
content: http://bbs.csdn.net/topics/370153775

user: user-2
content: i++  先执行  后++的问题 ++i  先++运算  在执行其他  比较两个 结果就能知道了

user: user-3
content: 这个问题也是月经贴了, 参见C99标准6.5.2.2.10说明 The order of evaluation of the function designator, the actual arguments, and subexpressions within the actual arguments is unspecified, but there is a sequence point before the actual call.

user: user-4
content: 这个问题真没必要纠结，你用不同的编译器可能结果都不同，因为所有的参数在传递或计算时有的从左往右的顺序传，有的从右往左。 这个与你所用的编译器有很大关系

user: user-5
content: 这种问题已经有很多的帖子讨论了，没必要再讨论了

user: user-6
content: 跟时间有什么关系

user: user-7
content: 没什么特别之处， printf("%10d%10d\n", i, i++ * i++ ); 这里输出的还是i*i，之后才是两个i++

user: user-8
content: 基础问题。。。。C这边新手太多了。

user: user-0
content: 引用 6 楼 wang0635 的回复:谭浩强的书看多了谭浩强的书很见过，不好意思，一般都看外国人写的书，看到一段代码，自己突发奇想改成这样的而已

user: user-9
content: 引用 10 楼 jiandingzhe 的回复:[quote=引用 9 楼 u013470052 的回复:] 问题很简单，printf输出的时候，对参数列表进行从右往左的编译，而i++都会被认为是先执行当前语句的时候使用i，完了之后再对i进行自加运算。 看置顶贴。[/quote] 我就不写这种代码~，我只是打个酱油

user: user-10
content: 引用 9 楼 u013470052 的回复:问题很简单，printf输出的时候，对参数列表进行从右往左的编译，而i++都会被认为是先执行当前语句的时候使用i，完了之后再对i进行自加运算。 看置顶贴。

user: user-9
content: 问题很简单，printf输出的时候，对参数列表进行从右往左的编译，而i++都会被认为是先执行当前语句的时候使用i，完了之后再对i进行自加运算。

user: user-11
content: 楼主在关注这个问题啊 貌似一般很多人都会叫你不要纠结这个问题的。 printf函数的入参是有顺序的。 至于i++*i++是先执行*再++  这个我也有点模糊

user: user-12
content: C/C++ 语言的规定告诉我们，任何依赖于特定计算顺序、依赖于在顺序点之间实现修改效果的表达式，其结果都没有保证。程序设计中应该贯彻的规则是：如果在任何“完整表达式”（形成一段由顺序点结束的计算）里存在对同一“变量”的多个引用，那么表达式里就不应该出现对这一“变量”的副作用。否则就不能保证得到预期结果。  看看这里吧,c++类的推荐就有呀, http://bbs.csdn.net/topics/370153775

user: user-13
content: 谭浩强的书看多了

user: user-14
content: 标准没规定，各编译器厂家自己说了算。 怎么没看置顶贴就发了啊？是不是置顶贴的标题名字不够响亮？ 能修改下把 ++ -- ++i++ 这些符号放上去吗？

user: user-15
content: 貌似没啥问题啊。都是在printf语句以后计算i+1. 哪错了。

user: user-16
content: 引用 2 楼 nanjun520 的回复:楼主在关注这个问题啊 貌似一般很多人都会叫你不要纠结这个问题的。 printf函数的入参是有顺序的。 至于i++*i++是先执行*再++  这个我也有点模糊 你也一起看置顶贴吧，这个跟先++还是后++一点关系都没有。在C/C++中这个叫未定义行为。
user-0 提问: （不知如何修正，求指点）一个用C语言实现将TXT文件数据加载到链表的程序

回复:
user: user-0
content: 恩，修改成wb+,后可以读了，debug1和debug2都输出了5次，但是数据没有显示出来，这边temp->item=a;是否存在不妥，修改成temp->item.name=a;时编译错误，应该如何修改？

user: user-0
content: 读链表部分换成以下内容后解决while(1)	 		{ 		temp=(list)malloc(sizeof(node)); 			if(fread(&temp->item, sizeof(temp->item), 1, fp) != 1)break;//重点修改了这边， 			temp->next = L->next; 			L->next = temp; 		} 		free(temp); 	return L;

user: user-1
content: 应该是文件打开方式的问题，wb方式只写不读，改成wb+试试

user: user-2
content: 读写用"wb+"模式；另外，写完先fflush一下再读稳当点...

user: user-0
content: 不好意思，发少一个生成空表list makeempty(list L) { 	L=(list)malloc(sizeof(node)); 	L->next=NULL; 	return L; }  list makeempty(list L) { 	L=(list)malloc(sizeof(node)); 	L->next=NULL; 	return L; }
user-0 提问: 偶遇 c语言 小问题 望高手解答

回复:
user: user-0
content: 结贴遇到   “给分与总分不符，请重新分配！”  这个怎么弄？

user: user-1
content: 负数的符号位是1，右移时，进行符号扩展， 所以右移一位的时候，负数永远移入1 （保证移位后还是负数），a所以永远不为0。 于是就无穷递归了，于是栈就爆了。 PS： 关于移位运算中的右移，这些基础知识，是必须记牢的：  1）无符号数右移，0扩展。    即移入0 2）有符号数右移，符号扩展。 即移入符号位的值。 3）正数符号位为0，负数符号位为1。

user: user-2
content: if(a<=0)return;

user: user-3
content: 负数右移我记得C是算术右移吧，前面会补1的，所以结果是（1111 1111）2 = （-1）10 正数用的是逻辑右移，前面补0，所以最后会变成0000 0000 也就是 0 你的判断条件应该改成这种： if(a==0||a==-1)

user: user-3
content: 递归过深栈爆了是很正常的，如果你想用递归的话，建议改成尾递归开编译器优化就可以了。

user: user-0
content: 给char类型赋值负数  然后进行位移操作  到底发生了什么

user: user-0
content: 3楼的 你说的很有道理阿  可是听你的改了if(a==-128) 连正数都是断错误了 当然负数也是段错误

user: user-2
content: void banary(char a)  {  if(a==0) return 0;////我想问题出在这里，负数不能满足判断条件，递归没有退出条件，发生了段错误。可是不明白为什么？ banary(a>>1);  printf("%d ",a&1);  } //非宽字符、非unicode以及非C++11的char16_t和char32_t情形，signed char负数范围-128~-1，1Byte字节，8bit位。 //最高位符号，负数置位1，其余7位整数有效数字，那么就是1 111 1111b~1 000 0001b。 //a>>1，右移1位运算，由于负数最高位符号“-”用“1”表示，那么最终陷入-128不断右移总是等于-128的死循环中，递归不停直到资源耗尽崩溃。只要是负数，a右移位，if(a==0)修改为if(a==-128)。

user: user-0
content: 其实我只是想知道  应该如何改 if（）里面的语句  或者 为什么if（a==0)不能退出递归，至少 a>>1  8次后 应该a==0能够成立啊  ！

user: user-4
content: 持续递归的话，栈总是会爆掉的。  引用 楼主 A3872215 的回复:用递归写的一个打印char类型8个bit位的数值， 输入整数 结果正常，输入负数 就是段错误！！！（注释掉的代码可以正常使用）。 #include <stdio.h> #include <unistd.h> #include <signal.h> #include <sys/wait.h>  //void banary(char,int); void banary(char); int main() { 		char a=-128; 		int i=0; 		char buf[10]={}; 		int n=0; 		while(1){ 		scanf("%d",&n); 		getchar();                 a=n; 		banary(a); 		puts(""); 		} } /*void banary(char a,int n) { 		int i=0; 		if(8==n) return; 		banary(a>>1,++n); 		printf("%d ",a&1); }*/ void banary(char a) { 		if(a==0) return 0;////我想问题出在这里，负数不能满足判断条件，递归没有退出条件，发生了段错误。可是不明白为什么？ 		banary(a>>1); 		printf("%d ",a&1); }
user-0 提问: C语言中double输出值被改变了,为什么呢?

回复:
user: user-1
content: 再说一句,C语言标准,输出函数的 %lf 格式,居然是不在标准中 这个很麻烦 不同编译系统的实现对于输出 float ,double 类型数据,可能就不一致了 有些支持%lf格式的 double 可以用%lf精确输出,用%f 就精度不够了. 不支持的虽然%f格式可以同时输出float,double 但是两种系统不一致,代码就不兼容了. 这是故意的么???????????

user: user-2
content: 结贴就可以给分了

user: user-0
content: 引用 3 楼 lm_whales 的回复:这个很好解释，尾部和前部拼接到一起，结果自然不乐观了  实际参数类型：         char *      , double     ,double 参数传递时的长度       ：[ 4B    ] ,[8B       ] ,[8 B ] 格式串和对应的格式     ：格式串    ,  %d  , %f  输出时看作的长度       ：[ 4 B   ] ，[ 4B]，[8B   ],[4B] 最后4B是多余的，无用参数字节。 输出时直接看作的类型：const char * ,int   ,double    输出时最终看作的类型：const  char *，int  ,float    第2，3 两个个参数，被劈为两半  第2参数，前一半，对应 %d 格式 4B，后一半对应%f格式 8B  差了4B，第三个参数的前4B补上。最后4B，用不上，不管他。  PS： 输出时，不论实参是double 还是 float , %f对应 float 数据，所以要转换成 float 输出，会造成精度丢失。 所以double 不应该使用 %f 输出。  同理，%lf 对应double， float类型，没有必要用 %lf输出。 因为，float 表示精度太低； 不需要用%lf，这种高精度方式输出。谢谢.我知道你说的了.第一次用这CSDN的提问,不知道怎么给你分啊.

user: user-3
content: 引用 1 楼 turingo 的回复:doule类型用%lf，否则结果难料。  [quote=引用 楼主 u013487029 的回复:] 小程序如下: #include <stdio.h>  main() { 	double dValue = 2.0; 	printf("%d\t%f",dValue, dValue); } 结果答案凶残的输出:0   0.000000 为什么呢?[/quote]  ++

user: user-1
content: printf 函数的输出方式，是依照格式数字节，来进行参数匹配的。 实参传递则是，按照数据类型，参数传递占用的字节数，传递数据(由C调用约定决定)。 Win32:    bool,char,int,long ,void * (32Bits 4Bytes) long long (64Bits--8Bytes) float,double(64Bits--8Bytes) PS:     实参传递的字节数，和数据类型的字节数并不相同。 参数传递的时候，会隐性的进行类型转换（类型提升）。

user: user-1
content: 这个很好解释，尾部和前部拼接到一起，结果自然不乐观了  实际参数类型：         char *      , double     ,double 参数传递时的长度       ：[ 4B    ] ,[8B       ] ,[8 B ] 格式串和对应的格式     ：格式串    ,  %d  , %f  输出时看作的长度       ：[ 4 B   ] ，[ 4B]，[8B   ],[4B] 最后4B是多余的，无用参数字节。 输出时直接看作的类型：const char * ,int   ,double    输出时最终看作的类型：const  char *，int  ,float    第2，3 两个个参数，被劈为两半  第2参数，前一半，对应 %d 格式 4B，后一半对应%f格式 8B  差了4B，第三个参数的前4B补上。最后4B，用不上，不管他。  PS： 输出时，不论实参是double 还是 float , %f对应 float 数据，所以要转换成 float 输出，会造成精度丢失。 所以double 不应该使用 %f 输出。  同理，%lf 对应double， float类型，没有必要用 %lf输出。 因为，float 表示精度太低； 不需要用%lf，这种高精度方式输出。

user: user-4
content: 刚测试了一下 确实很凶残 http://www.cnblogs.com/yangyh/archive/2011/10/03/2198631.html "%d"打印出0是很好解释的。但是写在一起的时候%f输出也为0我还没弄明白， 不过你如果改成 printf("%f\t%d\n",dValue, dValue);居然%f会输出正确。这个我只是在windosxp 的vs2008下测试的，不清楚与编译器是否有关

user: user-5
content: doule类型用%lf，否则结果难料。  引用 楼主 u013487029 的回复:小程序如下: #include <stdio.h>  main() { 	double dValue = 2.0; 	printf("%d\t%f",dValue, dValue); } 结果答案凶残的输出:0   0.000000 为什么呢?
user-0 提问: HDU 1007代码老是出错 求大神解答 已经对x 和y分别排序了

回复:
user: user-1
content: 看错了，上面代码是poj的

user: user-1
content: C++代码可以参考下 #include <iostream> #include <algorithm> using namespace std;  struct f{     int num;     char w[50]; }s[101];  bool cmp(struct f a, struct f b) {     return a.num < b.num; }  int main() {     int i, len, n, j, k;     cin>>len>>n;     for(i = 0; i < n; i++) 	{         s[i].num = 0;         cin>>s[i].w;         for(j = 1; j < len; j++)             for(k = 0; k < j; k++)                 if(s[i].w[j] < s[i].w[k])                     s[i].num++;     }      sort(s, s+n, cmp);     for(i = 0; i < n; i++)         cout<<s[i].w<<endl;     return 0; }
user-0 提问: linux下编译代码后同时启动

回复:
user: user-1
content: 放makefile里不行吗？编译完成后直接运行程序。

user: user-2
content: shell脚本。。

user: user-3
content: 那你的1.o和2.o还不是可执行程序，先连接，然后到控制台  $ ./1 & $ ./2 &  这里假定你连接后生成的可执行程序分别对应叫1和2，而且两个都不从stdin读入。如果其中一个要读stdin, 你可以后执行它，去掉后面的&, 如果两个都要读stdin, 你就开两个控制台，把&都取消掉。  如果程序的生命期极端，你想让它们活着的时候能彼此相遇，可以放到一个bash script中。这样要求只有一个会读stdin, 另一个就像一个服务一样。  当然，也可能我完全没弄懂你的意思。

user: user-0
content: 引用 1 楼 ALNG 的回复:你说的是把1.o和2.o一起连接出一个可执行文件吧？如果是，那么  g++ -omyprogram 1.o 2.o  其中myprogram是你想要的可执行程序的名字。你也可以跳过生成*.o的过程，直接  g++ -omypgrogram 1.cpp 2.cpp 不是，同时启动两个程序

user: user-4
content: g++ -c 1.o 1.cpp g++ -c 2.o 2.cpp g++ -oall 1.o 2.o

user: user-3
content: 你说的是把1.o和2.o一起连接出一个可执行文件吧？如果是，那么  g++ -omyprogram 1.o 2.o  其中myprogram是你想要的可执行程序的名字。你也可以跳过生成*.o的过程，直接  g++ -omypgrogram 1.cpp 2.cpp

user: user-5
content: ./prog1 & ./prog2    ？？？

user: user-6
content: 首先.o文件是目标文件，并不是可执行文件！其次，写一个makefile文件，完成编译；最后，若要编译之后立即启动，可以考虑使用脚本，在linux下写个shell脚本就可以完成；该脚本同时兼顾执行makefile文件！

user: user-7
content: 引用 3 楼 boyhailong 的回复:[quote=引用 1 楼 ALNG 的回复:]  你说的是把1.o和2.o一起连接出一个可执行文件吧？如果是，那么  g++ -omyprogram 1.o 2.o  其中myprogram是你想要的可执行程序的名字。你也可以跳过生成*.o的过程，直接  g++ -omypgrogram 1.cpp 2.cpp 不是，同时启动两个程序[/quote] 首先，你不可能“同时启动两个程序”，在哪个操作系统都一样。它们的进程空间是分离的。 然后，1.o和2.o肯定不是程序。
user-0 提问: select内存拷贝问题

回复:
user: user-1
content: 几乎所有的系统调用都会发生内核态和用户态的数据交换。干嘛要关心这个？ 简单地说，你自己代码中定义的变量，申请的内存，都在用户态内存中保存。调用系统调用时，一定需要把你的内存数据传递给内核，或者把内核从i/o得到的数据传递给你的程序。

user: user-2
content: select poll  二者都要kernel把状态返回给用户空间，由用户空间进行下一步调用，二者需要轮询 epoll则是类似于向内核注册回调的方式，不需要轮询
user-0 提问: 关于 图的十字链表 的问题

回复:
user: user-1
content: 我觉得你说的很有道理，head->tail这样一条有向的边，对head而言是出边，对tail而言才是入边。得到(tail,head)这样一条边后，应该是向tail顶点添加入边，head顶点添加出边。你可以直接向博客作者留言查询。
user-0 提问: 一个奇怪的现象。调试（无端点）状态下通过，结果正确；正式运行程序自动终止

回复:
user: user-0
content: 引用 6 楼 derekrose 的回复:[quote=引用 4 楼 darksworld 的回复:] [quote=引用 3 楼 derekrose 的回复:] [quote=引用 2 楼 darksworld 的回复:] [quote=引用 1 楼 derekrose 的回复:] 这 有可能是debug的时候把什么东西broken了 可以用注释来排出问题所在地方 大概不是软件的问题吧，因为我在不同的电脑上都试过，其他程序都行，就这个。。[/quote]  什么编译器 你试过的都是什么编译器[/quote] VC6.0 编程只用这一种。。。[/quote] 看你楼下 帮你找出错误了[/quote] 是的。。眼盲了。。。。已成功解决

user: user-0
content: 引用 5 楼 user-2 的回复:错误很多      int *Mean = (int*)malloc(sizeof(int)*BandNum);     memset(Mean,0,sizeof(Mean));     Mean = GetMeanNum(band,pixelNum,BandNum); 内存泄露，下面Dij处同理     Dij = (double*)malloc(sizeof(double)*BandNum);             Dij[m*3+n] = tmp / pixelNum; m*3+n超出了Dij指向的可用内存的大小 谢谢。。我太粗心了。。。  Dij = (double*)malloc(sizeof(double)*BandNum); 少乘了一个BandNum..... Mean均值向量没有问题吧。。。 改完运行ok~

user: user-1
content: 引用 4 楼 darksworld 的回复:[quote=引用 3 楼 derekrose 的回复:] [quote=引用 2 楼 darksworld 的回复:] [quote=引用 1 楼 derekrose 的回复:] 这 有可能是debug的时候把什么东西broken了 可以用注释来排出问题所在地方 大概不是软件的问题吧，因为我在不同的电脑上都试过，其他程序都行，就这个。。[/quote]  什么编译器 你试过的都是什么编译器[/quote] VC6.0 编程只用这一种。。。[/quote] 看你楼下 帮你找出错误了

user: user-2
content: 错误很多      int *Mean = (int*)malloc(sizeof(int)*BandNum);     memset(Mean,0,sizeof(Mean));     Mean = GetMeanNum(band,pixelNum,BandNum); 内存泄露，下面Dij处同理     Dij = (double*)malloc(sizeof(double)*BandNum);             Dij[m*3+n] = tmp / pixelNum; m*3+n超出了Dij指向的可用内存的大小

user: user-0
content: 引用 3 楼 derekrose 的回复:[quote=引用 2 楼 darksworld 的回复:] [quote=引用 1 楼 derekrose 的回复:] 这 有可能是debug的时候把什么东西broken了 可以用注释来排出问题所在地方 大概不是软件的问题吧，因为我在不同的电脑上都试过，其他程序都行，就这个。。[/quote]  什么编译器 你试过的都是什么编译器[/quote] VC6.0 编程只用这一种。。。

user: user-1
content: 引用 2 楼 darksworld 的回复:[quote=引用 1 楼 derekrose 的回复:] 这 有可能是debug的时候把什么东西broken了 可以用注释来排出问题所在地方 大概不是软件的问题吧，因为我在不同的电脑上都试过，其他程序都行，就这个。。[/quote]  什么编译器 你试过的都是什么编译器

user: user-0
content: 引用 1 楼 derekrose 的回复:这 有可能是debug的时候把什么东西broken了 可以用注释来排出问题所在地方 大概不是软件的问题吧，因为我在不同的电脑上都试过，其他程序都行，就这个。。

user: user-1
content: 这 有可能是debug的时候把什么东西broken了 可以用注释来排出问题所在地方
user-0 提问: 杭电2025题

回复:
user: user-1
content: #include<stdio.h> int main() {  char c[100];  char* p, *pm, *head;  int sh;    p = c;  pm = c;  head = c;    while(gets(c))  {   pm =c;   if(*p <= 'Z')   {    sh = 1;   }   else   {    sh = 0;   }      while(*p != '\0')   {    if(((*p+32) > *pm) && sh == 0)    {     if('A' <= *p && *p <= 'Z')     {      pm = p;      sh = 1;     }    }    if((*p > *pm) && sh == 1)    {     if('A' <= *p && *p <= 'Z')      {      pm = p;      sh = 1;     }    }    if(*p > *pm && sh == 0)    {     if(*p >= 'a')     {      pm = p;      sh = 0;     }    }    if(((*p-32) > *pm) && sh == 1)    {     if(*p >= 'a')     {      pm = p;      sh = 0;     }        }    p++;   }      p = c;      while(*p != '\0')   {    printf("%c", *p);    if(*p == *pm || ((*p+32) == *pm) || ((*p-32) == *pm))    {     printf("(max)");    }    p++;       }   printf("\n");   p = c;  }    return 0; }   提交总是wrong answer

user: user-0
content: 按答案的意思应该是ASCLL的顺序。。。

user: user-0
content: 引用 1 楼 ALNG 的回复:嗯，有点不严谨。最大没有定义ASCII, 字典方式？ 你可以都试试，从你认为最可能的开始。是的是的，就是这个意思

user: user-0
content: 引用 3 楼 ALNG 的回复:z>Z z<Z z==Z 都试过了吗？是的啊，应该是z〉Z的，但是说最大字母不该不分大小写么

user: user-2
content: acm.hdu.edu.cn 杭州电子科技大学acm的online juge 其实不止一个题目，杭电的OJ题量比较多，难度分布不是很均匀，很多是入门级别水题。 很久没去了，也许有改进。

user: user-3
content: 杭电oj2025  是神马？  google都没有呢

user: user-4
content: z>Z z<Z z==Z 都试过了吗？

user: user-0
content: 都试过，把大写字母考虑进去答案是错的。所以这题目应该改成只含小写字母。

user: user-4
content: 嗯，有点不严谨。最大没有定义ASCII, 字典方式？ 你可以都试试，从你认为最可能的开始。
user-0 提问: openg超级宝典第五版，第七章的点精灵实例黑屏

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

user: user-0
content: 书本源代码没有开启点精灵那句话。坑爹的书

user: user-1
content: 没光照？ 相机没对准要观察的目标？ 三角形顶点次序反了？ 材质完全透明或和背景颜色一样？ 显示器亮度太暗？ 显示器电源没开？ 墨镜没摘？ ……

user: user-2

user: user-0
content: 找到问题了。解决了，

user: user-3
content: 我不知道
user-0 提问: windows调用OpenSSL的问题

回复:
user: user-0
content: 我把代码拿到linux去编译，发现可以用，那我就没什么好担心的了，搞个宏定义把windows.h半酣进来就好了。还是谢谢以上两位

user: user-1
content: 引用 4 楼 Sealional 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。 这个工作量好大我的代码关系比较复杂，main就调用了一个函数，但是后面有千千万万函数。。。[/quote]  知不知道有个东西叫二分法

user: user-0
content: 同时在http://hi.baidu.com/mingyuejingque/item/41f6603ee951d085c2cf29ee空间中有说到这个问题，但是也必须包含windows.h

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。 找到错误了，X509_NAME *name = NULL;这句出错。（包含windows.h就不会出错）。我发帖的时候说的就是这个问题，融合避免OpenSSL库中的名字和windows库中的名字重复的问题。（也可能没必要这样，主要是我完全没有调用windows的库）。 出错信息是这样的： error C2065: “name”: 未声明的标识符 error C2296: “*”: 非法，左操作数包含“LPCSTR”类型  我看了一下，windows中的X509_NAME的定义是这样的： #define X509_NAME   ((LPCSTR) 7)

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。 这个工作量好大我的代码关系比较复杂，main就调用了一个函数，但是后面有千千万万函数。。。

user: user-2
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

user: user-0
content: 引用 1 楼 Sealional 的回复:没有人遇到过这样的问题么？是这样的错误如果最开始就包含了windows.h就不会有错  还补充一个问题，工程中我并没有包含wincrypt.h

user: user-0
content: 没有人遇到过这样的问题么？是这样的错误如果最开始就包含了windows.h就不会有错
user-0 提问: 如何将 C  语言中获取的参数值，传递给shell脚本中使用？

回复:
user: user-1
content: #include <stdlib.h>  int main() {   setenv("ipaddr", "192.168.0.1", 1);   system("./run.sh");   return 0; }   echo $ipaddr

user: user-0
content: 多谢楼上的几位朋友，但是我在 shell 这个脚本里想得到这个值比取到IP是 192.168.0.1 如：   #/bin/bash  iptables -t nat 192.168.0.1 .......  iptables -t nat 192.168.0.1 .......  iptables -t nat 192.168.0.1 .......  192.168.0.1这里是变量如何传递到这里使用呢    sprintf(cmd,"/root/run.sh %s",ip);    system(cmd);  sprintf(cmd,"/root/run.sh %s",ip); 这个是否在run.sh 这个shell脚本把 ip 这个以 $1 来代替

user: user-0
content: 多谢了几种方法都可以用了

user: user-2
content: ++  引用 1 楼 user-5 的回复:sprintf(cmd,"/root/run.sh %s",ip);   system(cmd);

user: user-3
content: 必须把值传到字符串里

user: user-4
content: char buf[1024] = "/root/run.sh "; strcat(buf, ipaddr); system(buf);    #/bin/bash ipaddress=%1

user: user-4
content: char buf[1024] = "/root/run.sh"; strcat(buf, ipaddr); system(buf);    #/bin/bash ipaddress=%1

user: user-5
content: sprintf(cmd,"/root/run.sh %s",ip);   system(cmd);
user-0 提问: 关于scanf缓冲区问题

回复:
user: user-1
content: 第二个scanf的时候，除去%c，其他格式说明符都忽略前面的空白（包括空格、回车、制表等），从第一个非空白字符读取。

user: user-2
content: "%s"读数据的时候会跳过所有的空格，tab和回车 "%c"则会读入任何字符， 包括空格， tab和回车  顺便说一下， LS说的rewind(stdin)和fflush(stdin)一样， 是一种不可移植的写法， 被微软支持， 但不被gcc支持。 通用的写法是 char ch; while ( (c = getchar()) != '\n' && c != EOF ) ;

user: user-3
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

user: user-4
content: 直接忽略  区别在于 %c 会读取 空白字符 而 %s 不会 %d %f %x %i %o 等等都不会读取空白字符  所以 前面有没有滞留 空白字符无所谓

user: user-5
content: 引用 楼主 missheaven2011 的回复:疑问是：第一次读取a时，残留的'\n'没有被b获取，是直接被忽略了么？  空格（'\n', '\t', ' ')是字符串的分割符，会被%s忽略的。

user: user-6
content: 不推荐这样用，两个scanf()加一个getchar()
user-0 提问: 《c和指针》里的一个疑问

回复:
user: user-1
content: 贴题目呀。。。

user: user-2
content: 限定columns[col]+nchars<=len 方法是，如果超过，减少nchars数量  比如columns[col] = 10 len=20 如果nchars = 5，没有关系，它还是5 如果nchars=15，那么让它等于10，保证它和columns[col]相加等于len

user: user-3
content: 避免nchars的取值过大导致越界访问。
user-0 提问: 怎样把字符数组里的内容拷贝到字符串里？

回复:
user: user-1
content: memcpy可行

user: user-2
content: strcpy  记得A要有所指。

user: user-3
content: A=(char *)B; 或 strcpy(A,B);//A指向的内存空间已提前分配，并足够长以放得下B 或 strncpy(A,B,n);A[n]=0;//A指向的内存空间为n+1个字节，将B的前n个字符拷贝到A中。

user: user-4
content: memcpy

user: user-4
content: strcpy不保险啊，数组里面，不一定有结束符，还是知道长度来增加判断条件用memcpy保险点。

user: user-5
content: memcpy

user: user-6
content: 要拷贝，memcpy可以拷贝任何数据，strcpy可以拷贝字符串 但如果楼主不理解字符指针char*是什么东西，那什么拷贝都没用
user-0 提问: Linux下检测网卡与网线连接状态，使用ioctl向socket发送SIOCETHTOOL命令字

回复:
user: user-1
content: 先确认你运行的环境中是否有eth0网卡。用ifconfig查看。 另外把这句话改成strncpy(ifr.ifr_name,if_name,sizeof(ifr.ifr_name)-1);

user: user-2
content: if((skfd=socket(AF_INET,SOCK_DGRAM,0)<0)) 这句话有问题。。。。

user: user-3
content: printf("eth0_data=%d\n",get_netlink_status("eth0")); 确定没有少0？

user: user-4
content: 虚拟机和实体机总该有区别，否则就不叫虚拟机了。 纯打酱油的路过……

user: user-0
content: 引用 2 楼 ForestDB 的回复:printf("eth0_data=%d\n",get_netlink_status("eth0")); 确定没有少0？加了也是一样的！！
user-0 提问: PDU短信的发送与接收

回复:
user: user-1
content: 那就得看USC2是如何编解码的。

user: user-0
content: ////////////////////////////////////////////////////////////////////////// //函数名：            gsmEncodeUcs2 //功能描述：          UCS2编码 //入口参数:           pSrc:                  源字符串指针 //			          nSrcLength:            源字符串长度 //出口参数:           pDst :                 目标编码串指针 //函数返回值：目标编码串长度 ////////////////////////////////////////////////////////////////////////// int gsmEncodeUcs2(const char* pSrc, unsigned char* pDst, int nSrcLength) { 	int nDstLength;		// UNICODE宽字符数目 	U8 wchar[128];	// UNICODE串缓冲区  	// 字符串-->UNICODE串 	nDstLength = MultiByteToWideChar(0, 0, pSrc, nSrcLength, wchar, 128);  	// 高低字节对调，输出 	for(int i=0; i<nDstLength; i++) 	{ 		*pDst++ = wchar[i] >> 8;		// 先输出高位字节 		*pDst++ = wchar[i] & 0xff;		// 后输出低位字节 	}  	// 返回目标编码串长度 	return nDstLength * 2; } //////////////////////////////////////////////////////////////////////// // 函数名：            gsmDecodeUcs2 // 功能描述：          UCS2解码 // 入口参数:           pSrc:                  源编码串指针 // 			          nSrcLength:            源编码串长度 // 出口参数:           pDst :                 目标字符串指针 // 函数返回值：目标字符串长度 //////////////////////////////////////////////////////////////////////// int gsmDecodeUcs2(const unsigned char* pSrc, char* pDst, int nSrcLength) { 	int nDstLength;		// UNICODE宽字符数目 	U8 wchar[128];	// UNICODE串缓冲区  	// 高低字节对调，拼成UNICODE 	for(int i=0; i<nSrcLength/2; i++) 	{ 		wchar[i] = *pSrc++ << 8;	// 先高位字节 		wchar[i] |= *pSrc++;		// 后低位字节 	}  	// UNICODE串-->字符串 	nDstLength = WideCharToMultiByte(0, 0, wchar, nSrcLength/2, pDst, 160, NULL, NULL);  	// 输出字符串加个结束符 	pDst[nDstLength] = '\0';  	// 返回目标字符串长度 	return nDstLength; } 现在MultiByteToWideChar和WideCharToMultiByte两个函数用不了，不知道如何改

user: user-2
content: pdu格式里面就两种编码格式，一种用UTF8,一种用USC2,单片机一般都支持USC2编码，所以把UTF8的编码转换成USC2 UTF8转USC2很好转，可根据协议自己写一个

user: user-0
content: 主要是字符转宽字符不知道怎么写，网上一般都是用MultiByteToWideChar(或WideCharToMultiByte)这个库函数，但是单片机上用不了这个函数
user-0 提问: unsigned int 赋值负数

回复:
user: user-1
content: “%d会按照int来打印，%u才是按照unsigned打印的。”+++

user: user-2
content: 当你把一个超过2^31-1的unsign int传给int的时候，int接收到的就是一个负值。

user: user-3
content: printf中%d就会把参数当int解释，%u就会把参数当unsinged int解释。

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

user: user-5
content: 因为你printf里又转回int格式了。

user: user-6
content: -10 32位机 原码为1000 0000 0000 0000 0000 0000 0000 1010 即0x8000 000A, 补码为1111 1111 1111 1111 1111 1111 1111 0110 即0xFFFF FFF6 计算机把负数是用被码存储的.如果你把它当成unsigned int看就是0xFFFF FFF6  数据还是哪个数据,就看你用什么角度去用.

user: user-7
content: %d又作了一次转换改为%u

user: user-8
content: %d这个格式会按照带有符号位的打印出来

user: user-9
content: %d会按照int来打印，%u才是按照unsigned打印的。  引用 楼主 u013431701 的回复:看了一段代码有点疑问.  void test（unsigned int a） { printf（"the a value is = %d\n",a）； }  void main（） {   int c = -10；  test（c）；  } 结果是-10； 有如下几个问题点. 1.unsigned int的取值范围不是0~2^32吗？为什么可以是负数呢， 2.test函数的参数是unsigned int，把int传进来的时候，会有隐式的类型转换吗?如果有也是转到unsigned int啊. 3.如果定义unsigned char型，结果就是一个正数.为什么呢？  拜托大家给我普及一下，

user: user-10
content: 强制转换了。其实正如10楼说的,对于cpu来说，是没有数据类型的概念的，都是内存中的字节

user: user-11
content: 数据类型是编译器给的一个限定。基于c的传统，c++编译器对这个的限制有些宽松。 实际对于cpu来说，是没有数据类型的概念的，存储的只是寄存器或内存中的字节，本质没有区别。 至于负数，正数在内存中怎么存储你看看基础书籍
user-0 提问: pos机开发相关问题

回复:
user: user-1
content: aa[0]=aa[0]&0xF0|0x08;//将aa[0]的低4位修改为0x8，高4位不变 //或者 aa[0]=aa[0]&0x0F|(0x08<<4);//将aa[0]的高4位修改为0x8，低4位不变

user: user-2
content: 你的意思是把那个16进制的串赋给你的aa数组吗？如果是这样  aa[0]=0x1f; aa[1]=0xff; aa[2]=0xf0; ...
user-0 提问: scanf小问题

回复:
user: user-1
content: 长知识了 ...

user: user-2
content: 这是我认同的写法，用getchar感觉有点凑的感觉，不喜欢。 引用 10 楼 IAccepted 的回复:确实楼上都给出了正确解答，无限输出是因为缓冲中存在换行符。字符数组输入时不必取地址，temp就代表了数组首地址。 另外我给出我通常的写法：  #include<stdio.h> int main() {     char temp[1000];     while(scanf("%[^\n]%*c",temp)!=EOF)     {         printf("%s\n",temp);     }     return 0; }

user: user-3
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

user: user-4
content: 引用 10 楼 IAccepted 的回复:确实楼上都给出了正确解答，无限输出是因为缓冲中存在换行符。字符数组输入时不必取地址，temp就代表了数组首地址。 另外我给出我通常的写法：  #include<stdio.h> int main() {     char temp[1000];     while(scanf("%[^\n]%*c",temp)!=EOF)     {         printf("%s\n",temp);     }     return 0; }    雷同，纯属巧合。

user: user-4
content: #define _CRT_SECURE_NO_WARNINGS  #include<stdio.h> int main() { 	char temp[1000];	 	while (scanf("%[^\n]%*c", temp) != EOF) //%*c will read \n and ignored 	{ 		printf("%s\n",temp); 	}  	return 0; }

user: user-4
content: //input: hello\n      while(scanf("%[^\n]",&temp)!=EOF)     {       //temp ---> hello\0                printf("%s\n",temp);       //next char to read is '\n'       //scanf("%[^\n]",&temp) will return 0, and temp is unchanged          }

user: user-5
content: 确实楼上都给出了正确解答，无限输出是因为缓冲中存在换行符。字符数组输入时不必取地址，temp就代表了数组首地址。 另外我给出我通常的写法：  #include<stdio.h> int main() {     char temp[1000];     while(scanf("%[^\n]%*c",temp)!=EOF)     {         printf("%s\n",temp);     }     return 0; }

user: user-6
content: #include <stdio.h> int main() { 	char temp[1000]; 	while(scanf("%[^\n]", temp) != 0) 			printf("%s\n", temp); 	return 0; }

user: user-6
content: 引用 5 楼 u013211088 的回复:问个问题，输入需要给temp取地址吗？temp本身不就代表一个地址么。 个人感觉无影响，因为temp和&temp指向同一地址，但是指向类型是不一样的，建议还是用temp。。

user: user-7
content: 引用 5 楼 u013211088 的回复:问个问题，输入需要给temp取地址吗？temp本身不就代表一个地址么。好仔细 这里的确不需要 &  算是一个错误的写法

user: user-6
content: 引用 3 楼 lin5161678 的回复:[quote=引用 2 楼 lin5161678 的回复:] 接 #1 楼  所以 你可以 把EOF 换成 0 这样删除getchar 就不会出问题 纠正 != EOF 换成 != 1[/quote]

user: user-8
content: 问个问题，输入需要给temp取地址吗？temp本身不就代表一个地址么。

user: user-7
content: 引用 3 楼 lin5161678 的回复:[quote=引用 2 楼 lin5161678 的回复:] 接 #1 楼  所以 你可以 把EOF 换成 0 这样删除getchar 就不会出问题 纠正 != EOF 换成 != 1[/quote] 再纠正 != EOF 换成 == 1

user: user-7
content: 引用 2 楼 lin5161678 的回复:接 #1 楼  所以 你可以 把EOF 换成 0 这样删除getchar 就不会出问题 纠正 != EOF 换成 != 1

user: user-7
content: 接 #1 楼  所以 你可以 把EOF 换成 0 这样删除getchar 就不会出问题

user: user-9
content: scanf("%[^\n]",&temp)，这条语句在第一次调用时，返回值为1，即成功获取字符串，存到temp中，但'\n'依然残留在缓存区内 第二次调用scanf("%[^\n]",&temp)，由于缓存区内残留'\n'，字符串读取失败，返回0，导致循环打印 getchar();用于吃掉残留在缓存区中的'\n'
user-0 提问: 明天考C语言 求助攻

回复:
user: user-0
content: 引用 3 楼 KenZhang1031 的回复:条件判断都是判断表达式的逻辑结果，为真就执行为假就不执行，比如while(条件),if(条件)，表示条件==真就执行，等价于while(条件==真),if(条件==真)，对C语言来说，真就是不等于0，假就是等于0。所以对C语言而言，也等价于while(条件!=0),if(条件!=0) 引用 2 楼 u011638252 的回复:引用 1 楼 KenZhang1031 的回复:答案为CCCCC恭喜    求解释 谢谢耐心解答！

user: user-1
content: 条件判断都是判断表达式的逻辑结果，为真就执行为假就不执行，比如while(条件),if(条件)，表示条件==真就执行，等价于while(条件==真),if(条件==真)，对C语言来说，真就是不等于0，假就是等于0。所以对C语言而言，也等价于while(条件!=0),if(条件!=0) 引用 2 楼 u011638252 的回复:引用 1 楼 KenZhang1031 的回复:答案为CCCCC恭喜    求解释

user: user-0
content: 引用 1 楼 KenZhang1031 的回复:答案为CCCCC恭喜    求解释

user: user-1
content: 答案为CCCCC
user-0 提问: 再问除数为0的问题

回复:
user: user-1
content: 我是来学习的

user: user-2
content: n=0/PI/(i-14);这样写n应该等于0啊？  n = (0/PI) / (i-14) 为什么你会觉得这个n是0呢?

user: user-3
content: 1.#INF / inf：这个值表示“无穷大 (infinity 的缩写)”，即超出了计算机可以表示的浮点数的最大范围（或者说超过了 double 类型的最大值）。例如，当用 0 除一个整数时便会得到一个1.#INF / inf值；相应的，如果用 0 除一个负整数也会得到 -1.#INF / -inf 值。  -1.#IND / nan：这个的情况更复杂，一般来说，它们来自于任何未定义结果（非法）的浮点数运算。"IND"是 indeterminate 的缩写，而"nan"是 not a number 的缩写。产生这个值的常见例子有：对负数开平方，对负数取对数，0.0/0.0，0.0*∞, ∞/∞ 等。

user: user-4
content: 除0错误在整数除以整数零的时候必然出现，但在浮点运算中则不一定出现 因为浮点运算得到的零不一定是精确的零，可能是一个极小的小数，因此浮点运算时的除零可能会变成除以绝对值极小的小数，从而得到一个绝对值极大的大数 数学运算时，会将低表示范围的数先提升为高表示范围的数，再进行运算，因此当被除数为PI时，除数的i-14被提升为浮点数
user-0 提问: 拉丁方

回复:
user: user-1
content: 就是想象行或者列是可以首位相接的，然后依次转一位，。。。  比如第一行是 1,2,3....N  第二行就是 2,3,4,..N,1  第三行就是 3，4,.N,1,2  依此类推。  按列也一样。它具体的字面意思或者表达方式你就没必要去抠了。
user-0 提问: 关于 图 有个地方不是很懂

回复:
user: user-1
content: 邻接表后面的边表只是指的它前面的顶点对应的节点，后面边表之间没有什么关系

user: user-0
content: 引用 8 楼 ALNG 的回复:[quote=引用 4 楼 u013160932 的回复:] [quote=引用 3 楼 ALNG 的回复:] 上面最后一句话应该是: 下面的两行，V2,V3都各只有2个邻接顶点，所以比V0,V1的少1列。  再补充一点，最左边的一列，格子是连在一起的，它隐含的意思是他们在内存中的表达是连续的(比如放在数组，向量之类的容器中的)，第2，3，4列的格子是离散的，因为它们的物理表达很可能就是单链表的节点，彼此在内存中的位置关系并不确定。 那就是说v0->1->2->3中的2->3不是指2和3连在一起,而是说2和3分别和0连在一起?[/quote]  刚才没看到这个，这个理解就对路了。[/quote]嗯好的,谢谢大神

user: user-2
content: 引用 4 楼 u013160932 的回复:[quote=引用 3 楼 ALNG 的回复:] 上面最后一句话应该是: 下面的两行，V2,V3都各只有2个邻接顶点，所以比V0,V1的少1列。  再补充一点，最左边的一列，格子是连在一起的，它隐含的意思是他们在内存中的表达是连续的(比如放在数组，向量之类的容器中的)，第2，3，4列的格子是离散的，因为它们的物理表达很可能就是单链表的节点，彼此在内存中的位置关系并不确定。 那就是说v0->1->2->3中的2->3不是指2和3连在一起,而是说2和3分别和0连在一起?[/quote]  刚才没看到这个，这个理解就对路了。

user: user-2
content: 那第一行中的2->3是什么意思?  ============== 1（vertex id）是0(v0)的第一个邻接顶点，2是1的下一个兄弟，所以也是v0的邻接顶点，3是2的下一个兄弟，所以它也是v0的邻接顶点。3的下一个兄弟的指针式空指针，意味着v0没有更多的邻接顶点了。

user: user-2
content: 不是。知道树的左儿子右兄弟表示法吗？这里的链表就是一些sibling（兄弟顶点)的链表。  你看，一个顶点的邻接顶点的个数是不确定的，可以一个都没有，也可能有好几百个。一种方法就是把它的所有的邻接顶点用一个单链表组织起来，这样不管你有多少的邻接顶点，那个Node的定义都是一样的  struct AdjvertexNode{     int nodeid;     AdjvertexNode *nextSibling; // 指向下一个兄弟，如果是一组邻接顶点中的最后一个，指正为NULL };

user: user-0
content: 引用 2 楼 fq553165833 的回复:下面的边表2和3没连上啊。0和1都有三条联通线，2和3明显只写了两条啊！你好好看看！ 那第一行中的2->3是什么意思?

user: user-0
content: 引用 3 楼 ALNG 的回复:上面最后一句话应该是: 下面的两行，V2,V3都各只有2个邻接顶点，所以比V0,V1的少1列。  再补充一点，最左边的一列，格子是连在一起的，它隐含的意思是他们在内存中的表达是连续的(比如放在数组，向量之类的容器中的)，第2，3，4列的格子是离散的，因为它们的物理表达很可能就是单链表的节点，彼此在内存中的位置关系并不确定。 那就是说v0->1->2->3中的2->3不是指2和3连在一起,而是说2和3分别和0连在一起?

user: user-2
content: 上面最后一句话应该是: 下面的两行，V2,V3都各只有2个邻接顶点，所以比V0,V1的少1列。  再补充一点，最左边的一列，格子是连在一起的，它隐含的意思是他们在内存中的表达是连续的(比如放在数组，向量之类的容器中的)，第2，3，4列的格子是离散的，因为它们的物理表达很可能就是单链表的节点，彼此在内存中的位置关系并不确定。

user: user-3
content: 下面的边表2和3没连上啊。0和1都有三条联通线，2和3明显只写了两条啊！你好好看看！

user: user-2
content: 看了下，第一行第一栏是定点0，后面是以单链表来描述的其邻接顶点，v0和v1,v2,v3都有边相连，所以这三个顶点都是其邻接的顶点。最右边 3+^, 意思是3这个邻接顶点之后，没有其它邻接顶点了。  类似的，V2也有3个邻接顶点，与V0类似；  线面的两行，V2,V3都各只有2个邻接顶点，所以比V0,V1的少两行。
user-0 提问: 变量赋值后（用=赋值），变量仍不变，怎么回事？？

回复:
user: user-1
content: 在你怀疑的地方打个断点，F5调试一下。 ps：把你的代码缩进调好一点，这样看着太费劲

user: user-2
content: 显然没有走到这个if分支里

user: user-3
content: 感觉不太可能吧？  把那个地方改成      printf("Before assignment, (%c,%c)\n", compare, compare1);     compare = compare1;     printf("After assignment, (%c,%c)\n", compare, compare1);   把程序输出贴出来看看。

user: user-4
content: 你有2个printf，要先看下是从那边输出的

user: user-5
content: 你调试了吗？