Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 求大神指教！

回复:
user: user-1
content: 引用 楼主 u014251655 的回复:一,、用exit()语句终止执行程序并报告错误。 二、以函数的返回值区别正确返回或错误返回。 三、设置一个整形变量的函数参数以区别正确返回或某种错误返回。 这三种错误处理方法各自有什么优缺点？ exit()副作用太大了，好的程序应该是尽量让它能够恢复。 函数的返回值是正统做法啦。但是有时候比如你一个函数叫 calculateMoney()，你期望返回的是值而不是错误信息，比如除0错误，这个时候就棘手了。 至于“一个整形变量的函数参数”就是in out的参数，这样是能解决之前的问题。但是函数调用有时候强调“可重入性”，给定一个可变的参数引用给函数，往往会增加函数的耦合性。

user: user-2
content: 才疏学浅，实在不懂有啥优缺点。 return 不会让程序关闭，exit则是关闭程序。这个要看用在不同地方吧？ 当然了，如果在main函数中，我觉得没有区别。

user: user-3
content: 依我看都不如写日志。  有时不将“调用函数名字＋各参数值，进入函数后各参数值，中间变量值，退出函数前准备返回的值，返回函数到调用处后函数名字＋各参数值＋返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的，包括捕获各种异常、写日志到屏幕、单步或设断点或生成core文件、……这些方法都不行！ 写日志到文件参考下面： #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32     #include <windows.h>     #include <io.h> #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef WIN32 void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} int main(int argc,char * argv[]) {     int i; #ifdef WIN32     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL); #endif     for (i=0;i<10000;i++) {         Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);     } #ifdef WIN32     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //1-78行添加到你带main的.c或.cpp的那个文件的最前面 //81-85行添加到你的main函数开头 //89-93行添加到你的main函数结束前 //在要写LOG的地方仿照第87行的写法写LOG到文件MyLog1.log中

user: user-4
content: _Noreturn void f (void) {}
user-0 提问: 在文件中直接对比

回复:
user: user-1
content: 内存映射用的也是读出来, 修改, 再写入的方式, 只不过是系统来做了这个管理而已

user: user-2
content: 我记得APUE上面有讲到关于这个问题，是关于内存映射的。不过你打算作这种字符串匹配的话，平常的算法肯定都很慢，可以去了解一下KMP算法。

user: user-3
content: 如果修改后内容长度≤修改前内容长度，可以 fopen(...,"rb+"); ... fseek fputc或fwrite fclose

user: user-3
content: 所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。

user: user-4
content: 都读出来比的想法挺好的，文件大的话用内存映射读比较快。
user-0 提问: 递归调用将一个整数逆序

回复:
user: user-1
content: int Reverse(unsigned int num, unsigned int reversenum = 0) {     return (num == 0) ? reversenum : Revert(num / 10, reversenum * 10 + num % 10); }  用尾递归还不损失效率

user: user-2
content: 引用 9 楼 u013707588 的回复:[quote=引用 5 楼 u010749411 的回复:] void Reverse(int num) { 	if( !num )  		return; 	else	 		Reverse(num / 10);  	printf("%d", num % 10); 	 }亲，你的代码不对哦[/quote] 看成正序输出了 void Reverse(int num) { 	if ( num == 0) 		return ; 	else 	{ 		printf("%d",num%10); 		Reverse(num/10); 	} }

user: user-0
content: 引用 5 楼 u010749411 的回复:void Reverse(int num) { 	if( !num )  		return; 	else	 		Reverse(num / 10);  	printf("%d", num % 10); 	 }亲，你的代码不对哦

user: user-3
content: #include <iostream.h>  void Rev(int num) { 	if(num/10 ==0) 	{ 		cout<<num<<'\n'; 		return; 	} 	cout<<(num%10)<<'\t'; 		Rev(num/10); } void main() { 	int num; 	cout<<"请输入一串数字"; 	cin>>num; 	Rev(num); } 仅供楼楼参考。。

user: user-4
content: 这玩意儿，感觉没啥用啊。 你把递归理解成 “栈” ，就很好理解了。 递归调用，相当于就是用系统栈， 这样逆序输出，不是很简单么。。

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

user: user-6
content: #include <stdio.h>  int Rev(int x) { 	if (x/10 == 0) return x; 	 	int m = (x % 10); 	int n = x; 	while (n /= 10) m *= 10;  	return m + Rev(x/10); }  void main() { 	int a = 987654321; 	a = Rev(a); 	printf("%d\n", a); }

user: user-2
content: void Reverse(int num) { 	if( !num )  		return; 	else	 		Reverse(num / 10);  	printf("%d", num % 10); 	 }

user: user-7
content: 看错了，每次取一下最后一位就可以了   void Reverse(int num) {   if(!num)      return;        printf("%d", num % 10);    Reverse(num / 10); }

user: user-7
content: 不说废话直接上代码吧  void Reverse(int* num, int start, int end) {    if(start > end)      return;        int temp = num[start];    num[start] = num[end]    num[end] = temp;     Reverse(num, ++ start, -- end); }

user: user-8
content: 逆序输出了不就好了嘛

user: user-9
content: 递归逆序，就是递归调用和操作（输出）的顺序问题。 递归懂了就行。
user-0 提问: 缓冲区是不是分为输入和输出两个缓冲区？

回复:
user: user-1
content: 缓冲区就是一块你分出的内存，输入还是输出由你决定。

user: user-2
content: http://blog.sina.com.cn/s/blog_51409e8f01009han.html
user-0 提问: txt输入多个二维数，并搜索相同项（C小白跪求大神解答）

回复:
user: user-0
content: 跪求代码~~！！！

user: user-1
content: 最直接的办法就是拿pattern数组在在你随机生成的数组中遍历 遍历的方法比较简单，就是先比较第一行，比如0,0找到了，然后改变列方向上+1判断 以此类推。。。  当然，应该有比较优化的算法来实现吧，我这智商智能用最笨的方法了

user: user-0
content: 麻烦大神详细解答，十分感谢！！！

user: user-2
content: 第一行匹配，其他行比较

user: user-0
content: 可能题目我写的有点不好懂。。。 例如：txt文件中pattern 1是{(00),(11)}；需要找出在随机生成的300x50的二维数组里有多少个跟pattern 1一样的二维数，然后显示坐标。以此类推。。。

user: user-1
content: 表示看不懂题目要求 对自己的智商表示压力很大
user-0 提问:  Linux C编程的返回值含义

回复:
user: user-1
content: 这玩意儿，没啥特定标准吧？。APUE，好像是有一个error的头文件，对各种返回值的信息有做一个描述。

user: user-2
content: 复杂函数的话，还是返回错误代码比较好，或者写个GetErr函数返回错误信息 个人习惯问题，返回int的函数，我是用负数代表错误，正数代表正确

user: user-3
content: 百家争鸣，百花齐放。

user: user-4
content: 不是说Linux下返回值是2个吗
user-0 提问: 毕业设计

回复:
user: user-1
content: 看你出多少￥。

user: user-2
content: 百度一大把。。。大一课程设计。。

user: user-3
content: 让你用C写个界面出来，不要在 dos 窗口来运行

user: user-4
content: 不是有这种毕设，这种现在一般都是用BS模式吧

user: user-5
content: 用java实现感觉好一点

user: user-6
content: 你们毕业设计这么简单

user: user-7
content: 各种语言的书上差不多都有图书管理的例子

user: user-8
content: 用c来做这个 太屈才了

user: user-9
content: http://wenku.baidu.com/link?url=THxim5z4Kp3mMbcJrlaGg_FEFPtxR2g0jYNc8sDhSV9pvJqCiCHDiejQG6Wrmz0zcZLH4MKv21Bm9vxpD8JU84UOf2mt98d-eHlRDYzX0GG  lz要是感觉这个不好就再搜搜，这个网上不少呢

user: user-10
content: 现在的一把，搜搜
user-0 提问: 求问如何把含有字母和数字的字符串转换成整形？3Q~~

回复:
user: user-1
content: /*  * 最近纠结于一个如何用C语言把含有字母和数字的字符串转换成整形的问题，  * 如规定A=11，B=12，...F=16，,则字符串（ED D8 9F 39）可显示为151414891639，  * 以此类推，有没有通用的方法或者程序呀？求大神们指点！感激不尽！   */  #include <stdio.h>   typedef void (*mf_t)(char, int*, int*);  __int64 str_to_int(const char *s, mf_t mf) { 	__int64 n = 0; 	const char *p = s;  	while (*p) 	{ 		int v, q; 		mf(*p++, &v, &q); 		//printf("v=%d, q=%d, ", v, q); 		n = n * q + v; 		//printf("n = %I64d\n", n); 	} 	return n; }   void map(char c, int *v, int *q) { 	/* 在此表中建立字符和数值以及权值间的映射关系 */ 	static const int m[][3] = { 		{ '3',  3, 10  },  		{ '8',  8, 10  },  		{ '9',  9, 10  }, 		{ 'D', 14, 100 }, 		{ 'E', 15, 100 },  		{ 'F', 16, 100 },  	}; 	int i;  	*v = *q = -1; 	for (i = 0; i < sizeof(m)/sizeof(m[0]); i++) 	{ 		if (m[i][0] == c) 		{ 			*v = m[i][1]; *q = m[i][2]; 			break; 		} 	} }   int main(void) { 	const char *s = "EDD89F39";  	printf("%I64d\n", str_to_int(s, map));  	getchar(); 	return 0; }  参考一下，更大的数字得借助大数（库）操作了。

