Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C语言问题求助 求知道这种方式的人给解释下

回复:
user: user-1
content: 这是旧式的C语言函数定义，具体可参看：http://blog.csdn.net/talent_CYJ/article/details/51302816  实际使用时，建议使用新式的

user: user-2
content: 函数定义的形式不对呢，用matlab的语法写C语言程序，本身语法的规则都不一样，怎么可能编译过去呢； 函数的定义就像main函数定义一样，有大括号包起来；需要的变量可以在大括号里定义，需要外部传递过来的变量，在参数里体现；

user: user-3
content: fftsf是一个函数，后面的double x只是把参数表的定义单独拿出来写，相当于这样的写法： double fftsf(double x) 后面的ffts也是一样的道理。  这些写法，包括变量是否可以随处定义等等，可能跟编译器有关，如果编译器不支持，你就改一下，按标准写法来就好了。
user-0 提问: 为什么下面的程序输出错误

回复:
user: user-1
content: 当然还有多算一个月，a的下标应该从month-1开始算 #include<stdio.h>  int main() {     int year,month,day,what_day = 0;     //   int a[130],b[130];     int a[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};     int b[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};     scanf("%d,%d,%d", &year, &month, &day);     if(year%400 ==0 || (year % 4 == 0 && year % 100 != 0))     {         for(month = month-1;month>0;month--)             what_day+=a[month];         printf("\n%d",what_day);     }     else     {         for(month = month-1;month>0;month--)             what_day+=b[month];         printf("\n%d",what_day);     }     what_day+=day;     //  printf("\n第%d天",what_day);     return 0; }

user: user-1
content: #include<stdio.h>  int main() {     int year,month,day,what_day = 0;     //   int a[130],b[130];     int a[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};     int b[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};     scanf("%d,%d,%d", &year, &month, &day);     if(year%4==0 || (year % 4 == 0 && year % 100 != 0))     {         for(;month>0;month--)             what_day+=a[month];         printf("\n%d",what_day);     }     else     {         for(;month>0;month--)             what_day+=b[month];         printf("\n%d",what_day);     }     what_day+=day;     //  printf("\n第%d天",what_day);     return 0; } 三个问题： 1. 输入格式不正确，年月日变量缺少& 2. 闰年判断不对； 3. what_day没有初始化；

user: user-2
content: scanf("%d,%d,%d", &year, &month, &day);  //添加 &
user-0 提问: 萌新求教，关于内存分配的问题

回复:
user: user-1
content: 因为你年轻，精力旺盛！  帮结帖＋蹭分

user: user-0
content: int  main（void） {           struct name * my_name;           my_name=(struct name *)malloc(siezeof(struct name));           my_name->fname=(char *)malloc(10*sizeof(char));           return 0; } 这样就可以了...... 作为一个金融专业的，我TM为什么要看C语言呢.............

user: user-2
content: struct name * my_name; 这样定义的是一个野指针，对于野指针的使用是未定义的，有可能会导致段错误； 通过malloc之后，my_name指针就指向的堆上的空间，堆上的空间就是可以正常访问了。

user: user-0
content: 好吧 我感觉自己找到答案了，因为指针初始化的问题。
user-0 提问: main()的形参argc个数的问题

回复:
user: user-1
content: exe 空格后面加参数

user: user-2
content: 引用 10 楼 hefashion0190 的回复:引用 6 楼 zhao4zhong1 的回复:http://bbs.csdn.net/topics/390469280

user: user-3
content: 引用 6 楼 zhao4zhong1 的回复:http://bbs.csdn.net/topics/390469280

user: user-4
content: 程序自身是一个参数，然后后边空格＋其他字符串又为一个参数

user: user-5
content: 把你的参数用空格分开就可以 "chin" "beijing" "bbb" "asdf" "asd" "fsdf"

user: user-6
content: 程序自身路径是一个参数，你输入的整体是一个参数，所以一共两个，输入多个参数你可以用空格分隔

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

user: user-7
content: 因为有两个参数，第一个就是可执行文件，即Text1.exe文件； 第二个就是你输入的（...） 所以，argc最小是1，因为对于系统来讲，至少有要执行的程序

user: user-8
content: 因为整个字符串没有空格，所以被认为是一个参数。因为中间的空格都在""中，被认为是字符而不是参数分隔符

user: user-9
content: 参数变量是以空格来隔开区分的，不是逗号

user: user-10
content: #include <stdio.h>  // int main(int argc, char* argv[]) int main()  {     char* s[] = {"myexe", "abc", "123"};     int argc = 3;      char** argv = s;      for (int i = 0; i != argc ; i++) {          printf("%s\n", argv[i]);       }      return 0; }

user: user-10
content: 你输入的参数 当做一个参数了 命令名   参数0 你输入的 参数1
user-0 提问: 求大佬来看看,在线等，谢谢。

回复:
user: user-1
content: 要把 StrDelete函数提到main函数上面

user: user-2
content: 定义的方式不对

user: user-3
content: 把你的StrDelete函数放到main函数的外面，不能在一个函数里实现另一个函数

user: user-4
content: 为什么要这样定义啊？

user: user-5
content: C语言规定函数不能嵌套定义

user: user-6
content: 看不懂你的代码，main函数里嵌套StrDelete函数吗？ 建议重发一下你的代码
user-0 提问: 为什么在c语言头文件中函数的声明是下划线格式的，但我们引用时可以不加下划线  _ ?

回复:
user: user-1
content: http://www.cnblogs.com/zhulin/archive/2011/12/27/2303398.html 有一部分原因是区分是系统函数或库函数还是自定义函数；系统或库函数一般前加_下划线，主要会和用户自己定义的函数名不冲突 http://bbs.csdn.net/topics/390471598

user: user-2
content: 这些  “—” 下划线前缀的函数的 不是 C语言标准定义的函数，所以加了个  _  区别出来。 对于函数 好像 使用的时候  _fun 和 fun 没区别吧

user: user-3
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。
user-0 提问: 输入N后一直死循环

回复:
user: user-1
content: 1、ch应该在循环前先进行初始化，否则第一次循环判断的只是一个随机的值  2、其次，在scanf("%d", &n);后加一个getchar();把缓冲区中的换行符接收了，否则会被后面的scanf("&c", &ch);直接接收，而不等待用户输入

user: user-2
content: 首先scanf里是%c 其次应该是while (ch != 'N'&&ch != 'n')吧

user: user-3
content: 还有一个问题，逻辑，输入N或n就要退出循环，但是循环执行的条件就应该是输入的ch既不是'n'也不是’N' 即改成如下形式： while (ch != 'N' && ch != 'n')

user: user-3
content: # include <stdio.h>      int prime(int); int main(void) {     int n;     char ch;      while (ch != 'N' || ch != 'n')     {         printf("I will tell whether this integer is prime, Please input an integer:");         scanf("%d",&n); 	getchar();    /*接收输入缓冲区里的换行符'\n'*/         if (prime(n))             printf("Prime!\n");         else             printf("Not a prime!\n");         printf("Continue: Y/N:");         scanf("%c", &ch);     }      return 0; }  两个问题，ch的输入格式应该是%c，而不是&c 第二个问题：论坛里提到很多次了，就是第二个输入是%c，那么输入n的时候会将换行符留在输入缓冲区，正好被ch收到，所以加一句getchar()接收这个换行符；

user: user-4
content: int prime (int n) {     int i;     int flag = 1;      for (i=2; i<=n/2 && flag==1; i++)     if (n%i == 0)     flag = 0;      return (flag); } 这边少一个i<=2否则结果不对。
user-0 提问: dll文件开辟的内存（存有数据）可否不回收，下次调用的dll文件直接对内存操作

回复:
user: user-1
content: 这应该不是个事儿。 DLL  和内存没有任何联系的。 只要你的进程不关闭就没有任何问题的。

user: user-2
content: 可以呀，你只要不卸载dll就行

