Question: 如何用C读取一个TXT文档中的特定数据。

引用 4 楼 云海玉弓缘 的回复:楼上的BF函数很好用，不过下面稍微改下就OK了。这么改：  # include <stdio.h> # define N 501 int BF(char a[],char b[])//BF算法 a为主串,b为被检验的串`返回b在a中的第一个下标 { int i=0,j=0;  while (a[i]&&b[j])  if (a[i++]==b[j]) ++j;   // 继续比较后继字 else (i-=j)&&(j=0); return b[j]?0:i;   //返回 } int main(){     int F,i=1;     char A[N];     char B[]={"07 00 07 00"};     char result[6] = { "" };     freopen("123.txt","r",stdin);     while(gets(A))     {         F=BF(A,B);         if(F)         {             A[F + 7] = '\0';              strncpy(result, A+1+F, 5);             printf("idx:%d %s -> %s\n", x, A, result);         }         x++;     }     return 0; }    为什么我的程序里显示 gets为未知标识符。。

要严谨的实现，还得用我代码中的办法。

最实用的方法是通过管道调用awk命令玩

引用 4 楼 iraya 的回复:楼上的BF函数很好用，不过下面稍微改下就OK了。这么改： 最后的printf函数内的x和x++ 改成i，  i++， 笔误。

# include <stdio.h> # define N 501 int BF(char a[],char b[])//BF算法 a为主串,b为被检验的串`返回b在a中的第一个下标 { int i=0,j=0;  while (a[i]&&b[j])  if (a[i++]==b[j]) ++j;   // 继续比较后继字 else (i-=j)&&(j=0); return b[j]?0:i;   //返回 } int main(){     int F,i;     char A[N];     char B[]={"07 00 07 00"};     freopen("123.txt","r",stdin);     while(gets(A))     {         F=BF(A,B);         if(F)         {             A[F+4]='\0';             puts(A+F);         }     }     return 0; }  我对文件读取不太了解 希望 这个函数 BF  应该能帮到你，如果需要其他标志  可以改改B[]字符串

引用 1 楼 zhao4zhong1 的回复:仅供参考：#include <stdio.h> #include <conio.h> #include <windows.h> #include <wincon.h> FILE *f; char c; long offset; char patch[3]="\x1b\x6d";//\x00 default void main(int argc,char **argv)//".vs\0\x31\0\0\x1f\x00\x08"->".vs\0\x31\0\0\x1b\x6d\x00" {     if (argc!=2) {         printf("VxPatch filename.vx");         getch();GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,0);         return;     }     if (NULL==(f=fopen(argv[1],"r+b"))) {         printf("----------Can not find %s!",argv[1]);         getch();GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,0);         return;     }     while (1) {         c=fgetc(f);         if (feof(f)) break;//         if (c=='.') {             c=fgetc(f);             if (feof(f)) break;//             if (c=='v') {                 c=fgetc(f);                 if (feof(f)) break;//                 if (c=='s') {                     c=fgetc(f);                     if (feof(f)) break;//                     if (c=='\0') {                         c=fgetc(f);                         if (feof(f)) break;//                         if (c=='\x31') {                             c=fgetc(f);                             if (feof(f)) break;//                             if (c=='\0') {                                 c=fgetc(f);                                 if (feof(f)) break;//                                 if (c=='\0') {                                     c=fgetc(f);                                     if (feof(f)) break;//                                     if (c=='\x1f') {                                         c=fgetc(f);                                         if (feof(f)) break;//                                         if (c=='\x00') {                                             c=fgetc(f);                                             if (feof(f)) break;//                                             if (c=='\x08') {                                                 offset=ftell(f);                                                 offset=offset-3;                                                 fseek(f,offset,SEEK_SET);                                                 if (3!=fwrite(patch,1,3,f)) {                                                     fclose(f);                                                     printf("----------%s VxPached fwrite error!",argv[1]);                                                     getch();GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,0);                                                 } else {                                                     fclose(f);                                                     printf("OK.");                                                 }                                                 return;                                             } else break;//                                         } else break;//                                     } else if (c=='\x1b') {                                         fclose(f);                                         printf("%s is VxPatched. Please type vlc.err!",argv[1]);                                         getch();GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,0);                                         return;                                     } else break;//                                 }                             }                         }                     }                 }             }         }     }     fclose(f);     printf("----------%s is not a unVxPached .vx file!",argv[1]);     getch();GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,0); }  看不懂啊。。前面那部分看不懂。不知道要怎么改


Question: sys/time.h找不到

大名鼎鼎的赵四老师又出现了

引用 2 楼 HelegeHeHeha 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] C:\Android\Mydroid\ndk\build\platforms\android-8\arch-x86\usr\include\sys\time.h C:\Android\Mydroid\ndk\build\platforms\android-8\arch-arm\usr\include\sys\time.h C:\Android\Mydroid\ndk\build\platforms\android-5\arch-x86\usr\include\sys\time.h C:\Android\Mydroid\ndk\build\platforms\android-5\arch-arm\usr\include\sys\time.h C:\Android\Mydroid\ndk\build\platforms\android-4\arch-arm\usr\include\sys\time.h C:\Android\Mydroid\ndk\build\platforms\android-3\arch-arm\usr\include\sys\time.h C:\Android\Mydroid\external\e2fsprogs\include\nonunix\sys\time.h C:\Android\Mydroid\bionic\libc\include\sys\time.h C:\glibc-2.25\conform\data\sys\time.h-data C:\glibc-2.25\include\sys\time.h C:\glibc-2.25\time\sys\time.h C:\opencv_old\apps\cvenv\include\sys\time.h C:\opencv_old\apps\Hawk\CVEiCL\EiC\src\win32\sys\time.h C:\S60\devices\S60_3rd_FP2_SDK_v1.1\epoc32\include\libc\sys\time.h C:\S60\devices\S60_3rd_FP2_SDK_v1.1\epoc32\include\stdapis\sys\time.h C:\Tiny C Compiler\tcc\include\sys\time.h C:\Tiny C Compiler\tcc-0.9.26\win32\include\sys\time.h这个是什么呀，大佬[/quote] 这你都看不懂？！

找不到头文件，建议查一下编译器的配置参数，看一下编译器的头文件路径

不在sys里面，直接#include <time.h>

你在任意编译器安装系统路径里搜一下 都会找到的  官方都会自带的

路径里没有? 路径不对么 还是真没有 没有就下一个

引用 1 楼 zhao4zhong1 的回复:C:\Android\Mydroid\ndk\build\platforms\android-8\arch-x86\usr\include\sys\time.h C:\Android\Mydroid\ndk\build\platforms\android-8\arch-arm\usr\include\sys\time.h C:\Android\Mydroid\ndk\build\platforms\android-5\arch-x86\usr\include\sys\time.h C:\Android\Mydroid\ndk\build\platforms\android-5\arch-arm\usr\include\sys\time.h C:\Android\Mydroid\ndk\build\platforms\android-4\arch-arm\usr\include\sys\time.h C:\Android\Mydroid\ndk\build\platforms\android-3\arch-arm\usr\include\sys\time.h C:\Android\Mydroid\external\e2fsprogs\include\nonunix\sys\time.h C:\Android\Mydroid\bionic\libc\include\sys\time.h C:\glibc-2.25\conform\data\sys\time.h-data C:\glibc-2.25\include\sys\time.h C:\glibc-2.25\time\sys\time.h C:\opencv_old\apps\cvenv\include\sys\time.h C:\opencv_old\apps\Hawk\CVEiCL\EiC\src\win32\sys\time.h C:\S60\devices\S60_3rd_FP2_SDK_v1.1\epoc32\include\libc\sys\time.h C:\S60\devices\S60_3rd_FP2_SDK_v1.1\epoc32\include\stdapis\sys\time.h C:\Tiny C Compiler\tcc\include\sys\time.h C:\Tiny C Compiler\tcc-0.9.26\win32\include\sys\time.h这个是什么呀，大佬


Question: 为什么这个代码运行后输入m输出不是monday而是error？

好像没问题， 输入m输出就是monday

非常感谢！@das白

用scanf吧 scanf_s 最后还有一个参数 你用的不对 所以没输入到i里  详情百度scanf_s的用法

为什么我用VS2013运行的时候 结果是“”error”？


Question: 新手入门C语言，关于”兰州烧饼“”的问题请教？

有点像脑筋急转弯，3 7返回应该是5, x y表示x个烧饼正面，y个烧饼反面： 3 0 3 0 1 2 0 3 0 2

这样想就好了，7个饼，一共14个面，一次最多3个面，就是5分钟

百度搜相关关键字。

引用 4 楼 真相重于对错的回复:3，2 第一次，放入2个烧饼，一分钟后好了一面 第二次，拿出其中1个烧饼，放入剩下一个，另外一个翻面，一分中后，一个全熟，两个半熟。 第三次，把全熟的拿出，放入两个， 共3分钟。 感谢提示   还真是这么回事   之前一直没没想明白

合理利用资源。三面的时候你非要先把俩个烙好，剩下一个花俩分钟那就没辙了

比如有3个饼，两口锅，先把其中两个的一面，放入锅里一份钟，再把这两个饼的其中一个的第二面，和第三个饼的第一个面，放入锅里一份钟，最后把原来的两个饼的另外一个的第二个面，和第三个饼的第二个面，放入锅里一份钟，所以一共需要3分钟。

引用 2 楼 qq_42044484的回复:我是说网上给的答案能看明白，截图中样例输入3  2，样例输出3，不可能是3分钟啊，肯定是偶数分钟 我是说网上给的答案没看明白，截图中样例输入3  2，样例输出3，不可能是3分钟啊，肯定是偶数分钟

3   7 结果是6 结果肯定是偶数,没毛病啊

z=(n/k)*2+(n%k?2:0); 没问题啊，先求得整数倍用时，再加上剩余个数用时（以7为例，7/3 == 2，整数相除结果为整数，然后求余7%3 == 1为真，选择2) 你有什么疑惑呢


Question: C程序未曾修改，有时候可以运行，有时候却运行一半卡住

崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  不要依赖调试器输出复杂数据结构！而要将复杂数据结构的整个内容在处理它的每一步使用一小段代码按自己很容易理解的格式输出，非常有助于调试！或者可以说是“基础设施”  数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

希望有大佬可以指点我一下


Question: 为什么float有效位是7，最准确的是6

引用 2 楼 user-3 的回复:2^23 = 8388608，结果是7位数，最多能表示7位有效数字，但绝对能保证的则是6位 就是这个意思了，8388608以下的保证7位，8388608以上的数字可以保证6位

理解和讨论之前请先学会如何观察！  浮点数格式 http://bbs.csdn.net/topics/390676437

引用 1 楼 papaweilun的回复:我不太懂为什么要用2的24次方。。。。。。这是因为这样子表示有2的24次方个数可以被表达吗？ 每一位有0和1两种状态，N个位就可以表示 2^N个值

这里说的有效位是小数点后的位数，而隐藏的1位不是小数点后的


Question: 程序终止

报错贴一下啊

调试一下


Question: python 文件压缩备份问题

百度搜相关关键字。


Question: 求助帖，整数拼数c语言版

使用字符串比较合适。通过字符串strcat, strcmp，strcpy等

https://blog.csdn.net/user-2/article/details/54949635 解决了


Question: VS2017问题，一直困扰我

项目属性——C/C++-——语言——符合模式：否

正确的写法应该是：const char * str = "12345";  之前允许是由于历史原因，但你修改它一样会导致程序崩溃  当然你要在VS2017下通过编译，可以在：项目属性——C//C++ 把符合模式改一下就行

谢谢版主大大，问题解决了~


Question: 困扰了我一天的问题，谁能帮忙解解惑

谢谢大家问题已解决

你的指针q没有指向有效的内存，你还没有初始q，就在QInit函数中访问指针指向的内存  一种改法是：   #include<stdio.h> #include<stdlib.h> #include <stdbool.h> #define buf_size 256  typedef struct { 	int top; 	int end; 	char qlist[buf_size]; }QUEUE; void QInit(QUEUE *q) { 	q->top = 0; 	q->end = 0; 	for (int i = 0; i < buf_size; i++) 	{ 		q->qlist[i] = 0; 	} } void main() { 	int len1 = 0; 	int tmp = 0; 	int data = 0; 	bool QFull_judge; 	char buf[13] = { 58,0,2,0,1,3,41,42,43,0,201,13,10 }; 	QUEUE q; 	QInit(&q); 	printf("hello...\n"); 	system("pause"); }

没有给指针分配内存 指针指向哪里？ 用函数初始化 用引用传递吧

指针初始化一下   #include<stdio.h>  #include<stdlib.h>    #define buf_size 256   typedef struct  {  int top;  int end;  char qlist[buf_size];  }QUEUE;   void QInit(QUEUE *q)  {  q->top = 0;  q->end = 0;  for (int i = 0; i < buf_size;i++)  {  q->qlist[i]=0 ;  }  printf("hello...\n");  }   void main()  {  int len1=0;  int tmp=0;  int data = 0;  bool QFull_judge;  char buf[13] = {58,0,2,0,1,3,41,42,43,0,201,13,10};  QUEUE *q = (QUEUE*)malloc(sizeof(QUEUE));  QInit(q);  free(q);  q=NULL;  printf("hello...\n");  system("pause");  }


Question: 有没有大神能看懂这个程序中的QInit函数为什么调试不进去

引用 8 楼 湘南smile的回复:debug调试运行可以进入到函数QInit里面，但是release调试运行就不可以，可以解释一下为什么吗 因为release时代码会被优化，要调试在debug下进行

已解决，谢谢大家

是否进去执行了，在QInit函数内加一条调试打印不可以了吗？！

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）

引用 6 楼 湘南smile的回复:我是单步调试的，但是运行到QInit的时候要么是直接跳过去，根本就不进去，要么就是直接引起中断 从代码看应该没问题，要进函数要点步入

引用 4 楼 湘南smile的回复:出错的位置就在QInit，要么就是直接不进去，要么就是在QInit这里中断，改了好几次都不行，是因为这个程序里面既有C语言又有C++吗？还是内存问题 从你给的代码看，QInit没问题，建议单步跟踪程序运行，以观察程序流程及分析原因

引用 2 楼 湘南smile的回复:这个程序有问题，编译的时候能成功，但是程序根本就进不到QInit函数里面，调用不起来 你怎么知道没进到QInit，如果是运行时错误，出错时点中断，通过调用堆栈定位到你代码相关位置，分析原因

什么叫调试不进去，你设置断点就可以在里面中断了


Question: 用单链表实现批量删除时出现了问题，请大佬看一下

楼上的答案不正确吧，这并没有真正的删除，只不过是结点后继跳过去了，而后面结点根本没有free掉

//删除元素 void DeleteList_L(LinkList L){     LinkList p;     LinkList q=(LinkList)malloc(sizeof(LNode));     p=L;     i=1;     if(x>=y)         printf("输入错误");     while(p->next!=NULL){         q=p->next;         if((q!=NULL)&&(q->data>=x)&&(q->data<=y)){ 			             p->next=q->next;             //p=p->next;                          printf("\n第%d次删除后单链表的存储状态为:",i);             PrintList_L(L);             i++;         } 		else p=p->next;      } 	free(q); 	q=NULL; }

太谢谢啦已经可以了~原来是自己的逻辑问题....十分感谢！

刚才看了那个帖子主要是排序的，而且是C++的，我的问题主要在批量删除这块，还有程序运行到一半就不动了是怎么回事呢？麻烦大佬再看看

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


Question: 能执行程序，但是得到的答案越界了，请各位大神帮忙修改一下

“多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