user: user-2
content: #include<stdio.h> void main() { char str[100];    int i,j;   gets(str); for(i=0;i<100;i++) {if(i%5==0) printf("\n");   printf("%d",str[i]); } } 直接就转换为assⅡ码输出，不过你也可以自己定义，

user: user-3
content: atoi,可以转换例如"123456789"这样的内容是数字的字符串
user-0 提问: 一道acm题目

回复:
user: user-1
content: 另外，二叉树，去重再好不过了。 《C 程序设计语言》有个二叉树的设计 里面的节点，绝对不会出现重复数据的。

user: user-1
content: 考虑到插了很多2，最多几千个字符串，去重而已。 每次读到 2，就开始去重了，所以没有多少重复的 如果不想复制数据  建个行指针，或者行索引表，这样去重的复制任务减轻一半。 也可用链表处理，这样每次去重的复制开销  = 1

user: user-2
content: 下个靠谱的avl代码。

user: user-3
content: 上面那个无视了吧，应该是不行。 还是老老实实建一个左儿子，右兄弟的二叉树吧。 之后搜索来的靠谱点

user: user-1
content: 8个字符==sizeof(long long) 就是10000个long long去重

user: user-3
content: 用tried树吧。 这么来，准备8个含有a-z数组的代表单词各个位置上的字母。和8个长为26的标识布尔数组。 每进来一个单词，对进来一个单词，把记录和前面单词是否重复的全程变量设成false。 对单词各个位置字母扫描，如果重复了把标识数组改一下，什么都不用作。没重复则 把记录单词数目的变量加1。  思路不算很难，就是挺麻烦的，有兴趣的话写一下试试吧。

user: user-0
content: 引用 4 楼 xurui20100834 的回复:不能用stl的话 树形结构也行大哥，你这不等于白说吗？

user: user-0
content: 引用 1 楼 user-4 的回复:才10000行。拿个set记都能过。怎么写代码啊

user: user-0
content: 怎么写代码啊@user-4

user: user-4
content: 才10000行。拿个set记都能过。
user-0 提问: 我用的dev-c提示没有sleep函数，所以在网上找了个，但是太高端我不知道怎么用，请问大虾们怎么样。。。

回复:
user: user-0
content: #define WIN32   #ifdef WIN32   如果定义了 WIN32 就。。。 。。。 #else   没有的话就。。。 。。。。 #endif  为什么我#define WIN32 会有那样的提示 而不定义就没有问题呢

user: user-0
content: #include <stdio.h> #include <stdlib.h> #include <string.h>   //#define WIN32   我这里还有个一问题如果加了这句我定义为WIN 才会进入 #ifdef WIN32 #include <windows.h> void sleep_ms(int ms) {      printf("你进入的是win");     Sleep(ms);// Sleep以毫秒为单位 } 但是我定义了后DEV-C++会出现 sleep.c [Warning] "WIN32" redefined  <built-in> [Warning] this is the location of the previous definition  的提示     void sleep_ms(int ms); int main( void ) {  sleep_ms(5000);  printf("LOOK");   system("pause");    return 0;      }    #ifdef WIN32 #include <windows.h> void sleep_ms(int ms) {      printf("你进入的是win");     Sleep(ms);// Sleep以毫秒为单位 } #else #include <unistd.h> void sleep_ms(int ms) {      printf("你进入的是linux");     usleep(ms*1000);//usleep单位是微秒us*1000毫秒  } #endif

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:#ifdef WIN32 #include <windows.h> void sleep_ms(int ms) {     Sleep(ms); } #else #include <unistd.h> void sleep_ms(int ms) {     usleep(ms*1000); } #endif   谢谢赵老师

user: user-1
content: 不用这么复杂吧，简单调用_sleep()就可以了。

user: user-2
content: #ifdef WIN32 #include <windows.h> void sleep_ms(int ms) {     Sleep(ms); } #else #include <unistd.h> void sleep_ms(int ms) {     usleep(ms*1000); } #endif
user-0 提问: 文件的打开和写入的问题

回复:
user: user-1
content: 引用 3 楼 u013869048 的回复:[quote=引用 2 楼 Automation_dmu 的回复:]  fpFood=fopen("Recipes.txt","rw");//这里搞不懂需要用什么方式打开？ "w+b" 不可以哦，运行到printf("测试1");//测试是否运行到这 程序就结束了[/quote]             p = (Food *)malloc(sizeof(Food));                 printf("请输入菜的名字(输入N代表结束输入):\n");                 scanf("%s",p->name);你忘了给name分配内存了

user: user-0
content: 引用 2 楼 Automation_dmu 的回复: fpFood=fopen("Recipes.txt","rw");//这里搞不懂需要用什么方式打开？ "w+b" 不可以哦，运行到printf("测试1");//测试是否运行到这 程序就结束了

user: user-1
content: fpFood=fopen("Recipes.txt","rw");//这里搞不懂需要用什么方式打开？ "w+b"

user: user-2
content: "r+"  Opens for both reading and writing. (The file must exist.)  "w+"  Opens an empty file for both reading and writing. If the given file exists, its contents are destroyed.  "a+"  Opens for reading and appending; the appending operation includes the removal of the EOF marker before new data is written to the file and the EOF marker is restored after writing is complete; creates the file first if it doesn’t exist.  When a file is opened with the "a" or "a+" access type, all write operations occur at the end of the file. The file pointer can be repositioned using fseek or rewind, but is always moved back to the end of the file before any write operation is carried out. Thus, existing data cannot be overwritten.  The "a" mode does not remove the EOF marker before appending to the file. After appending has occurred, the MS-DOS TYPE command only shows data up to the original EOF marker and not any data appended to the file. The "a+" mode does remove the EOF marker before appending to the file. After appending, the MS-DOS TYPE command shows all data in the file. The "a+" mode is required for appending to a stream file that is terminated with the CTRL+Z EOF marker.  When the "r+", "w+", or "a+" access type is specified, both reading and writing are allowed (the file is said to be open for “update”). However, when you switch between reading and writing, there must be an intervening fflush, fsetpos, fseek, or rewind operation. The current position can be specified for the fsetpos or fseek operation, if desired.
user-0 提问: 谁有VS2010的MSDN  别藏了

回复:
user: user-1
content: 微软官方网站上有在线联机的 VS2010 MSDN！可以联机看！

user: user-2
content: http://download.microsoft.com/download/E/0/4/E0427BB8-8490-4C7F-A05B-AFEA0FC3EA80/X16-60997VS2010UltimTrialCHS.iso
user-0 提问: 新人求大神深入指导交流！！万分感激

回复:
user: user-1
content: http://msdn.microsoft.com/en-us/library/aa279433(v=vs.60).aspx

user: user-2
content: http://pan.baidu.com/s/1mgK7WjI  看下这个视频吧。孙鑫的VC++教程。 觉得好，就多给点分。

user: user-3
content: MSDN98\SAMPLES\VC98\MFC\TUTORIAL\SCRIBBLE\STEP1～7\*.*

user: user-4
content: 现在才开始学MFC？好吧，我都不想搞MFC了。

user: user-5
content: 引用 2 楼 movsd 的回复:建议先看《Windows程序设计》，再学MFC。 明明是先看《C++ Primer》

user: user-6
content: 建议先看《Windows程序设计》，再学MFC。

user: user-7
content: 放一本Windows程序设计,C++语言参考书,深入浅出MFC在手边,随时翻翻,勤查MSDN,少逛CSDN  建议,仅供参考.
user-0 提问: 菜鸟求助

回复:
user: user-1
content: 这个程序还有一个问题，只能找出来一个都是一样的单词，如果俩个单词是相同的呢？  看一下我输入的，这个问题没有解决！

user: user-1
content: #include<stdio.h> #include<string.h> int main() { int n,k,i,num=0;         char a[1000][1000]; printf("请输入你要输入的单词个数\n"); scanf("%d",&n); for(i=0;i<=n;i++) { gets(a[i]);  } for(i=0;i<=n;i++) { k=strcmp(a[i],a[i++]); if(k==0) { num++;  }  } printf("输入的相同的单词的个数：\n"); printf("%d\n",num); }  这样就可以了，嘻嘻！就是把k=strcmp(&a[i],&a[i++]);里面的取地址符去掉，改成k=strcmp(a[i],a[i++]);

user: user-2
content: 引用 5 楼 yangtao5220 的回复:[quote=引用 1 楼 N_sev7 的回复:] 题目本身没搞清楚要做什么？ 与哪个单词相同的单词的个数？ 还是所有输入的单词中有些是存在相同的？如果是这个意思，你这程序起码需要一个双重循环来比较吧题目是这样的。请输入一个数代表你需要输入的单词的个数，每个单词的长度不超过八个，求相同单词的个数。求写代码[/quote]  比如有下列单词： asd sadda fdsa asd fdsa asdda  就是有三个相同的对吧

user: user-0
content: [quote=引用 2 楼 Bzy_NET 的回复:] k=strcmp(&a[i],&a[i++]);//数组本身就是一个地址，不用加取地址符[/ 这个我知道，，，，，题目是这样的。请输入一个数代表你需要输入的单词的个数，每个单词的长度不超过八个，求相同单词的个数。求写代码