user: user-3
content: 不要低估操作系统在处理“多次打开循环读写文件”优化时使用相应策略的智商。  无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！
user-0 提问: C语言实现将内存中的内容实时保存。

回复:
user: user-1
content: 你代码本身就存在问题，你打开了多次fopen,如果你想向一个文件中紧接文件尾部继续写入可以用fflush

user: user-2
content: 内存中的数据只要你程序没有崩溃或者关闭，就会一直存在，所以你要做的，就是写一个好的、鲁棒的程序，保证其稳定性，

user: user-2
content: 嗯。。稀疏矩阵最好用位图bitmap，可以去自己参考一下思想。空间利用率和CPU利用率都很高 如果想进一步压缩时间的话，最好减少IO的操作次数，考虑把成堆数据一次性输出到文件中 最后，将数据从内存中输出到硬盘中的操作，是不怎么会用到CPU的，电脑自带存储管理管线和控制器，CPU只是吧数据放在控制器上而已，传输操作不归CPU管

user: user-0
content: 由于C语言不能获得足够的权限，C程序是做成dll文件被其他程序调用使用的。不知道下面这个替代方法是否可行。  1，指定一个较大的内存区域，用于不停的存储新来的数据。 2. 主程序每调用一次C程序（dll文件），就在内存中进行一次基线检查，然后将剩下的矩阵元（1000个点）写入1中开辟的内存中。 并保证内存空间中的数据不消失（怎么保证？） 3.多次采集后例如（10万次后，将内存中的数据一次性写入硬盘）  由于每次主程序调用的是dll文件，每次调用完之后，dll文件都关闭了，那怎么保证内存空间中的数据不消失？  非常谢谢！

user: user-0
content: 谢谢大家回复，重新编辑了一下. 因为数据量比较大，担心CPU运行不过来，所以打算每次都把数据保存下来，保存到不到的文件中。  for (int jj=0;jj<1000;jj++) // 采集1000次  {	 char* filename; //每一次的文件名     filename = char(jj);//每一次的文件名       FILE *f = fopen( filename, "w" ); //每次保存一个新文件       for (y=0; y<ny; y++) {          float *ptr = (float*)GetPtr(bufnum,y);          for (x=0; x<nx; x++, ptr++)             fprintf(f,"%*.3f ",12, *ptr); //把数据写入新文件          fprintf(f,"\n");       }       fclose(f); //数据采集完一次，关闭文件； }

user: user-3
content: 打开文件会比较耗时，所以若是循环打开或者打开多个文件耗时就更多了。

user: user-3
content: 你的文件打开次数太多了吧 for (int jj=0;jj<1000;jj++) { char* filename;     filename = char(jj);       FILE *f = fopen( filename, "w" );       for (y=0; y<ny; y++) {          float *ptr = (float*)GetPtr(bufnum,y);          for (x=0; x<nx; x++, ptr++)             fprintf(f,"%*.3f ",12, *ptr);          fprintf(f,"\n");       }     }    你要打开几个文件？看你的打开文件在一个循环里，那么应该是打开多次（或打开多个文件）。如果实时保存时，只需要保存一份数据，建议先把文件打开再循环写入。另外，再次写入时将文件指针，只需要将文件指针重新指向文件开头即可。使用fseek或者rewind都可以实现将文件指针指向文件开始位置

user: user-4
content: 你这代码本身就有问题啊，在循环体里边执行fopen，却在循环体外边fclose，没有配对。fopen应该在循环之前做。

user: user-5
content: // 创建文件句柄 HANDLE hFile = ::CreateFile(lpszFileName, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // 创建文件映射 HANDLE hMap = ::CreateFileMapping(hFile, NULL, PAGE_READONLY | SEC_COMMIT, NULL, NULL, NULL); // 读取映射中的内存 LPVOID lpBuffer = ::MapViewOfFile(hMap, FILE_MAP_READ, NULL, NULL, NULL);  // 好了文件的内存已经获取了，你可以随意处理了  // 释放映射内存 ::UnmapViewOfFile(lpBuffer); // 关闭文件映射 ::CloseHandle(hMap); // close file handle ::CloseHandle(hFile);

user: user-5
content: // 创建文件句柄 HANDLE hFile = ::CreateFile(lpszFileName, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // 创建文件映射 HANDLE hMap = ::CreateFileMapping(hFile, NULL, PAGE_READONLY | SEC_COMMIT, NULL, NULL, NULL); // 读取映射中的内存 LPVOID lpBuffer = ::MapViewOfFile(hMap, FILE_MAP_READ, NULL, NULL, NULL);  // 好了文件的内存已经获取了，你可以随意处理了  // 释放映射内存 ::UnmapViewOfFile(lpBuffer); // 关闭文件映射 ::CloseHandle(hMap); // close file handle ::CloseHandle(hFile);
user-0 提问: 简单问题求教！！！！！

回复:
user: user-1
content: 建议看一下软件的使用说明吧，只有用过的朋友能回答你的这个问题；一般软件，建议从网上搜一搜，然后总结一下用法

user: user-2
content: 百度搜相关关键字。
user-0 提问: devCPP4.9.9.2怎样操作单步调试和设断点调试？

回复:
user: user-1
content: 确实，有些程序是无法单步调试的，比如驱动程序、交叉编译的程序，那就只能预设输出信息，根据这些信息判断运行情况了。不一而足，视具体情况而定。

user: user-2
content: 说单步调试的，应该是其本人使用的编辑编译器支持，并且也需要专门的学习，如果是初学者，可能有难度。但是，也不是没有办法调试。对于初学者的代码长度一般不会很长，可以考虑添加打印信息，了解变量的值，这种办法虽然笨，但也不适一个解决问题的办法；调试办法有很多，建议自己能够熟练的使用一两种，对于不同的问题，也建议有对应的解决问题的策略，这个需要学习和总结的。 不要对回答问题的人，天天贴一些重复的“单步调试”，他们都是用的很顺的“老油条”了，我们应该一步步来，或者专门去学习一下单步调试的流程；平时遇到问题时也有意识的用一下；  我感觉，回复帖子是发几句单步调试等等方法，也是为了刷存在感。仅代表个人见解（见解可能有误）。

user: user-1
content: 没用过，帮不了你。一般来说Windows下的IDE调试都比较方便，Linux的话常用的是gdb了。

user: user-3
content: 现代中国人的能力差别很大程度上体现在会不会合理高效地使用百度上。 百度搜相关关键字。  https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=devCPP4.9.9.2怎样操作单步调试和设断点调试  引用 3 楼 hzy_76 的回复:确实，有些程序是无法单步调试的，比如驱动程序、交叉编译的程序，那就只能预设输出信息，根据这些信息判断运行情况了。不一而足，视具体情况而定。 驱动程序、交叉编译的程序也可以单步调试。
user-0 提问: 大家帮忙看看哪里的问题 输出错误

回复:
user: user-1
content: 楼上全是正解， printf("%d is a prime number");编译器不知道%d打出什么。 printf("%d is a prime number", m);需要在后面 ， 分开， 输入要打印的变量。

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

user: user-0
content: 没有人在吗？

user: user-3
content: #include <stdio.h> #include <stdlib.h>  int main() {     int m,i;     printf("please enter a number:");     scanf("%d",&m);     for (i = 2;i< m;i++)         if (m%i == 0)  break;     if(i < m)         printf("%d is not a prime number", m);   /*缺少参数*/     else         printf("%d is a prime number", m);    /*缺少参数*/     return 0;  } printf输出缺少参数；有%d后面就应该跟一个对应的整形参数（楼主的代码里缺少m）； 像这样的错误，编译器会提出警告的，建议你不要放过警告信息。

user: user-4
content: 算法问题建议设置断点调试 百度搜索相关程序参考
user-0 提问: 一维数组，二维数组指针辩论效率问题