scanf("%d",&m);     for (i=1;i<=N;i++ )     {         for (j=1;j<=N;j++)         {             if(j==1)             {                 result[j]=a[i]%n;             }             else                 result[j]=result[j-1]*a[i]%n; //递归求模！避免大数运算         }     }     for (j=1;j<=N;j++)     {         for(g=1;g<=N;g++)         {             if (result[g]==result[j]) //判断是否有两个或以上相同的结果             { Q++;             }             return 0;         }         return 0;     } 这里的result使用都是越界了。result数组长度是１，那么下表只能是０，所以下表大于０都是越界的。

百度搜相关关键字。


Question: 关于c语言中浮点数在实际编程中的有效范围

按 IEEE754标准,   1.17549435E-38 是规格化数能表示的最小浮点数 (0x00800000, 阶码 -126, 尾数1.0...., 表示 1 * 2^-126),    更小的可以表示为为非规格化数,  最小的是 0x00000001 ,  阶码 -127,  尾数 0.0.....1,  表示  1 * 2^-(126+23) ...  非规格化数丢失精度, 所以一般说表示范围都指规格化数表示的范围,  还有不少模拟实现的浮点库视所有的非规格化数为0 ...

浮点数格式 http://bbs.csdn.net/topics/390676437

float能表示的最大和最小分别是FLT_MAX宏和FLT_MIN宏 ，这点你不用怀疑  double则是DBL_MAX 和 DBL_MIN

printf你指定多少他输出多少，但超过浮点数范围后面的都不是准确的


Question: 程序运行错误，指针如果未初始化那么对指针赋值NULL，可是该指针位于字符串常量区，不可以修改指针内容，见下面一段代码

char *arr = NULL; gets(arr); 第一条语句是将指针指向了ＮＵＬＬ，NULL是指不可读，不可写的区域。这样初始化是为了保证arr指针不是野指针。gets是向指针指向的内存区域写数据，但是指针指向NULL，所以会导致运行异常。

就是指针未初始化, 不是什么在常量区


Question: 新人求助mpich（C语言），实现两数组生成随机数并行相加并和串行进行比较时间

如果要比较两个并行相加和串行相加的时间，建议每个功能定义一个函数，在函数的开始使用start时间，函数结束使用end时间

百度搜相关关键字。


Question: [c语言]跪求大神帮我看看哪里出了问题

引用 2 楼 cheese143的回复:引用 1 楼 user-1 的回复:你的node变量要的空间太大，在栈上分配导致栈空间用完，应该在堆上分配它请问该怎么改呀，查了一下堆分配还是不太懂 node* y = (node*)malloc(sizeof(node));  这里y是指针，后面访问按指针操作

你的node变量要的空间太大，在栈上分配导致栈空间用完，应该在堆上分配它


Question: printf精度控制

例如%m,n控制输出结果中一共有m位，其中小数占n位。你可以根据你的需要控制精度值。 或者你可以比如对第三位小数进行四舍五入算法 n=(n*100+0.5)/100控制精度等等。

double能表示的最多就15位，还能用%g

printf("%g",A);


Question: 拓扑排序问题

引用 7 楼 mxway 的回复:输入 第一行两个数n,m,代表节点数和边数 m行，每行两个数代表一条有向边  测试数据范围：(1<=n<=50,0<=m<2500) const int MAXN = 25; 你的节点数才定义25，这肯定会有数组下标越界的行为。  第二你没有考虑重边的问题，题目已经有提示了。看下面的测试用例，两个1,2，1,2这个应该只能算是一条边吧。 5 5 1 2 1 2 2 5 3 4 4 5 我竟然看做这个上限了。 还有如果我这么排序的话也会正确输出拓扑排序，我当时想重边并不会影响输出结果。但是现在有个问题就是，是不是有重边就不是DAG了，应该输出no。 DAG好像只是简单图才行？？不胜感激

这下看着舒服多了

#define LOCAL #include<iostream> #include<vector> #include<queue> #include<cstring> //#include<stack> using namespace std;  const int MAXN = 25; const int MAXM = 2501; int n,m,inDegree[MAXN];//入度 vector<int> G[MAXN];//邻接表存储图 int vis[MAXN];//深度遍历访问标志  vector<int> circle;//存放DFS所找到的第一个环 int count = 0;//记录环的个数 vector<int> trace;//记录遍历路径  bool topologicalSort();//是否DAG，是则输出拓扑排序之一 //void topologicalPrint(); void circlePrint();//不是DAG，则输出DFS所找到的第一个环 bool isBiCircle();//是否存在自环，存在则输出 int main(){ #ifdef LOCAL 	freopen("in.txt","r",stdin); 	freopen("out.txt","w",stdout); #endif 	memset(inDegree,0,sizeof(inDegree)); 	memset(vis,0,sizeof(vis)); 	cin>>n>>m; 	int from,to; 	for(int i = 0; i < m; i++){ 		cin>>from>>to; 		G[from].push_back(to); 		inDegree[to]++; 	} 	/*for(int i = 0 ; i <= n ; i++){ 		cout<<i<<":"; 		for(int j = 0 ; j < G[i].size() ; j++){ 			cout<<G[i][j]<<"-->"; 		} 		cout<<endl; 	}*/ 	if(isBiCircle()) 		return 0; 	if(topologicalSort()){ 		return 0; 	}else{ 		circlePrint(); 		//cout<<"wtf"; 	} 	return 0; } bool topologicalSort(){ 	int num = 0; 	queue<int> a; 	vector<int> print1; 	for(int i = 1; i <= n; i++){ 		if(inDegree[i] == 0){ 			a.push(i); 		} 	} 	while(!a.empty()){ 		int u = a.front(); 		print1.push_back(u); 		num++; 		a.pop(); 		for(int i = 0 ; i < G[u].size() ; i++){ 			int v = G[u][i]; 			inDegree[v]--; 			if(inDegree[v] == 0){ 				a.push(v); 			} 		} 	} 	if(num == n){ 		int first = 1; 		cout<<"YES"<<endl; 		for(int i = 0 ; i < print1.size() ; i++){ 			if(first){ 				first = 0; 				cout<<print1[i]; 			} 			else{ 				cout<<","<<print1[i]; 			} 		} 		cout<<endl; 		return true; 	} 	else return false; } void DFS(int u){ 	vis[u] = 1; 	trace.push_back(u); 	for(int i = 0; i < G[u].size() ; i++){ 		int v = G[u][i]; 		if(v == trace[0]){//找到环了 			circle.assign(trace.begin(),trace.end());//把遍历路径以及最后定点加入环中 			circle.push_back(v); 			return; 		} 		if(vis[v] == 0){ 			DFS(v); 		} 	} 	trace.pop_back(); } void circlePrint(){ 	for(int i = 1 ; i <= n; i++){ 		if(vis[i] == 0) 			DFS(i); 	} 	cout<<"NO"<<endl<<circle[0]; 	for(int i = 1 ; i < circle.size() ; i++) 		cout<<","<<circle[i]; 	cout<<endl; 	 } bool isBiCircle(){ 	for(int i = 1 ; i <= n ; i++){ 		for(int j = 0 ; j < G[i].size() ; j++){ 			if(G[i][j] == i){ 				cout<<"NO"<<endl<<i<<","<<i<<endl; 				return true; 			} 		} 	} 	return false; }

各种排序算法动画演示http://www.webhek.com/misc/comparison-sort/

百度搜相关关键字。


Question: 一种c语言函数声明方式

引用 1 楼 jianwen0529 的回复:早期的 K&R C 语法 现在使用的是ANSI C语法

早期的 K&R C 语法


Question: 关于链表

比如下面这段代码  int initInt(int a)  { 	a = 5; }  在main里面调用时, initInt(b), 调用完之后b的值并不会改变; 如果把initInt函数改为  int initInt(int *pA) { 	*pA = 5; }  在main里面调用initInt(&b),b的值就会改变为5了  同样的道理,在main里面调用这个方法int InitList(LinkList &L), 可以传入参数指向的地址

引用，引用就是别名，即形参就是实参的一个别名。别名和原有的名字都指向同一个内存区域，对别名（形参）修改，就是对原有（实参）的修改。这样达到通过InitList函数将链表头初始化得到。 若不用引用，当然也可以用二重指针，两种方法是等效的。  但是，若用一重指针（不加引用），根据参数的传递是值传递，形参和实参是相互独立（加了引用，形参和实参就是别名的关系），对于形参的修改，不能影响到实参。

就是使用引用，在函数里可以修改它

其实就是引用传递

引用调用，和传指针一样的效果。

这个是函数的参数  加& 是引用传递  详情百度 引用传递 和 值传递

百度 C引用 int InitList(LinkList &L) 等同于 int InitList(LNode *&L) 内部L=new LNode;影响实参，否则赋值仅仅是影响函数内的临时副本


Question: 奇怪的结构体变量声明问题

建议贴出你的代码，但从数据结构不能看出问题所在。

可能是申请的内存空间不够导致越界访问

引用 8 楼 Love_Irelia97 的回复:引用 1 楼 paschen 的回复:可能是申请的内存空间不够导致越界访问嗯。。。好像是我申请结点的时候错了 node = (Node*)malloc(sizeof(node)); 这里应该是sizeof(*node)，可是为什么之前的结构体又可以呢？  可以不能得出正确，最多说明你运气好，这是未定义行为，就是说可以表现为任何情况

应该改为：  node = (Node*)malloc(sizeof(Node)); if (!node)     exit(0);  [/quote]嗯嗯，你是对的，但非常奇怪的是不添加这两个变量，或者改成我贴出的完整代码那样就可以正常运行，不知道为什么

感觉内存越界了？

引用 6 楼 Love_Irelia97 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] 建议贴出你的代码，但从数据结构不能看出问题所在。/* Advanced Tree */ #include <stdio.h> #include <stdlib.h> #define MaxSize 100  typedef int ElementType; typedef struct nTree* pTree; typedef struct nTree	//	线索二叉树定义  { 	ElementType data; 	pTree left; 	pTree right; 	int lflag;	 	int rflag; }Node;  /*	非递归建立二叉查找树	*/ void InsertTree(ElementType X, pTree &root) { 	Node *node, *bt, *pre; 	node = (Node*)malloc(sizeof(node)); 	node->left = node->right = NULL; //	node->lflag = node->rflag = 0; 	node->data = X;	  	pre = bt = root;	//	node新结点，bt遍历结点，pre为 bt前驱结点  	while(NULL != bt) 	{ 		pre = bt; 		if(X < bt->data) 			bt = bt->left; 		else if(X > bt->data) 			bt = bt->right;		 	} 	if(NULL == pre)		//	空树  		root = node; 	else if(pre->data > X) 		pre->left  = node; 	else 		pre->right = node; }  void Visit(const pTree bt) { 	printf("%d  ", bt->data); }  int GetTreeHeight(const pTree bt) { 	int l_height= 0, r_height = 0; 	if(NULL == bt) 		return 0; 	else 	{ 		l_height = GetTreeHeight(bt->left); 		r_height = GetTreeHeight(bt->right); 		return (l_height>r_height ? l_height:r_height)+1; 	} }  void PreOrder(const pTree bt) { 	int top = -1; 	pTree stack[MaxSize]; 	pTree p; 	 	if(NULL != bt) 	{ 		stack[++top] = bt; 		while(-1 != top) 		{ 			p = stack[top--]; 			Visit(p); 			if(NULL != p->right) 				stack[++top] = p->right; 			if(NULL != p->left) 				stack[++top] = p->left; 		} 	} 	putchar('\n'); }  void MidOrder(const pTree bt) { 	int top = -1; 	pTree stack[MaxSize]; 	pTree p = bt; 	 	while(p!=NULL || top!=-1) 	{ 		while(p!=NULL) 		{ 			stack[++top] = p; 			p = p->left; 		} 		if(top != -1) 		{ 			p = stack[top--]; 			Visit(p); 			p = p->right; 		} 	} 	putchar('\n'); }  void PostOrder(const pTree bt) { 	int top1 = -1, top2 = -1; 	pTree stack1[MaxSize], stack2[MaxSize]; 	pTree tmp; 	 	if(NULL != bt) 	{ 		stack1[++top1] = bt; 		while(-1 != top1) 		{ 			tmp = stack1[top1--]; //			Visit(tmp); 			stack2[++top2] = tmp; 			if(tmp->left != NULL) 				stack1[++top1] = tmp->left; 			if(tmp->right != NULL) 				stack1[++top1] = tmp->right; 		} 	} 	while(-1 != top2) 		Visit(stack2[top2--]); 	putchar('\n');	 } 			 		 int main() { 	bool falg = false; 	int data[] = {6, 1, 2 ,8 ,10, 5, 0, 7, 3, 9, 4}; 	pTree root = NULL; 	 	for(int i = 0; i <= 10; ++i) 		InsertTree(data[i], root); 	/* 					6 			1				8 		0	  2			7	    10	 				5              9 			   3 			    4			 	*/ 	printf("%d\n", GetTreeHeight(root)); 	PreOrder(root); 	MidOrder(root); 	PostOrder(root);	 	return 0; }   就是这样的代码，把结构体定义换成下面这样就不行了 typedef struct tree    //    线索二叉树定义  {     ElementType data;     pTree left;     int lflag;        pTree right;     int rflag; }Node; [/quote] node = (Node*)malloc(sizeof(node));  问题在这一句，申请的空间不足。我想即使不加这两个参数，一样也会有问题。 node是指针，那么sizeof(node)等价与sizeof(int *)，即指针变量的sizeof值是４（３２位系统里）。 应该改为：  node = (Node*)malloc(sizeof(Node)); if (!node)     exit(0);

引用 2 楼 cfjtaishan 的回复:建议贴出你的代码，但从数据结构不能看出问题所在。/* Advanced Tree */ #include <stdio.h> #include <stdlib.h> #define MaxSize 100  typedef int ElementType; typedef struct nTree* pTree; typedef struct nTree	//	线索二叉树定义  { 	ElementType data; 	pTree left; 	pTree right; 	int lflag;	 	int rflag; }Node;  /*	非递归建立二叉查找树	*/ void InsertTree(ElementType X, pTree &root) { 	Node *node, *bt, *pre; 	node = (Node*)malloc(sizeof(node)); 	node->left = node->right = NULL; //	node->lflag = node->rflag = 0; 	node->data = X;	  	pre = bt = root;	//	node新结点，bt遍历结点，pre为 bt前驱结点  	while(NULL != bt) 	{ 		pre = bt; 		if(X < bt->data) 			bt = bt->left; 		else if(X > bt->data) 			bt = bt->right;		 	} 	if(NULL == pre)		//	空树  		root = node; 	else if(pre->data > X) 		pre->left  = node; 	else 		pre->right = node; }  void Visit(const pTree bt) { 	printf("%d  ", bt->data); }  int GetTreeHeight(const pTree bt) { 	int l_height= 0, r_height = 0; 	if(NULL == bt) 		return 0; 	else 	{ 		l_height = GetTreeHeight(bt->left); 		r_height = GetTreeHeight(bt->right); 		return (l_height>r_height ? l_height:r_height)+1; 	} }  void PreOrder(const pTree bt) { 	int top = -1; 	pTree stack[MaxSize]; 	pTree p; 	 	if(NULL != bt) 	{ 		stack[++top] = bt; 		while(-1 != top) 		{ 			p = stack[top--]; 			Visit(p); 			if(NULL != p->right) 				stack[++top] = p->right; 			if(NULL != p->left) 				stack[++top] = p->left; 		} 	} 	putchar('\n'); }  void MidOrder(const pTree bt) { 	int top = -1; 	pTree stack[MaxSize]; 	pTree p = bt; 	 	while(p!=NULL || top!=-1) 	{ 		while(p!=NULL) 		{ 			stack[++top] = p; 			p = p->left; 		} 		if(top != -1) 		{ 			p = stack[top--]; 			Visit(p); 			p = p->right; 		} 	} 	putchar('\n'); }  void PostOrder(const pTree bt) { 	int top1 = -1, top2 = -1; 	pTree stack1[MaxSize], stack2[MaxSize]; 	pTree tmp; 	 	if(NULL != bt) 	{ 		stack1[++top1] = bt; 		while(-1 != top1) 		{ 			tmp = stack1[top1--]; //			Visit(tmp); 			stack2[++top2] = tmp; 			if(tmp->left != NULL) 				stack1[++top1] = tmp->left; 			if(tmp->right != NULL) 				stack1[++top1] = tmp->right; 		} 	} 	while(-1 != top2) 		Visit(stack2[top2--]); 	putchar('\n');	 } 			 		 int main() { 	bool falg = false; 	int data[] = {6, 1, 2 ,8 ,10, 5, 0, 7, 3, 9, 4}; 	pTree root = NULL; 	 	for(int i = 0; i <= 10; ++i) 		InsertTree(data[i], root); 	/* 					6 			1				8 		0	  2			7	    10	 				5              9 			   3 			    4			 	*/ 	printf("%d\n", GetTreeHeight(root)); 	PreOrder(root); 	MidOrder(root); 	PostOrder(root);	 	return 0; }   就是这样的代码，把结构体定义换成下面这样就不行了 typedef struct tree    //    线索二叉树定义  {     ElementType data;     pTree left;     int lflag;        pTree right;     int rflag; }Node;

看一下申请空间的的代码，是不是申请的不够，单个结构体变大了，总体需要的空间也变大了，如果没有操作这两个新加的属性，可以看看是不是越界了

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

仅供参考：#include <locale.h> #include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef struct BiTNode {//二叉树结点     char data;                      //数据     struct BiTNode *lchild,*rchild; //左右孩子指针 } BiTNode,*BiTree; int nn=0; int CreateBiTree(BiTree *T) {//按先序序列创建二叉树     char data;     scanf("%c",&data);//按先序次序输入二叉树中结点的值（一个字符），‘#’表示空树     if (data == '#') {         *T = NULL;     } else {         *T = (BiTree)malloc(sizeof(BiTNode)); nn++;         (*T)->data = data;         //生成根结点         CreateBiTree(&(*T)->lchild);//构造左子树         CreateBiTree(&(*T)->rchild);//构造右子树     }     return 0; } void Visit(BiTree T) {//输出     if (T->data != '#') {         printf("%c ",T->data);     } } void PreOrder(BiTree T) {//先序遍历     if (T != NULL) {         Visit(T);               //访问根节点         PreOrder(T->lchild);    //访问左子结点         PreOrder(T->rchild);    //访问右子结点     } } void InOrder(BiTree T) {//中序遍历     if (T != NULL) {         InOrder(T->lchild);     //访问左子结点         Visit(T);               //访问根节点         InOrder(T->rchild);     //访问右子结点     } } void PostOrder(BiTree T) {//后序遍历     if (T != NULL) {         PostOrder(T->lchild);   //访问左子结点         PostOrder(T->rchild);   //访问右子结点         Visit(T);               //访问根节点     } } void PreOrder2(BiTree T) {//先序遍历(非递归) //访问T->data后，将T入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为T，出栈，再先序遍历T的右子树。     BiTree *stack=(BiTree *)malloc(nn*sizeof(BiTree));     int sp=0;     BiTree p = T;//p是遍历指针     while (p || sp) {   //栈不空或者p不空时循环         if (p != NULL) {             stack[sp]=p;sp++;       //存入栈中             printf("%c ",p->data);  //访问根节点             p = p->lchild;          //遍历左子树         } else {             sp--;p=stack[sp];       //退栈             p = p->rchild;          //访问右子树         }     }     free(stack); } void InOrder2(BiTree T) {//中序遍历(非递归) //T是要遍历树的根指针，中序遍历要求在遍历完左子树后，访问根，再遍历右子树。 //先将T入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为T，出栈，访问T->data，再中序遍历T的右子树。     BiTree *stack=(BiTree *)malloc(nn*sizeof(BiTree));     int sp=0;     BiTree p = T;//p是遍历指针     while (p || sp) {   //栈不空或者p不空时循环         if (p != NULL) {             stack[sp]=p;sp++;       //存入栈中             p = p->lchild;          //遍历左子树         } else {             sp--;p=stack[sp];       //退栈             printf("%c ",p->data);             p = p->rchild;          //访问右子树         }     }     free(stack); }  typedef struct BiTNodePost{     BiTree biTree;     char tag; } BiTNodePost,*BiTreePost; void PostOrder2(BiTree T) {//后序遍历(非递归)     BiTreePost *stack=(BiTreePost *)malloc(nn*sizeof(BiTreePost));     int sp=0;     BiTree p = T;//p是遍历指针     BiTreePost BT;     while (p != NULL || sp) {//栈不空或者p不空时循环         while (p != NULL) {//遍历左子树             BT = (BiTreePost)malloc(sizeof(BiTNodePost));             BT->biTree = p;             BT->tag = 'L';//访问过左子树             stack[sp]=BT;sp++;       //存入栈中             p = p->lchild;         }         while (sp && (stack[sp-1])->tag == 'R') {//左右子树访问完毕访问根节点             sp--;BT=stack[sp];        //退栈             printf("%c ",BT->biTree->data);             free(BT);         }         if (sp) {//遍历右子树             BT=stack[sp-1];             BT->tag = 'R';//访问过右子树             p = BT->biTree;             p = p->rchild;         }     }     free(stack); } void LevelOrder(BiTree T) {//层次遍历     BiTree p;     BiTree *queue;     int h=0,t=0,n=0;      if (T == NULL) return;     p=T;     queue=(BiTree *)malloc(nn*sizeof(BiTree));     queue[t]=p;t=(t+1)%10;n++;//根节点入队     while (n) {    //队列不空循环         p=queue[h];             //对头元素出队         printf("%c ",p->data);  //访问p指向的结点         h=(h+1)%10;n--;         //退出队列         if (p->lchild != NULL) {//左子树不空，将左子树入队             queue[t]=p->lchild;t=(t+1)%10;n++;         }         if (p->rchild != NULL) {//右子树不空，将右子树入队             queue[t]=p->rchild;t=(t+1)%10;n++;         }     }     free(queue); } int main() {     BiTree T;      setlocale(LC_ALL,"chs");     CreateBiTree(&T);      printf("先序遍历        ：");PreOrder  (T);printf("\n");     printf("先序遍历(非递归)：");PreOrder2 (T);printf("\n");                                                printf("\n");     printf("中序遍历        ：");InOrder   (T);printf("\n");     printf("中序遍历(非递归)：");InOrder2  (T);printf("\n");                                                printf("\n");     printf("后序遍历        ：");PostOrder (T);printf("\n");     printf("后序遍历(非递归)：");PostOrder2(T);printf("\n");                                                printf("\n");     printf("层次遍历        ：");LevelOrder(T);printf("\n");      return 0; } //ABC##DE#G##F### //先序遍历        ：A B C D E G F //先序遍历(非递归)：A B C D E G F // //中序遍历        ：C B E G D F A //中序遍历(非递归)：C B E G D F A // //后序遍历        ：C G E F D B A //后序遍历(非递归)：C G E F D B A // //层次遍历        ：A B C D E F G //  ///       A ///      / ///     B ///    / \ ///   C   D ///      / \ ///     E   F ///      \ ///       G


Question: C语言中有关mktime函数的位置问题

引用 6 楼 Mixxx5 的回复:[quote=引用 5 楼 shihengzhen101 的回复:] 是localtime的锅，每次调用都会返回相同的地址，你必须先取得localtime中的结果，然后再调用下一次 看看运行的例子  这里两个t=time(NULL);的值还是一样的吗？为什么地址改变了呢？[/quote] t的地址肯定是一样的，但是t的值取决于运行时间，因为time(NULL)的单位是秒，如果两次调用处于不同的秒数，则t的值不同

引用 5 楼 shihengzhen101 的回复:是localtime的锅，每次调用都会返回相同的地址，你必须先取得localtime中的结果，然后再调用下一次 看看运行的例子  这里两个t=time(NULL);的值还是一样的吗？为什么地址改变了呢？

localtime Converts a time value and corrects for the local time zone.  struct tm *localtime( const time_t *timer );  Routine Required Header Compatibility  localtime <time.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  localtime returns a pointer to the structure result. If the value in timer represents a date before midnight, January 1, 1970, localtime returns NULL. The fields of the structure type tm store the following values, each of which is an int:  tm_sec  Seconds after minute (0 – 59)  tm_min  Minutes after hour (0 – 59)  tm_hour  Hours after midnight (0 – 23)  tm_mday  Day of month (1 – 31)  tm_mon  Month (0 – 11; January = 0)  tm_year  Year (current year minus 1900)  tm_wday  Day of week (0 – 6; Sunday = 0)  tm_yday  Day of year (0 – 365; January 1 = 0)  tm_isdst  Positive value if daylight saving time is in effect; 0 if daylight saving time is not in effect; negative value if status of daylight saving time is unknown. The C run-time library assumes the United States’s rules for implementing the calculation of Daylight Saving Time (DST).   Parameter  timer  Pointer to stored time  Remarks  The localtime function converts a time stored as a time_t value and stores the result in a structure of type tm. The long value timer represents the seconds elapsed since midnight (00:00:00), January 1, 1970, coordinated universal time (UTC). This value is usually obtained from the time function.  gmtime, mktime, and localtime all use a single statically allocated tm structure for the conversion. Each call to one of these routines destroys the result of the previous call.  localtime corrects for the local time zone if the user first sets the global environment variable TZ. When TZ is set, three other environment variables (_timezone, _daylight, and _tzname) are automatically set as well. See _tzset for a description of these variables. TZ is a Microsoft extension and not part of the ANSI standard definition of localtime.  Note   The target environment should try to determine whether daylight saving time is in effect.  Example  /* LOCALTIM.C: This program uses time to get the current time   * and then uses localtime to convert this time to a structure   * representing the local time. The program converts the result   * from a 24-hour clock to a 12-hour clock and determines the   * proper extension (AM or PM).  */  #include <stdio.h> #include <string.h> #include <time.h>  void main( void ) {         struct tm *newtime;         char am_pm[] = "AM";         time_t long_time;          time( &long_time );                /* Get time as long integer. */         newtime = localtime( &long_time ); /* Convert to local time. */          if( newtime->tm_hour > 12 )        /* Set up extension. */                 strcpy( am_pm, "PM" );         if( newtime->tm_hour > 12 )        /* Convert from 24-hour */                 newtime->tm_hour -= 12;    /*   to 12-hour clock.  */         if( newtime->tm_hour == 0 )        /*Set hour to 12 if midnight. */                 newtime->tm_hour = 12;          printf( "%.19s %s\n", asctime( newtime ), am_pm ); }   Output  Tue Mar 23 11:28:17 AM   Time Management Routines  See Also   asctime, ctime, _ftime, gmtime, time, _tzset

因为localtime返回的指针是指向一个静态变量，第二次调用会把第一次调用的值覆盖了

两次localtime返回的指针是一样的，startt和endt是同一结构体的指针


Question: c语言有几个变量不知道该怎么定义，求大神指导

错误的信息是未找到定义，原因是这些未定的变量被你注释掉了。

你的编译器不是很老的话, 应该是支持用到的时候再定义变量, 无需一次性全部定义出来 至少 C99 就已经可以了

nt n,tab,tab1,k,i,m,N,j;//result,mod,a,length,sum; 红色部分被注释掉了，去掉注释 int n,tab,tab1,k,i,m,N, result,mod,a,length,sum; /*以上为复制的答案*/ 另外问一句，你是来故意发帖凑活跃度的么？

int n,tab,tab1,k,i,m,N,j;//result,mod,a,length,sum; 红色部分被注释掉了，去掉注释 int n,tab,tab1,k,i,m,N, result,mod,a,length,sum;

建议再去找一本基础的C语言书籍看一下吧，从基础开始，别急着写程序，按书上步骤一步一步来


Question: C怎么正确显示中文？

你系统是中文的吗

引用 5 楼 qq_38204686 的回复:看看cmd小黑框的编码格式  不对了改一下 应该就是这个原因了。 我改成UTF-8后就能显示中文了。  照这个改的： https://blog.csdn.net/tfs411082561/article/details/78416569

引用 4 楼 cfjtaishan 的回复:是因为编码格式的问题吧，代码的格式应该是utf-8格式，但是win7下一般是gb2312吧 出现乱码，肯定是编码的问题嘛。 代码应该是utf-8的。那要怎么处理？ c在读取文件，或者print的时候，不能指定编码方式吗？

编码里边转为ANSI编码  或 转为UTF-8编码

这种乱码应该都是格式造成的吧 统一成 utf-8 看看还有没有问题 Windows 里默认的应该不是

project------->setting----------->Resource   里面language选简体中文

看看cmd小黑框的编码格式  不对了改一下

你的环境？什么编译器？

引用 2 楼 hdt 的回复:你的环境？什么编译器？ gcc，都在cmd中执行。系统是win7 大概是这种： 先编译——gcc path/file.c -o path/file.o 再执行.o文件——path/file.o


Question: C 语言 - 有关pointer aliasing violations的问题

引用 3 楼 jianwen0529 的回复:作用不一样吧 第一种指针置NULL 第二种是指针指向填充了一个void*的数据，即NULL？ void*指针大小

其实这两种实现都能达到目的，只是我不太明白为何第二种会被采用，这段代码是摘录开源code。

你如果是想让指针释放后指向NULL，第二种方法实际是自欺欺人


Question: 选择排序法，这个程序哪里错了吗？

補充：程序報錯是因爲數組越界，也就是非法訪問内存了。

首先，數組a總共10個元素，所以最后一個是a[9]；其次以下這個調用：  sort(&a[10],10);  傳入的是a[10]的地址，但你的函數應該傳入的是數組a的首地址。所以建議改爲：  sort(a,10);


Question: 求大佬指点

# include <stdio.h>   # include <math.h>   # define N 10000   char A[N];    int main()   {       int i,j,Q;       for(A[0]=A[1]=1,Q=sqrt(N)+1,i=2;i<Q;i++) 		if(!A[i])for(j=i*i;j<N;j+=i) 			A[j]=1;//经过筛法后 如果i是质数则S[i]=0 否则为1   		printf("[2,%d)的质数:\n",N);     for(i=0;i<N;i++)       if(!A[i])printf("%d ",i);       return 0;   }

1.素数的定义是只能被1和它本身整除，比如说10这个数，从2—9，只要除出来有不是0的就不是素数，否则就是素数 2.break就是结束本次循环，continue是这次循环不执行了，进入下一次循环

1.    判断一个数是否为素数只需用2到这个数的平方根去除他本身，如果能够被整除，说明他不是素数。 2.break语句用来从循环体跳出循环体，即提早结束循环，接着执行循环下面的语句，它也可以用在switch语句当中；continue语句是结束本次循环的执行，即不再执行continue语句之后的语句，转入下一次循环条件的判断和执行。简而言之就是，break语句跳出一整个循环，continue语句跳出本次循环，进入下一次循环。

用改进的埃氏筛法 筛1--N之间的质数的复杂度O（sqrt(N)loglogN）

#include <stdio.h>  int isprime(int t) {     int i;      if (t != 2 && !(t % 2))         return 0;      for(i = 2; i*i <= t; i++)         if (!(t % i))             return 0;     return 1; }   int main() {     int n,count,i;      while(scanf("%d",&n) != EOF && n) {         count = 0;         if(n <= 1) {             ;         } else {             count++;             for(i = 3; i <= n; i++)                 if(isprime(i))                     count++;         }         printf("Total prime is %d \n",count);     }     return 0; }  参考一下吧

#include<stdio.h>  #define MAX_LEN 1001  void print_all_prime(int *array, int len); void print_number_prime(int *prime_list, int len, int idx);  int main(void) {     int i;     int N, count;     int arr[MAX_LEN];    //限制数据量大小为1000      printf("你想求多少以内的素数:");     scanf("%d", &N);      for(i = 1; i <= N; i++) //为方便计，从1起         arr[i] = 1;      count = 2;  //筛选起点为2     while(count <= N/2) //显然：count不会超过N/2,必能使留下的数全为素数。     {         for(i = count+1; i <= N; i++) {             if(arr[i] == 1 && i % count == 0)                 arr[i] = 0;         }         for(i = count+1; i <= N; i++) {             if(arr[i] == 1) {                 count = i;                 break;             }         }     }     print_all_prime(arr, N);     print_number_prime(arr, N, 5);      return 0; }  void print_all_prime(int *array, int len) {     int i, cnt = 0;      printf("%d以内的素数为:\n", len);     for(i = 2; i <= len;i++)         if(array[i]) {             cnt++;             printf("%d ", i);             if(!(cnt % 10)) //增设cnt为输出换行                 printf("\n");         }     printf("\n"); }  void print_number_prime(int *array, int len, int idx) {     int i, cnt = 0;      for (i = 2; i < len; i++) {         if (array[i] == 1) {             cnt++;             if (cnt == idx) {                 printf("NO.%d prime is %d\n", idx, i);                 break;             }         }      }     if (i >= len) {         printf("不存在第%d 素数\n", idx);     } } 参考一下吧  不一定一定要用到break, continue;

代码介意参照楼上“自信男孩的” 我说一下break和continue：在一个循环中如 for，while，do-while（一般只有break用在switch语句中） break:跳出当前循环，并不执行下面的代码（即brake后到循环“}”之前的代码），只跳出一层 continue：是跳出本次循环，进入下一次循环。列：for循环中遇到continue，执行for循环语句第三个表达式，再判断表达式二进行下一次是否循环 （粉我，了解更多嘿嘿！）