user: user-0
content: 引用 1 楼 N_sev7 的回复:题目本身没搞清楚要做什么？ 与哪个单词相同的单词的个数？ 还是所有输入的单词中有些是存在相同的？如果是这个意思，你这程序起码需要一个双重循环来比较吧题目是这样的。请输入一个数代表你需要输入的单词的个数，每个单词的长度不超过八个，求相同单词的个数。求写代码

user: user-0
content: 题目是这样的。请输入一个数代表你需要输入的单词的个数，每个单词的长度不超过八个，求相同单词的个数。

user: user-3
content: 1.你要输入单词个数为N，那N就 i 就应该小于N，小于等于就输入n+1个值了 2.字符串不是储存在一个单位里的，gets(a[i])是从a[i[地址开始输入的

user: user-4
content: k=strcmp(&a[i],&a[i++]);//数组本身就是一个地址，不用加取地址符

user: user-2
content: 题目本身没搞清楚要做什么？ 与哪个单词相同的单词的个数？ 还是所有输入的单词中有些是存在相同的？如果是这个意思，你这程序起码需要一个双重循环来比较吧
user-0 提问: 素数的筛选问题

回复:
user: user-1
content: //每次都是从k筛起，因为前面的都已近筛过了。每次加2i才仍旧为奇数。  你的问题在你自己贴的代码的注释里就已经有了了。

user: user-2
content: i不应该从自身开始啊，他自己如果是素数，就被prim[j]=1;

user: user-3
content: 因為 擁有 小於i的因子的數字已經被篩過了呀。 這代碼的篩選方法是，把n的整數倍的數字篩掉。 比如15，你篩3的整數倍的時候，已經篩掉了。那麼篩5的整數倍的時候顯然沒必要再來一次，對吧。只有大於25的數字才有必要篩嘛。
user-0 提问: 整除问题

回复:
user: user-1
content: 把a分解质因数来解决这个问题 #include<stdio.h> main() {   int  n=1000, a=75,i,m,s,k=30000,t,x; for(i=2;i<=a;i++)  {  m=0;t=0;      while(a%i==0) { m++;t=1; a/=i;)     if(t)       { s=n; x=0;         while(s>=i)        { x+=s/i; s/=i;}      if(x/m<k) k=x/m;     }  }  printf(" k=%d\n",k); }

user: user-2
content: 我记得这是上海交大的考研题吧？还是清华的来着，忘了。 普通的方法做不了的，数据太大了，时间绝对会超时。我记得有方法是用分解质因素的，你可以去看看。好久没做这些了。

user: user-0
content: 引用 3 楼 u013889450 的回复:请问楼主这是哪里的题目？ 九度Oj的题目

user: user-3
content: 请问楼主这是哪里的题目？

user: user-4
content: 代码问题较多，就不详细解释了，只说一句：对循环的条件还要多加斟酌。你自己diff一下代码  #include <stdio.h> #include <stdlib.h> int main(void) {     long n,a,k = 0;     int i;     int sum = 1;     while(scanf("%ld%ld",&n,&a)!=EOF)       {           for(i=1;i<=n;++i)               {                 sum *=i;               }          while (sum != 0 && sum % a == 0) {             sum = sum / a;             k++;         }         printf("%ld\n",k);      }       return 0; }

user: user-5
content: 这和n！0的个数异曲同工 用二分查找
user-0 提问: 定义一个函数来返回平均值，求解哪里错了

回复:
user: user-1
content: 像楼上说的，scanf("%d",&a[i]);这句应该改成浮点数输入，不然输入的整数被当成浮点数计算，就会出错，内存中浮点数的存储格式和整数不一样

user: user-2
content: http://www.cplusplus.com/reference/cstdio/printf/?kw=printf

user: user-3
content: %d是十进制整数。

user: user-4
content: scanf("%d",&a[i]) --> scanf("%f",&a[i]);
user-0 提问: C语言小问题求解

回复:
user: user-1
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-2
content: #include "stdio.h" main() { int a=3; a+=(a<1)?a:1;    //a=a+((a<1)?a:1),a<1否故((a<1)?a:1)=1 原式就等于a=a+1=3+1=4 printf("%d",a); }

user: user-3
content: a = 3 a>1   所以(a<1)?a:1得到1，a+=1  a=4

user: user-4
content: int a = 5; a += 1; printf("%d", a);为什么最后的结果是6啊？
user-0 提问: Socket编程？

回复:
user: user-1
content: 引用 8 楼 u013441719 的回复:thefirstz：   包大人，看些什么书呢？ UNP，还有一本我觉得也挺好，中国人写的，Linux高性能服务器编程

user: user-2
content: 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html

user: user-3
content: 引用 楼主 u013441719 的回复:IOS招聘： 3、熟悉移动平台网络Socket编程，了解TCP/IP、SOAP协议、HTTP协议，具有linux环境下C 语言开发经验技术者优先；  ---------------- 问题： 1.IOS系统Socket编程，与linux系统有什么不同？  2.IOS系统Socket编程，是开发些什么程序？ 实际上真正在开发中，一般公司都是封装好了，客户端根本不需要去了解什么socket，最终暴露给你的只有收到和发送两个接口。断线重连什么的也都是以消息的方式返回。

user: user-4
content: 主要是API不同, 其他没有明显区别哈。

user: user-5
content: 学校socket编程，推荐《UNIX网络编程》，另外可以参考我的系列博客，里面有现成代码可以参考。 http://blog.csdn.net/coolingcoding/article/details/7346404

user: user-5
content: 引用 3 楼 u013441719 的回复:IOS系统，开发些什么应用程序，会用到Socket编程？ 给个实例！Socket编程，通常开发一些与网络有关的应用，如网络聊天，文件传输，等等

user: user-0
content: IOS系统，开发些什么应用程序，会用到Socket编程？ 给个实例！

user: user-0
content: IOS系统，与linux系统，相同么？

user: user-1
content: 网络编程一般需要socket，进程间通信有时候也用socket socket编程除了架构，剩下的就是调用相关平台的api了
user-0 提问: 浮点数能使用位运算交换两个数？

回复:
user: user-1
content: 2.15.C语言_数据类型_浮点数表示法 http://www.tudou.com/listplay/z5u9lwXuPKU/bQ31mR0D14U.html

user: user-2
content: 位运算是底层操作，跟数据类型没有关系

user: user-3
content: 取指针  强转为char*  [0] [1] [2]......位操作
user-0 提问: 将指针变量带入函数时实参变了

回复:
user: user-1
content: 如1楼所说, 你应该监视 a  而不是*a   *a就是第一个字符"2"的ASCII码值  0x52

user: user-2
content: 貌似你监控的是*a，不是a，a应该与s3的内容相同的吧
user-0 提问:    [swu]调用外部函数求解

回复:
user: user-1
content: 想像库一样，建库， 提供，头文件，库

user: user-1
content: 引用 5 楼 u013990248 的回复:但是我们又是如何实现向<stdio.h>那样   将所有的函数写到一个头文件中呢？  复制函数头部到文件，加分号，存为x.h x.c void print_string(char str[80])  x.h void print_string(char str[80]);

user: user-0
content: 但是我们又是如何实现向<stdio.h>那样   将所有的函数写到一个头文件中呢？

user: user-0
content: 第一个文件  1 #include <stdio.h>   2 void enter_string(char str[80]);   3 void delete_string(char str[80], char ch);   4 void print_string(char str[80]);   5   6 void main()   7 {   8         char str[80];   9         char c;  10         enter_string(str);  11         scanf("%c", &c);  12         delete_string(str, c);  13         print_string(str);  14 } 第二个文件  1 #include <stdio.h>   2 #include <string.h>   3   4 void enter_string(char str[80])   5 {   6         gets(str);   7 } 第三个文件  1 #include <stdio.h>   2 #include <string.h>   3   4 void delete_string(char str[80], char ch)   5 {   6         int i, j;   7   8         for(i=j=0; str[i]!='\0'; i++){   9                 if(str[i]!=ch){  10                         str[j++]        = str[i];  11                 }  12         }  13         str[j]  = '\0';  14 } 第四个文件  1 #include <stdio.h>   2 #include <string.h>   3   4 void print_string(char str[80])   5 {   6         printf("%s\n", str);   7 }

user: user-2
content: while(str[i]!='\0'){  10                 if(str[i]==ch){  11                         str1[j] = str[i+1];  12                 }  13                 i++;  14                 j++;  15         } 错误明显，自己单步调试

user: user-3
content: 你这个循环有问题，好好检查检查

user: user-4
content: 多文件要在使用该函数的文件中对该函数进行声明后再使用。声明应该放在main函数外，最好是单独用一个头文件来放这个，我记得我上课时说过这个的吧。 至于为什么是乱码，你还是自己调试一下。准备合理的测试数据是基本的。
user-0 提问: 一个C语言基础指针的问题

回复:
user: user-0
content: 引用 3 楼 baichi4141 的回复:除了在定义的时候可以整体初始化，数组在大多数情况下不能整体使用 楼主你猜[]这个操作符在语言标准里是怎么定义的？是用指针来定义的的！每次你写a[b]，如果a是一个数组，它都首先转化为指向第一个元素的指针pa，然后再执行*(pa+b) 在函数参数列表里，*a和a[]完全一样，前者更本质，后者更适合还不懂指针的初学者 引用 4 楼 gigglesun 的回复:都可以，两种方法一样  谢谢两位

user: user-1
content: 都可以，两种方法一样

user: user-2
content: 除了在定义的时候可以整体初始化，数组在大多数情况下不能整体使用 楼主你猜[]这个操作符在语言标准里是怎么定义的？是用指针来定义的的！每次你写a[b]，如果a是一个数组，它都首先转化为指向第一个元素的指针pa，然后再执行*(pa+b) 在函数参数列表里，*a和a[]完全一样，前者更本质，后者更适合还不懂指针的初学者

user: user-0
content: 引用 1 楼 user-3 的回复:形参使用数组形式也是可以的,但是要指定数组长度吧 你的意思是说，如果用*b，就是不指定它的长度了？b[]指定长度了吗？

user: user-3
content: 形参使用数组形式也是可以的,但是要指定数组长度吧
user-0 提问: 求助（一个字符串乱序比较的acm问题）

回复:
user: user-0
content: 引用 6 楼 vichare 的回复:都不能改帖子。。。 多次操作和一次是一样的，还是用KMPkmp算法的确可以用，3Q

user: user-0
content: 引用 3 楼 angel_su 的回复:试试取消c数组不要花时间去重组字串，直接strncmpstrncmp不是比较前几位的字符么，拆分比较怎么做到？

user: user-1
content: 都不能改帖子。。。 多次操作和一次是一样的，还是用KMP

user: user-1
content: 不对，X是任意次操作，那岂不是任何顺序都能得到？

user: user-1
content: 用KMP算法

user: user-2
content: 试试取消c数组不要花时间去重组字串，直接strncmp

user: user-0
content: 引用 1 楼 user-3 的回复:上原题吧~ 准确一点原题就代码注释

user: user-3
content: 上原题吧~ 准确一点
user-0 提问: 求问哪错了

回复:
user: user-1
content: int main() {     int i, j;     for(i=1; i<10; i++)         //    scanf("%d",i);     {         if(i%2 == 1)             printf("%2d\n", i);     }     return 0; }

user: user-2

user: user-3
content: 7         scanf("%d",&i);

user: user-4
content: 问题：for循环的使用和scanf中的变量应该是地址哦。

user: user-5
content: #include<stdio.h>   int main()  { 	int a[]={1,2,3,4,5,6,7,8,9}; 	for (int i=0;i<10;i=i+1) 	 { 		 		 if(a[i]%2==1)          printf("%d",a[i]); 	 } 	return 0; }

user: user-6
content: 朕也来编程了…… #include <stdio.h>  int main (void) {     for(int i = 1; i<10; i++) if (i%2) printf("%d ", i); }

user: user-5
content: 楼主错好多地方啊。。

user: user-7
content: # include <stdio.h> ///////////stdio.h   int main() {     int i;     for(i=1; i<10; i++)         //    scanf("%d",i);     {         if(i%2 == 1)             printf("%2d\n", i);     }     return 0; } 关于数组，lz可以看看书啊！也可以看看这个——http://blog.csdn.net/u012421456/article/details/18938553

user: user-7
content: 这个 j 该去掉，没用到，忘了去

user: user-7
content: # include <stdio.h> ///////////stdio.h  int main() { 	int i, j; 	for(i=1; i<10; i++) 		//	scanf("%d",i); 	{ 		if(i%2 == 1) 			printf("%2d\n", i); 	} 	return 0; }  lz应该好好看看书啊

user: user-8
content: #include<stdio.h> int main() { 	int a[10]={0,1,2,3,4,5,6,7,8,9},i; 	for(i=1;i<10;i++) 	{ 		if(a[i]%2==1) 		printf("%d ",i); 	} 	return 0; } 刚才那个多定义了一个j，现在好了

user: user-8
content: #include<stdio.h> int main() { 	int a[10]={0,1,2,3,4,5,6,7,8,9},i,j; 	for(i=1;i<10;i++) 	{ 		if(a[i]%2==1) 		printf("%d ",i); 	} 	return 0; }

user: user-9
content: 楼主多看看书吧，这么一个简单的程序，错的地方太多了 int i,; for(i = 0; i < 10; i++) {        if(i % 2 != 0)             printf("%d ", i); } printf("\n");

user: user-0
content: 问题是 编程打印小于10的正奇数。 程序要求 使用if条件判断语句，输出时，每两个数字之间有一空格。 还有如何定义一个数组我现在写的是   1 #include<stdio.h>   2   3 int main()   4 {   5         int i,k,a[k]=   6         for(i=0;i<10;i=i+1){   7   8         if(k%2==1)   9                 printf("%d",k);  10         }  11         return 0;  12 }  13 ~

user: user-8
content: 你要实现什么功能
user-0 提问: 求最大递增数遇到的问题

回复:
user: user-1
content: 虽然不知道你的最大递增数是求什么的，不过printf("%s\n",maxshu);应该改成printf("%d\n",maxshu);吧，在我这就可以了

user: user-0
content: 求大神指教，不知道哪里错了
user-0 提问: [swu]输出结果

回复:
user: user-0
content: 恩  好  我输出的结果是  7 8 8 8

user: user-1
content: 确实是毫无意义的问题。不值得大家来费神。 楼主应该首先想想要问什么问题。

user: user-2
content: 一般是不用考虑这些的，即使有特殊的情况，也可以用其他方式避免这种情况出现，这个问题流传已经很广了

user: user-2
content: VC6.0完整绿色版win8.1下，结果是 8 8 8 7，这个问题没啥意义，不同的机器或编译器得到的结果可能就不同，lz好好看看置顶帖吧——http://bbs.csdn.net/topics/370153775

user: user-3
content: 怎么没有意义？闭上眼睛，客观世界就不存在了吗？

user: user-4
content: 毫无意义的题目

user: user-5
content: 这就有意思吗？

user: user-3
content: Side effects and value computations of the arguments of the called function are unsequenced.

user: user-6
content: c++标准没有规定参数的计算顺序，输出结果和编译器相关，楼主看看置顶帖。 http://bbs.csdn.net/topics/370153775
user-0 提问: 基础问题，变量值传递问题。

回复:
user: user-0
content: 自己顶，。。。。

user: user-1
content: 在a.cpp中定义全局变量CString cstr 在a.h中extern声明 b.cpp中#include "a.h"

user: user-2
content: 不能定义在头文件中，全局变量最好定义到源文件，这样做是为了避免头文件被多个源文件包含，导致编译出现变量重定义  全局变量在源文件定义，在头文件用extern来声明

user: user-3
content: 这么快，刚刚打完字 就解决了～～

user: user-3
content: .h文件不是独立的编译单元，在预处理时会做复制处理罢了 也就是说，如果在a.h定义了一个cstr，凡是包含了 a.h 都将在预处理时做一次复制，例如你的 a.cpp，b.cpp就都定义了一个 cstr，但是他们的内存地址不一样  所以，.h文件不要定义变量，只定义类型  extern是这样用的： a.cpp定义了一个非static变量cstr，全局的。那么 b.cpp也想用这个变量，就需要 extern CString cstr; 这样做的目的是在编译b.cpp时知道这个变量是在其他文件定义，至于是哪儿定义的，需要在连接时的符号解析时才知道

user: user-4

user: user-0
content: 弄好了，有同样问题的请查阅下面链接： http://developer.51cto.com/art/201104/256820.htm
user-0 提问: 关于C语言二级考试中一段冒泡排序的疑问

回复:
user: user-0
content: 没有人解答吗？

user: user-0
content: 写的好像有点混乱 当J=2;k=3;i=0时 就是之前K的值为3，执行strcmp程序之后，K被赋值为k=i=0;了，但是执行完冒泡之后K的值是0还是3呢当再次执行for语句i++的时候，我自己测试感觉是k=3可能对这个理解的还不是很透，不过总算是在慢慢啃而且没退步
user-0 提问: C编程，新人求助

回复:
user: user-0
content: 谢谢各位，可是为什么我改了以后编译通过，但是运行的结果不对呢？ #include <stdio.h> #include <stdlib.h> void main ()  { 	int i,j;  	char a; 	scanf("%s",&a); 	#define m sizeof(a) 	j=m; 	char str1[m],str2[m]; 	scanf("%s",str1); 	for (i=0;i<=j-1;i++) 	 { 		 int t(char x); 		 str2[i]=t(str1[i]); 	 }     printf("%s",str2);  	system("pause"); }  int t(char x) { 	int y; 	if (x>=0&&x<=7) 	{ 		y=x+2; 	    return (y); 	} 	else if (x>7&&x<=9) 	{ 		y=x%10; 	    return (y); 	} 	else printf("error"); }

user: user-1
content: 当做字符串处理，先定义一个char a[MAX],再scanf("%s",a); C++中可以直接定义一个string a;再cin>>a；即可

user: user-2
content: char str1[j],str2[j];                        //此行报错，怎么改啊，求大神！   这里的申明中“j”不能使变量，必须是常量或者常量表达式   处理！  可以  #define m 10 ... 下面申明就可以了 不知道长度的话，可以写个if来判断长度自适应

user: user-0
content: #include <stdio.h> #include <stdlib.h> void main ()  { 	int i,j;  	char a; 	scanf("%s",&a); 	j=sizeof (a); 	char str1[j],str2[j];                        //此行报错，怎么改啊，求大神！ 	scanf("%s",str1); 	for (i=0;i<=j-1;i++) 	 { 		 int t(char x); 		 str2[i]=t(str1[i]); 	 }     printf("%s",str2);  	system("pause"); }  int t(char x) { 	int y; 	if (x>=0&&x<=7) 		y=x+2; 	else if (x>7&&x<=9) 		y=x%10; 	else printf("error"); }

user: user-3
content: 你可以指定一个长度, 能体现你的功能就行了. 实际产品中又不是用户从输入字符串, 根据实际情况分配动态内存就可以了

user: user-0
content: 可是我不知道用户输入的字符串长度，怎么确定数组的元素个数？？？

user: user-0
content: 谢谢大家，我终于编出来了，换了一种思路！

user: user-4
content: 读一个字符，加2，输出，再读一个字符，加2，输出…… 根本没必要在内存中保存

user: user-0
content: 那怎么改？？？

user: user-5
content: 第七行定义a是char类型，怎么输入时用%s啊？
user-0 提问: 冒泡排序，大神帮我检查代码啊

回复:
user: user-1
content: 如果你是在vc中运行的话，局部变量的定义要放在函数的开通部分编译才会通过。 比如： void f() { ..............代码.............. for(int i=0; i<10; i++) } 应该改为 void f() { int i; ..............代码............. for (i=0; i<10; i++) }

user: user-2
content: 10个数只进行9轮排序。所以i<10改成i<9 第1轮至多进行9趟比较，第2轮至多进行8趟比较...。所以应该是j<9-i。 每一趟是从头开始把每相邻的两个数进行比较排序，所以应该是num[j]>num[j+1]而不是num[i]>num[i+1]

user: user-2
content: int num [] = {10,9,8,7,6,5,4,3,2,1}; 	printf("数组十位数字为："); 	for (int i = 0; i<10; i++) 		printf("%d,",num[i]); 	printf("\n"); 	for (int i =0; i< 9; i++) 	{   		for (int j = 0; j< 9 -i; j++) 		{  			if (num[j]>num[j+1]) 			{  				int tmp = num[j]; 				num[j]=num[j+1]; 				num [j+1]=tmp; 			} 		} 	} 	for (int i=0; i<10; i++) 		printf("%d,",num[i]); 	printf("\n"); 	return 0;
user-0 提问: 动态链接库的加载问题

回复:
user: user-1
content: 引用 楼主 u014123498 的回复:是否每个程序的地址空间里都有映射kernel32.dll?（哪怕导入表为空）  那么如果我显式加载kernel32.dll，windows是不是就不会再映射一次了？  其实你的工程设置中都已经显示加载了，否则根本不能link。看你的工程设置的link部分

user: user-2
content: 引用 楼主 u014123498 的回复:是否每个程序的地址空间里都有映射kernel32.dll?（哪怕导入表为空）  那么如果我显式加载kernel32.dll，windows是不是就不会再映射一次了？ 是的，一个dll只会被同一个进程加载一次，不管是显示还是隐式，一旦加载后，再加载只是增加引用计数而已。
user-0 提问: 01背包问题

回复:
user: user-1
content: 因为循环里运算  [i-1]

user: user-2
content: 引用 楼主 tingfengx 的回复:#include<iostream> # include<cstring> # define max(a,b) a>b?a:b using namespace std; int main() {      int dp[101][1001],m,T,w[101],val[101],i,j;     cin>>T>>m;     for(i=1;i<=m;i++)         cin>>w[i]>>val[i];     memset(dp,0,sizeof(dp));     for(i=1;i<=m;i++)      for(j=0;j<=T;j++)//j相当于上面说的V-c[i]          {     if(j>=w[i])         dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+val[i]);//放还是不放的选择     else dp[i][j]=dp[i-1][j];      }      cout<<dp[m][T]<<endl;      return 0; }  为什么循环是从i=1开始，而j从0开始？数组下标不是都从0开始吗 我没有具体看这个背包问题是解决什么问题的，但是如你所说，i从几开始是和程序设计的逻辑相关的，语法上数组都是从下标0开始，但是可能这个程序的设计需要抛弃0从1开始呢？这个用法没有问题，要看实际的逻辑需要。
user-0 提问: 关于VS2010 32位控制台应用程序项目生成的文件夹里的文件的意思

回复:
user: user-0
content: 觉得内在的联系是什么啊

user: user-1
content: ipch是 ip change的缩写

user: user-2
content: 看一下里面有什么文件就差不多知道了，这个问题一般在讲windosw编程的书上会提到
user-0 提问: 打神来帮我看一下哪里错了

回复:
user: user-1
content: 楼主这是不会用vs2010啊，你新建一个工程吧，然后再敲这些代码

user: user-2
content: 我也覺得樓主是 在做編程練習，在工程裡開了n個.c文件，每個裡面都有int main()

user: user-3
content: 看样子很有可能是编译器问题

user: user-4
content: 楼主，推荐一个编译器给你吧，DEVc++，希望对你有用

user: user-5
content: 很明显,这是一个工程里面有了两个以上的main函数嘛!

user: user-6
content: 引用 15 楼 u014106516 的回复:引用 12 楼 lming_08 的回复:把工程中的jishuai.cpp或jishuai.c移除掉   我重新建了一个工程文件了  还是不行  我重新建了那个都没有你说的你个文件 怎么移除啊  你确定你建立的工程是空工程？

user: user-7
content: 这个根本是刷分贴

user: user-0
content: 引用 16 楼 angel_su 的回复:决定你是新建一个文件，不是新工程，没搞清阿，现在工程里3个main啦... 哦     你是在那里看出3个main的啊

user: user-8
content: #include<stdio.h> int main(void) {int a;    int b;      int c;        a=10;          b=20;            c=a*b;   printf("c=%d\n",c);     return 0; } 后一个双引号也错了。

user: user-8
content: printf("c=%d\n,c");  这个改成 prinft("c =%d\n",c); 楼主太马虎了啊。。。

user: user-9
content: 我用vc6变异没有错，直接copy你的代码，。你用的vs容错率更高，应该不会报错，可能就是你的符号的全角半角写错了，还不容易分辨

user: user-10
content: 引用 15 楼 u014106516 的回复:引用 12 楼 lming_08 的回复:把工程中的jishuai.cpp或jishuai.c移除掉   我重新建了一个工程文件了  还是不行  我重新建了那个都没有你说的你个文件 怎么移除啊你VS左侧的解决方案里面项都展开看看有没有jishuai.cpp，有就右键移除

user: user-11
content: 决定你是新建一个文件，不是新工程，没搞清阿，现在工程里3个main啦...

user: user-0
content: 引用 12 楼 lming_08 的回复:把工程中的jishuai.cpp或jishuai.c移除掉   我重新建了一个工程文件了  还是不行  我重新建了那个都没有你说的你个文件 怎么移除啊

user: user-0
content: 引用 11 楼 angel_su 的回复:认真看错误信息，不是说你的代码有问题，是说你的工程里有两个main函数，链接出错，新建一个工程重做或者把无关的文件剔出。  还是不可以

user: user-0
content: 你们看吧还是不行

user: user-10
content: 把工程中的jishuai.cpp或jishuai.c移除掉

user: user-12
content: #include<stdio.h> int main(void) {int a;    int b;      int c;        a=10;          b=20;            c=a*b;   printf("c=%d\n,c");     return 0; } 因为你没有贴出报错的具体信息，可能的问题： 1、分号、括号的中英文状态，检查下是否全是英文状态输入的； 2、printf("c=%d\n,c"); 这个分号错了，检查看，改成 printf("c=%d\n",c);    ； 我将你的程序，录入我的VS2010编译没有问题。你得仔细检查下分号括号之类的。不然就贴出错误信息，否则就是编译器没弄好。 给点建议，在写程序时，最好将你声明的变量初始化，这是一个好的习惯，虽然在写这种简单程序影响不到结果，但在做大项目，很多变量时，可能会给你带来很多困扰。

user: user-13
content: LZ 认真看书~~

user: user-11
content: 认真看错误信息，不是说你的代码有问题，是说你的工程里有两个main函数，链接出错，新建一个工程重做或者把无关的文件剔出。
user-0 提问: 关于超级终端仿真程序的疑问（总是有1个error）

回复:
user: user-1
content: ComlistenThread，ComListenThread，l没有大写。。。

user: user-0
content: 引用 1 楼 user-1 的回复:ComlistenThread，ComListenThread，l没有大写。。。 改了以后出了这个问题
user-0 提问: 输出乱码，是不是缓冲区的问题？？

回复:
user: user-1
content: 请检查scanf的返回值。 http://bbs.csdn.net/topics/390471779

user: user-2
content: 引用 9 楼 u011779380 的回复:[quote=引用 7 楼 u012421456 的回复:] [quote=引用 2 楼 r_Jimy 的回复:] 楼主的scanf按下面这样用就没问题了，加个,号为什么会有问题跟scanf 的实现有关，期待大神详解  scanf("%d%s%lf",&age,name,&salary);  scanf中一般不要使用非输入控制符（这里指的是逗号），关于这个，lz可以看看——http://blog.csdn.net/u012421456/article/details/18501309[/quote] 我想请教下scanf()的用法二，为什么是输入m123才不出错？[/quote] lz没仔细看吧！m在那儿是非输入控制符，非输入控制符必须原样输入  下面这是那儿的话（重要的地方——红色部分）  scanf（“非输入控制符 输入控制符”，输入参数）； 功能： 将从键盘输入的字符转化为输入控制符所规定格式的数据，然后存入已输入参数的值为地址的变量中（非输入控制符必须原样输入）。

user: user-0
content: 引用 7 楼 u012421456 的回复:[quote=引用 2 楼 r_Jimy 的回复:] 楼主的scanf按下面这样用就没问题了，加个,号为什么会有问题跟scanf 的实现有关，期待大神详解  scanf("%d%s%lf",&age,name,&salary);  scanf中一般不要使用非输入控制符（这里指的是逗号），关于这个，lz可以看看——http://blog.csdn.net/u012421456/article/details/18501309[/quote] 我想请教下scanf()的用法二，为什么是输入m123才不出错？

user: user-2
content: # include <stdio.h>  int main() {	 	int age; 	char name[20]; 	double salary;  	scanf("%d %s %lf", &age, &name, &salary); 	printf("i am %s, %d years old, salary:%f\n", name, age, salary);  	return 0; }

user: user-2
content: 引用 2 楼 r_Jimy 的回复:楼主的scanf按下面这样用就没问题了，加个,号为什么会有问题跟scanf 的实现有关，期待大神详解  scanf("%d%s%lf",&age,name,&salary);  scanf中一般不要使用非输入控制符（这里指的是逗号），关于这个，lz可以看看——http://blog.csdn.net/u012421456/article/details/18501309

user: user-3
content: 测试了下，使用 scanf("%d,%lf,%s",&age,&salary,name); 在控制台输入时也以,间隔如：1,3.5,jim可以正常读数据 使用 scanf("%d %s %lf",&age,name,&salary); 在控制台输入时以空隔做间隔如：10 jim 3.5也可以正常读数据 由此可以推断如下几点： 1.scanf实现时，格式串不加间隔默认以空格或回车作为间隔符读数据 2.如果我们加了间隔，则以我们加的字符为间隔符 3.我们加了间隔符，如果接收到回车符则结束（楼主的情况就是只输入一个数字，按了回车控制台直接打印内容     不再等待输入） 4.采用"%s"格式串时，可用空格或不使用间隔符而不能用逗号作为间隔符

user: user-0
content: 引用 1 楼 r_Jimy 的回复:%s输出的话，name应以'\0'结尾 建议输出前将name[19]=0;这样试了也不行

user: user-0
content: 引用 2 楼 r_Jimy 的回复:楼主的scanf按下面这样用就没问题了，加个,号为什么会有问题跟scanf 的实现有关，期待大神详解  scanf("%d%s%lf",&age,name,&salary); 用空格也是乱码

user: user-4
content: %d后面可以加逗号，但这时你输入也要输入逗号，%s后不能加逗号，逗号不能使用%s正确地结束，所以最好用空格  scanf("%d %s %lf",&age,name,&salary);

user: user-3
content: 楼主的scanf按下面这样用就没问题了，加个,号为什么会有问题跟scanf 的实现有关，期待大神详解  scanf("%d%s%lf",&age,name,&salary);

user: user-3
content: %s输出的话，name应以'\0'结尾 建议输出前将name[19]=0;
user-0 提问: c指针自加问题

回复:
user: user-1
content: P 是指向int型的指针，p++等价于 p = p当前值 + sizeof(int)； 第一个for循环执5次，p++执行了5次，在执行第二个for以前 p已经指向了a[4]之后，即 p == &a + 5*sizeof(int)，明显p指向 的单元已经超出了数组的范围

user: user-2
content: 1：指针是int类型，自加一次应该是增加一个int长度 -------------------------------------------------------------------- 指针是指针，int是int，指针怎么变成int了……

user: user-3
content: # include<stdio.h> #include <iostream> using namespace std; int main() {     int a[5];     int * p =&a[0]; 	cout<<p<<"  "<<p+1<<endl; 	int *pp =a; 	cout<<pp<<"  "<<pp+1<<endl; 	int (*ppp)[5] =&a; 	cout<<ppp<<"  "<<ppp+1<<endl;       for (int i =0; i<5; i++) 	{		 		scanf("%d",p+i); 	} 	     for (int j=0; j<5; j++) 	{ 		printf("%d ",*(p+j)); 	}     printf("\n");      	 	 	int cc; 	cin>>cc; 	return 0; }     1：指针是int类型，自加一次应该是增加一个int长度 2：楼主的p一直在执行自加操作，不论是一个int长度，还是数组长度，都不可能输出正确结果 3：要想自加一次增加一个数组长度，就要将指针定义为指向数组的指针，

user: user-4
content: 引用 3 楼 zhb111hy 的回复:那指针是int类型，自加一次不应该是增加一个int长度吗？ 按照谭浩强的解释就是增加了一个数组的长度，不明白不明白自加一次是增加一个int长度，数组有5个int长度

user: user-0
content: 引用 2 楼 piaobotudou 的回复:他应该是这个意思，就是第一次循环结束后已经越界 对，他的意思就是这样的，我也就因为这个纠结了……&

user: user-0
content: 那指针是int类型，自加一次不应该是增加一个int长度吗？ 按照谭浩强的解释就是增加了一个数组的长度，不明白不明白

user: user-5
content: 他应该是这个意思，就是第一次循环结束后已经越界

user: user-5
content: 第二次循环前p已经等于p+5了，所以已经越界
user-0 提问: 编译原理的小证明题  求大神解答  

回复:
user: user-0
content: 引用 4 楼 user-2 的回复:证明一个language不是regular language用的是标准的pumping lemma。你先把pumping lemma看懂，然后用pumping lemma说明矛盾。 这个的确得仔细看。我当年学的时候班级里大半都花了挺长时间理解的。  好的 谢谢

user: user-1
content: 写出合理的产生式就差不多了，只要能推出你要证明的结果。

user: user-2
content: 证明一个language不是regular language用的是标准的pumping lemma。你先把pumping lemma看懂，然后用pumping lemma说明矛盾。 这个的确得仔细看。我当年学的时候班级里大半都花了挺长时间理解的。

user: user-0
content: 引用 1 楼 oYinGui1 的回复:S->AB, A->0A, B->1B  谢谢你啦  这个类型的题我的教材里没有的  不知道怎么下手 是只要证明对应的产生式没有出口就行了吗。。。。。。。。。

user: user-1
content: S->AB, A->0A, B->1B
user-0 提问: c动态分配二维数组地址失败

回复:
user: user-1
content: int getArrayLength(point* pts) {     int length;     length = sizeof(pts)/sizeof(point);     return length; } 1.你没有声明point类型    用typedef struct point{   }point; 2.对指针的sizeof结果为4     如果你声明了类型point    那么sizeof  point =16   你可以打印return  的返回值  为0 3.你代码太长了    实在不想看     recalloc是重新分配一整块内存  如果不能在原malloc分配的内存后面进程扩充就   会重新分配一整块内存   把原内存的数据拷贝到重新分配的内存中   指针指向realloc分配的内存    原内存数据被丢弃掉  这里再检查下

user: user-1
content: 二级指针怎么和二维数组勾搭上了

user: user-0
content: 引用 7 楼 poiu710 的回复:ceterPoints =(point*)realloc(classesDetribution这句有问题，这句把classesDetribution已经是变成了野指针，使用野指针当然报错 额。。。不好意思，这个是我直接复制的时候忘记改变base的变量了。。 我在自己测试一下，不行的话就换个思路来写这个算法了。

user: user-0
content: 引用 4 楼 user-3 的回复:sizeof任何指针大小都一样 我一向建议只使用一维数组  好像是这样的。我测试了一下。隐约记得老师以前说过，结构体使用sizeof的大小好像和结构体变量位数最大的那个相同。

user: user-2
content: ceterPoints =(point*)realloc(classesDetribution这句有问题，这句把classesDetribution已经是变成了野指针，使用野指针当然报错

user: user-0
content: 引用 3 楼 poiu710 的回复:从你的程序中看出来，你对值传递和指针传递不明白，不要以为用指针作参数就是指针传递，还有sizof()操作符不明白。 嗯，是这样的。指针用的比较少，现在比较特殊，所以才使用c来写程序的。至于sizeof还是以前上课的时候学数据结构学的用法，前辈能看出来大概问题在哪里呢？

user: user-0
content: 引用 4 楼 user-3 的回复:sizeof任何指针大小都一样 我一向建议只使用一维数组 不会把，int*和double*难道sizeof也一样？我也在思考，是不是二维数组造成的问题，在不行的话就改用一维数组。即便如此，我还是想弄明白具体的原因。二维数组应该是可以动态分布的吧。

user: user-3
content: sizeof任何指针大小都一样 我一向建议只使用一维数组

user: user-2
content: 从你的程序中看出来，你对值传递和指针传递不明白，不要以为用指针作参数就是指针传递，还有sizof()操作符不明白。

user: user-0
content: 引用 1 楼 poiu710 的回复:代码没看完，但这个getArrayLength函数错了   //计算数组的长度 int getArrayLength(point* pts) {     int length;     length = sizeof(pts)/sizeof(point);     return length; }  sizeof(pts) ==4，sizeof(point) 应该是16 我修改成了//计算数组的长度 int getArrayLength(point* pts) { 	int length; 	length = sizeof(pts)/sizeof(pts[0]); 	return length; } 这样应该是对的。我自己还在测试这个问题，第一次循环完全可以，第二次循环就在realloc这里出问题了。不知道什么问题。

user: user-2
content: 代码没看完，但这个getArrayLength函数错了   //计算数组的长度 int getArrayLength(point* pts) {     int length;     length = sizeof(pts)/sizeof(point);     return length; }  sizeof(pts) ==4，sizeof(point) 应该是16
user-0 提问: 新手求助！！请问这个程序到底哪里错了！

回复:
user: user-1
content: 这个for用的不对吧

user: user-0
content: 引用 3 楼 angel_su 的回复:编译器应该会警告a没初始化... 额。。。。没有警告额。。。。

user: user-2
content: 编译器应该会警告a没初始化...

user: user-0
content: 引用 1 楼 user-3 的回复:没有看里面的循环逻辑。不过10的6次方已经可以让int类型已经溢出了，试试long 用了long   依旧没办法解决 。。。。

user: user-3
content: 没有看里面的循环逻辑。不过10的6次方已经可以让int类型已经溢出了，试试long
user-0 提问: php5.4.25的c核心用vs2008sp1编译无法通过。。

回复:
user: user-0
content: 不会吧，这个在vs上测试了，而且注释了是会内存泄漏？但不影响吧？。。。看来。。。还是我自己看看吧。。

user: user-1
content: rightJudge被你注释的那些行，不会影响其他功能么？

user: user-0
content: 我在dev c++下debug是没错的，也编译通过了，但一运行就直接弹出一个错误对话框停止了。在vs下没有以上问题。 至于是不是链接出错，应该不会吧，因为只是rightJudge函数出错了，把它注释掉就能通过，而它里面的苦函数在别的函数中也有用到。。 啊，，头疼。。 谢谢了

user: user-2
content: 另外楼主是不是在链接的时候出的错误呢，是不是哪个库函数没有定义？

user: user-2
content: 楼主说的用指针会直接停止具体是什么情况，内存申请成功了吗？
user-0 提问: 如何方便查看I/O函数的参数

回复:
user: user-1
content: 引用 4 楼 u013921360 的回复:[quote=引用 3 楼 user-1 的回复:] [quote=引用 2 楼 u013921360 的回复:] [quote=引用 1 楼 user-1 的回复:] 常用自然记住，不常用的用的时候查 如果要用的时候不允许查比如说学生要考试，那只能平时多练习 那查的时候去哪查？我的意思是最好能在电脑里找到函数声明[/quote] 好一点的编译环境都可以直接右键跳到函数声明 复杂一点的函数光看声明看不懂，查书查手册上网查资料找老师找领导等等等等[/quote] 如果不用IDE怎么办 [/quote] 如果不用IDE，就自己找到编译器编译所需的头文件放在哪里 不过我觉得连这几个简单函数都记不住的，要记住每个函数所在头文件的位置更没戏

user: user-0
content: 引用 3 楼 user-1 的回复:[quote=引用 2 楼 u013921360 的回复:] [quote=引用 1 楼 user-1 的回复:] 常用自然记住，不常用的用的时候查 如果要用的时候不允许查比如说学生要考试，那只能平时多练习 那查的时候去哪查？我的意思是最好能在电脑里找到函数声明[/quote] 好一点的编译环境都可以直接右键跳到函数声明 复杂一点的函数光看声明看不懂，查书查手册上网查资料找老师找领导等等等等[/quote] 如果不用IDE怎么办

user: user-1
content: 引用 2 楼 u013921360 的回复:[quote=引用 1 楼 user-1 的回复:] 常用自然记住，不常用的用的时候查 如果要用的时候不允许查比如说学生要考试，那只能平时多练习 那查的时候去哪查？我的意思是最好能在电脑里找到函数声明[/quote] 好一点的编译环境都可以直接右键跳到函数声明 复杂一点的函数光看声明看不懂，查书查手册上网查资料找老师找领导等等等等

user: user-0
content: 引用 1 楼 user-1 的回复:常用自然记住，不常用的用的时候查 如果要用的时候不允许查比如说学生要考试，那只能平时多练习 那查的时候去哪查？我的意思是最好能在电脑里找到函数声明

user: user-1
content: 常用自然记住，不常用的用的时候查 如果要用的时候不允许查比如说学生要考试，那只能平时多练习
user-0 提问: 字符串逆转输出问题

回复:
user: user-0
content: 现在懂了，感谢各位的精彩回复

user: user-1
content: str+1，所以占用了一个，去掉+1

user: user-2
content: 我觉得改成这样更标准更好理解一些 #include<stdio.h> void reverse(char*str){     if(*str!='\0'){         reverse(str+1);         printf("%c",*str);     }    } void main(){     char a[]="dlroW olleH";     char b[]="margorp C a si sihT\n";     char c[]="doog yreV\n";     reverse(a);     reverse(b);     reverse(c);     printf("\n\n\n\n"); }

user: user-3
content: 在reverse(++str)过程中对str进行了++，所以递归返回后下面的printf输出的就是第二个字符了，把第一个字符加过去了，修改如下： void reverse(char*str){     if(*(str)!='\0') 	{         reverse(++str); 	    printf("%c",*(--str));     }    }

user: user-0
content: 在线等大神！
user-0 提问: c字符问题

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

user: user-2
content: 第一句就错了

user: user-3
content: str定义出错，，char str是个字符，不能赋予一个字符串

user: user-4
content: 引用 楼主 zhb111hy 的回复:要求吧字符串中整数打出来（位置左） 不太明白lz的这句话的意思，不知道下面的代码符不符合楼主的意思 # include <stdio.h>  # include <string.h>  int main()  {     char str[9]={'1', '3', '4', 'a', '2', '3', '1', 'b'};   //char是字符类型，不能存放字符串，如果想存放字符串，需要用字符数组   //  char * p = &str[9];     int len = strlen(str);     for (int i=0; i<len ; i++)  	{         if ((str[i]>='A' && str[i]<='Z') || (str[i]>='a' && str[i]<='z')) 		{             str[i] = '0';         }      }      printf("%s\n", str);  	return 0; }

user: user-5
content: #include<stdio.h>  #include<string.h>  int main()  {      char str[]="134a231b";      char * lp1=str;      char * lp2=str;      int len =   strlen(str);       for (int i =0;i<=len ; i++)      {          if(lp1[i]<'0'||lp1[i]>'9')          {              lp1[i]='\0';              if(lp1>lp2)                   printf("%s\n",lp2);              lp2=lp1+1;           }      } }  这是输出所有数字串的，没有经过测试。

user: user-6
content: 引用 4 楼 PDD123 的回复:[quote=引用 3 楼 user-6 的回复:] [quote=引用 1 楼 PDD123 的回复:] #include<stdio.h> #include<string.h> int main() {     char str[]="134a231b";     int len =   strlen(str);     for (int i =0;i<len ; i++)     {         if(str[i]<'0'||str[i]>'9')         {             str[i]='\0';             break;         }     }     printf("%s",str); } 判断到除0-9以外字符就break，字符串中只有一个这样的字符吗？[/quote]  楼主似乎就只需要输出一个字符串。[/quote] LZ的原文：一个练习题，要求吧字符串中整数打出来（位置左） 所以只是LZ的替换成'\0'的方法不可行而已

user: user-5
content: 引用 3 楼 user-6 的回复:[quote=引用 1 楼 PDD123 的回复:] #include<stdio.h> #include<string.h> int main() {     char str[]="134a231b";     int len =   strlen(str);     for (int i =0;i<len ; i++)     {         if(str[i]<'0'||str[i]>'9')         {             str[i]='\0';             break;         }     }     printf("%s",str); } 判断到除0-9以外字符就break，字符串中只有一个这样的字符吗？[/quote]  楼主似乎就只需要输出一个字符串。

user: user-6
content: 引用 1 楼 PDD123 的回复:#include<stdio.h> #include<string.h> int main() {     char str[]="134a231b";     int len =   strlen(str);     for (int i =0;i<len ; i++)     {         if(str[i]<'0'||str[i]>'9')         {             str[i]='\0';             break;         }     }     printf("%s",str); } 判断到除0-9以外字符就break，字符串中只有一个这样的字符吗？

user: user-6
content: char str="134a231b";-->定义的是字符，赋的值是字符串 再提示一点，如果你想改成char *str也是错的。

user: user-5
content: #include<stdio.h> #include<string.h> int main() {     char str[]="134a231b";     int len =   strlen(str);     for (int i =0;i<len ; i++)     {         if(str[i]<'0'||str[i]>'9')         {             str[i]='\0';             break;         }     }     printf("%s",str); }
user-0 提问: C语言数据结构单向链表问题》问什么这条程序只有查找是对的，删除和插入都错了？

回复:
user: user-1
content: 代码有点长… 加点测试语句，找到出问题的代码区域段，贴上来讨论下

user: user-2
content: 所有参数传递本质上是值传递      你传递的只是实参指针值的一份拷贝      形参改变不了实参的值       就像a=5    func(a)    在func中试图改变a是改变不了的一样      所以你的删除和插入错误     而查找不改变链表的结构  所以能够成功     祝你好运能够理解      代码太长实在难看   但是你的错误也是大众问题每个学C的人都会经历

user: user-3
content: 给lz一份自己写的代码参考一下 /*---------------------------------------------- File: G:\soft\02\168.c Date: 2014-3-26 17:55:18 Author: 1174843091@qq.com 利用malloc创建链表，增加、删除或倒序链表 ----------------------------------------------*/ #include<stdio.h> #include<malloc.h>  struct student { 	int num; 	struct student *next; };  //检测链表降序/顺序 int shun(struct student *head) { 	struct student *p,*q; 	for(p=q=head;p!=NULL;) 	{ 		if(p->num<q->num)return 0; 		q=p; 		p=p->next; 	} 	return 1; }  //输出链表 void prf(struct student *head) { 	while(head!=NULL) 	{ 		printf("%3d",head->num); 		head=head->next; 	} 	printf("\n"); }  //倒序链表 struct student *dao(struct student *head) { 	struct student *p,*q,*temp; 	for(p=NULL,q=head;q!=NULL;) 	{ 		temp=q->next; 		q->next=p; 		p=q; 		q=temp; 	} 	head=p; 	return head; }  int main() { 	int n,i=1,num,flag; 	char c[100]; 	struct student *head,*p,*q,*temp; 	printf("请输入要创建的链表数:\n"); 	scanf("%d",&n); 	if(n<1)return 0; 	head=p=q=(struct student *)malloc(sizeof(struct student)); 	q->num=i++; 	for(n--;n>0;n--) 	{ 		q=p; 		p=(struct student *)malloc(sizeof(struct student)); 		p->num=i++; 		q->next=p; 	} 	p->next=NULL; 	q=p=head; 	prf(head); 	getchar(); 	for(i=1;head!=NULL;i=1,q=p=head) 	{ 		if(flag=shun(head))printf("当前链表为升序\n"); 		else printf("当前链表为降序\n"); 		printf(" 你想要插入一个节点(a) 删除一个节点(b) 倒置链表(c) 退出(d)?\n"); 		gets(c); 		switch(c[0]) 		{ 			case 'a': 			{ 				printf("请输入插入节点的数值:\n"); 				temp=(struct student *)malloc(sizeof(struct student)); 				scanf("%d",&temp->num); 				if(flag)for(q=p=head;p!=NULL&&p->num<temp->num;) 				{ 					q=p; 					p=p->next; 				} 				else for(q=p=head;p!=NULL&&p->num>temp->num;) 					p=p->next; 				temp->next=p->next; 				p->next=temp; 				prf(head); 				getchar(); 				break; 			} 			case 'b': 			{ 				printf("请输入删除节点的数值:\n"); 				scanf("%d",&num); 				if(head->num==num)head=head->next; 				for(;p!=NULL&&p->num!=num;) 				{ 					q=p; 					p=p->next; 				} 				if(p==NULL) 				{ 					printf("没有找到!"); 					getchar(); 					break; 				} 				q->next=p->next; 				prf(head); 				getchar(); 				break; 			} 			case 'c':head=dao(head);prf(head);break; 			case 'd':return 0; 	} 	} 	if(c[0]!='c')printf("链表节点已全部删除!"); 	getchar(); 	return 0; }

user: user-4
content: 自己先调试下，整理下代码吧！然后把有问题的部分贴出来！ 不要一下子什么都没有，就一大片代码的，下次就可能被删帖的哦！

user: user-5
content: http://blog.csdn.net/wonggonghong/article/details/21527577 可以参考这篇文章
user-0 提问: C语言排序去重,谁能看一下哪里错了啊??

回复:
user: user-1
content: 程序没什么问题吧，应该是输入错误

user: user-2
content: #include <stdio.h> #include <stdlib.h>  #define N 100  int cmp1(const void* a, const void* b) {     return *(int*)a - *(int*)b; }  int cmp2(const void*a, const void* b) {     return *(int*)b - *(int*)a; } int main() {     char order;     int v[N], n=0, i;     scanf("%c",&order);     while (scanf("%d",&v[n])==1)  n++;//没有退出条件，死循环     if(order =='A')   qsort(v,n,sizeof(int),cmp1);     if(order =='D')   qsort(v,n,sizeof(int),cmp2);     printf("%d ",v[0]);     for(i=1;i<n;i++)         if(v[i]!=v[i-1]) printf("%d ",v[i]);     printf("\n");     return 0; }

user: user-3
content: int cmp1(const void* a, const void* b) {     return *(int*)a - *(int*)b; }  int cmp2(const void*a, const void* b) {     return *(int*)b - *(int*)a; } 字符串比较使用strcmp(const char* a,constcmp char* b),返回值分别为-1 0 1 表示小于 等于 大于 添加头文件 string.h
user-0 提问: c语言数值交换问题

回复:
user: user-1
content: 函数的参数传递方式，教科书上一般说有三种：值传递，引用传递，指针传递；其实本质上看，只有两种：值传递和引用传递，指针传递的本质还是值传递。 详细解释，可参见如下视频： 4.03.C语言_函数_值传递 http://www.tudou.com/listplay/z5u9lwXuPKU/JYlkMDiWrIE.html 4.04.C语言_函数_引用传递 http://www.tudou.com/listplay/z5u9lwXuPKU/5Lax5EAM10w.html 4.05.C语言_函数_指针传递 http://www.tudou.com/listplay/z5u9lwXuPKU/_nFpuooNZrU.html

user: user-0
content: 恩 懂了 感谢各位 因为我这分本来就不多 还有各位回答都很到位 我一直心存感激的 因为你们都给我了帮助 分数只好平均着给了   下次不懂得地方我会先查看以前的帖子的  一时心急忘了 没想起来看以前的哈 再次感谢你们！

user: user-2
content: 所谓的值  跟 指针 是相对的  要交换值，需要传它的指针， 要交换指针， 需要穿他的指针，也就是指针的指针

user: user-3
content: 指针变量说白了也还是值传递，只不过是地址的复制，你可以通过地址修改指向数据的值，但是在函数内部交换指针的值，只是将函数内的变量的地址进行了交换，对外面的指针是没有影响的，

user: user-4
content: 我觉得“传值”和“传址”这两种说法本身就是最大的误人子弟 传参就是复制，至于传的指针是用来干嘛的，跟传参本身没关系

user: user-5
content: 其实交换两个数用到的指针的知识在几乎所有的入门书籍中都有讲到，楼主不用急着看一些专业的书，打好基础更要紧。

user: user-6
content: 谭浩强的<C语言程序设计>

user: user-7
content: 关于怎么用指针传值，lz可以看看这个——http://blog.csdn.net/u012421456/article/details/21803797  至于书，我是没看过几本，就不推荐了，看别人吧 其实lz可以搜一些论坛上的帖子，这样的问题有人问过的

user: user-0
content: 恩 看了各位的解释后 才明白我理解的太狭隘了 我也觉得好多细节理解不透，推荐本书呗  感激不尽哈

user: user-5
content: 调用函数时的参数都是实际参数的一个复制品，指针也不例外，当你向一个函数传一个指针时，函数使用的是这个指针的复制品，第一个图中的函数，虽然传进函数的一个指针的值，但是函数是根据这个值找到内存中的地址对应的变量，所以可以修改值，第二个图只是把指针的值复制了一下，没有改变原来变量的值。其实书上都有详细的讲解，楼主可以看看书
user-0 提问: JNI 对象数组作为函数参数的问题

回复:
user: user-0
content: [quote=引用 1 楼 N_sev7 的回复:] 你来错板块了貌似！！！[ /quote] JNI的目的使用JAVA调用本地C

user: user-1
content: 你来错板块了貌似！！！
user-0 提问: 求大神找出这个中缀表达式转为后缀表达式的错误

回复:
user: user-1
content: 测试环境win7  测试例子： 1、 输入：3+4# 输出：  2、 输入：3+4-2# 输出：

user: user-1
content: #include<iostream.h>   int is_operation(char op) { 	switch(op) 	{ 	case'+': 	case'-': 	case'*': 	case'/':return 1; 	default:return 0; 	} }   int priority(char op) { 	switch(op) 	{ 	case'#':return -1; 	case'(':return 0; 	case'+': 	case'-':return 1; 	case'*': 	case'/':return 2; 	default:return -1; 	} }   void postfix(char e[],char f[]) { 	int i=0,j=0; 	char opst[100]; 	int top,t; 	top=0; 	opst[top]='#';top++; 	while(e[i]!='#') 	{ 		if((e[i]>='0'&&e[i]<='9')||e[i]=='.') 			f[j++]=e[i]; 		else if(e[i]=='(') 		{ 			opst[top]=e[i]; 			top++;} 		else if(e[i]==')') 		{ 			t=top-1; 			while(opst[t]!='('){f[j++]=opst[--top];t=top-1;} 				top--; 		} 		else if(is_operation(e[i])) 		{ 			f[j++]=' '; 			while(priority(opst[top-1])>=priority(e[i])) 				f[j++]=opst[--top]; 			opst[top]=e[i];top++; 		} 		i++; 	} 	while(top) 		f[j++]=opst[--top]; }  void main() { 	char e[10],f[10]; 	memset(e, 0, 10); 	memset(f, 0, 10); 	cin.getline(e,10); 	postfix(e,f); 	cout<<f; }