回复:
user: user-1
content: http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组

user: user-1
content: 引用 11 楼 li_rui_1220 的回复:引用 10 楼 zhao4zhong1 的回复:http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组付费的。。。 以前是免费的。 看来CSDN最近银根吃紧。

user: user-0
content: 引用 10 楼 zhao4zhong1 的回复:http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组付费的。。。

user: user-1
content: 无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

user: user-2
content: 写成二维pp[t][i]编译器一样会生成计算地址汇编代码，如果你要完全遍历，可以一边遍历一边递加指针

user: user-3
content: 直接这样应该是最快了，省去了编译器寻址的损耗。   	char *pData;                      //指向30w数据 	char *pTemp= pData; 	 	int i = 300000; 	while (i--) { 		*pTemp; 		++pTemp; 	}

user: user-4
content: 从你的代码上来看，第二个效率会高些。因为，循环的次数是一样的，第一部分有一个计算的过程（会涉及到读变量t, LineNum并做乘法运算），第二部分再循环次数一样的情况下，只是做了读操作。所以，个人认为是第二个效率会高些

user: user-5
content: 关键是循环。

user: user-6
content: 引用 6 楼 li_rui_1220 的回复:[quote=引用 4 楼 u012947309 的回复:] ......效率问题一般是讨论需要访问多少次，读写多少次等等。。。 你这里循环次数都没变，写成一维还是二维并不影响效率。  其实你可以简单粗暴的把二维数组当成一堆首尾相连的一位数组。这样看的话二维数组跟一位数组没有区别。  程序是运行在嵌入式平台上的，计算时间哪怕能够节省1ms也是非常必要的。 我原来的方式就是按照一维数组处理的，但是我改完以后发现计算时间基本上没咋变化，可能还慢0.3-0.4ms 我在想是不是二维数组指针遍历，执行的效率不高[/quote]  二维的访问方式多找了一次地址。 至于二维多找一次地址和一维多一次乘法运算来算地址，哪一个更快我认为这跟环境有关。 如果不是海量数据的话，我认为这种差距不会带来质变。  如果需要从数量级上来提升效率的话，我想你可能需要修改数据结构和遍历算法了。

user: user-0
content: 引用 4 楼 u012947309 的回复:......效率问题一般是讨论需要访问多少次，读写多少次等等。。。 你这里循环次数都没变，写成一维还是二维并不影响效率。  其实你可以简单粗暴的把二维数组当成一堆首尾相连的一位数组。这样看的话二维数组跟一位数组没有区别。  程序是运行在嵌入式平台上的，计算时间哪怕能够节省1ms也是非常必要的。 我原来的方式就是按照一维数组处理的，但是我改完以后发现计算时间基本上没咋变化，可能还慢0.3-0.4ms 我在想是不是二维数组指针遍历，执行的效率不高

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！  这个程序需要运行在嵌入式平台

user: user-6
content: ......效率问题一般是讨论需要访问多少次，读写多少次等等。。。 你这里循环次数都没变，写成一维还是二维并不影响效率。  其实你可以简单粗暴的把二维数组当成一堆首尾相连的一位数组。这样看的话二维数组跟一位数组没有区别。
user-0 提问: 给整形变量地址加1，为什么不是偏移了1个字节？

回复:
user: user-1
content: 地址加1,就是当前类型的地址加一，如果想偏移1个字节，可以转换成char *

user: user-2
content: 因为在你当前的环境下，int类型系统会默认为4个字节的内存大小，即long int类型；当int *p;p＝0;p＋＋;后所指向的地址偏移实际上加了4个字节，刚刚好是一个int的内存大小

user: user-3
content: 变量地址加一，是指sizeof    (变量类型) 个字节，  建议你想的话可以用位段试试，用位段可以指定一个变量占几个字符

user: user-4
content: Pointer Arithmetic Additive operations involving a pointer and an integer give meaningful results only if the pointer operand addresses an array member and the integer value produces an offset within the bounds of the same array. When the integer value is converted to an address offset, the compiler assumes that only memory positions of the same size lie between the original address and the address plus the offset.  This assumption is valid for array members. By definition, an array is a series of values of the same type; its elements reside in contiguous memory locations. However, storage for any types except array elements is not guaranteed to be filled by the same type of identifiers. That is, blanks can appear between memory positions, even positions of the same type. Therefore, the results of adding to or subtracting from the addresses of any values but array elements are undefined.  Similarly, when two pointer values are subtracted, the conversion assumes that only values of the same type, with no blanks, lie between the addresses given by the operands.

user: user-5
content: 3楼正解， 强制转到char* 再+1就是对字节的操作

user: user-6
content: 指针的加减操作，和指针的类型相关的，想一次+1偏移一个字节，只能把指针强行转换成char*

user: user-7
content: 你这里是给一个指针(int*)进行加法运算，指针的加法运算是这样：指针+N 相当于移动 N*sizeof(T)，T是指针指向的对象类型

user: user-8
content: 注意&b是值整个类型的地址，&b+1就是偏移sizeof(int)个字节；  比如int *p = &b; p++//即p = p+1，那么就是偏移sizeof int个字节 还有   char a[2]; a++;    /*偏移一个字节*/ &a++;    /*偏移sizeof(char) * 2个字节，即偏移一个数组长度*/

user: user-9
content: +1是指+1个变量类型的长度

user: user-10
content: 指针变量的+1, 是增加指针所指向的类型的字节数. int *p;   p+1则是增加4字节  short *p; p+1则是增加2字节 以此类推.
user-0 提问: 字符数组和字符指针的地址问题

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  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对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495 http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组

user: user-2
content: a是指向字符串常量，那么a指针变量里存放的是字符串的地址，字符串在只读数据段，而指针变量a是在粘上申请，因此&a是变量a的地址，在栈上申请，那么就是栈地址。 &a[0]是指向字符串第一个字符的地址，那么改地址是在只读数据段，因此就是字符串的首地址。 同理，b变量是在栈上申请，字符串"You are a student..."是在栈上（注意这儿有一个copy，即字符串是常量，从只读数据段拷贝到栈上），因为b是数组，在栈上有内存空间，a是指针变量，只存放地址，因为不会将字符串拷贝至a中。  指针可以按照数组的形式使用。因此a[0]和b[0]都是一样的，取字符串的第一个字符；a[0] == *(a+0); a[1] == *(a + 1);  b[1] == *(b+1); 查看他们的变化，建议写个程序运行一下即可。
user-0 提问: 创建一个多项式，输入后却无法进行下一步的显示，只能无限输入…是这串代码有问题么

回复:
user: user-0
content: 对了对了…原来是要输入系数为0结束 谢谢各位大佬了

user: user-0
content: void print (struct duoxiangshi*head3) {struct duoxiangshi*p3;  p3=head3;   do  {  if(p3->zhishu==0)   {printf("%d",p3->xishu);    p3=p3->next;    continue;   }   else if(p3==head3)     {printf("%dx^%d",p3->xishu,p3->zhishu);    p3=p3->next;    continue;   }   else if(p3->xishu<0)   printf("%dx^%d",p3->xishu,p3->zhishu);   else if(p3->xishu>0)   printf("+%dx^%d",p3->xishu,p3->zhishu);   p3=p3->next;  }while(p3!=NULL);  printf("\n\n"); } 这个是输出的代码…

user: user-0
content: 输入的时候已经有空格了，xishu！=null这里的确有问题…改了一下 还是没法进入第二部分的显示多项式输入字母才会出来…然后跟着一堆乱码

user: user-1
content: p1->shix  !=0