Finding prime numbers - Kenneth Haugland  Different schemas for finding prime numbers explained with code http://www.codeproject.com/Articles/429694/Finding-prime-numbers

谢谢各位大佬，刚开始用这个论坛，没找到怎么单独回复，抱歉，等我仔细研究下


Question: read 返回 -1, 为什么？

linux下返回-1，一般都是错误的。可以用strerror(errno)来获取错误的详细信息

引用 2 楼 wllabs 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 建议判断一下open的返回值，即需要判断文件是否成功打开。 很有可能是文件打开失败  打印了下是 3。 有值， 我把这个 flags |= O_DIRECT  去掉就可以读了。这是为什么？ [/quote] https://blog.csdn.net/axw2013/article/details/70242228

#include<stdio.h> #include <string.h> #include <errno.h> #include <unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h>  int main() {     char file[] = "/root/b.c";     int flags = O_RDONLY, ret;     flags |= O_DIRECT;     flags |= O_SYNC;     int fd = open(file, flags);     if (fd < 0)         return 1;     char buff[4096];     ret = read(fd, buff, 2);     if (ret < 0)         printf("%s\n", strerror(errno));     else if (ret > 0)         puts(buff);     //printf("%d\n", read(fd, buff, 2));     while(read(fd, buff, 2) > 0)     {         printf("aaaa\n");         printf("%s", buff);     }     close(fd);      return 0; } 用strerror(errno)定位是什么原因导致的return -1

引用 1 楼 cfjtaishan 的回复:建议判断一下open的返回值，即需要判断文件是否成功打开。 很有可能是文件打开失败  打印了下是 3。 有值， 我把这个 flags |= O_DIRECT  去掉就可以读了。这是为什么？


Question: 为什么多维数组传参第一个中括号里边的数字可以省略不写

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

引用 3 楼 赵4老师的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构…… 调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx 蟹蟹赵4老师的回答，我好像明白了

引用 1 楼 user-3的回复:最后一个可以不写吧，相当于传递一个指针过去，根据类型就可以自动知道存放在什么地方，而且是连续存放的 最后一个必须要写的，楼儿好像说的对

因为 1传入到函数中数组退化为指针。 2 传入到函数中如果最后一维不写    void test( int  a[][3])    {      int b = a+1; 将会得到错误的结果，a+1相当于指向第二行。只有知道最后一维的尺寸，才能正确知道正确的位置。    }


Question: 小白求教 约瑟夫环问题

在每个最后不带\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字符或回车换行，读取下一个字符。

百度搜相关关键字。

又重写了了一下，运行还是出问题 #include<stdlib.h> #include<stdio.h>  //声明循环链表结构体  typedef struct node {int data; char name[10]; 	char sex; 	int age; struct node *next; }node; struct node stu;  //创建单循环链表  node *Creatlist(node *h,int n) {  node *p,*q;//创建两个结点指针  int S; h=(node*)malloc(sizeof(node));//分配动态存储空间  h->next=NULL;//h指向下一个元素结点为空，确定*h是头结点指针 q=h;//将头结点的数据赋给q  for(S=n;S>0;S--)//遍历整个链表  { p=(node*)malloc(sizeof(node));//分配动态存储空间  scanf("%d %s %c %d",&p->data,p->name,&p->sex,&p->age);//输入p的数值  p->next=q->next;//指针*q跟着*p后面，一个接一个插入 q->next=p; q=p;//把p的值再传给q } q->next=h->next;//从链表中删除  free(h);//释放头结点*h  return q->next;//形成单循环链表  }  //执行出列操作  void Printlist(node *h) {node *p,*q; p=h;//找到第M个人所在位置  while(p->next!=h)//当*p不再指向头结点时 ，即找到要出列人的位置  {printf("%d",p->data); p=p->next; } printf("%d ",p->data); printf("\n"); free(p); p=NULL; while(q->next!=NULL)//当*q不再指向空结点时，即找到剩余人的位置  {printf("\t\t\t编号\t\t\t姓名\t\t\t性别\t\t\t年龄\n"); for(q=h;q!=NULL;q=q->next) printf("\t\t\t%d\t\t\t%s\t\t\t%c\t\t\t%d\n",q->data,q->name,q->sex,q->age); } }  //约瑟夫环  void YueSeFuHuan(node *h,int S,int n) {node *p,*q; int M,m,e; p=h; for(M=1;M<S;M++) { p=p->next;} printf("被删除的编号：",p); while(p->next!=p)//用循环输出链表中的元素 	{for(m=1;m<n-1;m++) 	{p=p->next;} q=p->next;p->next=q->next;e=q->data; free(q); printf("%d ",e); p=p->next; } e=p->data; free(p); printf("%d\n",e); }  void input(node stu[]);//input函数声明   //主函数  int main() {node *L; int N,S,M,X; {printf("输入人数N: \n"); scanf("%d",&N); node stu[N];//*p=stu;//定义结构体数组和指针  input(stu);//调用input函数  printf(stu); } printf("输入每个人的编号\n"); L=Creatlist(L,N); printf("建立的循环链表:\n"); Printlist(L); printf("输入开始数数的人的位置:\n"); scanf("%d",&S); printf("间隔的个数:\n"); scanf("%d",&M); printf("输入剩余人数：\n"); scanf("%d",&X); printf("删除的编号:\n"); YueSeFuHuan(L,S,M); //printf("输出最后剩余的人的编号，姓名、性别和年龄:\n"); //printf("data:%d\nname:%s\nsex:%c\nage:%d\n\n",stu[].data,stu[0].name,stu[0].sex,stu[0].age); }  void input(node stu[])//定义input函数  { 	int i,N; 	printf("输入各编号所对应的学生姓名，性别，年龄：\n"); 	for(i=0;i<N;i++) 	{ scanf("%d %s %c %d",&stu[i].data,stu[i].name,stu[i].sex,&stu[i].age); } }


Question: Linux下fread读取结构体的问题

引用 7 楼 olivehht 的回复:[quote=引用 6 楼 zhao4zhong1 的回复:] [quote=引用 5 楼 olivehht 的回复:] 由于是二进制文件，比如文件的头四个字符对应的十六进制是0x00 0x00 0x00 0xD9，这个文本在AIX下用fread读，直接就可以读出来为217，可是不用fread的话，要如何将其读出来呢？ 可以用fgetc  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 [/quote] fgetc读第一个字符就退出来了。我是用UltraEdit查看的[/quote] 仅供参考：#include <stdio.h> #include <string.h> #include <conio.h> FILE *fi,*fo; int i; int main(int argc,char **argv) {     if (argc<3) {         printf("Usage:%s src des\n",argv[0]);         return 1;     }     if (0==stricmp(argv[1],argv[2])) {         printf("Src and des is same!\n");         return 2;     }     fo=fopen(argv[2],"wb");     if (NULL==fo) {         printf("Can not create file %s\n",argv[2]);         return 3;     }     fi=fopen(argv[1],"rb");     if (NULL==fi) {         fclose(fo);         printf("Can not find file %s\n",argv[1]);         return 4;     } 	i=0;     fseek(fi,-1L,SEEK_END);     while (1) {         fputc(fgetc(fi)^0x5A,fo); 		i++; 		if (i%1000000==0) cprintf("\r%dKB",i/1000);         if (fseek(fi,-2,SEEK_CUR)) break;     }     fclose(fi);     fclose(fo); 	cprintf("\r%dKB OK.\r\n",i/1000);     return 0; }

引用 6 楼 zhao4zhong1 的回复:[quote=引用 5 楼 olivehht 的回复:] 由于是二进制文件，比如文件的头四个字符对应的十六进制是0x00 0x00 0x00 0xD9，这个文本在AIX下用fread读，直接就可以读出来为217，可是不用fread的话，要如何将其读出来呢？ 可以用fgetc  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 [/quote] fgetc读第一个字符就退出来了。我是用UltraEdit查看的

引用 5 楼 olivehht 的回复:由于是二进制文件，比如文件的头四个字符对应的十六进制是0x00 0x00 0x00 0xD9，这个文本在AIX下用fread读，直接就可以读出来为217，可是不用fread的话，要如何将其读出来呢？ 可以用fgetc  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

应该是字节序不同。 aix跑在小机上的话跟suse跑在x86上大小端刚好是相反的。 你这个字段这么多，转换起来也很麻烦，别用结构体了 直接打印输出成文本吧，一行一个，跨平台也没问题

没看bs是什么  建议单步跟踪程序运行，观察每一步变化情况，分析原因

引用 1 楼 自信男孩的回复:只看到你读取了，那么写入是怎么做的呢？写入和读取最好是匹配的，否则不保证每次都对呢。 fread／fwrite匹配 写入是别人做的，对方提供文件


Question: DEVC的调试问题

点击工具下的编译选项 点击 代码生成/优化 然后点 连接器 把 产生调试信息后的No 选为Yes 然后确定 就可以调试了

引用 楼主 weixin_40709508的回复: 设置断点和添加变量后单步调试不给反应呢 我也碰到这样的问题了，烦ヽ(‘⌒´メ)ノ老哥你解决没，教教我

建议赶快换这个： Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

先设置断点，然后f5进入调试，然后再添加变量监控，然后再逐步进入呢。

建议找一下该软件调试说明


Question: 通过数组下标访问结构体成员可以这样写吗？

引用 10 楼 mbtmxk 的回复:[quote=引用 8 楼 cfjtaishan 的回复:] [quote=引用 7 楼 mbtmxk 的回复:] [quote=引用 6 楼 cfjtaishan 的回复:] [quote=引用 5 楼 mbtmxk 的回复:]  WdgM_TriggerType dog;   WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  };  dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这样可以吗？ 其实我主要是想知道通过下标的方式访问非数组类型的结构体变量可以吗？ 我看别人这样写代码竟然调试没问题，我感到很困惑 WdgM_runTimeMod这个是指针呢，那你开始定义的不是指针。  另外，如果这样写，那么结构体定义里的WdgMTrigger是不是也是指针呢？ 提问题，建议把问题描述的更清晰和准确一些。[/quote]  WdgM_runTimeMod这个是指针，如果WdgMTrigger也是指针， 就可以用下标的方式来访问吗？那么 (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这个表达式得到的结果是什么？是指针WdgMTrigger的首地址吗？[/quote] WdgMTrigger这个是指针吗？[/quote]   typedef struct  {      uint8               WdgMWatchdogDeviceRef;      uint16              WdgMTriggerConditionValue;      WdgIf_ModeType      WdgMWatchdogMode;  } WdgM_TriggerType;    typedef struct  {      uint16                                                         WdgMExpiredSupervisionCycleTol;      WdgM_CheckPointInModeCfgType           WdgCpInMode;     WdgM_AliveSupervisionType                     WdgMAliveSupervision;       WdgM_DeadlineSupervisionType            WdgMDeadlineSupervision;      WdgM_TriggerType*                                   WdgMTrigger;      WdgM_LocalStatusParamsType                WdgMLocalStatusParams;      uint16                                                           numOfAlive;      uint16                                                           numOfDeadline;      uint8                                                             numOfTrigger;      uint16                                                           numOfLocalStatus;   } WdgM_ModeCfgType;     WdgM_TriggerType dog;   WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  }; WdgM_runTimeMode，WdgMTrigger都是指针，那么dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这样的写法可以吗？得到的结果究竟是什么呢[/quote] WdgMTrigger这个是指针，那么就能说得通这个表达式了。 WdgMTrigger指向一个WdgM_TriggerType类型的数组或者指向堆上的空间的话，可以按照数组的形式访问，就是这样的表达式。 dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex 这个值是多少，要看你初始化什么了 WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  }; ，或者在这个表达式之前还应该有对WdgMTrigger操作的吗？

不可以，要么你看错了，要么他写的不是C++代码。

引用 8 楼 cfjtaishan 的回复:[quote=引用 7 楼 mbtmxk 的回复:] [quote=引用 6 楼 cfjtaishan 的回复:] [quote=引用 5 楼 mbtmxk 的回复:]  WdgM_TriggerType dog;   WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  };  dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这样可以吗？ 其实我主要是想知道通过下标的方式访问非数组类型的结构体变量可以吗？ 我看别人这样写代码竟然调试没问题，我感到很困惑 WdgM_runTimeMod这个是指针呢，那你开始定义的不是指针。  另外，如果这样写，那么结构体定义里的WdgMTrigger是不是也是指针呢？ 提问题，建议把问题描述的更清晰和准确一些。[/quote]  WdgM_runTimeMod这个是指针，如果WdgMTrigger也是指针， 就可以用下标的方式来访问吗？那么 (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这个表达式得到的结果是什么？是指针WdgMTrigger的首地址吗？[/quote] WdgMTrigger这个是指针吗？[/quote]   typedef struct  {      uint8               WdgMWatchdogDeviceRef;      uint16              WdgMTriggerConditionValue;      WdgIf_ModeType      WdgMWatchdogMode;  } WdgM_TriggerType;    typedef struct  {      uint16                                                         WdgMExpiredSupervisionCycleTol;      WdgM_CheckPointInModeCfgType           WdgCpInMode;     WdgM_AliveSupervisionType                     WdgMAliveSupervision;       WdgM_DeadlineSupervisionType            WdgMDeadlineSupervision;      WdgM_TriggerType*                                   WdgMTrigger;      WdgM_LocalStatusParamsType                WdgMLocalStatusParams;      uint16                                                           numOfAlive;      uint16                                                           numOfDeadline;      uint8                                                             numOfTrigger;      uint16                                                           numOfLocalStatus;   } WdgM_ModeCfgType;     WdgM_TriggerType dog;   WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  }; WdgM_runTimeMode，WdgMTrigger都是指针，那么dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这样的写法可以吗？得到的结果究竟是什么呢

仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %31[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8

引用 7 楼 mbtmxk 的回复:[quote=引用 6 楼 cfjtaishan 的回复:] [quote=引用 5 楼 mbtmxk 的回复:]  WdgM_TriggerType dog;   WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  };  dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这样可以吗？ 其实我主要是想知道通过下标的方式访问非数组类型的结构体变量可以吗？ 我看别人这样写代码竟然调试没问题，我感到很困惑 WdgM_runTimeMod这个是指针呢，那你开始定义的不是指针。  另外，如果这样写，那么结构体定义里的WdgMTrigger是不是也是指针呢？ 提问题，建议把问题描述的更清晰和准确一些。[/quote]  WdgM_runTimeMod这个是指针，如果WdgMTrigger也是指针， 就可以用下标的方式来访问吗？那么 (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这个表达式得到的结果是什么？是指针WdgMTrigger的首地址吗？[/quote] WdgMTrigger这个是指针吗？

引用 6 楼 cfjtaishan 的回复:[quote=引用 5 楼 mbtmxk 的回复:]  WdgM_TriggerType dog;   WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  };  dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这样可以吗？ 其实我主要是想知道通过下标的方式访问非数组类型的结构体变量可以吗？ 我看别人这样写代码竟然调试没问题，我感到很困惑 WdgM_runTimeMod这个是指针呢，那你开始定义的不是指针。  另外，如果这样写，那么结构体定义里的WdgMTrigger是不是也是指针呢？ 提问题，建议把问题描述的更清晰和准确一些。[/quote]  WdgM_runTimeMod这个是指针，如果WdgMTrigger也是指针， 就可以用下标的方式来访问吗？那么 (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这个表达式得到的结果是什么？是指针WdgMTrigger的首地址吗？

引用 5 楼 mbtmxk 的回复:WdgM_TriggerType dog;   WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  };  dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这样可以吗？ 其实我主要是想知道通过下标的方式访问非数组类型的结构体变量可以吗？ 我看别人这样写代码竟然调试没问题，我感到很困惑 WdgM_runTimeMod这个是指针呢，那你开始定义的不是指针。  另外，如果这样写，那么结构体定义里的WdgMTrigger是不是也是指针呢？ 提问题，建议把问题描述的更清晰和准确一些。