user: user-2
content: #include <stdio.h>   struct duoxiangshi {     int xishu,zhishu;     struct  duoxiangshi*next; }; struct duoxiangshi*create() {     struct duoxiangshi*head,*p1,*p2;     int n;     n=0;     head=NULL;     p2=NULL;     p1=NULL;     p1=(struct duoxiangshi*)malloc(SHI);     scanf("%d %d",&p1->xishu,&p1->zhishu);     while(p1->xishu != 0)    /*判断xishu的值应该是!= 0吧*/     {         ++n;         if(n==1)         {             head=p1;             p2=p1;         }         else         {             p2->next=p1;             p2=p1;             p2->next=NULL;         }         p1=(struct duoxiangshi*)malloc(SHI);         scanf("%d %d",&p1->xishu, &p1->zhishu);         p1->next = NULL;     }     free(p1);     return (head); } xishu变量不是指针，而是一个普通的int类型变量，不能与NULL比较
user-0 提问: 如何获取活动窗口目录的路径？详细见帖子。

回复:
user: user-1
content: WinExec("cmd.exe cd /d %1 1>NUL 2>NUL",SW_SHOW);

user: user-2
content: 试试 GetCurrentDirectory

user: user-1
content: 仅供参考： D:\ToDir.bat： @echo off cd /d %1 1>NUL 2>NUL if errorlevel 1 goto isfile title 命令提示符 - %cd% goto end :isfile cd /d %~dp1 title 命令提示符 - %cd% :end  ToDir.reg：REGEDIT4  [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\ToDir] @="■ToDir" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\ToDir\command] @="cmd /k D:\\ToDir.bat \"%1\""

user: user-0
content: 引用 3 楼 zgl7903 的回复:试试 GetCurrentDirectory 见四楼，我更改了说明。

user: user-0
content: 引用 2 楼 user-3 的回复:直接使用相对路径cmd.exe，程序会在系统路径中进行搜索 见四楼，我描述的详细了一些。

user: user-0
content: 大家说的我都看了一下，可是跟我想象中的有所不同。 我的打算是，类似下面这样：  通过一个第三方的软件，叫listary，弹出一个窗口，可以在其中输入命令什么的，直接打开。 我现在想在打开cmd的时候方便一些，直接输入一条命令，或者干脆就注册一个热键，让调用的cmd路径正好是我当前面对的这个文件夹的路径。 请教有什么方法可以实现。。

user: user-3
content: 直接使用相对路径cmd.exe，程序会在系统路径中进行搜索
user-0 提问: MTK搭建模拟器时，错误'cl.exe' 不是内部或外部命令，也不是可运行的程序 或批处理文件。

回复:
user: user-1
content: 把MSVC2015和 WindowsKits 符号链接过来 cd /d c:\CodeBlocks mklink /d MSVC2015 "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC" mklink /d WindowsKits "C:\Program Files (x86)\Windows Kits"   编译器安装目录设定 $(CODEBLOCKS)\MSVC2015 rc.exe 改成  $(CODEBLOCKS)\WindowsKits\8.1\bin\x86\rc.exe   搜索路径  编译器 $(CODEBLOCKS)\MSVC2015\include $(CODEBLOCKS)\WindowsKits\10\Include\10.0.10150.0\ucrt $(CODEBLOCKS)\WindowsKits\8.1\Include\um $(CODEBLOCKS)\WindowsKits\8.1\Include\shared     搜索路径  连接器 $(CODEBLOCKS)\MSVC2015\lib $(CODEBLOCKS)\MSVC2015\lib\x86 $(CODEBLOCKS)\WindowsKits\8.1\Lib\winv6.3\um\x86 $(CODEBLOCKS)\WindowsKits\10\Lib\10.0.10150.0\ucrt\x86     搜索路径  资源编译器 $(CODEBLOCKS)\MSVC2015\include $(CODEBLOCKS)\WindowsKits\10\Include\10.0.10150.0\ucrt $(CODEBLOCKS)\WindowsKits\8.1\Include\um $(CODEBLOCKS)\WindowsKits\8.1\Include\shared     向导建立 WIN32 GUI 选择Platform SDK目录 填路径 $(CODEBLOCKS)\WindowsKits\8.1\bin\x86           百度网盘分享 http://pan.baidu.com/s/1o6N2Ik6 ==================================== MSVC2015.7z             VC2015主编译器 WindowsKits.7z          Windows 软件开发工具包 (SDK) SysWOW64_VC2015.7z      可能用到C++ 运行时   VS2015_for_CB.conf      VS2015在CB中的配置文件 CodeBlocks设置MSVC2015编译器.txt      目前设置可以编译控制台程序和WIN32 GUI for x86

user: user-1
content: CodeBlocks 相关资源在百度网盘  http://pan.baidu.com/s/1dD6Qrap  里面有 绿色的 vc2010 和 vc2015 编译器

user: user-2
content: https://zhidao.baidu.com/question/2013348587733004188.html http://blog.csdn.net/sheldon4090/article/details/6707544 http://blog.csdn.net/hmsiwtv/article/details/8155441  这些博客是否能够帮到你； 遇到类似这样的问题，可以先从网上搜一搜，看看别人有没有遇到你类似的问题，并已经解决的

user: user-3
content: 百度搜相关关键字。
user-0 提问: linux下pthread产生的线程不会同时运行在多个核心中

回复:
user: user-1
content: 你的想法严重错误了，你程序是开了两条一模一样的线程在跑同样的运算量，即单线程的两倍。我觉得你的想法是开两条线程来做同一件事情然后任务被分摊了，速度会快，这想法是需要线程同步，线程互斥来实现的，不是你这样写的

user: user-0
content: 引用 4 楼 FancyMouse的回复:clock本来就算的是cpu时间，多个核上的时间已经加起来了 你运行time ./prime来看计时。 谢谢 原来是这样 长知识了

user: user-2
content: clock本来就算的是cpu时间，多个核上的时间已经加起来了 你运行time ./prime来看计时。

user: user-3
content: CPU上的线程调度，是操作系统根据整个运行环境来统一分配的吧，不一定非要把你的程序的2个线程分到2个核心上。

user: user-0
content: 引用 1 楼 老马何以识途的回复:多线程程序，会需要额外的线程管理开销，在程序总耗时不太长时，确实还可能比单线程慢的。 但是为什么我pthread出来的线程没被分配到多个核心上运行呢？我的虚拟机开的是双核四线程

user: user-3
content: 多线程程序，会需要额外的线程管理开销，在程序总耗时不太长时，确实还可能比单线程慢的。
user-0 提问: 关于在C程序编译器下调用库函数的问题

回复:
user: user-1
content: '/0'改为'\0'

user: user-2
content: 下载easyx并安装。

user: user-3
content: 这个是以前的turbo c用的图形库体系，在dos下用的 到了今天肯定没用了 在这上面改也没什么意义，这代码也就只能给我们这些老人怀怀旧了

user: user-4
content: 引用 6 楼 goldenhawking 的回复:赵老师太厉害了！这个http://www.easyx.cn太棒了！这样我的好多老程序，可以脱离虚拟机啦！ Who am I！

user: user-5
content: 引用 9 楼 zhao4zhong1 的回复:请教该技术对应的源代码或汇编指令。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！ 难道已经没有人类可以在技术上指导赵老师了？好厉害

user: user-4
content: 引用 8 楼 u010312274 的回复:[quote=引用 7 楼 zhao4zhong1 的回复:] [quote=引用 6 楼 goldenhawking 的回复:] 赵老师太厉害了！这个http://www.easyx.cn太棒了！这样我的好多老程序，可以脱离虚拟机啦！ Who am I！[/quote] 赵老师骄傲了哈 话说赵老师遇到技术问题能请教谁？[/quote] 请教该技术对应的源代码或汇编指令。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-5
content: 引用 7 楼 zhao4zhong1 的回复:[quote=引用 6 楼 goldenhawking 的回复:] 赵老师太厉害了！这个http://www.easyx.cn太棒了！这样我的好多老程序，可以脱离虚拟机啦！ Who am I！[/quote] 赵老师骄傲了哈 话说赵老师遇到技术问题能请教谁？