引用 12 楼 cfjtaishan 的回复:[quote=引用 10 楼 mbtmxk 的回复:] [quote=引用 8 楼 cfjtaishan 的回复:] [quote=引用 7 楼 mbtmxk 的回复:] [quote=引用 6 楼 cfjtaishan 的回复:] [quote=引用 5 楼 mbtmxk 的回复:]  WdgM_TriggerType dog;   WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  };  dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这样可以吗？ 其实我主要是想知道通过下标的方式访问非数组类型的结构体变量可以吗？ 我看别人这样写代码竟然调试没问题，我感到很困惑 WdgM_runTimeMod这个是指针呢，那你开始定义的不是指针。  另外，如果这样写，那么结构体定义里的WdgMTrigger是不是也是指针呢？ 提问题，建议把问题描述的更清晰和准确一些。[/quote]  WdgM_runTimeMod这个是指针，如果WdgMTrigger也是指针， 就可以用下标的方式来访问吗？那么 (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这个表达式得到的结果是什么？是指针WdgMTrigger的首地址吗？[/quote] WdgMTrigger这个是指针吗？[/quote]   typedef struct  {      uint8               WdgMWatchdogDeviceRef;      uint16              WdgMTriggerConditionValue;      WdgIf_ModeType      WdgMWatchdogMode;  } WdgM_TriggerType;    typedef struct  {      uint16                                                         WdgMExpiredSupervisionCycleTol;      WdgM_CheckPointInModeCfgType           WdgCpInMode;     WdgM_AliveSupervisionType                     WdgMAliveSupervision;       WdgM_DeadlineSupervisionType            WdgMDeadlineSupervision;      WdgM_TriggerType*                                   WdgMTrigger;      WdgM_LocalStatusParamsType                WdgMLocalStatusParams;      uint16                                                           numOfAlive;      uint16                                                           numOfDeadline;      uint8                                                             numOfTrigger;      uint16                                                           numOfLocalStatus;   } WdgM_ModeCfgType;     WdgM_TriggerType dog;   WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  }; WdgM_runTimeMode，WdgMTrigger都是指针，那么dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这样的写法可以吗？得到的结果究竟是什么呢[/quote] WdgMTrigger这个是指针，那么就能说得通这个表达式了。 WdgMTrigger指向一个WdgM_TriggerType类型的数组或者指向堆上的空间的话，可以按照数组的形式访问，就是这样的表达式。 dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex 这个值是多少，要看你初始化什么了 WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  }; ，或者在这个表达式之前还应该有对WdgMTrigger操作的吗？[/quote]   除了初始化没有其他操作了，另外结构体变量可以直接用 “=”  赋值？

引用 2 楼 cfjtaishan 的回复:[quote=引用 1 楼 mbtmxk 的回复:] 求教大神们，全部的积分都贡献出来了 WdgMTrigger不是数组，为什么要用[]呢？ 另外WdgM_runTimeMode不是指针，为什么要用->?  由于WdgMTrigger类型和dog类型匹配，可以直接赋值； dog = WdgM_runTimeMode.WdgMTrigger; [/quote]   我感到困惑的是(WdgM_runTimeMode->WdgMTrigger)[dogIndex]; 这个引用竟然编译时不报错，理论上来说应该编译不通过的

引用 3 楼 mbtmxk 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] [quote=引用 1 楼 mbtmxk 的回复:] 求教大神们，全部的积分都贡献出来了 WdgMTrigger不是数组，为什么要用[]呢？ 另外WdgM_runTimeMode不是指针，为什么要用->?  由于WdgMTrigger类型和dog类型匹配，可以直接赋值； dog = WdgM_runTimeMode.WdgMTrigger; [/quote]   我感到困惑的是(WdgM_runTimeMode->WdgMTrigger)[dogIndex]; 这个引用竟然编译时不报错，理论上来说应该编译不通过的[/quote] 肯定编译不过去，因为结构体变量当结构体指针使用，这个基本错误编译器不会找不出来的。 建议贴出你的codes

引用 1 楼 mbtmxk 的回复:求教大神们，全部的积分都贡献出来了 WdgMTrigger不是数组，为什么要用[]呢？ 另外WdgM_runTimeMode不是指针，为什么要用->?  由于WdgMTrigger类型和dog类型匹配，可以直接赋值； dog = WdgM_runTimeMode.WdgMTrigger;

求教大神们，全部的积分都贡献出来了


Question: 求大佬搭救，菜单选项输入不了选项。

学会调试比改好这段程序重要； 学会找水比要水现在解渴重要。

#include<stdio.h>  void showmenu(void); int getchoice(int high, int low);  int main(void) {     int code;      showmenu();     while((code = getchoice(4,1)) != 4)     {         printf("I like choice %d.\n",code);         showmenu();     }      return 0; }  void showmenu(void) {     printf("Please choose one of following:\n");     printf("1) copy files       2) move files\n");     printf("3) remove files     4) quit\n");     printf("Enter the number of your choice:\n"); }  int getchoice(int high, int low) {     int num, good;      good = scanf("%d", &num);     while(good == 1 && (num < low || num > high))     {         printf("%d is not a valid choice; try again.\n", num);         showmenu();         good = scanf("%d", &num);     }     //if(scanf("%d", &num) != 1)     if(good != 1)     {         printf("Input error.");         num = 4;     }      printf("%d", num);      return num; } 参考一下吧  因为while后面还有一个scanf，所以你需要输入两次才行。但是，修改一下，改成如上就可以了。

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

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


Question: 这段简单的单链表代码哪里重定义了

#include<stdlib.h> #include<stdio.h> #include<string.h> #include<malloc.h>  struct studtype {     char name[20];     long studnum;     int studage;     char studsex;     float studscore;     int order;     struct studtype *next; };  //struct studtype * stu_init(); //struct studtype *stu_creat(); struct studtype * init(); struct studtype * creat();  int main() {            system("pause"); }  struct studtype * init() {     printf("enter the date in order\n");     return creat();  } struct studtype *creat() {     struct studtype *h, *info, *p;     for (;;)     {         info = (struct studtype*)malloc(sizeof(struct studtype));          if (!info) {             printf("内存不足\n");             break;             //return NULL;         }         printf("name\n");         scanf("%s", info->name);         printf("studnum\n");         scanf("%ld", &info->studnum);         if (info->studnum == 0)             break;         printf("age\n");         scanf("%d", &info->studage);         printf("sex");         scanf("%c", &info->studsex);         info->next = NULL;         if (h == NULL)             h = info;         else         {             p = h;             while (p->next != NULL)             {                 p = p->next;             }             p->next = info;         }      }      return h; } 参考一下吧 还有其他一些问题，一并做了修改，建议对比参考一下  找一下这个结构体名称的区别： struct stdutype 和 struct studtype

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

44 45 行需要加大括号吧

你的main函数没有返回值吧


Question: 一维数组的初始化问题

初始化与赋值的问题。

第二种形式不是定义，而是赋值，但是赋值有数组越界，等号两边类型不匹配。

a[10]={...}属于赋值语句，单独为a[10]赋值，并且a[10]已经越界

第二个不是在初始化，而是在为a[10]这个元素赋值（虽然这个位置已经越界），没有这样的用法。

“变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。

区分赋值与初始化


Question: 新人求指教，错在哪里

main写成mian；