user: user-6
content: 赵老师太厉害了！这个http://www.easyx.cn太棒了！这样我的好多老程序，可以脱离虚拟机啦！

user: user-0
content: 能编译通过的可以再开贴加100分

user: user-0
content: 加了void还是不能编译通过诶，报错有很多未声明的变量

user: user-4
content: http://www.easyx.cn

user: user-7
content: 修改函数定义的方式  把 char* uscanf(sx,sy,max)  /*图形模式下输入函数*/ int sx,sy,max; {...} 改成 char* uscanf(int sx,int sy,int max)  /*图形模式下输入函数*/ {...}  把 void SETGRAPH(){     /*图形模式初始化*/ 改成 void SETGRAPH(void){     /*图形模式初始化*/  之类。 上个世纪八十年代的代码，现在的编译器快不认识它们了

user: user-8
user-0 提问: 请大神们看哈，这个怎么和预期的结果不一样，很是疑惑！！！

回复:
user: user-1
content: 不知预期结果是什么。  当前逻辑是: 只有当数组a中元素与a[4]值相等时，if判断为true，才会执行表达式num1 = num - 5;

user: user-0
content: @自信男孩 ，我也思考了一段时间，我这样写是不是也是对的，你这样写是可以的。

user: user-0
content: #include<iostream> using namespace std; int a[5] = {1,2,3,4,5}; void main() { 	int ck[5], count=0, num1=0,num2=0,num=10,t=0; 	for (int i = 0;i < 5;i++) 	{ 		ck[i] = a[4] - a[i]; 		num1 = num - 5;  //通过这个计算公式计算，num1=5； 		if (!ck[i])   //此时i为4，ck[i]==0; 		{ 			count++;          //count =1 ;	 		}      //t = count; 	 //cout << t << endl; 		if(ck[i]) 			num2 = num - 5 - num1; 		//cout << num1 << endl; 		cout << num2 << endl;  	} 		 }

user: user-2
content: 引用 3 楼 program_Three3 的回复:当数组a中元素与a[4]值相等时，if判断为true，才会执行表达式num1 = num - 5;   然后数组a中元素与a[4]值不相等，通过num2 = num - 5 - num1*count这个计算公式减去以上 数组a中元素与a[4]值相等时的num1值，我的意思是这个num2应该为10-5-5*1=0，运行的结果却是5。这个count ，num1在这个else变为0，不知道是哪里的问题。 因为a[0], a[1], a[2], a[3]和a[4]相减取反后都不是true，所以只有a[4]和a[4]相减为0， 取反后为true，此时num1 = 5, count = 1; 但是else里的num2 = num - 5 - num1*count在i = 4时不会执行到，所以，num2 = num - 5 - num1*count这个表达式只会执行4次，最后一次不执行。 #include<iostream> using namespace std; int a[5] = {1,2,3,4,5};  int main() {     int ck[5], count=0, num1=0,num2=0,num=10;      for (int i = 0;i < 5;i++)     {         ck[i] = a[4] - a[i];         if (!ck[i]) {             num1 = num - 5;             count++;         }         //cout << num1 << endl;     }     num2 = num - 5 - num1 * count;     cout<<"num2 =" << num2<<endl;      return 0; } 这样不知道是不是你想要的逻辑

user: user-0
content: 当数组a中元素与a[4]值相等时，if判断为true，才会执行表达式num1 = num - 5;   然后数组a中元素与a[4]值不相等，通过num2 = num - 5 - num1*count这个计算公式减去以上 数组a中元素与a[4]值相等时的num1值，我的意思是这个num2应该为10-5-5*1=0，运行的结果却是5。这个count ，num1在这个else变为0，不知道是哪里的问题。

user: user-2
content: 预期结果是什么？另外，这个程序的需求是什么？
user-0 提问: 卒子过河问题

回复:
user: user-1
content: 单步跟踪程序运行，观察每一步程序执行结果与你期望的是否一致，很容易分析得到出错的原因

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

回复:
user: user-1
content: VS2015社区版可以编译运行   逻辑有问题: k = a[i];

user: user-0
content: 万分感谢！！

user: user-2
content: #include<stdio.h>  void main() {     int a[5];     int i,j,k;      for (i=0;i<5;i++)         scanf("%d", &a[i]);     printf("\n");     for(i=0;i<4;i++)         for(j=i+1;j < 5; j++)             if(a[i]>a[j]) {                 k = a[i];    /* 这儿应该是a[i]*/                 a[i] = a[j];                 a[j] = k;             }      for(i=0;i<5;i++)         printf("%d ",a[i]);     putchar(10); }
user-0 提问: visio studio 2015 %为不可识别的字符转义序列

回复:
user: user-1
content: printf("%d\t%d\n", fahr, celsius); 双引号的结束应当在\n后面。 \t后面多了一个\应当去掉。

user: user-2
content: printf中的两个问题： 1. 参数不对，根据你的代码逻辑是要输出fahr和celsius的值。所以，应将两个变量名放到双引号外； 2. 第二个的%d前多了一个\转移，这样第二个%d就是不完整的。

user: user-3
content: 输出\需要转义，使用\\

user: user-4
content: \%  ?  你是写错了么
user-0 提问: 字符串处理函数运行异常

回复:
user: user-1
content: 引用 2 楼 qq_38546553 的回复:困扰我好几天的问题终于解决了，非常感谢你。 我还有两个小问题想请教一下，字符串的结束标识符不应该是'\0'吗？另外我查了一下这个函数的原型是这样的errno_t strcat_s(char *strDestination,size_t numberOfElements,const char *strSource);第三个参数是不是相当于一个char型指针指向字符串的地址所以DataRcv的前面要加&？ '\0' == 0即，字符串结束标记'\0'对应的数值就是0； 第三个参数是字符指针，即传的是地址，所以要加&

user: user-0
content: 困扰我好几天的问题终于解决了，非常感谢你。 我还有两个小问题想请教一下，字符串的结束标识符不应该是'\0'吗？另外我查了一下这个函数的原型是这样的errno_t strcat_s(char *strDestination,size_t numberOfElements,const char *strSource);第三个参数是不是相当于一个char型指针指向字符串的地址所以DataRcv的前面要加&？

user: user-1
content: #include<stdio.h> #include<string.h>  int main() {     char DataRcv[20], character;     char str[20]="";     int  i=0, j=0;      printf("Enter text:\n");     do     {         character = getchar();         DataRcv[i] = character;         if (i >= 20)            break;         DataRcv[i+1] = 0;    /*字符串结束标记*/         strcat_s(str, sizeof(str), &DataRcv[i]);         i++;     } while (character!='\n');     printf("%s\n", str); } 原因出在DataRcv不是字符串，字符串的其中一个标志就是有结束标记；若DataRcv不是字符串，那么和str通过strcat_s连接肯定会出问题（注意DataRcv没有初始化） 所以，每次调用strcat_s前都应该保证&DataRcv[i]是字符串； 另外，strcat_s的第三个参数是地址，不是字符，所以需要加&

user: user-2
content: 建议使用标准库的std::string， 更安全更方便，而不是刀耕火种时代的char[]

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

回复:
user: user-1
content: 引用 5 楼 cfjtaishan 的回复:[quote=引用 4 楼 u010312274 的回复:] 还可以： fflush(stdin); fflush对与stdout是可行的，但是对于stdin是未定义的，即不一定都好使。[/quote] 未定义的意思是让各个编译器厂商自己定义，VS下我试过是可以的，别的编译器不一定行。只要编译器支持、不需要跨平台，还是可以用的。

user: user-2
content: 学习了，看似简单，还真没有看出问题，几楼所说，很是佩服，以后还是得仔细一点，搞技术的，真是马虎不得

user: user-3
content: 1 问题分析 正如1楼所说，在输入“3 回车”之后，x的值为3，而a[0]的值是回车符0x0a，如图1所示  也就是说，回车符也作为一个输入被使用了。 2 问题解决 解决该问题的方法就是屏蔽回车符。在scanf()之后加入getchar()函数。 	scanf_s("%d", &x); 	getchar(); getchar()函数的作用是从标准输入流中读取1个字符，调用该函数正好可以将输入流中的回车符读取出来，此时如果定义一个变量保存getchar()的返回值，可以看到该返回值是 0x0a，即回车符。 之后，就可以将输入的字符串保存到数组x中了，如图2所示

user: user-4
content: 引用 4 楼 u010312274 的回复:还可以： fflush(stdin); fflush对与stdout是可行的，但是对于stdin是未定义的，即不一定都好使。

user: user-5
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

user: user-1
content: 还可以： fflush(stdin);

user: user-4
content: 因为三个字符里的第一个接收了换行符，即是输入x时，残留在输入缓冲区里的换行符'\n'，这个你可以通过输出这三个字符是，注意一下第一个字符是不是一个换行； 解决办法，可以考虑在输入x之后，循环输入之前，加一句getchar()；作用是接收（吸收）残留在输入缓存里的换行符；

user: user-6
content: %c单个字符输出的意思 %s是输出字符串 %d是输出整型 %f是输出整型 这些都是c语言格式输入输出的内容，找本基础的书好好看看吧，把基本的东西掌握好了

user: user-7
content: %c  会接受回车符 可以在scanf后加一个getchar();
user-0 提问: 准备取学习一门新语言，这个是什么意思？？

回复:
user: user-1
content: 不支持就不能用

user: user-2
content: 不支持可能编译时会提示找不到库或头文件之类的吧。 猜测是解决不了问题的，建议你试一下，然后根据提示的问题，去解决问题。

user: user-3
content: 不支持就不能用

user: user-4
content: 没支持当然不能用了。

user: user-5
content: http://study.163.com/course/introduction.htm?courseId=1003857009
user-0 提问: getchar()读到文件末尾后会把"文件结束符"放回队列么？

回复:
user: user-1
content: 仅供参考：#include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:在输入i时，可以按ctrl+d（Linux）或ctrl+z（Windows）退出while循环； 或者在输入i时，输入字母也可以退出； 不能张口就来吧，你试过么？

user: user-2
content: 在输入i时，可以按ctrl+d（Linux）或ctrl+z（Windows）退出while循环； 或者在输入i时，输入字母也可以退出；
user-0 提问: 译密码题中的这句怎么理解，大神们

回复:
user: user-0
content: 引用 4 楼 housecarl的回复:楼主是不是刚开始编程没多久啊。 'Z'在ASCII码表中表示90，那么'Z'+4=94。如果c映射到ASCII码表中对应的10进制在[90,94]之间就满足条件。 另外小写的'z'对应的10进制为122。 代码对比的是字符，但是应该可以理解为数字 嗯，没错，初学者，多谢解疑

user: user-1
content: 楼主是不是刚开始编程没多久啊。 'Z'在ASCII码表中表示90，那么'Z'+4=94。如果c映射到ASCII码表中对应的10进制在[90,94]之间就满足条件。 另外小写的'z'对应的10进制为122。 代码对比的是字符，但是应该可以理解为数字

user: user-0
content: 引用 1 楼 hefashion0190的回复:if( ( (c>='Z')&&(c<=('Z'+4) ) ) || (c>'z') )  预先判断c字符是否属于取值区间['Z', 'Z'+4]。如果在此区间，if表达式判断为true 如果c字符不属于取值区间['Z', 'Z'+4]，则判断c字符是否大于'z'。如果大于，if表达式判断为true ['Z', 'Z'+4]是什么意思，那个范围

user: user-2
content: 这个要根据编码的算法来定，建议详细看一下译码算法

user: user-3
content: if( ( (c>='Z')&&(c<=('Z'+4) ) ) || (c>'z') )  预先判断c字符是否属于取值区间['Z', 'Z'+4]。如果在此区间，if表达式判断为true 如果c字符不属于取值区间['Z', 'Z'+4]，则判断c字符是否大于'z'。如果大于，if表达式判断为true
user-0 提问: 用Labview调用C语言程序时，无法用fileopen函数打开TXT文件

回复:
user: user-1
content: fopen函数的文件名带上完整的路径，打开参数用“rb+”试试。 检查一下fopen的返回值是否有效。

user: user-2
content: fopen标准的用法是随之写一个if (NULL == fp)做个错误处理，另外你还要确认当前目录是哪里，因为fopen没带路径，只会从当前目录找。

user: user-3
content: 个人建议文件读写时，对于打开的文件指针fp都做一个判断，若打开失败的fp，继续使用肯定会出问题。 另外，建议根据文件内容的格式，选择不同的读写接口；

user: user-4
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，再将b.txt改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？ 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话，文本文件的格式问题可参考json或xml  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！
user-0 提问: 跪问，查看C语言源码用什么ide比较好？

回复:
user: user-1
content: Windows自带的记事本多好用的。钻石恒久远，一颗永流传。

user: user-2
content: 标准C/C++可用Source Insight，最经典了；其次，eclipse也是不错的选择，但是设置稍为麻烦点，需要安装C/C++插件。

user: user-3
content: VC++6.0啊，我一直用她

user: user-4
content: 现在的电脑还在乎vs那一点空间？

user: user-5
content: 这个 IDE怎么样

user: user-6
content: Windows下推荐Source Insight

user: user-7
content: vc6.0  比较经典的

user: user-8
content: 个人推荐看代码首推 Source Insight 也可以用用understand    这个我也用的少，看关系图还可以

user: user-9
content: codeblocks，初学者神器，很好用 注：下载带mingw的

user: user-10
content: eclipse,是不错的选择

user: user-11
content: 引用 2 楼 hefashion0190 的回复:Source Insight ?

user: user-12
content: Source Insight ?

user: user-13
content: 可以考虑Linux下编程；在Linux下用Makefile编译，使用vim编辑器等等 github上的ffmpeg项目应该支持Windows和Linux，Linux下个人感觉比较方便
user-0 提问: 关于对称矩阵问题

回复:
user: user-0
content: #include <stdio.h>  int main() {     int i, j, m;     int a[200], b[200], c[200];      while(~scanf("%d", &m))     {         //int a[m], b[m], c[m];         for(i = 1; i <= m*(m+1)/2; i++)             scanf("%d", &a[i]);         for(i = 1; i <= m*(m+1)/2; i++)             scanf("%d", &b[i]);         for(i = 1; i <= m*(m+1)/2; i++)             c[i] = a[i] + b[i];          for(i = 1; i <= m; i++)         {             for(j = 1; j <= m; j++)             {                 if(i >= j)                     printf("%d ", c[i*(i-1)/2+j-1]);                 else                     printf("%d ", c[j*(j-1)/2+i-1]);             }             printf("\n");         }     }      return 0; }

user: user-1
content: #include <stdio.h>  int main() {     int i, j, m;     int a[200], b[200], c[200];      while(~scanf("%d", &m))     {         //int a[m], b[m], c[m];         for(i = 0; i < m*(m+1)/2; i++)             scanf("%d", &a[i]);         for(i = 0; i < m*(m+1)/2; i++)             scanf("%d", &b[i]);         for(i = 0; i < m*(m+1)/2; i++)             c[i] = a[i] + b[i];  #if 1         for(i = 0; i < m * (m+1)/2; i++)             printf("%d ", c[i]);         printf("\n"); #else         for(i = 0; i < m; i++)         {             for(j = 0; j < m; j++)             {                 if(i >= j)                     printf("%d ", c[i*(i-1)/2+j-1]);                 else                     printf("%d ", c[j*(j-1)/2+i-1]);             }             printf("\n");         } #endif     }     return 0; } 做了一个参考吧

user: user-2
content: 你的意思是怎么让它直观的，查看它的运算结果？ 输出的话可以用printf，或者cout。 你想规范矩阵输出。 每行输出跳出列循环，加个转折'\n',输出就ok

user: user-3
content: static int a[200]; static int b[200]; static int b[200]; 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
user-0 提问: 求大佬指教啊，刚学c语言，遇到个比大小的问题。

回复:
user: user-1
content: 定义一个 max函数 这个不在库函数 要自己定义 借助一个新的变量

user: user-2
content: 我也是codeblocks, 遇到过一个小问题 for(int i=0;i<n;i++)  这样的语句在cb里面无法运行。需要修改成int i; for(i=0;i<n;i++)

user: user-0
content: 。。。。。。。。。

user: user-3
content: 记得给分

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

user: user-5
content: 输入格式有问题，scanf是格式话输入，除了回车之外，其他都是应该和scanf第一个参数的格式一样才可以； 根据楼主的格式，输入的格式应该是 3,6 注意逗号应该是英文的。

user: user-6
content: 要输入英文的逗号3,6  或者代码中去掉逗号改成scanf("%d %d", &a, &b); 然后输入的时候也不用输入逗号，直接拿空格分开3 6

user: user-7
content: 看截图，似乎输入的逗号是全角？
user-0 提问: 栈的问题

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h> #include <string.h>  #define MAX 100 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10  typedef struct {     int x;     int y; }Postype;  typedef struct {     int ord;     Postype seat;     int di; }SElemType;  typedef struct {     SElemType *base;     SElemType *top;     int stacksize; }SqStack;  typedef int Status; Status InitStack(SqStack *S) {     S->base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));     if (!S->base)         exit(OVERFLOW);      S->top = S->base;     S->stacksize = STACK_INIT_SIZE;    /*建议使用已经定义的宏*/      return OK; }  Status StackEmpty(SqStack *S) {     if(S->base == S->top)         return TRUE;     else         return FALSE; }  Status Pop(SqStack *S,SElemType **e) {     if(S->base == S->top)         return ERROR;      **e = *(--S->top);     return OK; }  Status Push(SqStack *S,SElemType *e) {     if(S->top - S->base >= S->stacksize)     {         S->base=(SElemType*)realloc(S->base,(S->stacksize + STACKINCREMENT)*sizeof(SElemType));         if(!S->base)             exit(OVERFLOW);          S->top=S->base+S->stacksize;         S->stacksize+=10;     }      *S->top++=*e;     return OK; }   int main(void) {     int i;     SqStack S;     SElemType *e,*s;      //clrscr();     InitStack(&S);     e = (SElemType*)malloc(sizeof(SElemType));    // e->seat=(Postype*)malloc(sizeof(Postype));     for(i = 0; i < 5; i++)     {         e->ord=1;         //e->seat->x=i;         //e->seat->y=i+1;         e->seat.x=i;         e->seat.y=i+1;         e->di=3;         Push(&S,e);     }       Pop(&S,&e);     //printf("\n(%d,%d)",e->seat->x,e->seat->y);     printf("\n(%d,%d)",e->seat.x,e->seat.y);      Pop(&S,&e);     //printf("\n(%d,%d)",e->seat->x,e->seat->y);     printf("\n(%d,%d)",e->seat.x,e->seat.y);      putchar(10);     if(!StackEmpty(&S))         printf("Not empty\n");     else         printf("empty\n");     return 0; }  seat为未申请空间，在申请栈空间的时候没有对seat申请空间，导致每次Push时只是将e的seat地址赋值给栈的seat，所以输出都是最后一个入栈的值。因为最后一个入栈时将它seat地址值给了，所以栈上的seat的元素都指向e的seat，所以最后一个e的seat就是(4, 5)； 对数据结构做微调，把结构体里的指针seat改成结构体变量，其他不做修改即可。

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

user: user-3
content: 单步跟踪程序运行，看是哪一步与你期望的不一致，再分析原因
user-0 提问: linux上多个c文件的链接编译  求指教

回复:
user: user-1
content: include一般是用来引入头文件的，很少或者基本上没见过引入源文件的。 对于自定义的头文件也不能使用<>引入，因为加上<>是告诉编译器我引入的是系统头文件或者C库的头文件； 自定义的头文件应该用""引号，编译器会明白是用户自定义的头文件，如果没找到，则编译器会从系统和库里寻找； 但是<>引入的，是去系统和库里寻找的。

user: user-2
content: 参见 http://blog.csdn.net/weixin_38239856/article/details/76358636
user-0 提问: c和指针  第一篇的一个程序有点问题求指教

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

user: user-2
content: 第一个问题： 输入：2 4 5 8 -1 下标：0 1 2 3 4 确实应当是4，因为你的判断是在存入columns[num] 以后判断的，所以-1已经存入了columns了 如果不想存入，那么就另外存入一个变量里面判断后再放进去。 另外根据你的程序你存入8之后，也就是下标为3的时候，你的num+=1，这个时候num也就是4了。  QT没怎么用过，不清楚那边的调试应当怎么做，这里有一个文章看看吧 http://blog.csdn.net/lyc_daniel/article/details/12968843

user: user-3
content: num = 0； 假定num < max一直成立 2 4 5 8 -1依次输入时 输入2 num += 1;        4 num += 1;        5 num += 1;        8 num += 1;       -1 < 0退出while num =4
user-0 提问: 求指导，新手问题。。

回复:
user: user-1
content: if((fp=fopen("data","wb"))==NULL)     {         printf("can not open\n");         return;     }     for(i=0;i<m;i++)         fwrite(&stu[i] ,LEN,1,fp);/*向指定的磁盘文件写入信息*/ 这部分code可以考虑去掉；注意，若以wb形式打开，文件里原有的内容都会被清除，所以，若要去掉这部分写操作，同时要把文件以"wb"形式的打开也要去掉；

user: user-2
content: 把原始数据再写一遍确实多余，第二次打开文件用追加模式就可以了。

user: user-3
content: 为什么还要写数据? 冗余，可以优化去掉  写的内容是哪里来的? 读取文件时原始数据保存于数组stu
user-0 提问: 一个简单的c程序问题

回复:
user: user-1
content: #include <stdio.h> #include <string.h>  int main(int argc, const char * argv[]) {     char a[100];     const int number[6]={4,8,3,1,0,5};     const char zf[6]={'A','B','E','I','O','S'};     printf("Enter amessage:");     gets(a);        for(int i=0; i < strlen(a);i++)     {         for (int n=0; n<6; n++) {             if (zf[n]==a[i])                 a[i] = number[n] + '0';   /*数字转字符数字*/           }     }      printf("%s\n",a);     return 0; }  个人认为，是数字转字符数字的问题，需要加'0'，只需要改一句即可，如上代码；

user: user-2
content: 问题应该是出在 gets(a);这一句  你把 gets(a); 替换成strcpy(a,"A1111B22222E33333");  就看得到效果了, 下面for循环没有大问题.
user-0 提问: c和指针一道课后题  求指教

回复:
user: user-1
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-2
content: 代码的需求是什么？要实现什么功能，代码的逻辑是跟着需求或者功能来走的。
user-0 提问: c语言头文件

回复:
user: user-1
content: code

user: user-2
content: 顶6楼，好人好资源

user: user-3
content: 已下载，还是网盘好，CSDN资源越做越垃圾

user: user-4
content: 已下载收藏备用。

user: user-5

user: user-5
content: C++ 文档手册  三剑客 CHM  cppreference_2017.chm cplusplus-2013-8-8.chm MSDN_1.5_精简安装版  链接: https://pan.baidu.com/s/1cEsWPK 密码: 3gzv

user: user-6
content: http://www.cplusplus.com

user: user-7
content: %后格式没有加

user: user-4
content: MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl 先下载安装MSDN98  再参考：mk:@MSITStore:D:\MSDN98\98VS\2052\vccore.chm::/html/_crt_run.2d.time_routines_by_category.htm Run-Time Routines by Category This chapter lists and describes Microsoft run-time library routines by category. For reference convenience, some routines are listed in more than one category. Multibyte-character routines and wide-character routines are grouped with single-byte – character counterparts, where they exist.  The main categories of Microsoft run-time library routines are:  Argument access Floating-point support  Buffer manipulation Input and output  Byte classification Internationalization  Character classification Memory allocation  Data conversion Process and environment control  Debug Searching and sorting  Directory control String manipulation  Error handling System calls  Exception handling Time management  File handling

user: user-8
content: 建议看源码，可以从网上搜一下源码； 个人认为对于头文件没必要都要熟悉，根据自己现学现用，然后逐渐记住那些函数或者宏定义或者全局变量在那个头文件里。
user-0 提问: C语言单链表实现填空最好是尾插法，不知道该怎么填，求助！

回复:
user: user-1
content: 建议自己动手写一写； 但从函数声明已经发现问题： void create(LNode *L);  //用头插法或尾插法创建单链表  这样定义参数，是无法得到尾插法后的链表的，需要传二重指针进去； 即 void create(LNode **L);  //用头插法或尾插法创建单链表  调用即： create(&L); 除了display之外，其他函数都需要传二重指针；  帮你到这儿了，自己动手写写吧

user: user-2
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-3
content: struct LNode{ int data; struct LNode *next;}; typedef struct LNode LNode; /*   --将struct LNode取别名为 LNode ---  */  后面的内容照教程来写就可以了。
user-0 提问: 求帮忙！！！！

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  int main() {     char str[80];     int  *a, n;     int i, k,num = 0;     int count = 0;     scanf("%d", &n);     getchar();   /* for '\n' */     a = (int *)malloc(sizeof(int) * n);     if (!a)         return 0;     for(i = 0; i < n; i++)     {         fgets(str, 80, stdin);         if (strlen(str) <= 5) {             a[num++] = count;             continue;         }          for(k = 0; k < strlen(str) - 5;k++)         {             if(str[k]=='j'&&str[k+1]=='x'&&str[k+2]=='u'&&str[k+3]=='s'&&str[k+4]=='t')             {                 count++;                 a[num] = count;             }          }         count = 0;    /* 重新初始化 */         num++;     }     for(i = 0; i < n; i++)         printf("%d\n",a[i]);     return 0; } 三个问题： 1. 输入j时，回车符会被gets直接接收，（根据测试用例，输入3个）其实输入2个字符串就直接退出了，因为第一个是回车符； 2. 程序里有越界嫌疑，因为p[k+4]， p[k+1]....都会越界；比如k指向了最后一个有效字符，那么 k+2, k+3都已经越界了。再说，p只定义了8个字符，测试用例里第二个和第三个输入已经越界了； 3. cout用后需要重新初始化；原因自己可以考虑一下； 代码还是建议自己总结和定位问题，不建议遇到问题马上就提出来问别人

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

回复:
user: user-1
content: 一个汉字占两个英文字母宽。

user: user-2
content: 大神求助 void set_cocate(int x,int y) { x*=2;//增加     HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);     COORD loc={x,y};     SetConsoleCursorPosition(hOut,loc); }中为什么要x*=2

user: user-3

user: user-1

user: user-4
user-0 提问: 求大佬指导，为什么有一部分结果输出不对

回复:
user: user-1
content: #include <stdio.h> #include <math.h>  int    n=3; double f[]={6.0, 9.0, 2.0, 5.0}; double x[]={1.0, 2.0, 3.0, 4.0};  double c[4];  void newton(double x[], double f[], double c[], int n) {     int    i, j, k;     for(j = 0; j<=n;j++)         c[j] = f[j];     for(k=1;k<=n;k++){         for(i=n;i>=k;i--)             c[i] = (c[i]-c[i-1])/(x[i]-x[i-k]);     }     for(k=0;k<=n;k++)         fprintf(stderr, "C[%d]=%lf\n",k, c[k]); } double Horner(double t, double c[], double x[], int n) {     double sum;     int    i;      sum = c[n];     for(i=n-1;i>=0;i--)         sum = sum*(t - x[i]) + c[i];     return sum; } int main(int argc, char **argv) {     int     i;     double  p[4];     newton(x, f, c, n);     for(i=0;i<=n;i++){         p[i] = Horner(x[i], c, x, n);         fprintf(stderr,"i=%d, sample= %lf, interpolated=%lf\n", i, f[i], p[i]);     }      return 0; }  Horner函数没有返回值，根据代码逻辑应该是返回sum的值？ Horner没有返回值，自然p[i]是随机值

user: user-2
content: 应该没问题啊，看错误信息的话是溢出，怀疑除以0了，但看代码应该是对的。

user: user-3
content: 仅供参考：//用C语言编程，求出2^x=x^10这个方程的解。 #include <math.h> #include <stdio.h> double x,e; void main () {     x=-1.0;     e=0.001;     while (1) {         while (1) {             if (pow(2.0,x)<pow(x,10.0)) {                 x+=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;         while (1) {             if (pow(2.0,x)>pow(x,10.0)) {                 x-=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;     }     printf("%+.14g\n",x);      x=1.0;     e=0.001;     while (1) {         while (1) {             if (pow(2.0,x)>pow(x,10.0)) {                 x+=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;         while (1) {             if (pow(2.0,x)<pow(x,10.0)) {                 x-=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;     }     printf("%+.14g\n",x); }
user-0 提问: 关于动态数组的问题

回复:
user: user-1
content: 其他的数组也可以按照sco的方式申请（malloc）和释放(free);使用时，可以按照数组的形式；

user: user-1
content: C 语言编译器不支持动态数组。（C++除外，C++支持动态数组） 建议用malloc/free在堆上申请空间； 比如int sco[stu * cou]；改成如下：   int *sco = (int *)malloc(sizeof(int) * stu * cou); if (!sco) {     fprintf(stderr, "malloc error!");     exit(0); } .... .... //中间对于sco可以按数组来用  free(sco);   //不用的时候记着释放

user: user-2
content: C语言C99标准是支持的。  测试：VS 2015社区版编译变长数组Demo失败，说明它不支持C99标准中的变长数组 错误提示很明显。

user: user-3
content: 仅供参考：#include <stdio.h> #include <stdlib.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=new int *[rows];     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=new int[cols];         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         delete[] p[i];     }     delete[] p; } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //
user-0 提问: 6174问题输出结果不对

回复:
user: user-1
content: #include <stdio.h>   int foo(int a) {     int max,min,temp,cha;     int num[4] = {0};     num[0] = a / 1000;     //jie qu qian wei     num[1] = (a % 1000) / 100;         //jie qu bai wei     num[2] = (a % 100) / 10;                       //jie qu shi wei     num[3] = a % 10;                 //jie qu ge wei     if(num[0] == num[1] && num[0] == num[2] && num[0] == num[3])         return 1;     for(int i = 0;i < 4;i++)           //循环判断应该是<4     {         for(int j = 0; j < 4 - i - 1;j++)    //循环变量改成4 - i - 1         {             if(num[j] > num[j + 1])             {                 temp = num[j];                 num[j] = num[j + 1];                 num[j + 1] = temp;             }         }     }     min = num[0] * 1000 + num[1] * 100 + num[2] * 10 + num[3];     max = num[0] + num[1] * 10 + num[2] * 100 + num[3] * 1000;     cha = max - min;     printf("cha = %d\n", cha);     if(cha == 6174)         return 1;     else         return foo(cha) + 1; }  int main() {     int b;     int times;     scanf("%d",&b);     times = foo(b);       printf("%d",times);  } 排序的循环稍作修改； 之所以是3，而不是4.因为没有计算第一次执行1234

user: user-2
content: 单步跟踪程序运行，观察每一步变量变化情况，看是哪一步与你预期的不一致，分析原因