第一，main写成mian； 第二，函数声明是这样的float volume（float  b， float c，）跟函数实体不符 第三，printf("%.2f\n,d)n后面少了"

写代码的时候细心点吧

mian改成main

main函数拼写错误 printf("%.2f\n,d);改为printf("%.2f\n”,d);

少了一个引号

#include <stdio.h>  #define A 1.2  float volume(float b,float c);  int main() {     float b;     float c;     float d;     printf("输入b的长度:\n");     scanf("%f",&b);     printf("输入c的长度；\n");     scanf("%f",&c);     d=volume(b,c);     printf("输出体积：");     printf("%.2f\n", d);     return 0; } float volume(float b,float c) {     float d=(b*c)*A;     return d; } 参考一下吧 宏定义建议使用大写单词或字母 最后一个参数后没有逗号  这些错误应该编译时会提示，建议注意下，并读懂编译提示

main不是mian，单词拼写注意一下

printf("%.2f\n,d);  n后面少了个引号

d=volume(b,c,);  c后面多了个逗号

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


Question: 请教C语言错误：0xC0000005: 写入位置 0x000000000559FD40 时发生访问冲突。

引用 19 楼 DelphiGuy 的回复:largeaddressaware只是PE文件头的一个标志，可以使用VC++自带的editbin.exe设置或者去除，但是调用DLL的.exe也要设置/largeaddressaware:no，否则可能还会有问题。 更简单，也是比较偷懒的方法，是修改一下dword的定义： #if defined(_WIN64) || defined(_M_AMD64) typedef unsigned long long DWORD; #else typedef unsigned long DWORD; #endif 很棒！真的非常感谢！在大侠的帮助下问题解决了，还是修改指针类型的方式。修改dword定义的方式导致几个头文件的定义也出了问题，就没有深入修改。关闭大地址的方式由于对方需要此功能也没有尝试。再次感谢你的帮助，技术和人品都没得说，好人一生平安！ 也感谢其他朋友的热情指导，谢谢！  就此结贴~！

百度搜相关关键字。

在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

个人认为是局部变量stream占用的内存空间过大导致，栈上的空间是有限的，不建议申请那么大的栈上空间。 建议改成1024再试试，改成1024或512对于你的这个程序也不会导致越界。

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

引用 1 楼 Automation_dmu 的回复:((PCustomAction)root)->index1=0;     ((PCustomAction)root)->index2=0;     ((PCustomAction)root)->index3=0;  溢出了 没看出溢出，哪里溢出了。 root只是一个指针，并且root指向了stream，这个数组可是65536个字节，不可能溢出的。

肯定是越界的问题了，Win7 64没按道理也是越界，但是没崩溃 64位下比较sizeof(TRegion)和sizeof(TRoot)大小，看看是不是前者大于后者

引用 17 楼 DelphiGuy 的回复:我测试了一下，在xp64、win7/64中，系统加载程序不会把64位应用加载到4GB以上地址空间，即便程序设置了largeaddressaware标志（32位编译器默认关闭，64位编译器默认打开），所以除非程序用到可能差不多4GB或者更多内存，64位指针截断为32位的问题不会暴露出来，但是win10/64会把有largeaddressaware标志的应用加载到4GB以上的随机地址，64位指针截断为32位的问题一下子就暴露出来了。可以链接时使用/largeaddressaware:no来关闭这一特性。 多谢多谢！动手试了真的很感谢！确实可以，程序运行没有报错，另外 改成：region=(PRegion)((BYTE *)root+BufferSeek); 的我也是了，也是没报错。非常感谢！但我改了之后现在遇到新的麻烦了。首先改成：region=(PRegion)((BYTE *)root+BufferSeek);的方式，牵扯太大了，改了其它的也要改，而且有的我还不知道怎么改（我贴出的只是出问题的部分代码）。再者通过设置/largeaddressaware:no，直接生成程序确实没问题，但我现在的任务是生成dll文件，供他人使用。编译的时候报了这个：1>LINK : warning LNK4075: 忽略“/LARGEADDRESSAWARE:NO”(由于“/DLL”规范)。然后写了个简单的程序调用它还是之前的错误（应该是大地址没有关成）。还望再帮我看看怎么样能关掉大地址选项。  在此也多谢以上回复的各位大侠！

region还是malloc一下

引用 14 楼 DelphiGuy 的回复:[quote=引用 11 楼 cfjtaishan 的回复:] [quote=引用 10 楼 DelphiGuy 的回复:] 可以改成：region=(PRegion)((BYTE *)root+BufferSeek); +++  但是在64位系统上，unsigned long(也就是DWORD）也是64位的。64系统是整体都提升为64位吧，比如int在64系统里编译器就是64位的[/quote]  windows下64位编译器基本都使用LLP模型，long long是64位的，long仍然是32位的，输出sizeof(DWORD)就可以看到了，那篇文章中说的不全面，应该是针对unix类系统的编译器。  [/quote] 有可能的，不同系统下的编译规定也可能不一样

引用 11 楼 cfjtaishan 的回复:[quote=引用 10 楼 DelphiGuy 的回复:] 可以改成：region=(PRegion)((BYTE *)root+BufferSeek); +++  但是在64位系统上，unsigned long(也就是DWORD）也是64位的。64系统是整体都提升为64位吧，比如int在64系统里编译器就是64位的[/quote]  windows下64位编译器基本都使用LLP模型，long long是64位的，long仍然是32位的，输出sizeof(DWORD)就可以看到了，那篇文章中说的不全面，应该是针对unix类系统的编译器。

引用 5 楼 cfjtaishan 的回复:[quote=引用 1 楼 Automation_dmu 的回复:]     ((PCustomAction)root)->index1=0;     ((PCustomAction)root)->index2=0;     ((PCustomAction)root)->index3=0;  溢出了 没看出溢出，哪里溢出了。 root只是一个指针，并且root指向了stream，这个数组可是65536个字节，不可能溢出的。[/quote]是的，我看错了

引用 10 楼 DelphiGuy 的回复:可以改成：region=(PRegion)((BYTE *)root+BufferSeek); +++  但是在64位系统上，unsigned long(也就是DWORD）也是64位的。64系统是整体都提升为64位吧，比如int在64系统里编译器就是64位的

https://www.cnblogs.com/lovevivi/p/3334369.html 建议参考一下64位系统，不同类型的位数。

这一句：region=(PRegion)((DWORD)root+BufferSeek);  编译为64位程序，root如果指向4GB以上地址，region将被截断到32位范围之内。

引用 1 楼 Automation_dmu 的回复:((PCustomAction)root)->index1=0;     ((PCustomAction)root)->index2=0;     ((PCustomAction)root)->index3=0;  溢出了 多谢回复！但疲敝掉错误仍旧。64位win7下却没报错，不知道什么原因


Question: 什么时候能用到开辟动态内存空间

比如你定义一个数组，char str[5];这是可以的，如果你定义一个char str[num];那就是不可以的（新标准可能可以）也就是里边的数量不能是变量，这个时候就需要动态创建这个数组了，memset是将内存初始化为某个值，相当于你申请了一块地，需要自己修整一下，才能使用

引用 2 楼 focuslight的回复:char *p = (char*)malloc(len*2+1); *2干什么？ char *p = (char*)malloc(len+1); strcpy (p,arr); strcat(p,arr) 所以是len*2+1 不知道对不对

引用 5 楼 spaceman_c 的回复:[quote=引用 1 楼 pwanbul的回复:]你应该是初学者，malloc用于在堆上动态分配内存，如果分配成功，通过返回的指针就能使用了，memset 函数是用初始化内存的，因为用内存上会有垃圾值！ 开辟的大小，怎么看，每次申请是用多少申请多少，还是要多申请一点[/quote] 可以考虑需要多少申请多少，如果第一次申请的不够，也可以使用realloc追加

引用 1 楼 pwanbul的回复:你应该是初学者，malloc用于在堆上动态分配内存，如果分配成功，通过返回的指针就能使用了，memset 函数是用初始化内存的，因为用内存上会有垃圾值！ 懂了，，多谢指教。。。

引用 1 楼 pwanbul的回复:你应该是初学者，malloc用于在堆上动态分配内存，如果分配成功，通过返回的指针就能使用了，memset 函数是用初始化内存的，因为用内存上会有垃圾值！ 开辟的大小，怎么看，每次申请是用多少申请多少，还是要多申请一点

引用 4 楼 自信男孩的回复:malloc申请的空间是根据动态需要来的，比如程序运行开始不知道应该申请多少内存。运行过程中知道了需要多少内存，就是使用malloc/realloc； 从你的这个函数里来看，也可以不memset，strcpy/strcat会将'\0'拷贝值p中，memset是初始化，因为malloc的内存空间的数据是随机数，memset一下可以初始化。 多谢指教，那个开辟内存刚开始申请多少

malloc开辟动态内存空间的大小由你自己决定，memset函数用于初始化


Question: 求矩阵的部分和

数组定义的时候需要指定大小，不管是几维数组，除非你在定义的时候初始化它。 int array_one[] = {1,2,3,4}; int array_two[4] = {0}; 其他类型或多维数组同上

#include<stdio.h>  int main() {     int n,i,j;     int a[10][80];     int sum = 0;     scanf("%d",&n);     if (n > 10)         return 0;     for(i=0;i<n;i++)         for(j=0;j<n;j++)             scanf("%d", &a[i][j]);     for(i=0;i<n;i++)         for(j=0;j<n;j++){             if(j!=n-1&&i!=n-1&&i+j==n+1)                 sum=sum+a[i][j];         }     printf("%d",sum);     return 0; } 参考一下吧  定义数组时，需要指定数组的行数和列数（二维数组）。 另外，scanf需要加&

a[][999]的前面那个中括号也要指定大小吧


Question: 拉格朗日乘子法怎么处理不等式约束条件的问题

百度搜相关关键字。


Question: 请教一个链接问题

静态的库是编译时链接的即会在编译时加入到可执行程序里。，动态库是执行可执行程序时动态加载的。 因此若想用liba.a的库，不想用libb.a的库，只需要在编译时不引用liba.a的库


Question: 顺序表实现过程中没有打印出任何值，求问哪里出现问题？

每次插入后，length没有改变，导致后面再插入时，i>sqlist->length + 1 直接返回错误

//将第i个元素以及第i个元素后面的元素后移     for (int j = sqlist->length; j >= i; j--)         sqlist->elem[j] = sqlist->elem[j - 1]; 这个操作也可以去掉了，冗余代码

我自己的错，插入的时候成员搞错了

#include <stdio.h> #include <stdlib.h>  #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10  #define OK 0 #define error -1 #define OVERFLOW -2  typedef int ElemType;  typedef struct _SqList {     ElemType *elem;     int length;        //表长度     int listsize;    //当前分配的存储容量 }SqList,*pSqList;  //增加存储空间容量 int addcapacity(SqList *sqlist) {     ElemType *newbase;    //分配一个新的基址     //newbase = (ElemType *)malloc((sqlist->listsize + LISTINCREMENT) * sizeof(ElemType));     newbase = (ElemType *)realloc(sqlist->elem, (sqlist->listsize + LISTINCREMENT) * sizeof(ElemType));     if (newbase == NULL)         exit(OVERFLOW);     sqlist->elem = newbase;     sqlist->listsize += LISTINCREMENT;     return OK; }  //初始化顺序表 int InitList_sq(SqList *sqlist) {     if (sqlist == NULL)         return error;     //给线性表分配初始容量     sqlist->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));     if (!sqlist->elem)         exit(OVERFLOW);     sqlist->length = 0;     sqlist->listsize = LIST_INIT_SIZE;      return OK; }  //在表的第i个位置插入新元素newelem int ListInsert(SqList *sqlist, int i, ElemType newelem) {     if (sqlist == NULL || i < 1 || i > sqlist->length + 1)     {         return error;     }     if (sqlist->length >= sqlist->listsize)    //检查线性表是否已满，如果满了就扩充空间容量     {         if (addcapacity(sqlist) != OK)             return OVERFLOW;     }     //将第i个元素以及第i个元素后面的元素后移     for (int j = sqlist->length; j >= i; j--)         sqlist->elem[j] = sqlist->elem[j - 1];     sqlist->elem[i - 1] = newelem;     //sqlist->elem++;     sqlist->length++;     return OK; }  //顺性表输出 void Print_list(SqList *sqlist) {     int i;     for (i = 0; i < sqlist->length; i++)         printf("%d  ", sqlist->elem[i]);     printf("\n"); }  int main() {     SqList L;     InitList_sq(&L);      for (int i = 0; i < 10; i++)    //将0-9插入顺序表     {         ListInsert(&L, i + 1, i);     }     Print_list(&L);     return 0; } 参考一下吧  问题1：addcapacity函数内，建议使用realloc而不能使用malloc，因为使用malloc确实把空间扩展了，但是原来的数据应该就没了，realloc就可以避免这个问题。 问题2：insert函数内，没有对length进行修改，那么比较空间是否需要扩展就没有意义了，因为length还是0. 问题3：insert函数内，sqlist->elem++;这个操作是修改了指针的位置，这个是为什么你输出的时候没有任何数据的原因，当然还跟length没有修改有关； 问题4：if (sqlist->length > sqlist->listsize)    //检查线性表是否已满，如果满了就扩充空间容量     {         if (addcapacity(sqlist) != OK)             return OVERFLOW;     } 这个比较建议加上=，因为不加会越界。因为下表的值是从0～listsize-1;


Question: 给出一个数，求这个数的所有本原元

在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

是不是benyuan ();这句应该放在printf之前

printf ("请输入一个素数%d",p);  scanf("%d",&n); f= pow(m,i); p=f%n; printf("全部本原元为:%d",m); 虽然不知道什么意思～但这里的m的值不会因为你输入的值而改变吧

什么是本原元，描述的不够清晰。建议举出一个或者一些例子来

素数的因子不是一和他的本身吗？


Question: 请教

include 后面要跟头文件  #include <stdio.h>

引用 11 楼 qq_31504597 的回复:[quote=引用 10 楼 Fantacy936 的回复:]  提示结果错误, 应该是打印的内容有误.  #include <stdio.h> int main() {     printf("Hello world!\n");     return 0; } [/quote] +++  多年的编程经验，不加<stdio.h>，编译都过不去，更别说运行了。

头文件没加啊

题目要求是打印Hello world！， 你为啥要打印别的额，不明白。  引用 10 楼 Fantacy936 的回复:

#include<stdio.h> int main() {     printf("让我们学习C语言向世界问好。\n");     return 0; } 楼主，此问题中你遇到的问题是在#include中需要引入头文件<stdio.h>

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

引用 10 楼 Fantacy936 的回复: 提示结果错误, 应该是打印的内容有误.  #include <stdio.h> int main() {     printf("Hello world!\n");     return 0; }

引用 8 楼 Fantacy936 的回复:改成那个是没问题的，但是输入到网课上面老是有问题 截图不够清晰吧，看不清呢

改成那个是没问题的，但是输入到网课上面老是有问题

引用 4 楼 Fantacy936 的回复:改成那个是可以，但是他不满足网课给的要求，提交作业的时候还是显示错误 网课是什么要求？

#include <stdio.h>  int main() {     printf("让我们学习C语言向世界问好。\n");      return 0; } 需要引入头文件

#include ->改成 #include<stdio.h>

改成那个是可以，但是他不满足网课给的要求，提交作业的时候还是显示错误

引用 2 楼 Fantacy936 的回复:还是有个编译的错误 编译错误 a.c:1:19: fatal error: iostream: No such file or directory compilation terminated.  改成stdio.h

头文件：#include <iostream>


Question: System.Reflection.TargetInvocationException: 调用的目标发生了异常   求解

System.DllNotFoundException: 无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块。

信息太少了吧，但从异常的打印上看，是动态库加载有问题。


Question: 哪位大佬指点一下，小弟感激不尽，调用哪个函数求数学英语物理总成绩的平均值呢

也可以直接在display( ) 添加语句： cout<<“评价值”<<(mscore+escore+pscore)/3<<endl;

自己再定义一个方法，来求平均值

自己写函数，没有能直接调用的

修改一下display函数  void display( ) // 定义公用函数display { cout<<"姓名："<<name<<endl; cout<<"学号："<<num<<endl; cout<<"数学成绩："<<mscore<<endl; cout<<"英语成绩："<<escore<<endl; cout<<"物理成绩："<<pscore<<endl; cout<<“平均成绩：”<<(mscore+escore+pscore)/3<<endl;  };


Question: 请对以下程序运行结果的分析总结，函数实现程序时间复杂度分析

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


Question: itoa链接错误

ubuntu可能真的沒有，可以這麽做：  sprintf(szBuffer, "%d", nValue);                   //整数转化为字符串


Question: c语言没有报错，但是运行不了，求大神解答

已经可以运行出来了，但是想输入一个基数，n个指数，同时输出结果，就是例如2^3,2^5,2^7这样同时输出，想让大神们指导一下

根据报错逐次修改代码

#include <stdio.h> #include <math.h> int main() { 	int n; //修改1 ： 声明 n     double base, exponent, result,i;     printf("基数: ",base);     scanf("%lf", &base);     printf("指数: ",exponent);     scanf("%lf", &exponent);     n=(int)exponent;// 修改2:   n 赋值(int)强制类型转换 for(i=1;i<=n-1;i++) {     // 计算结果     result = pow(base, exponent);     printf("%.1lf^%.1lf = %.2lf", base, exponent, result);     return 0; } }

i，n都没有定义，而且i应该是整型的，i=exponent又是双精度转换成整型

我想实现的是把一个数e从1次幂到n次幂全部都存在一个数组中，我试了楼上那种把那些语句都注释掉，但是还是运行不了

#include <stdio.h> #include <math.h>  int main() { 	double base, exponent, result, i; 	//printf("基数: ",base); 	printf("基数: "); 	scanf("%lf", &base); 	//printf("指数: ",exponent); 	printf("指数: "); 	scanf("%lf", &exponent); 	//i = exponent; 	/* 	for(i = 1; i <= exponent-1;i++) 	{ 		// 计算结果 	} 	*/ 	result = pow(base, exponent); 	printf("%.1lf^%.1lf = %.2lf", base, exponent, result); 	return 0; }  参考一下吧； 对比一下找找问题

n未定义，程序逻辑也有问题


Question: 代码运行结果不正确

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

代码看着好累，，你插入代码试试


Question: 5.	用for循环计算圆周率，计算到某项的绝对值小于10-6止。(其中一种公式为：PI / 4 = 1 – 1/3 + 1/5- 1/7+1/9 -……）（约为

引用 2 楼 NNSSHXS 的回复:[quote=引用 1 楼 wang0635 的回复:] 1.0/i<10e-6 ==> 1.0/i>10e-6 printf("PI=%lf\n",PI); ==> printf("PI=%f\n",PI); PI=4*x; ==>最好拿到循环外头来 非常感谢您！ 还有一个小问题想请教您，按我这样写得到的结果和给出的参考答案不太一样（我的结果是3.141573，而参考答案是3.141591），是我这样还有什么产生误差的地方吗？[/quote]1e-6 写成 10e-6 了

我明白了，谢谢您！

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

引用 1 楼 wang0635 的回复:1.0/i<10e-6 ==> 1.0/i>10e-6 printf("PI=%lf\n",PI); ==> printf("PI=%f\n",PI); PI=4*x; ==>最好拿到循环外头来 非常感谢您！ 还有一个小问题想请教您，按我这样写得到的结果和给出的参考答案不太一样（我的结果是3.141573，而参考答案是3.141591），是我这样还有什么产生误差的地方吗？


Question: dev可以运行，oj却过不去。求助大佬！！！

杭电第三题，我不知道我为啥也过不了

这是大数相加，long long是存不下的，需要用字符串接收，然后转化为数字相加

Notice that the integers are very large, that means you should not process them by using 32-bit integer.  虽然我的英语很烂，也看懂人家要求你不能用32为整形来处理这个问题  提示，用字符串


Question: C语言程序，但在dev中无法正常运行，求大神解答

第一个循环前i没有初始化，后面的x、1x2没有初始化

扔掉DEV C++，安装VS2010 Express Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

自顶。。。。。。。。


Question: 数据结构——单链表删除问题

纸上学来终觉浅，绝知此事要躬行。

引用 4 楼 zhao4zhong1 的回复:数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633 其实和队列的删除元素原理差不多。。。。。。

引用 9 楼 zhao4zhong1 的回复:看我在http://bbs.csdn.net/topics/392201633 这个帖子中的最新回复。  感谢老师解惑！！！昨晚困扰到现在，一直在看，看了各种删除操作，始终不得其中的诀窍，  怒了，中午开始直接上手做，边做边想，发现思路清晰很多，  真心感谢老师的指点，  下面这段代码是我自己敲的， status List_Delete_i(List* L, int i)//删除第i个 { 	List p, q; 	p = *L; 	int j = 1; 	while (p->next && j < i) 	{ 		p = p->next; 		j++; 	} 	/* 	if (!(p->next) || j > i) 	{ 		return ERROR; 	}*/ 	if (p->next) 	{ 		q = p->next; 		p->next = q->next; 		free(q); 	} return OK; }  我也明白了为什么要用 p->next作为判断位置合理的原因了，这么简单，

引用 6 楼 zhao4zhong1 的回复:[quote=引用 5 楼 zyx6680599 的回复:] [quote=引用 4 楼 zhao4zhong1 的回复:] 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633 其实和队列的删除元素原理差不多。。。。。。[/quote] 千句讨论和解释，比不上一行例子代码。 千句例子代码，比不上一副对相应代码足够清晰的图解。[/quote]  感谢论坛元老的指点迷津， 可是小白，就这个问题还没有理解， 怎么理解这个判断条件 if (!(p->next) || j > i)

引用 1 楼 hdt 的回复:你的代码有问题，把一个指针传入函数，无论函数中对这个指针进行同级修改，函数返回后这个指针指向的地址不变，只能改变这个指针指向的内存。  代码是这里看到的 https://blog.csdn.net/bestallen/article/details/53148836#t4  对于删除操作，我不是很明白，尤其是用    if (!(p->next) || j > i)   判断合理性的时候，我就搞不懂了，为什么要用p->next去判断？

引用 5 楼 zyx6680599 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633 其实和队列的删除元素原理差不多。。。。。。[/quote] 千句讨论和解释，比不上一行例子代码。 千句例子代码，比不上一副对相应代码足够清晰的图解。

Status ListDelete(LinkList *L,int i,ElemType *e)  如果我要删除第一个元素将会出错，所以有些链表的实现，会加一个头元素，头元素下一个指向实际的第一个元素

直接p->NEXT==NULL是不是就可以了？同为菜鸟


Question: 分别定义一个char类型的数组和char*指针数组，为什么每个指针数组a的地址相差是8byte,数组b的地址相差1byte..有理解错的地方还望各位大侠指教

引用 1 楼 RATNG的回复:懂了，因为每个指针数组存放的都是都是一个指针，在64位机器中，指针的大小是8个byte. 纠正下，是64位程序指针是8字节，而不是64位系统，64位系统下也可以运行32位程序，指针是4字节

引用 1 楼 qq_35196982 的回复:懂了，因为每个指针数组存放的都是都是一个指针，在64位机器中，指针的大小是8个byte. 编译器背锅.

指针数组:mac或者64位程序  指针占8个字节。32位程序占四个字节。 另一个相差1没什么问题

引用 4 楼 paschen 的回复:[quote=引用 1 楼 RATNG的回复:]懂了，因为每个指针数组存放的都是都是一个指针，在64位机器中，指针的大小是8个byte. 纠正下，是64位程序指针是8字节，而不是64位系统，64位系统下也可以运行32位程序，指针是4字节[/quote] 谢谢！！！


Question: 扫雷游戏，感觉逻辑都正确，为什么运行结果会挂掉

判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

引用 1 楼 user-3的回复:在函数init_board里面，你的两个数组都有越界访问的操作，导致数组附近堆栈损毁，然后程序崩溃。  如果你定义一个数组 int a[10]，那么代表他有10个元素，其下标范围是[0, 10)，这是一个半开半闭的区间。下标从0开始，到9结束。所以你在遍历这个数组时，应该这样：  for (int i = 0; i < 10; ++i)  如果你对C语言中这种数组的不对称边界以及为什么这么设计感兴趣，可以阅读《C陷阱和缺陷》的 3.6小节 边界计算与不对称边界 。 不对啊，改了之后第一行第一列返回的ret就错了

“多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

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

呃，不是迷宫，是雷图...

两个问题： 1.  void game() {     char arr[row][col];     char mine[row][col]; 这里的arr、mine应该定义为全局数组，不要放在game()里 2. 可能你的想法是迷宫存储比显示大一圈，这样就不用判断输入的某点是否在边界上了，这么设计没问题，但是实现上有一点错误，要显示10x10的迷宫，col和row要设置为12，显示使用1..10，0和11作为不可见的边界。


Question: 求大神帮忙看下问题在哪

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

%s对应的不是字符串指针

1.结构体中定义学号为整型，但输入时却是字符串类型的 2.计算平均分总和时stu[i].avg=stu[i].sum/4应放在第二个循环的外面，否则计算的是没门科目的四分之一 3.按总分从高到低排序时，stu[i+1].sum下标越界了，超过最大的6了，而且排序的方法也不对，可以用选择排序或冒泡排序。

最后一个函数调用stu[i+1]越界了

问题1：number是int类型，但是输入的格式是按照%s输入的:scanf("%s", &stu[i].number); 问题2：fun0中有逻辑错误，即stu[i].avg = stu[i].sum / 4;应该放在第二层循环外。 问题3：fun1中，出现越界问题（这个是导致程序异常退出的直接原因），i+1已经在i=5时，越界。 因此应改成： for (i = 0; i < 6 - 1; i++ 另外，排序还存在逻辑错误。排序是需要2层循环的，建议查一下冒泡排序算法。

fun1中 循环中i = 5时，stu[i+1]越界访问了

崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }


Question: [Clion问题] Cmake project is not loaded

不晓得楼主看懂没得，反正我是看不懂，没得前提，直接说的是啥？？project是什么类型文件？？？感觉这些都是混子

不要打开之前的代码，新建一个project把代码粘贴过去，这样系统会自动为你写Cmake文件，不然就要你自己写

就一句话，新建project，不要打开已经有的project，新建project系统会自己给你写CMakeLists.txt文件


Question: 为什么队列运行出错。。

谢谢 终于运行通过了。。

引用 4 楼 cfjtaishan 的回复:#include<stdio.h> #include<malloc.h> #include<stdlib.h>  typedef struct _node *PtrToNode;  struct _node{     int num; //结点定义     PtrToNode Next; };  typedef struct _queue *Queue; //队列定义  struct _queue{     PtrToNode Head;     PtrToNode Rear; };  void CreateQ(Queue Q) {      Q->Head = (PtrToNode)malloc(sizeof(struct _node));     Q->Head->Next = NULL;     Q->Rear = Q->Head;  } void AddQ(Queue Q,int num) //加入队列 {     PtrToNode New;     New = (PtrToNode)malloc(sizeof(struct _node));     New->Next = NULL;     New->num = num;      Q->Rear->Next = New;      Q->Rear = New;  } int DeleteQ(Queue Q) //出队 {     PtrToNode New;     int num;     New=Q->Head->Next;     num=New->num;     Q->Head=Q->Head->Next;     free(New);     return num; }  int isEmpty(Queue Q) {     if(Q->Head==Q->Rear){         return 1;     }     return 0; }  static void ShowQ(Queue Q) {     PtrToNode p = Q->Head->Next;      while (p) {         printf("%d ", p->num);         p = p->Next;     }     putchar(10); }  int main() {     Queue Q;      Q = (Queue)malloc(sizeof(struct _queue));     if (!Q)         exit(0);      CreateQ(Q);     int i;     for (i=0;i<10;i++){         printf("step1\n");         AddQ(Q,i);         printf("step2\n");     }     ShowQ(Q);      while(!isEmpty(Q)){         printf("%d",Q->Rear->num);         // printf("%d ",DeleteQ(Q));         Q->Head = Q->Head->Next;     } }  参考一下吧 第一个问题：main函数里的Q是野指针，要使用Q中的HEAD, Rear，需要先对其申请空间； 第二个问题：Create函数里，为Head申请了空间，为啥有给其赋值NULL呢？这不是矛盾吗？改了一下让Head->Next = NULL; 另外加了遍历函数。申请的空间没有释放，建议自己加上。

Q->Rear->Next=New;  Q->Rear=New

Q->Rear在addQ的时候值是不是等于null了


Question: 为什么在visual studio2013中 “strcpy”不合法，那下面这个程序该怎么改呢

strcpy_s比strcpy安全 就和 五十步笑百步 一样！  #pragma warning(disable:4996) //开头加这句或项目、属性、配置属性、C/C++、预处理器、预处理器定义中添加“_CRT_SECURE_NO_WARNINGS”

strcpy_s(m_name, name, 20);  试一下这个函数。 strcpy_s是安全封装的strcpy


Question: 遇到蛋疼问题特来求教,望各位大神赐教..

也可以将c中的bool统一更名为your_bool， 避免与c++的bool类型冲突

c++中的bool不是宏定义的，是一种基本类型  你可以用#ifdef判断是否是C代码，把你那部分代码放到相应条件下


无符号数和有符号数的区别

引用 10 楼 qq_41774046 的回复:0X开头就是无符号16进制常数，进行右移就是无符号的右移。-1==0xffffffff，左边默认int，右边是unsigned int，比较运算前会进行类型转化，都变成无符号型 ，自然值为1了。你是对常量部分掌握不好，概念模糊，再去多看看就明白了。大家的回答都看了，又在网上搜了下，发现有这句话'在C、C++中，十进制是有正负之分的，-12表示负数，12表示正数。但是八进制和十六进制都只能表示无符号正整形',这个应该才是为什么系统会认为0xFFFFFFFF为无符号的原因。和10楼答案一样。

加后缀 U 就行了：-1U。不加是 int 加了是 unsigned int。

7楼正解！

负数移位，由于是有符号数移位，且符号位是1，那么右移之后次高位要填充1，而不是0. 0xffffffff移位是无符号数移位，最高位填0.

0xffffffff>>1 移位后还是负数吗？

bool b = ((0xffffffff>>1)==(-1>>1)); 试一下这里的b为 true 还是 false

看结果能猜到0xffffffff是按照无符号来算的，但是c语言里面不是默认为int吗？

-1>>1 是按signed 显示的 0xffffffff>>1是按unsigned显示的

再供参考：#include <stdio.h> unsigned short int ui;   signed short int si; int main() { 	ui=(unsigned short int)0x8000u; 	si=(  signed short int)0x8000; 	printf("ui=%u\n",ui); 	printf("si=%d\n",si); 	ui=ui>>1; 	si=si>>1; 	printf("ui=%u\n",ui); 	printf("si=%d\n",si);  	printf("--------------\n"); 	ui=(unsigned short int)0x8000u; 	si=(  signed short int)0x8000; 	printf("ui=%u\n",ui); 	printf("si=%d\n",si); 	ui=((  signed short	int)ui)>>1; 	si=((unsigned short	int)si)>>1; 	printf("ui=%u\n",ui); 	printf("si=%d\n",si);  	return 0; } //ui=32768 //si=-32768 //ui=16384 //si=-16384 //-------------- //ui=32768 //si=-32768 //ui=49152 //si=16384

因为-1为负数在计算机中以补码形式存储，其二进制转换成16进制为0xffffffff，并且-1是一个有符号数，所以进行右移时，会在高位进行补1，所以移位后，它的16进制依然为0xffffffff，因此打印输出10进制时将它看作有符号数进行转换打印，最终的结果依然是-1，而对于0xffffffff，在计算机转换成二进制时，认为它是一个无符号数，进行右移时，会在高位进行补0，所以移位后，它的16进制依然为0x7fffffff，因此打印输出10进制时将它看作无符号数进行转换打印，所以最终的结果是2147483647 对于两者比较时是进行相减法进行比较的，因为-1的二进制和0xffffffff的二进制是一样的，所以进行减法运算时得出结果为0，因此认为-1==0xffffffff  以上为本人的愚见，若有什么不足之处希望，各位大神进行纠正，谢谢。

常量也有类型！ C++ Integer Constants Integer constants are constant data elements that have no fractional parts or exponents. They always begin with a digit. You can specify integer constants in decimal, octal, or hexadecimal form. They can specify signed or unsigned types and long or short types.  Syntax  integer-constant :  decimal-constant integer-suffixopt octal-constant integer-suffixopt hexadecimal-constant integer-suffixopt 'c-char-sequence'  decimal-constant :  nonzero-digit decimal-constant digit  octal-constant :  0 octal-constant octal-digit  hexadecimal-constant :  0x hexadecimal-digit 0X hexadecimal-digit hexadecimal-constant hexadecimal-digit  nonzero-digit : one of  1 2 3 4 5 6 7 8 9  octal-digit : one of  0 1 2 3 4 5 6 7  hexadecimal-digit : one of  0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F  integer-suffix :  unsigned-suffix long-suffixopt long-suffix unsigned-suffixopt  unsigned-suffix : one of  u U  long-suffix : one of  l L  64-bit integer-suffix :  i64  To specify integer constants using octal or hexadecimal notation, use a prefix that denotes the base. To specify an integer constant of a given integral type, use a suffix that denotes the type.  To specify a decimal constant, begin the specification with a nonzero digit. For example:  int i = 157;   // Decimal constant int j = 0198;  // Not a decimal number; erroneous octal constant int k = 0365;  // Leading zero specifies octal constant, not decimal  To specify an octal constant, begin the specification with 0, followed by a sequence of digits in the range 0 through 7. The digits 8 and 9 are errors in specifying an octal constant. For example:  int i = 0377;   // Octal constant int j = 0397;   // Error: 9 is not an octal digit  To specify a hexadecimal constant, begin the specification with 0x or 0X (the case of the “x” does not matter), followed by a sequence of digits in the range 0 through 9 and a (or A) through f (or F). Hexadecimal digits a (or A) through f (or F) represent values in the range 10 through 15. For example:  int i = 0x3fff;   // Hexadecimal constant int j = 0X3FFF;   // Equal to i  To specify an unsigned type, use either the u or U suffix. To specify a long type, use either the l or L suffix. For example:  unsigned uVal = 328u;             // Unsigned value long lVal = 0x7FFFFFL;            // Long value specified                                    //  as hex constant unsigned long ulVal = 0776745ul;  // Unsigned long value


Question: 求助TAT感觉代码好像没错但是OJ过不了

if(qz>=qb)         q=qz;     else         q = qb; 这个地方是不是应该改成这样？ 因为你的输入不一定是qz >= qb，也可能是qz < qb呢

描述： A与B是两个非负十进制整数（0 <= A,B <= 1e8），求A加B运算包含几次进位操作（逢十进一）。 输入： 输入包含两个非负整数A和B，空格隔开。 输出： 一个整数，表示进位次数。 输入样例： 1901 1609 输出样例： 2  Hint: 个位1+9进1，百位9+6进1，共2次  这是题目~


Question: 使用fgetc()读文件错在哪了啊？

十分感谢！！

引用 1 楼 cfjtaishan 的回复:while(ch=(fgetc(in))!=EOF) 改一下，改成如下：注意括号的位置，否则会变成ch = (getc(in) != EOF)，因为赋值运算符的优先级最低。 while((ch=fgetc(in))!=EOF)++


Question: 请教下如何在预编译的时候将__FUNCTION__和字符串拼接起来

引用 2 楼 u011955950 的回复:多谢指教，__LINE__是可以展开；但是__FUNCTION__好像就没有办法展开出来？我试了下不行，可以再指教下吗？ 改用代码生成技术。 代码生成技术参考：//codegen.c // 输入一组字符串，比如 // aa ss ddd dd 33 dd // 然后自动生成一个函数 int A(const char*); // 实现A("aa")返回0  A("ss")返回1 依次类推 #include <stdio.h> int main(int argc,char **argv) {     int i;     if (argc<2) {         printf("%s p1 [p2 ...] [>result.c]\nGenerate code int A(const char *a); 0==A(\"p1\") 1==A(\"p2\") ...",argv[0]);         return 1;     }     //printf("#include <string.h>\n");     printf("int A(const char *a) {\n");     for (i=0;i<argc-1;i++) {         printf("    if (0==strcmp(a,\"%s\")) return %d;\n",argv[i+1],i);     }     printf("    return -1;\n");     printf("}\n");     return 0; } //C:\test\Debug>codegen.exe //codegen.exe p1 [p2 ...] [>result.c] //Generate code int A(const char *a); 0==A("p1") 1==A("p2") ... //C:\test\Debug>codegen.exe aa ss ddd dd 33 dd //int A(const char *a) { //    if (0==strcmp(a,"aa")) return 0; //    if (0==strcmp(a,"ss")) return 1; //    if (0==strcmp(a,"ddd")) return 2; //    if (0==strcmp(a,"dd")) return 3; //    if (0==strcmp(a,"33")) return 4; //    if (0==strcmp(a,"dd")) return 5; //    return -1; //} // //c:\test\Debug>codegen.exe aa ss ddd dd 33 dd >result.c // //c:\test\Debug>type result.c //int A(const char *a) { //    if (0==strcmp(a,"aa")) return 0; //    if (0==strcmp(a,"ss")) return 1; //    if (0==strcmp(a,"ddd")) return 2; //    if (0==strcmp(a,"dd")) return 3; //    if (0==strcmp(a,"33")) return 4; //    if (0==strcmp(a,"dd")) return 5; //    return -1; //} //

仅供参考：#include <stdio.h> #define DEBUG2(x,y) "Line " #y " of File " x #define DEBUG1(x,y) DEBUG2(x,y) #define LINE_FILE DEBUG1( __FILE__ , __LINE__ )      const char *str = LINE_FILE; void main() {     printf("%s\n",str); } //Line 10 of File c:\tmp\tmp\foo.c


Question: 使用VC2010编辑FOR循环的问题

你的循环条件 i >= (1.0/5)在i还是正数的时候一直是真，直到i溢出成为负数才会结束。你这段代码其实得不到你预期的输出。  for 循环可以这样写 for（i==1；i<=100;i++） {     sum += 1/i; }  其他不用变了

循环条件永远成立，无法停止

for (i = 1;i >= (1.0/5); 1.0/(i++) )里面的表达式中给i赋值的是i++ 就是的第二次i=2.0，第三次I=3.0，以此类推 i的值一直大于1.0/5 所以程序一直循环下去 也就是死循环 可以修改成   int main()    {   double i;   double sum = 0;          for ( i = 1.0;i <=100.0; i++ )   {     sum = sum +1/ i;      }    printf("sum = %lf\n",sum);    system("pause");    return 0;    }

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

double sum = 1;            for (in= 1;n<100;n++ )       {    sum = sum + 1/n;  } for 里面的数要整数；

死循环了


Question: 大家帮忙看看这个代码，UVa 10340

边界条件 输入输出格式 ……


Question: win10用VC++6.0写的一个比较大小的程序，帮忙看下输出问题，

注意中英文字符。建议输入a, b之后，马上输出一下a,b的值。这样保证调用max之前是自己输入的值。

+1，空格的锅，就几行代码你试试不要空格绝对没问题

你输入的1，2中间逗号是英文还是中文、逗号后面有空格吗？输入要和scanf保持一致。

仅供参考（输入两个整数，中间随便用什么间隔）：#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; }

可能是逗号的问题吧，，，

不应该啊，明天上机试试

你的电脑是假的吧

把int max（）声明放main函数外面


Question: VS2010的BUTTON中怎样对text输入的数值用IF语句进行判断？

谢谢大家谢谢

你想问什么、思路已经这么清楚了、就按你说的一步步写代码就行了

CString::Compare int Compare( LPCTSTR lpsz ) const;  Return Value  Zero if the strings are identical, < 0 if this CString object is less than lpsz, or > 0 if this CString object is greater than lpsz.  Parameters  lpsz  The other string used for comparison.  Remarks  Compares this CString object with another string using the generic-text function _tcscmp. The generic-text function _tcscmp, which is defined in TCHAR.H, maps to either strcmp, wcscmp, or _mbscmp depending on the character set that is defined at compile time. Each of these functions performs a case-sensitive comparison of the strings, and is not affected by locale. For more information, seestrcmp, wcscmp, _mbscmp in the Run-Time Library Reference.  Example  The following example demonstrates the use of CString::Compare.  // example for CString::Compare CString s1( "abc" ); CString s2( "abd" ); ASSERT( s1.Compare( s2 ) == -1 ); // Compare with another CString. ASSERT( s1.Compare( "abe" ) == -1 ); // Compare with LPTSTR string.  CString Overview |  Class Members |  Hierarchy Chart  See Also   CString::CompareNoCase, CString::Collate, CString::CollateNoCase


Question: 关于strlen()

无符号数和有符号数运算，好像有时会有些问题，这个你具体去查下

strlen返回值肯定大于等于0，你和负数也可以比较，比较结果总是真

函数strlen()返回的是字符串的长度，应该>=0

无符号

引用 10 楼 a34140974 的回复:无符号数和有符号数运算，好像有时会有些问题，这个你具体去查下 查了下： 无符号与有符号数进行运算时，系统会自动将有符号数看成无符号数，然后进行比较。 举例：假定一个数是8位，一个字节表示 -1=11111111（补码），相当于无符号数255 10=00001010 此时，-1>10

首先，strlen()返回值在不同c库的版本中不同，有的是int，有的是size_t(usigned int 或 unsigned long); 再次，你的问题应该是返回值是size_t的strlen()，这就是c/c++类型比较时的强制转换问题，rt.

不能与负数比较是什么意思，警告还是错误？其实返回字符串的长度必定大于等于0，返回值应该是无符号整数，如果非要和有符号整数比较，可以强转啊！

strlen()返回的字符串的长度，应该>=0

能不能比我不知道，但是没有必要比较啊，strlen（）返回值大于等于0，根本不需要和负数比较啊。

引用 2 楼 user-10 的回复:strlen()得到是数据的类型的大小，必定>0 空串的strlen()得到是0吧

strlen()返回的是无符号整型

strlen()得到是数据的类型的大小，必定>0

strlen得到的返回值范围是：>= 0;跟负数比较没意义吧。 可以看一下strlen的原型，返回值是size_t，size_t是unsigned类型。


Question: linux下C语言工程编译不出来，求大神指点

引用 7 楼 cfjtaishan 的回复:[quote=引用 6 楼 HelegeHeHeha 的回复:] [quote=引用 4 楼 cfjtaishan 的回复:] [quote=引用 3 楼 HelegeHeHeha 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 建议先make clean一下，然后再make试试   试过了好多次了，还是那个问题[/quote] 问一下，你的libcure.so库是交叉编译生成的吗？还是用gcc编译生成的。因为你使用交叉编译器编译你的代码，那么libcur.so也应该是交叉编译生成的。[/quote]   那个库是我在网上下的，怎么给他交叉编译呢，是不是要改库里的Makefile?[/quote] 那就不行了。 建议你改一下库里的makefile，将你的交叉编译器的路径替换原有编译器的（原有的编译器应该是使用gcc那个版本的）。 最终你需要先将libcur.so交叉编译生成才行[/quote]  那我想问一下这个.so文件在这里面起什么作用呢，我才开始搞这个，不太懂

引用 6 楼 HelegeHeHeha 的回复:[quote=引用 4 楼 cfjtaishan 的回复:] [quote=引用 3 楼 HelegeHeHeha 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 建议先make clean一下，然后再make试试   试过了好多次了，还是那个问题[/quote] 问一下，你的libcure.so库是交叉编译生成的吗？还是用gcc编译生成的。因为你使用交叉编译器编译你的代码，那么libcur.so也应该是交叉编译生成的。[/quote]   那个库是我在网上下的，怎么给他交叉编译呢，是不是要改库里的Makefile?[/quote] 那就不行了。 建议你改一下库里的makefile，将你的交叉编译器的路径替换原有编译器的（原有的编译器应该是使用gcc那个版本的）。 最终你需要先将libcur.so交叉编译生成才行

引用 3 楼 HelegeHeHeha 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 建议先make clean一下，然后再make试试   试过了好多次了，还是那个问题[/quote] 问一下，你的libcure.so库是交叉编译生成的吗？还是用gcc编译生成的。因为你使用交叉编译器编译你的代码，那么libcur.so也应该是交叉编译生成的。

引用 4 楼 cfjtaishan 的回复:[quote=引用 3 楼 HelegeHeHeha 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 建议先make clean一下，然后再make试试   试过了好多次了，还是那个问题[/quote] 问一下，你的libcure.so库是交叉编译生成的吗？还是用gcc编译生成的。因为你使用交叉编译器编译你的代码，那么libcur.so也应该是交叉编译生成的。[/quote]   那个库是我在网上下的，怎么给他交叉编译呢，是不是要改库里的Makefile?

引用 1 楼 cfjtaishan 的回复:建议先make clean一下，然后再make试试   试过了好多次了，还是那个问题

试过了好多回，还是没有用

建议先make clean一下，然后再make试试


Question: OSE架构下DSP开发   生成数组后 DA 不往出发数

有时不将“调用函数名字＋各参数值，进入函数后各参数值，中间变量值，退出函数前准备返回的值，返回函数到调用处后函数名字＋各参数值＋返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的，包括捕获各种异常、写日志到屏幕、单步或设断点或生成core或dmp文件、……这些方法都不行！ 写日志到文件参考下面： #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef _MSC_VER     #pragma warning(disable:4996)     #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 _MSC_VER 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 _MSC_VER     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 _MSC_VER     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //1-79行添加到你带main的.c或.cpp的那个文件的最前面 //81-86行添加到你的main函数开头 //90-94行添加到你的main函数结束前 //在要写LOG的地方仿照第88行的写法写LOG到文件MyLog1.log中


Question: eclipse的帮助文档

使用WebCHM软件，可以将指定网页下载打包成一个chm文件。

引用 1 楼 老马何以识途的回复:eclipse只是一個IDE，並不包含API 使用說明文檔可以去其官方網站下載 老哥，先谢谢你的回复啦。我找到了网页，但好像不知道它的那个下载的地方在哪里

eclipse只是一個IDE，並不包含API 使用說明文檔可以去其官方網站下載


Question: 关于指针的指针操作恳请大神答疑

《牛肉干》 C语言上机课，某女同学偷偷吃起牛肉干。 有一粒牛肉干掉到了键盘上，卡在7和8键之间。 女同学就在键盘上抠啊、抠啊、抠啊…… 程序里一行代码变成这个样子： int *pa=&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&a; 后来的结局是 ————程序顺利通过编译，运行结果正确！

引用 5 楼 cfjtaishan 的回复:只能用prear = &p;而不能*prear = p;因为prear是野指针，prear = &p;是指针prear指向p的地址。 如果定义时把prear = NULL;那么运行时段错误是必现的。

引用 3 楼 自信男孩的回复:scanf("%d",k); 这个地方也有问题：改成这样 scanf("%ld", &k); 非常感谢！这里疏忽了哈哈

引用 1 楼 user-3的回复:*prear=p; 改成prear = &p;试试看 回家试一试上班了hhhh谢谢！可以问一下这两句话之间有什么区别嘛

*prear=p; 改成prear = &p;试试看

引用 8 楼 weixin_41974276 的回复:[quote=引用 6 楼 自信男孩的回复:][quote=引用 5 楼 cfjtaishan 的回复:] 只能用prear = &p;而不能*prear = p;因为prear是野指针，prear = &p;是指针prear指向p的地址。 如果定义时把prear = NULL;那么运行时段错误是必现的。[/quote] Hi你好！ 很感谢你为我解答，下午又查了很多资料，算是有些理解了，非常感谢！ 想追问一下，如果仍用*prear=p,但在之前为prear分配一个地址可否？[/quote] 恩，可以的。需要给prear分配一个指针大小的空间

引用 9 楼 cfjtaishan 的回复:[quote=引用 8 楼 weixin_41974276 的回复:] [quote=引用 6 楼 自信男孩的回复:][quote=引用 5 楼 cfjtaishan 的回复:] 只能用prear = &p;而不能*prear = p;因为prear是野指针，prear = &p;是指针prear指向p的地址。 如果定义时把prear = NULL;那么运行时段错误是必现的。[/quote] Hi你好！ 很感谢你为我解答，下午又查了很多资料，算是有些理解了，非常感谢！ 想追问一下，如果仍用*prear=p,但在之前为prear分配一个地址可否？[/quote] 恩，可以的。需要给prear分配一个指针大小的空间[/quote] 但对这个程序来说没必要。就应该是：prear = &p;

引用 6 楼 自信男孩的回复:[quote=引用 5 楼 cfjtaishan 的回复:] 只能用prear = &p;而不能*prear = p;因为prear是野指针，prear = &p;是指针prear指向p的地址。 如果定义时把prear = NULL;那么运行时段错误是必现的。[/quote] Hi你好！ 很感谢你为我解答，下午又查了很多资料，算是有些理解了，非常感谢！ 想追问一下，如果仍用*prear=p,但在之前为prear分配一个地址可否？


Question: 请教高手帮忙完善一下这个基础BFS算法（打印最短路径）

struct node t; 	t = que[tail - 1]; 	for(i=0; i<que[tail - 1].s+1;i++) 	{	printf("(%d,%d)",t.x, t.y);		//输出路径 		t = que[t.f]; 	} 在主函数的最后加上这个就行了。

“给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出  仅供参考：//1 2 3 //4 5 6 求一笔划过所有9个键的所有方法 //7 8 9 #include <stdio.h> int g[10][9]={     {0,0,0,0,0,0,0,0,0},     {2,4,5,0,0,0,0,0,0},//1     {1,3,4,5,6,0,0,0,0},//2     {2,5,6,0,0,0,0,0,0},//3     {1,2,5,7,8,0,0,0,0},//4     {1,2,3,4,6,7,8,9,0},//5     {2,3,5,8,9,0,0,0,0},//6     {4,5,8,0,0,0,0,0,0},//7     {4,5,6,7,9,0,0,0,0},//8     {5,6,8,0,0,0,0,0,0},//9 }; int k,i,n; int h[10];//记录是否划过h[1..9],history int p[10];//记录划的顺序p[1..9],path void go(int f,int L) {     int j;      if (L==9) {         p[L]=f;         n++;         printf("%08d:",n);         for (i=1;i<=9;i++) printf(" %d",p[i]);         printf("\n");     } else {         p[L]=f;         h[f]=1;         j=0;         while (1) {             if (g[f][j]==0) break;             if (h[g[f][j]]==0) {                 go(g[f][j],L+1);                 h[g[f][j]]=0;             }             j++;         }     } } int main() {     n=0;     for (k=1;k<=9;k++) {         for (i=1;i<=9;i++) h[i]=0;         go(k,1);     }     return 0; } //00000001: 1 2 3 5 4 7 8 6 9 //00000002: 1 2 3 5 4 7 8 9 6 //00000003: 1 2 3 5 6 9 8 4 7 //00000004: 1 2 3 5 6 9 8 7 4 //00000005: 1 2 3 5 7 4 8 6 9 //00000006: 1 2 3 5 7 4 8 9 6 //00000007: 1 2 3 5 9 6 8 4 7 //00000008: 1 2 3 5 9 6 8 7 4 //00000009: 1 2 3 6 5 4 7 8 9 //00000010: 1 2 3 6 5 7 4 8 9 //00000011: 1 2 3 6 5 9 8 4 7 //00000012: 1 2 3 6 5 9 8 7 4 //00000013: 1 2 3 6 8 4 7 5 9 //00000014: 1 2 3 6 8 7 4 5 9 //00000015: 1 2 3 6 8 9 5 4 7 //00000016: 1 2 3 6 8 9 5 7 4 //00000017: 1 2 3 6 9 5 4 7 8 //00000018: 1 2 3 6 9 5 4 8 7 //00000019: 1 2 3 6 9 5 7 4 8 //00000020: 1 2 3 6 9 5 7 8 4 //00000021: 1 2 3 6 9 5 8 4 7 //00000022: 1 2 3 6 9 5 8 7 4 //00000023: 1 2 3 6 9 8 4 5 7 //00000024: 1 2 3 6 9 8 4 7 5 //00000025: 1 2 3 6 9 8 5 4 7 //00000026: 1 2 3 6 9 8 5 7 4 //00000027: 1 2 3 6 9 8 7 4 5 //00000028: 1 2 3 6 9 8 7 5 4 //00000029: 1 2 4 5 3 6 9 8 7 //00000030: 1 2 4 5 7 8 9 6 3 //00000031: 1 2 4 7 5 3 6 8 9 //00000032: 1 2 4 7 5 3 6 9 8 //00000033: 1 2 4 7 5 8 9 6 3 //00000034: 1 2 4 7 5 9 8 6 3 //00000035: 1 2 4 7 8 5 3 6 9 //00000036: 1 2 4 7 8 5 9 6 3 //00000037: 1 2 4 7 8 6 3 5 9 //00000038: 1 2 4 7 8 6 9 5 3 //00000039: 1 2 4 7 8 9 5 3 6 //00000040: 1 2 4 7 8 9 5 6 3 //00000041: 1 2 4 7 8 9 6 3 5 //00000042: 1 2 4 7 8 9 6 5 3 //00000043: 1 2 4 8 7 5 3 6 9 //00000044: 1 2 4 8 7 5 9 6 3 //00000045: 1 2 4 8 9 6 3 5 7 //00000046: 1 2 5 3 6 9 8 4 7 //00000047: 1 2 5 3 6 9 8 7 4 //00000048: 1 2 5 4 7 8 9 6 3 //00000049: 1 2 5 7 4 8 9 6 3 //00000050: 1 2 6 3 5 4 7 8 9 //00000051: 1 2 6 3 5 7 4 8 9 //00000052: 1 2 6 3 5 9 8 4 7 //00000053: 1 2 6 3 5 9 8 7 4 //00000054: 1 2 6 9 8 4 7 5 3 //00000055: 1 2 6 9 8 7 4 5 3 //00000056: 1 4 2 3 5 6 9 8 7 //... ... //00000776: 9 8 7 4 5 6 3 2 1 //00000777: 9 8 7 5 1 4 2 3 6 //00000778: 9 8 7 5 1 4 2 6 3 //00000779: 9 8 7 5 3 6 2 1 4 //00000780: 9 8 7 5 3 6 2 4 1 //00000781: 9 8 7 5 4 1 2 3 6 //00000782: 9 8 7 5 4 1 2 6 3 //00000783: 9 8 7 5 6 3 2 1 4 //00000784: 9 8 7 5 6 3 2 4 1

加一个函数PrintPath。  void PrintPath(struct note* q, int k) { 	if (k == 1) 		printf("(%d, %d) ", q[k].x, q[k].y); 	else 	{ 		PrintPath(q, q[k].f); 		printf("(%d, %d) ", q[k].x, q[k].y); 	} }   然后最后调用：  PrintPath(que, tail - 1);

@赵4老师 麻烦您帮忙看看


Question: 奇怪的%问题

引用 8 楼 paschen 的回复:至于等于255的情况没能理解，你可以分析下你汇编 a%b - c    如果拆开成啊a=a%b   a=a-c  每步都有一个无符号的指令，如果写到一起就只有都计算完才有一个无符号的指令，差别就在这。挺奇怪的

这个是C标准对转换的描述：http://en.cppreference.com/w/c/language/conversion  这个是MSDN给的：https://msdn.microsoft.com/en-us/library/aetzh118.aspx

至于等于255的情况没能理解，你可以分析下你汇编

引用 6 楼 nadleeh的回复:[quote=引用 5 楼 paschen 的回复:] 1楼说的不正确，s - e 比int小，s - e后的结果不是unsigned char类型，而是int类型，即int类型的-1，再转换成unsigned，即0xFFFFFFFF，十进制是4294967295  所以最后结果相当于是4294967295 % 128 = 127 版主，所有变量都当unsigned char就是int 是手误。  但是我得到过2种值，一种是255，一种是127，C标准关于 连续无符号数的操作结果赋值给无符号数，其规定是每步的结果都当无符号数处理，还是其他？[/quote] 我上面说了，s-e是得到的结果是int，这叫Integral promotions（整型提升），两个小于int范围的整数运算时均会被提升到int  也就是说s - e相当于是(int)s - (int)e，结果是int类型

引用 5 楼 paschen 的回复:1楼说的不正确，s - e 比int小，s - e后的结果不是unsigned char类型，而是int类型，即int类型的-1，再转换成unsigned，即0xFFFFFFFF，十进制是4294967295  所以最后结果相当于是4294967295 % 128 = 127 版主，所有变量都当unsigned char就是int 是手误。  但是我得到过2种值，一种是255，一种是127，C标准关于 连续无符号数的操作结果赋值给无符号数，其规定是每步的结果都当无符号数处理，还是其他？

引用 2 楼 hzy_76 的回复:負數取模可能實現不同？學習了！ 在某平台下： unsigned char len = 128; unsigned char s = 0； unsigned char e = 1； unsigned a = (s-e)%len; unsigned b = s-e; unsigned c = b%len;  结果是a=255；c是127 去看对应的汇编的时候，a在s-e这步完成后没有无符号处理的指令，然后直接就接着%了，b则是在减完后紧跟着了一个无符号处理的指令。 按理说a的逻辑应该是 减后无符号处理，然后%。

引用 1 楼 cfjtaishan 的回复:这个问题跟%应该没啥关系。主要是类型有关，尤其类型的隐氏提升。 s - e两个都是unsigned char类型，计算出来的结果是-1，转unsigned char得：255；然后%len，由于len是unsigned int类型，因此255再转换位unsigned int类型，最后与len计算%. 所以结果应该是255 % 128  按理说 一群无符号数的连续的操作，都应当做无符号数来做处理。 我在windows上得到的值是127，在其他平台上得到过255，没想明白，C标准中对于 无符号连续运算的规定我记得是  每步的结构都当成无符号数参与下一步运算。

負數取模可能實現不同？學習了！

那虚数取模呢？

用事实说话,XXXX


Question: VS2013链表冒泡排序运行报错Free Heap block 3e71c8 modified at 3e71e0 after it was freed怎么办

return 0之前加一句getchar()就可以實現任意鍵退出。

引用 1 楼 hzy_76 的回复:那一句應該寫為：   struct NODE * head = (struct NODE *)malloc(sizeof(struct NODE));   因爲malloc的參數是大小，如果帶了*號，則不是結構体所佔空間大小，而是指針所佔空間大小。 谢谢,可以了,还有最后它生产的程序,执行完直接关闭了,如何才能是它长时间显示