Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 关于if（）后面加；号的问题

回复:
user: user-1
content: 引用 18 楼 琢光 的回复:[quote=引用 1 楼 自信男孩 的回复:]#include<stdio.h> int main() {     int a,b;     a=1;     b=2;     if (a>b)         ;     printf("1");         } 这个能输出1是因为不论if判断的条件是否为真，都会执行printf打印； 而去掉;（分号），printf的打印要看if条件是否为真，若为真则执行，否则不执行； 简单理解，加了分号，就是printf不在if的控制范围之内了；  去掉分号，结果不为真，还是一样打印出来”1“。[/quote] 那不可能，你测试一下试试。或者把你修改之后的代码再贴出来～

user: user-2
content: 引用 1 楼 自信男孩 的回复:#include<stdio.h> int main() {     int a,b;     a=1;     b=2;     if (a>b)         ;     printf("1");         } 这个能输出1是因为不论if判断的条件是否为真，都会执行printf打印； 而去掉;（分号），printf的打印要看if条件是否为真，若为真则执行，否则不执行； 简单理解，加了分号，就是printf不在if的控制范围之内了；  去掉分号，结果不为真，还是一样打印出来”1“。

user: user-3
content: 加了；号后，后面的那句打印就不属于if块了

user: user-4
content: a的初始值为1，b的初始值为2，if判断语句是if(a>b)，如果不加；这个条件是不满足的所以不输出，加上；号这个语句执行完毕，才会输出1

user: user-5
content: 这是基础问题，“if();”    这条语句判断后执行  “；”，完了再顺序的执行  ” printf("1");  "， “   if() printf("1");  "这条语句判断后执行  ” printf("1");  " 然后main()函数结束。

user: user-6
content: 分号代表的是一个语句的结束。'if （a > b）; 表示判断完成之后，就结束，因为判断后并没有要求做什么。然后程序继续执行接下来的操作，输出1. 下一句if (a>b)  printf("1"); 表示的是，先判断条件是否成立，成立，后面没分号代表语句还没有结束。因此在前面的判断条件下看看是否执行输出1的操作

user: user-7
content: 分号 阻断了if进行条件判断 即结束if语句块

user: user-8
content: ;将条件判断和输出分开了~无论里面结果如何按照顺序流程，都会输出1。

user: user-9
content: if加；后，if下面不执行，直接打印

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

user: user-11
content: 加了";"表示这个if语句已经结束了，无论判断结果如何，都不执行任何操作。

user: user-12
content: 加了;相当于if的执行语句是一条空语句，后边的printf是一条独立的语句 二不加;时，后边的printf是if语句的执行语句，只有当前边的if条件成立时，才执行

user: user-13
content: if (a>b);   printf("1"); 相当于 if (a>b) ;  printf("1"); 其实就是空语句

user: user-14
content: if 后面如果不是大括号，if的范围只是紧接着的后一条语句，如果加了分号，if的范围只是这个分号的语句（一个空语句），后面的prinf不属于if的范围，即if成立只是执行一个空语句，prinf无论if是否成立均会执行

user: user-15
content: 你这个有点类似悬挂if，建议在使用if else的时候，不管语句长短，都用{}括起来

user: user-16
content: 条件语句 后加 ； 相当于一条语句

user: user-1
content: #include<stdio.h> int main() {     int a,b;     a=1;     b=2;     if (a>b)         ;     printf("1");         } 这个能输出1是因为不论if判断的条件是否为真，都会执行printf打印； 而去掉;（分号），printf的打印要看if条件是否为真，若为真则执行，否则不执行； 简单理解，加了分号，就是printf不在if的控制范围之内了；
user-0 提问: char声明一个量等于1的时候为什么输出为笑脸

回复:
user: user-0
content: 谢谢谢谢谢谢谢谢

user: user-1
content: 建议参考ASCII码，%c输出，1不是一个可以显示的字符，比如若b = 48,输出的是0，因为48对应的ascii码为'0'
user-0 提问: 求助，关于C语言栈的实现的错误，请前辈们看下。

回复:
user: user-0
content: 好的，现在通了，谢谢。

user: user-1
content: int full(StackPtr s) {     return (s->top == MAXSTACK - 1); } 是判断表达式不应该是赋值表达式；  #include<stdio.h> #include<stdlib.h>  #define MAXSTACK 100  typedef struct stack {     int top;     int entry[MAXSTACK]; }Stack,*StackPtr;  int init(StackPtr s); int push(StackPtr s, int i); int full(StackPtr s); int pop(StackPtr s, int *p);  int main(void) {     int temp = 0;     StackPtr s = (StackPtr)malloc(sizeof(stack));     init(s);     printf("%d  ", s->top);     //int number[5] = { 1,2,3,4,5 };     //for (int i = 0;i < 5;i++)     //{push(s, number[i]);}     push(s,1);     //for (int i = 0;i <= s->top; i++)     printf("%d  ", s->entry[s->top]);     pop(s, &temp);     printf("%d\n", temp);     getchar();     return 0;  }  int init(StackPtr s) {     s->top = -1;     return 0; }  int push(StackPtr s, int i) {     if (full(s))         return -1;      s->top++;     s->entry[s->top] = i;     return 0; }  int full(StackPtr s) {     return (s->top == MAXSTACK - 1); }  int is_empty(StackPtr s) {     return (s->top == -1); }  int pop(StackPtr s, int *num) {     if (is_empty(s))         return -1;      *num = s->entry[s->top];     s->top--;      return 0; } 参考一下吧 另外需要加一个判断栈是否为空的函数，在pop时需要判断栈是否为空，若为空则停止出栈，如上的代码；
user-0 提问: C语言指针问题

回复:
user: user-1
content: *str类型是char，%d需要的是int类型整数，%s需要的是一个字符指针且需要以\0结尾，char转换为int是没有问题的，但转换为指针将导致程序崩溃，因为printf按你这个char的值作为一个地址去输出该地址的字符串内容

user: user-2
content: printf("%s\n", str); 把*去掉就好了。 因为%s是输出字符串，对应的参数应该是一个地址值，若直接传str，由于str是字符数组名，本身就是地址，因此是没问题的。 但是若是*str，那么*str的值是72，那么就是输出地址为72开始的字符串（直到遇到'\0'才会结束输出），由于72是一个不能读写的位置，所以会导致段错误，程序异常

user: user-2
content: 引用 2 楼 jianwen0529 的回复:printf("%s\n",*str); //%s格式是输出字符串，*str是一个字符，值是72，然后就会把0x00000072当作一个字符串，0x00000072这个地址可能是系统保护的 换成 %c 这个才是输出字符 个人认为不是把0x00000072当成一个字符串（况且，72的16进制也不是0x00000072,而是0x00000048吧）而是输出以0x00000048开始内存单元的数据，直到遇到'\0'停止输出。

user: user-3
content: printf("%s\n",*str); //%s格式是输出字符串，*str是一个字符，值是72，然后就会把0x00000072当作一个字符串，0x00000072这个地址可能是系统保护的 换成 %c 这个才是输出字符

user: user-4
content: 首先，你的指针定义有问题，*左边或右边多了个空格，删除一个，然后把下一行的*删掉就可以了

user: user-0
content: 引用 5 楼 paschen 的回复:*str类型是char，%d需要的是int类型整数，%s需要的是一个字符指针且需要以\0结尾，char转换为int是没有问题的，但转换为指针将导致程序崩溃，因为printf按你这个char的值作为一个地址去输出该地址的字符串内容 同样感谢你的回复，你和3#的回复同样正确！

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:printf("%s\n", str); 把*去掉就好了。 因为%s是输出字符串，对应的参数应该是一个地址值，若直接传str，由于str是字符数组名，本身就是地址，因此是没问题的。 但是若是*str，那么*str的值是72，那么就是输出地址为72开始的字符串（直到遇到'\0'才会结束输出），由于72是一个不能读写的位置，所以会导致段错误，程序异常 感谢你的回复，让我豁然开朗，原来格式控制%s是需要地址作为参数的，我原先一直以为参数就是第一个字符，感谢！

user: user-5
content: *str不是字符串
user-0 提问: 为什么int a[5]不行，哪一步越界了？（ int a[6]就可以）

回复:
user: user-1
content: 数组下标从0开始

user: user-2
content: 数组都是基于0（base-0）开始的，萌新； 0在C++中是很特殊的一个存在。 函数返回0，一般代表运行正确 0还可以表示空指针，表示C字符串结束符号 0还表示false

user: user-3
content: 数组下标从0开始 PS：话说我好像也不太清楚什么时候用==，<=,>=什么的

user: user-4
content: 数组下标都是从0开始计数的  建议多看一些基础书籍 多加练习

user: user-5
content: 数组下表是从0开始的

user: user-6
content: i小于等于5呀..i等于5的话只能到a4哦亲

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

user: user-8
content: a[6]的数组下标是从0-5的

user: user-9
content: 若定义的数组长度为5，目前的排序算法是不可以的。输入的时候也已经越界了。因为下表是从0开始的。所以，若定义的长度位5，则下表应该是[0,4]；包括0,4 目前的代码是没问题的，可以对5个数据排序，因为定义的数组长度为6，下表为0的位置没有用。  #include <stdio.h> #include <stdlib.h>  int main () {     int a[5],i,j,b;     for (i = 0; i < 5; i++)         scanf ("%d", &a[i]);      for (i = 0; i <= 4;i++)     {         for (j = 0;j < 5 - i - 1; j++)         {             if (a[j] > a[j+1])             {                 b = a[j];                 a[j] = a[j+1];                 a[j+1] = b;             }         }     }     for (i = 0;i < 5; i++)         printf ("%d ",a[i]);     system ("pause");     return 0; } 参考一下吧

user: user-10
content: 数组小标从0开始计数，到小于数组个数N，即0 ~ （N-1）

user: user-11
content: 引用 2楼5fai 的回复:不知道你为什么要从1开始计数，int a［6］你确定可以？

user: user-11
content: 不知道你为什么要从1开始计数，int a［6］
user-0 提问: 求大神帮我看看，啊啊啊啊啊啊啊

回复:
user: user-1
content: 输入输出样例有没有？

user: user-2
content: 引用 2 楼 cfjtaishan 的回复:#include<stdio.h> int main() {      int i,j;     int a[3];     int b[100];      b[0]=1;     b[1]=2;      for(i=0;i<3;i++)         scanf("%d",&a[i]);     for(i=0;i<3;i++){         for(j=2;j<a[i];j++) {             b[j]=b[j-1]+b[j-2];             printf("No.%d = %d\n", j + 1, b[j]);         }         printf("::%d\n",b[j-1]);   /*此处用j-1,因为第二层循环里，j是j++后跳出循环的，所以输出时应该是是j-1*/     } } 参考一下吧 原因详见上面代码注释 正解   可以不用遍历  用数学表达式求

user: user-3
content: 这不就是斐波那契数列吗？小样，换个马甲我就不认识你了？

user: user-4
content: #include<stdio.h> int main() {      int i,j;     int a[3];     int b[100];      b[0]=1;     b[1]=2;      for(i=0;i<3;i++)         scanf("%d",&a[i]);     for(i=0;i<3;i++){         for(j=2;j<a[i];j++) {             b[j]=b[j-1]+b[j-2];             printf("No.%d = %d\n", j + 1, b[j]);         }         printf("::%d\n",b[j-1]);   /*此处用j-1,因为第二层循环里，j是j++后跳出循环的，所以输出时应该是是j-1*/     } } 参考一下吧 原因详见上面代码注释
user-0 提问: 二分查找

回复:
user: user-1
content: int bisearch(int v[],int x,int low,int high) {     int mid=(low+high)/2;     while(low < high&&x!=v[mid])     {         if(x>v[mid])             low=mid+1;         else             high=mid-1;         mid=(low+high)/2;     }     if(x==v[mid])         return mid;     else if(low >= high)         return (x>v[low])?low+1:low; } 试一下这个。 改一下while循环的条件，另外，再改一下最后一个else if判断条件。即将上面的low <= high等号放到下面去判断

user: user-0
content: int bisearch(int v[],int x,int low,int high) { 	int mid=(low+high)/2; 	while(low<=high&&x!=v[mid]) 	{ 		if(x>v[mid]) 			low=mid+1; 		else 			high=mid-1; 		mid=(low+high)/2; 	} 	if(x==v[mid]) 		return mid; 	else if(low>high) 		return (x>v[low])?low+1:low; } int binarySearch(int a[], int item, int low, int high) {     if (high <= low)         return (item > a[low])?  (low + 1): low;      int mid = (low + high)/2;      if(item == a[mid])         return mid+1;      if(item > a[mid])         return binarySearch(a, item, mid+1, high);     return binarySearch(a, item, low, mid-1); }

user: user-0
content: 下面的我写的，上面的是正确的，很抱歉图发错了

user: user-0
content: 引用 8 楼 hdt 的回复:int bisearch(int v[],int x,int low,int high) { 	int mid; 	while( low<high-1) 	{ 		mid= low+(high-low)/2; 		if(x>v[mid]) 		{ 		   low=mid; 		} 		else 		{ 			high=mid; 		} 	} 	if( x==v[low]) 		return low; 	else if( x==v[high]) 		return high; 	else 		return -1; } 非常感谢点拨，最后一个else确实应该加上

user: user-0
content: 引用 4 楼 cfjtaishan 的回复:int bisearch(int v[],int x,int low,int high) {     int mid=(low+high)/2;     while(low < high&&x!=v[mid])     {         if(x>v[mid])             low=mid+1;         else             high=mid-1;         mid=(low+high)/2;     }     if(x==v[mid])         return mid;     else if(low >= high)         return (x>v[low])?low+1:low; } 试一下这个。 改一下while循环的条件，另外，再改一下最后一个else if判断条件。即将上面的low <= high等号放到下面去判断 非常感谢点拨！可以的，当while的测试条件如此改变后，就避免了溢出的情况

user: user-2
content: int bisearch(int v[],int x,int low,int high) { 	int mid; 	while( low<high-1) 	{ 		mid= low+(high-low)/2; 		if(x>v[mid]) 		{ 		   low=mid; 		} 		else 		{ 			high=mid; 		} 	} 	if( x==v[low]) 		return low; 	else if( x==v[high]) 		return high; 	else 		return -1; }

user: user-2
content: int bisearch(int v[],int x,int low,int high) {     int mid=(low+high)/2; //这里如果low和high足够大，将溢出。     while(low<=high&&x!=v[mid])     {         if(x>v[mid])             low=mid+1;         else             high=mid-1;         mid=(low+high)/2;     }     if(x==v[mid])         return mid;     else if(low>high)         return (x>v[low])?low+1:low; //   缺少一个else   如果要找的数不在序列中将出错 ，还有因为缺少一个分支所以要求严格的编译器将无法通过编译 }

user: user-0
content: 引用 5 楼 hdt 的回复:我看到两处bug 求教

user: user-2
content: 我看到两处bug

user: user-3
content: binarySearch和binsearch都怎么实现的？没看到啊
user-0 提问: 连续使用scanf（）遇到的一个问题

回复:
user: user-1
content: 引用 3 楼 weixin_41703094 的回复:用C方法可以fflush()清空缓冲区 fflush有时候是未定义的，可能跟具体实现有关。

user: user-2
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin)、scanf(“%*[^\n]%*c”); scanf里面的%和变量以及变量前加不加&的一一对应关系.

user: user-3
content: printf( "Enter first group of five digits: " ); fseek(stdin, 0, SEEK_END);  scanf( "%1d%1d%1d%1d%1d", &i1, &i2, &i3, &i4, &i5 ); printf( "Enter second group of five digits: " ); fseek(stdin, 0, SEEK_END);  scanf( "%1d%1d%1d%1d%1d", &j1, &j2, &j3, &j4, &j5 );

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

user: user-5
content: 格式化输入串中加入分隔符号.

user: user-6
content: 引用 3 楼 weixin_41703094 的回复:用C方法可以fflush()清空缓冲区 这个是未定义行为，不保证所有正常编码器下都有效 详情可以参考http://bbs.csdn.net/topics/320073944

user: user-7
content: 加个清楚缓冲区的就行了

user: user-4
content: rewind(stdin);

user: user-8
content: 用C方法可以fflush()清空缓冲区

user: user-9
content: scanf是根据输入的内容，一一匹配 如果第一次输入6个数字，那么不能通过返回值来判断，判断了也不会返回出错，因为第六个输入不会进入第一个scanf对应的变量里。它还在输入缓存里。  printf( "Enter first group of five digits: " );     scanf( "%1d%1d%1d%1d%1d", &i1, &i2, &i3, &i4, &i5 );     while (getchar() != ‘\n') ;     printf( "Enter second group of five digits: " );     scanf( "%1d%1d%1d%1d%1d", &j1, &j2, &j3, &j4, &j5 ); 简单处理，考虑用这种方法   #include<stdio.h> int main() {       int i1, i2, i3, i4, i5;     int j1, j2, j3, j4, j5;      printf( "Enter first group of five digits: " );     scanf( "%1d%1d%1d%1d%1d", &i1, &i2, &i3, &i4, &i5 );      while (getchar() != '\n')         ;     printf("%d %d %d %d %d\n", i1, i2, i3, i4, i5);     printf( "Enter second group of five digits: " );     scanf( "%1d%1d%1d%1d%1d", &j1, &j2, &j3, &j4, &j5 );     printf("%d %d %d %d %d\n", j1, j2, j3, j4, j5); } 建议试一下

user: user-10
content: 判斷scanf的返回值，小於要輸入的變量個數就是出現錯誤了；在下一次調用之前清空緩衝區，就可以避免取到多輸入的内容。
user-0 提问: 写任务计划

回复:
user: user-1
content: 项目属性——链接器——清单文件——UAC执行级别：改成：requireAdministrator (/level='requireAdministrator')

user: user-0
content: 引用 3 楼 paschen 的回复:以管理员方式打开CMD窗口执行 只能这样吗? 哎 版主 有程序获取管理员权限demo不 vc的

user: user-0
content: 引用 2 楼 user-2 的回复:DOS是以管理员方式运行的吗？有没有使用兼容WIN7的方式运行过？ 只有在win10上只有管理员权限才能吗? 那我要是在vc++中 那不是还得提示本程序管理权限?

user: user-1
content: 以管理员方式打开CMD窗口执行

user: user-2
content: DOS是以管理员方式运行的吗？有没有使用兼容WIN7的方式运行过？

user: user-0
content: 顶
user-0 提问: C代码使用GetDiskFreeSpaceEx获得磁盘分区大小信息，返回值是以字节数表示，我想用字节数/512，表示成扇区数，为什么不成功？谢谢！

回复:
user: user-1
content: 不能简单除以 512 的，用 GetDiskFreeSpace 获取扇区大小，再除。

user: user-2
content: #ifndef UNICODE #define UNICODE #endif // UNICODE  #include<stdio.h>  #include<windows.h>  #include <stdlib.h>   CHAR buf1[52428800]; //定义全局字符数组变量，大小50M   BOOL GetDiskSpaceInfo(LPCWSTR pszDrive){  DWORD64 qwFreeBytesToCaller = 0, qwTotalBytes = 0, qwFreeBytes = 0;  BOOL bResult = FALSE;  //使用GetDiskFreeSpaceEx获取磁盘信息并打印结果 bResult = GetDiskFreeSpaceEx(pszDrive,  (PULARGE_INTEGER)&qwFreeBytesToCaller,  (PULARGE_INTEGER)&qwTotalBytes,  (PULARGE_INTEGER)&qwFreeBytes);  if (bResult){  printf("使用GetDiskFreeSpaceEx获取磁盘信息\n");  printf("可获得的空闲空间（字节）：\t%I64d\n", qwFreeBytesToCaller);  printf("空闲空间（字节）：\t\t%I64d\n", qwFreeBytes);  printf("磁盘总容量（字节）：\t\t%I64d\n", qwTotalBytes);  }  return bResult;  }  int main(int argc, PCHAR argv[]){  GetDiskSpaceInfo(L"D:");   int i = 0;  int a = 0;  int num_str = 0;  DWORD RSize = 0;   DWORD64 qwFreeBytesToCaller = 0, qwTotalBytes = 0, qwFreeBytes = 0;  BOOL bResult = FALSE;  //使用GetDiskFreeSpaceEx获取磁盘信息并打印结果 bResult = GetDiskFreeSpaceExA("C:",  (PULARGE_INTEGER)&qwFreeBytesToCaller,  (PULARGE_INTEGER)&qwTotalBytes,  (PULARGE_INTEGER)&qwFreeBytes);   if (bResult){  printf("使用GetDiskFreeSpaceEx获取磁盘信息\n");  printf("可获得的空闲空间（字节）：\t%I64d\n", qwFreeBytesToCaller);  printf("空闲空间（字节）：\t\t%I64d\n", qwFreeBytes);  printf("磁盘总容量（字节）：\t\t%I64d\n", qwTotalBytes);  };  printf("磁盘总容量（扇区）：\t\t%I64d\n", qwTotalBytes/512);          return 0;  }

user: user-0
content: 就是这样，提示：未找到源

user: user-3
content: 不成功是什麽意思？輸出不符合預期？還是segment fault？
user-0 提问: c语言设计时间差的问题

回复:
user: user-1
content: 引用 3 楼 qq_41603109 的回复:我写的没错啊 注意看一下你的双引号引到哪儿了？

user: user-0
content: 我写的没错啊

user: user-1
content: #include <stdio.h> int main() {     int hour1,minute1;     int hour2,minute2;           scanf("%d %d",&hour1,minute1);     scanf("%d %d",&hour2,minute2);           int t1 = hour1 * 60 + minute1;     int t2 = hour2 * 60 + minute2;           int t = t2 - t1;           printf("时间差的%d小时%d分钟。", t/60, t%60);       return 0;  }   scanf编译应该会提示警告，至少会有警告；因为scanf的参数不对。 改成这样：     scanf("%d %d",&hour1,minute1);     scanf("%d %d",&hour2,minute2);

user: user-2
content: scanf("%d %d,&hour1,&minute1");     scanf("%d %d,&hour2,&minute2");

user: user-1
content: 引用 2 楼 cfjtaishan 的回复:#include <stdio.h> int main() {     int hour1,minute1;     int hour2,minute2;           scanf("%d %d",&hour1,minute1);     scanf("%d %d",&hour2,minute2);           int t1 = hour1 * 60 + minute1;     int t2 = hour2 * 60 + minute2;           int t = t2 - t1;           printf("时间差的%d小时%d分钟。", t/60, t%60);       return 0;  }   scanf编译应该会提示警告，至少会有警告；因为scanf的参数不对。 改成这样：     scanf("%d %d",&hour1,minute1);     scanf("%d %d",&hour2,minute2); minute1,2也需要加&  scanf("%d %d",&hour1, &minute1);     scanf("%d %d",&hour2, &minute2);

user: user-3
content: scanf("%d %d,&hour1,minute1"); scanf("%d %d,&hour2,minute2");   改为   scanf("%d %d",&hour1,&minute1); scanf("%d %d",&hour2,&minute2);

user: user-4
content: minute1也要改成&minute1

user: user-0
content: 引用 6 楼 user-5 的回复:scanf("%d %d,&hour1,minute1"); 改成： scanf("%d %d",&hour1,minute1);  注意右引号位置谢谢  我已经改了

user: user-0

user: user-5
content: scanf("%d %d,&hour1,minute1"); 改成： scanf("%d %d",&hour1,minute1);  注意右引号位置

user: user-0
content: 引用 4 楼 cfjtaishan 的回复:[quote=引用 3 楼 qq_41603109 的回复:] 我写的没错啊 注意看一下你的双引号引到哪儿了？[/quote]哦好低级的错误  主要是编译没问题没警告  但是我改了后怎么在命令窗口输入  一回车就强行停止
user-0 提问: 请问大神我这道题的算法错在哪里？

回复:
user: user-0
content: 引用 2 楼 liugc2008 的回复:没跑过，我是看着，2<=n,m<=20，就这个条件，你的程序就不满足，ACM肯定通不过的。。。 啊？   应该怎么改？     我刚刚传了代码的截图，看得更清楚一些。。。

user: user-0
content: 引用 1 楼 hdt 的回复:怎么个加密？ 就是原来是一个n*m的二维数组，解码的过程就是对其从上往下以“弓形”的方式读取 ，得到一个数字序列。

user: user-0

user: user-1
content: 没跑过，我是看着，2<=n,m<=20，就这个条件，你的程序就不满足，ACM肯定通不过的。。。

user: user-2
content: 怎么个加密？
user-0 提问: c语言程序有问题，求解答，菜鸟求轻踩

回复:
user: user-1
content: 單步調試看在哪裏出問題了

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h>  enum        NumberDefine     {two, three, four, five, six, seven, eight, nine, ten, jack, queen, king, ace, joker  }; const char* NumberString[] = {"2", "3",   "4",  "5",  "6", "7",   "8",   "9",  "10","J",  "Q",   "K",  "A", "Joker"}; enum        ColourDefine     {spade, heart, club, diamond}; const char* ColourString[] = {"黑桃","红桃","梅花","方块"}; const int   CountOfNumber = 13; const int   CountOfColour = 4; const int   CountOfJoker  = 2; const int   CountOfCards  = 52;  typedef unsigned char byte;  typedef struct tagPoker {     byte number;     byte colour; }Poker;  void swapCards(Poker* cards, int first, int second) {     Poker temp;     if(first != second)     {         memcpy(&temp,          &cards[first],  sizeof(Poker));         memcpy(&cards[first],  &cards[second], sizeof(Poker));         memcpy(&cards[second], &temp,          sizeof(Poker));     } }  Poker* produceCards(int countOfPack) {     Poker* cards = (Poker*)malloc(sizeof(Poker)*CountOfCards*countOfPack);     int pack = 0, colour = 0, number = 0, index = 0;     for(pack = 0; pack < countOfPack; pack++)     {         for(colour = 0; colour < CountOfColour; colour++)         {             for(number = 0; number < CountOfNumber; number++)             {                 cards[index].number = number;                 cards[index].colour = colour;                 index++;             }         }     }     return (cards); }  void shuffleCards(Poker* cards, int countOfPack) {     int count = countOfPack*CountOfCards;     int i = 0;     srand((unsigned)time(NULL));     for(i = 0; i < count; i++)     {         swapCards(cards, i, rand()%count);     } }  void displayCards(Poker* cards, int countOfPack) {     int count = countOfPack*CountOfCards;     int i = 0;     for(i = 0; i < count; i++)     {         printf("%003d: %s%s\n", i, ColourString[cards[i].colour], NumberString[cards[i].number]);     } }  void destroyCards(Poker* cards) {     free(cards); }  int main(void) {     int countOfPack = 1;     Poker* cards = produceCards(countOfPack);     printf("------------------------------\n");     displayCards(cards, countOfPack);     shuffleCards(cards, countOfPack);     printf("------------------------------\n");     displayCards(cards, countOfPack);     destroyCards(cards);     return (0); }
user-0 提问: 关于在消息响应函数中创建窗口的问题

回复:
user: user-1
content: 会不会是同步、异步的区别

user: user-2
content: 《深入浅出MFC》

user: user-0
content: 引用 3 楼 leetow2006 的回复:会不会是同步、异步的区别 能详细说下嘛？

user: user-0
content: 引用 1 楼 liugc2008 的回复:你理解偏差了，有一种是虚函数，比如PostNcDestroy，这种是即时响应的。当然我说的是MFC，但是殊途同归。 而所有的消息响应机制中，消息的处理过程也是有队列的，你POST了WM_XXX，也要等到系统取到这个消息之后才响应。所以说，无论什么消息，只要消息队列不空，就没法即时响应，除非调用别的类似GetMessage或查看消息队列的函数，具体名称忘记了。  这点我之前查的时候有看到，PostQuitMessage在将WM_QUIT放入队列后不会等到它响应会直接退出来，但是还是不懂为什么WM_CLOSE中放入队列的WM_QUIT会一直得不到响应，但是WM_DESTROY中放入队列的WM_QUIT可以得到响应呢？ 不好意思，新手有点转不过这个弯

user: user-3
content: 你理解偏差了，有一种是虚函数，比如PostNcDestroy，这种是即时响应的。当然我说的是MFC，但是殊途同归。 而所有的消息响应机制中，消息的处理过程也是有队列的，你POST了WM_XXX，也要等到系统取到这个消息之后才响应。所以说，无论什么消息，只要消息队列不空，就没法即时响应，除非调用别的类似GetMessage或查看消息队列的函数，具体名称忘记了。
user-0 提问: C语言中：栈的伸展方向到底是什么啊？ 我今天被嘲笑了。。

回复:
user: user-1
content: 栈的伸展方向和处理器有关。早一些的51系列是向高地址生长的，称为正向生长。8086系列是向低地址生长的，称为逆向生长。

user: user-2
content: 你没有控制变量，输出的地址谁大谁小受栈生长方向和局部变量分配顺序两个英雄。 栈的生长方向是取决于处理器所采用的指令架构的。 而你的使用的测试代码的输出不但涉及到栈的生长方向；还涉及到编译器给局部变量分配空间的顺序问题，而对于这个问题（实际上标准是没有规定的，因为没必要，因为编程者想要的只是一个抽象的可以存储东西的变量，而不关心a和b在内存中的绝对位置或者相对位置，如果你需要固定相对位置的话，可以通过struct或者数组解决），既然没有规定，那么编译器的实现者就可以自由发挥了。 另外，从编译原理的角度来看，debug和release两种模式下的编译器是两个编译器，因为它们生成的目标代码不一样（虽然目标代码所属的种类一样）。当然，debug和release出现这样的差异的确比较神奇（不过可能debug和release是两个小组的人员分别实现不同的部分，然后共有部分又是一批人实现的），对于语言标准没定，而且又不怎么要紧的实现细节出现不一致也不是什么难以理解的事） 当然，虽然局部变量的分配顺序没定，但是函数调用时参数传递压栈的顺序是有规定的（如果需要详细了解细节，应当查看调用规范。__cdecl,__fastcall,__stdcall,__pascal）。 当然，你在debug和release模式下的运行不一致，说明应该是两种模式下编译器的解释不一致，具体可以生成汇编代码查看。

user: user-1
content: 栈的伸展方向是不确定的，这一点在<UNP>中有谈到，栈的伸展方向并没有统一的规定，只区分地址的大小端。可能是自顶而下，也可能是自下而上。

user: user-3
content: http://blog.csdn.net/fengjunwang1980/article/details/51964844

user: user-3
content: 8086的堆栈指针，压栈时，SP减去2，是按照地址递减的方向生成堆栈； 8031的堆栈指针，压栈时，SP加上1，是按照地址递增的方向生成堆栈。 arm 甚至可以改变。

user: user-4
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-5
content: 特别是2#3#答乃所问

user: user-5
content: 1-9#说的对，10#12#讲的不对

user: user-3
content: 和所使用的cpu硬件结构有关,如同 大小 端 问题。

user: user-6
content: 由高地址向低地址生长

user: user-7
content: 你可以用struct包起来再看，struct里按顺序来的

user: user-8
content: 栈的伸展方向说白了，就是入栈时堆栈指针是从高地址向低地址递减还是堆栈指针是从低地址向高地址递增。       具体中哪种，和所使用的单片机硬件结构有关。

user: user-9
content: 这个楼主看一下反汇编，变量声明通常是顺序生命的，也就是IP(Instruction Pointer)增长的方向，这样便于人的理解，而楼主所说的栈，是程序调用栈，是在函数调用之前，即汇编call之前的函数参数入栈过程，即push，这个栈的顺序是逆IP方向的，这样的设计好处是充分利用地址空间。楼上所说的调用约定（Calling Convention），跟你说的我觉得是不一样的。楼主可以看一下函数调用，稍微学一下汇编，就懂了。

user: user-10
content: 该语言标准并没有规定，可以向上可以向下，，但操作系统规定是向下的

user: user-11
content: 四种物件的生存方式(in stack、int heap、global、local static)

user: user-12
content: 并没有规定栈一定要向哪个方向伸展，这个跟具体的cpu架构有关，有向上的有向下的 int a,b这个也没有规定哪个先入栈哪个后入栈，不同的编译器不同的情况有不同完全是可能的  最后，这个问题其实并不重要，绝大多数情况下你并不应该关心它向上增长还是向下增长 记得先进后出就好了

user: user-13
content: 其实我是看到“嘲笑”两个字进来的。  1.会嘲笑别人的人，一般都是半桶水，区别只是大半桶还是小半桶而已； 2.想学东西，或者想做事情，就不要怕嘲笑，脸皮一定要厚实才行。

user: user-14
content: 栈确实是从高到低增长  你写的代码需要注意编译器的调用方式：  cdecl、stdcall、fastcall函数调用  详细文档http://blog.csdn.net/fly2k5/article/details/544112

user: user-15
content: 从C语言层面上不好解释,在汇编层面又是基础知识. 局部变量申请一般都是sub esp 8这类的指令,也可以说是由高地址向低地址生长,建议看下汇编相关的知识,不是很复杂的.

user: user-16
content: int a,b; 标准并没有要求编译器非得把a放在b的前面，你定义a b变量也不是一个压栈的过程，和栈生长方向没什么关系
user-0 提问: realloc(): invalid next size求助

回复:
user: user-1
content: 直接把sizeof(char **)改成4

user: user-1
content: sizeof前面加个(unsigned)试试

user: user-2
content: array = (char ***)realloc(array, sizeof(char **) * capacity); 这个扩容有问题吧，大小没变化呢，是不是应该是： array = (char ***)realloc(array, sizeof(char **) * sum);

user: user-3
content: 单步跟踪程序运行，观察变量变化情况，分析原因
user-0 提问: 求回答

回复:
user: user-1
content: 就是想修改文件的名字吧？那可以搜一下函数rename() 这里有具体的例子http://www.yiibai.com/c_standard_library/c_function_rename.html

user: user-0
content: 引用 4 楼 cfjtaishan 的回复:已建立的意思是已经创建？ 如果是，建议搜一下系统函数rename 这个函数有印象,

user: user-2
content: 这么不通顺的句子都能看懂

user: user-3
content: 已建立的意思是已经创建？ 如果是，建议搜一下系统函数rename

user: user-4
content: int rename(char * oldname, char * newname);

user: user-5
content: 文件操作  rname

user: user-6
content: 可以啊，用C语言的方式修改。 linux就可以。Shell 指令
user-0 提问: float 怎么就近似成0了

回复:
user: user-1
content: 这里发生了隐式类型转换 a 是int ，3也是整形，所以 (a/3)运算的结果，c++规定为int。 b=a/3.0;改为 这样就对了。 更详细的只是，楼主请看 c++primer 隐式类型转换这一节

user: user-2
content: 两个整数相除结果还是整数 然后把整数存到一个浮点数变量中 其中一个为浮点数 则结果也为浮点数

user: user-3
content: 你这里进行的是整数除法，所以结果是0，你要浮点数除法的话写成：b=a/3.0f;  或者 b=(float)a / 3;
user-0 提问: 关于在lcd上显示一张jpg图片的程序~~编译通过了，但启动程序后没有任何显示~~求解！！

回复:
user: user-1
content: 沒錯，先分模塊測試，一點點來。

user: user-2
content: 看你代码的逻辑，可以分开测试一下 先读取一个rgb数据的文件，写入lcd设备，是否能够正常显示 如果可以正常显示，读取jpg文件转成rgb数据，在写入lcd设备，是否能够正常显示

user: user-3
content: 程序这么长，总得自己慢慢调试啊。别人拿去一般也只能通过调试发现问题。
user-0 提问: 学了C的困惑

回复:
user: user-1
content: 给自己定一个学习的方向和目标，再定向学习和看相关的书籍，做好笔记，这样进步会快些~~

user: user-2
content: 參加一個實際的項目，雖然不一定是技術很深的，但能讓你看到技術在業務上的應用。

user: user-3
content: 学C是一个渐进的过程，学习的过程注重实践，总结；实践是不停的写和调试，也可以抄写别人的代码，然后分析和修改，再调试。遇到问题，或多某个问题认识模糊，建议自己先解决，不论是通过写代码调试还是通过看书找答案，都要自己先动手。然后，还可以考虑上网搜，对于初学者遇到问题在网上基本上都能找到答案。  http://blog.csdn.net/cfjtaishan/article/details/53672594

user: user-4
content: 学习c函数的源码。

user: user-5
content: 题库刷题&&看下纯面向对象的java

user: user-6
content: 楼主如果想用C玩玩图形、小游戏编程，可以了解一下EasyX，EasyX是Windows平台最简单的绘图函数库（名副其实），兼容BC和TC的绘图函数，在VC下用EasyX来编程跟在TC下编程绘图差不多是完全一样的。EasyX既可以绘图，也支持图像显示和处理。  下载一个EasyX包，里面有完整的函数手册EasyX_Help.chm，有示例。EasyX官网有很多网友上传的实例，包括游戏。  仅供参考： 用绘图语句画机器猫（初学C语言的同学必看） http://blog.163.com/tab_98/blog/static/1192409720150316223680/
user-0 提问: 一个程序 求大神解答一下

回复:
user: user-1
content: include <stdio.h>  int main(void) {     float a;     int b;     int c;     int d;     int e;     printf("请输入你的分数:");     scanf("%f", &a);      b = (a<=100) && (a>=85);     c = (a<85) && (a>=70);     d = (a<70) && (a>=60);     e = (a<60) && (a>=0);      if (b==1)     {         printf("优秀");     }     else if (c==1)     {         printf("良好");     }     else if (d==1)     {         printf("及格");     }     else if (e==1)     {         printf("补考");     }     else     {         printf("请重新输入");     }     return 0;  } 判断表达式变成了字符串，去掉双引号即可。  另外，对于多个判断，建议使用switch case

user: user-2
content: 楼上正解 你那个是一串字符串 if 恒为true

user: user-3
content: else if ("d==1") else if ("e==1")  ?? 你是复制粘贴的吧，条件判断没有“”的
user-0 提问: 关于C语言指针的一个问题 新人求大牛指点

回复:
user: user-1
content: q并沒有靜態分配，這一點理解有誤了，他是未分配狀態。

user: user-2
content: 此int *p 非*p=8;

user: user-3
content: #include<stdio.h> #include<malloc.h>  int main() {     int* q;     int* p=(int*)malloc(sizeof(int));     if (!p)         return 1;      *p = 5;     *q = 6;      printf("%d",*p);     printf("%d",*q);      return 0; } 因为p指向了堆上的空间，是有效的空间。 q指针是野指针，指向的区域是随机的。若指向的是不可读写的区域，那么就会导致段错误～

user: user-4
content: q就没有分配内存呀，所以报错

user: user-5
content: 一般我们用指针，用到两个概念：指针本身，称之为 P (Pointer)，指针指向的值，称之为 V (Value)。事实上，指针指向的值 V，也只是人为定的一个概念。因为指针指向的值和指针的值，其实就是两个独立的值。但值 P 其实是 V 的地址，这就人为将其建立了关联。通俗点讲，P 的值是 V 的“家庭住址”。不过 P 自身也有“家庭住址”，但不在我们讨论之列。你用 *P 这种写法，表示通过家庭住址来更换这个家庭中的东西，那前提是 P 这个“家庭住址”是有效的，并且你有权访问的。  一般我们在 C 中声明指针：int *p;如果仅仅是这样声明，没有初始化或赋值，只能称之为野指针。你没初始化，他的值是不确定的。你通过 *p 来读取（实地考察观看）这个不确定的“家庭住址”，那是没问题的。但是你如果要修改这个地址，一般只有两种可能：这个地址是别的程序的数据空间（已经有人居住，别人家的房子），或者说这里你没有权限写入（无法居住，没有房子，甚至连地都没有，比如大海）。当然是无效的了！通过指针访问数据，当然得有对应的实体，要不你访问哪的数据呢？  要通过指针间接更改其他变量的值：int n = 1;                    // 声明整型 n int *p = &n;                  // 声明指针 p 指向整型变量 n *p = 2;                       // 通过指针修改 n 的值为 2int *p = malloc(sizeof(int)); // 声明一块能够存放得下一个 int 大小的新空间 *p = 2;                       // 通过指针修改该新申请的空间以 int 方式储存值为 2 的整数 free(p);                      // 告诉系统你不再使用这块空间int *p; *p = 1;                       // WTF！自己写了一个存单就想去银行取钱？自己随便写了一个房产证就想强行入住？

user: user-0
content: int* q 的意思不是 给它分配一个int*类型的空间么？q不是有空间了么？

user: user-6
content: 没有分配空间 赋的值往哪里存 指针只有分配空间或者说指向一片内存才可以直接赋值
user-0 提问: 请问下这个函数中有两个return怎么回事呢？

回复:
user: user-1
content: 判断N为0则return   非0继续第一个return后的逻辑

user: user-2
content: 满足某一特定条件后返回

user: user-3
content: 第一个return是递归条件结束，也就是递归出口 第二个return是函数结束，其实不用加的，多此一举

user: user-4
content: 根据不同的判断条件看，来返回

user: user-5
content: if ( !N )   成立就直接退出了

user: user-6
content: 看来是个递归，第一个return是当N为0时返回void，第二个return是函数执行完了的标志。

user: user-7
content: if ( !N )  //递归结束条件     return;  递归函数一定要有结束条件

user: user-8
content: 用断点看一下，有利于你的理解

user: user-9
content: 第一个是对if（） ，第二个是对函数void（）。

user: user-10
content: 引用 5 楼 user-17 的回复:我写程序的时候，还有用过 3 个 return 的呢。  好厉害的样子

user: user-11
content: 后面就是     多此一举

user: user-12
content: N=2或者3时，一步一步走个单步看看，就知道两个return是什么意思了。其实就是个递归函数。

user: user-13
content: return是直接返回的意思，退出函数执行；即return后面的代码不会继续执行。 return返回的内容根据函数定义的返回值来定，若没有返回值，则直接跳出函数执行，释放函数资源；

user: user-14
content: 一个函数中有多个return是很正常的，return就是函数返回嘛，没什么呀！

user: user-15
content: if ( !N )  //递归结束条件     return;  return; //这个是最后的返回，void类型，其实要不要都可以，通常这种情况不写这个return

user: user-16
content: 不同结束程序的条件

user: user-17
content: 我写程序的时候，还有用过 3 个 return 的呢。
user-0 提问: 新手求教

回复:
user: user-1
content: 冒个泡。。。

user: user-2
content: vs现在用scanf_s替代scanf了

user: user-3
content: scanf("%s", &a);这个有问题吧，a是数组名，就是数组的首地址，所以scanf("%s", a);

user: user-4
content: 代码没问题， VS2015编译时需要在 预处理器->预处理器定义里添加一个_CRT_SECURE_NO_WARNINGS，否则会报scanf不安全的错误（如楼上所说用scanf_s，如果想继续用scanf就按前面说的添加一个_CRT_SECURE_NO_WARNINGS就OK）

user: user-5
content: 推荐看一下scanf的原型 int scanf(const char *format, ...); The  scanf()  family  of  functions  scans input according to format as        described below.  This format may  contain  conversion  specifications;        the  results from such conversions, if any, are stored in the locations        pointed to by the pointer arguments that follow format.   Each  pointer        argument  must  be of a type that is appropriate for the value returned        by the corresponding conversion specification.         If the number of conversion specifications in format exceeds the number        of  pointer  arguments,  the  results  are undefined.  If the number of        pointer arguments exceeds the number of conversion specifications, then        the excess pointer arguments are evaluated, but are otherwise ignored.         The  scanf() function reads input from the standard input stream stdin,        fscanf() reads input from the stream pointer stream, and sscanf() reads        its input from the character string pointed to by str.

user: user-6
content: scanf("%s", a); 去掉a前的&;因为a是字符数组，数组名本身就是地址，因此不需要加&;

user: user-7
content: vc6编译环境很低，你换c-free试试，程序没啥问题

user: user-8
content: 代码在vc6.0中可以运行，说明代码没有问题。 VS2015在创建工程的时候，和vc6.0是不一样的，很明显VS2015的编译环境你不熟悉。你百度一下、关于vs单个文件编译运行的问题。

user: user-9
content: 输入到a数组的时候 不要加&       只写个a试试 scanf(.....,&a)  ->  scanf(...,a)
user-0 提问: 关于if的问题

回复:
user: user-1
content: 浮点数是有精度的，你的理解是110 < 100 * 1.1是不成立的 但是100*1.1的结果可能是110.00000001,在满足精度的情况下，他是合理的，所以可能会输出OK

user: user-2
content: 是，可能是精度问题

user: user-3
content: 运算符优先级你看一下

user: user-4
content: 这是有可能的。因为a,b都是浮点数，浮点数是有精度的，普通输出%lf都是小数点保留6位，可以通过%.20lf或者更多，就可以找到为什么会a < b * 1.1为真了。  #include<stdio.h>  int main() {     double a,b,c,x;     scanf("%lf %lf",&a, &b);     printf("%.0lf %.0lf\n",a,(a-b)/b*100);      printf("%.20lf %.20lf\n", a, b);     printf("%.20lf \n", b * 1.1);     if(a < b * 1.1) {         printf("OK\n");     }     else if(a>=b*1.1&&a<b*1.5){         printf("Exceed %.0lf%%. Ticket 200\n",(a-b)/b*100);     }     else if(a>=b*1.5){         printf("Exceed %.0lf%%. License Revoked\n",(a-b)/b*100);     }      return 0; } 对于浮点数判断大小不能按照整数判断大小的方法了，建议使用如下方法：  如果fabs(a-b)<=1e-6，那么就是相等了。 fabs是求浮点数绝对值的函数。 类似的 判断大于的时候，就是if(a>b && fabs(a-b)>1e-6)。 判断小于的时候，就是if(a<b&&fabs(a-b)>1e-6)。
user-0 提问: 求高手解答strcpy()的一点疑问

回复:
user: user-1
content: 完全可以那样写啊！把不等于0去掉也没问题啊

user: user-2
content: '\0'实际值是0，所以省略掉实际是一样的，只是可读性没那么好

user: user-3
content: 引用 1 楼 cfjtaishan 的回复:while (*strDest++=*strSrc++;);  是可以的。个人认为没问题；因为'\0'对应的十进制值就是0；0就是判断false，退出循环； while (*strDest++=*strSrc++);  抱歉手误，多加了一个分号

user: user-3
content: while (*strDest++=*strSrc++;);  是可以的。个人认为没问题；因为'\0'对应的十进制值就是0；0就是判断false，退出循环；
user-0 提问: 请教各位大大一个指针问题，有关strtok函数的。

回复:
user: user-1
content: 这是一个返回局部地址内容的操作，当split函数调用结束后，backup会被自动释放，那么你返回backup中的一个子串是没有意义的，也是未定义的行为； 建议这样操作；  char* split(char *buf, int pos, char *token, char *substr) {     char *hehe;     char *content;     char backup[100];     memcpy(backup, buf, 20);     content = strtok_s(backup, token,&hehe);     for (int i = 0; i < (pos-1); i++)     {         content = strtok_s(NULL, token, &hehe);     }     memcpy(substr, backup, strlen(backup) + 1);     //printf("%s\n", backup);      return substr; }  int main() {     char string_test[] = "no,yes,love,you";     char substr[32];     char *obj = split(string_test, 3, ",", substr);     printf("%s\n", obj);      return 0; } 这只是其中一种方法，如果有更好的，建议采纳更好的

user: user-2
content: 这里有使用方法和例子：https://msdn.microsoft.com/en-us/library/ftsafwz3.aspx

user: user-3
content: content每次返回的是下一次字符串的首地址，因为分隔符被替换为/0了。最后一个分割，content会指向字符串的最末位置的下一位置，就是无效字符串 还有你既然分割字符串，那肯定是很多个子串，你单单返回一个字符串是什么作用？
user-0 提问: 新手C求教指导~~~

回复:
user: user-1
content: puts(++ptr);以后指针移动了

user: user-2
content: #include<stdio.h> int main(void) { char note[] = "See you at the snack bar."; char * ptr; ptr = note; puts(ptr); puts(ptr+1); note[7] = '\0'; puts(note); puts(ptr); puts(++ptr); return 0; }  你在开始的时候已经对指针进行更改了。。。

user: user-3
content: 这是因为第一个puts(++ptr);此时的ptr已经指向了字符串node的第二个字符，即'e'，所以再次puts(ptr)时，应该是从"See"的第一个'e'开始输出；最后一个puts(++ptr);ptr指向了“See"的第二个字符'e'，因此输出是"e you"  个人建议通过打印出ptr的地址，这样能更好的分析原因： #include<stdio.h>  int main(void) {     char note[] = "See you at the snack bar.";     char * ptr;     printf("0. note: %p\n", note);     ptr = note;     printf("1. pstr: %p\n", ptr);     puts(ptr);      puts(++ptr);     printf("2. pstr: %p\n", ptr);     note[7] = '\0';     puts(note);     puts(ptr);     puts(++ptr);     printf("3. pstr: %p\n", ptr);     return 0; }
user-0 提问: 我是新手，请问大神这里是什么情况，怎么错了？

回复:
user: user-1
content: 信息不够，结构体声明没有提出来； 从目前贴出的代码来看，code是野指针，直接给野指针赋值会导致运行时段错误； 建议楼主将完整代码贴出来，不要帖图片，若是编译结果可以贴图片。

user: user-2
content: 除了上面两位说的，你是不是库文件没有调用完全啊。 信息量太少了，你错误代码都没有

user: user-3
content: 用malloc分配一下空间，没有分配内存应该是

user: user-0
user-0 提问: 新手求助

回复:
user: user-1
content: 不仅仅是变量还包含格式 %0.2f之类的，还有你让printf如何判断你的数据是什么类型，这需要运行时信息的支撑吧？

user: user-2
content: 一个int变量，由于根据需要要各种格式输出，比如%c输出，%lu，%d， %lf, %f。那么printf需要根据格式来判定应该输出什么数据; 最重要的是printf函数接收的不是变量，而是变量值，比如  int val = 5; printf("%d", val);  这个操作是val传递给printf，其实是将val变量对应内存空间的值传给printf而不是变量。
user-0 提问: 【求助】我是c语言初学者，关于for循环我有问题要问大神

回复:
user: user-1
content: for(j=0,k=5;j<6,k>=0;j++,k--) 这句需要注意，如果j < 6 和 k >= 0是逗号连接，那么根据逗号运算符的特点，取最后一个表达式的值，那么for循环的判断就是根据k >=0是否为真，那么j < 6就没有意义了。 这一点需要注意，看一下你的想法是不是这样的，还是j < 6 && k >= 0；这个&&标识两个表达式同时为真才可以继续循环，否则退出循环；
user-0 提问: 搞不懂的C输入

回复:
user: user-0
content: 按照楼上改了之后本地运行成功，上交网上测评仍然失败，按照下面的输入格式来就都成功了 int main(void) { 	int p=0; 	char tmp;  //p条道路 	scanf("%d",&p); 	int i=0; 	for(i=0;i<p;i++){//输入a，b牧场以及他们之间的距离 		input(); 	} 	run(25,0); 	printf("%c %d\n",minC+'A',min); 	return 0; } void input() { 	char a=' ',b=' '; 	int t; 	while(a==' '||a=='\r'||a=='\n') a = getchar(); 	while(b==' '||b=='\r'||b=='\n') b = getchar(); 	scanf("%d",&t); 	a = (a>='A'&&a<='Z'?a-'A':a-'a'+26);       //用0～25代表大写字母，用26～52代表小写字母 	b = (b>='A'&&b<='Z'?b-'A':b-'a'+26); 	if(map[a][b]!=0&&t>map[a][b]){      //如果a，b此前已经录入过，则比较a，b之间道路的距离，录入距离短的 		return; 	} 	map[a][b] = t;  //a-b距离为t 	map[b][a] = t;  //b-a距离为t 	check[a] = 1;  //标记a，b农场此时已经被写入map 	check[b] = 1; }

user: user-1
content: void input(int n) {     char a=' ',b=' ',tmp;     int t;     int i=0;     for(i=0;i<n;i++){//输入a，b牧场以及他们之间的距离         getchar();    /*recv ‘\n'上次输入的换行符*/         scanf("%c %c %d",&a,&b,&t);         a = (a>='A'&&a<='Z'?a-'A':a-'a'+26);       //用0～25代表大写字母，用26～52代表小写字母         b = (b>='A'&&b<='Z'?b-'A':b-'a'+26);         printf("a = %d, b = %d\n", a, b);   /*check a, b*/         if(map[a][b]!=0&&t>map[a][b]){      //如果a，b此前已经录入过，则比较a，b之间道路的距离，录入距离短的             continue;         }         map[a][b] = t;  //a-b距离为t         map[b][a] = t;  //b-a距离为t         check[a] = 1;  //标记a，b农场此时已经被写入map         check[b] = 1;     } }  出现段错误是因为数组下标越界，导致数组下标越界的是因为输入的数据不能和a, b, c对上号，对不上号的原因是%c比较特殊，因为它会匹配上次输入残留在输入缓存里的换行符'\n'； 解决办法详见上面的代码; 另外，判断是不是下标越界导致的段错误，可以打出a, b的值。  a = (a>='A'&&a<='Z'?a-'A':a-'a'+26);       //用0～25代表大写字母，用26～52代表小写字母         b = (b>='A'&&b<='Z'?b-'A':b-'a'+26); 这两行代码只能接收'a' ~'z'或'A' ~'Z'的字母，其他字符就很可能导致下标越界；

user: user-2
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

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

回复:
user: user-1
content: cprintf比printf更靠谱。

user: user-1
content: \t         光标向右跳到下一个Tab位置（如果Tab宽度约定为8，就是往右的下一个8*n+1处，从1开始数，n为整数） \b        退格（光标往左挪一个位置） 空格   空一格

user: user-2
content: 没什么原理吧，如果找原理，那么就是标准规定，规定'\t', '\b', ' '的输出格式
user-0 提问: 请教一个基础习题所出现的问题

回复:
user: user-1
content: Linux:Ctrl+D Windows:Enter,Ctrl+Z,Enter

user: user-2
content: 实测可以： 环境：windows 10            vs2017 commu.. 操作：ctrl c 和 ctrl z作为结束都可以达到目的

user: user-3
content: 引用 3 楼 destory27 的回复:ctrl + z   ctrl + c 都可以 ctrl+c直接退出了，没有输出了。 Linux下使用ctrl + d, windows下使用ctrl+z输入EOF； 可以根据你的变成环境输入对应的组合键

user: user-4
content: linux中，ctrl-c好像也可以结束

user: user-5
content: ctrl + z   ctrl + c 都可以

user: user-6
content: 结束键好像是ctrl + z 吧
user-0 提问: 新手求助

回复:
user: user-1
content: 想了解更多，建议从网上搜一下缓冲区分类（行缓冲，全缓冲以及无缓冲）。

user: user-1
content: 因为我们的输入是行缓冲，不输入回车我的输入的其他字符还在输入缓冲区里，没有进入内存里进行执行。所以，每次都需要输入回车才会将输入缓存里的字符刷到内存里，才会执行你的逻辑。
user-0 提问: 下面的代码运行后出现一堆乱码，请大神指导

回复:
user: user-0

user: user-1
content: #include<stdio.h>  double max(double a[3][5]);  int main(void) {     int i,j;     double ar[3][5];      printf("Please enter 3 couples of numbers and every includes 5 point-numbers:");     for(i=0;i<3;i++)     {         for(j=0;j<5;j++)             scanf("%lf", &ar[i][j]);         printf("Continue!\n");     }     for(i=0;i<3;i++)     {         for(j=0;j<5;j++)             printf(" %lf",ar[i][j]);         printf("\n");     }      double sum;     double total=0;     for(i=0;i<3;i++)     {         sum = 0;         for(j=0;j<5;j++)         {             sum = sum+ar[i][j];             total=total+ar[i][j];         }         printf("\nThe average of couple%d is %lf\n", i+1, sum/5);     }     printf("\nThe average of total is:%lf\n",total/15);     printf("\nThe maximum of these numbers is %f\n",max(ar));     printf("\nDONE!");      return 0; }  double max(double a[3][5]) {     int x,y;     double maximum = a[0][0];     for(x = 0; x < 3; x++)     {         for(y=0;y<5;y++)         {             if(a[x][y]>maximum)                 maximum=a[x][y];         }     }      return maximum; } 参考一下吧  主要是输入的格式应该用%lf。另外，输出时建议加上换行符'\n'

user: user-0
content: 多谢大家了。

user: user-0
content: 多谢大家了。

user: user-2
content: 很明显是你格式化输入或者是格式化输出的时候有问题。 代码本身应该没有太大的问题，不然程序没法运行。

user: user-3
content: double型数据输入是scanf("%lf",&ar[i][j]); %f  改为%lf
user-0 提问: \b的用法

回复:
user: user-1
content: 仅供参考：#include <conio.h> #include <stdio.h> char pw[40]; int i,ch; FILE *f; void main() { 	cprintf("\r\nPassword:"); 	i=0;pw[i]=0; 	while (1) { 		ch=getch(); 		if (ch==13 || i>=39) break; 		switch (ch)	{ 		case 27: 			cprintf("\rPassword: %40s"," "); 			cprintf("\rPassword: "); 			i=0;pw[i]=0; 			break; 		case 8: 			if (i>0) { 				i--; 				pw[i]=0; 				cprintf("\b \b"); 			} 			break; 		default: 			pw[i]=ch; 			i++; 			pw[i]=0; 			cprintf("*"); 			break; 		} 	} 	cprintf("\r\n"); 	f=fopen("password.txt","w"); 	fprintf(f,"%s\n",pw); 	fclose(f); }

user: user-2
content: 你用的啥编译器？vc？ 建议你编译出汇编代码来看看，一般来说遇到古怪的问题从c这一级看不出什么问题可以到更低层看看怎么回事。

user: user-0
content: 可能是编译环境不一样，\b的作用表现的也不一样

user: user-3
content: 结果是一样的呢： 0 	1-2 >>0-1  2

user: user-1
content: cprintf
user-0 提问: 关于函数参数的疑问？

回复:
user: user-0
content: 引用 8 楼 cfjtaishan 的回复:[quote=引用 7 楼 jianwen0529 的回复:] [quote=引用 5 楼 tmog66 的回复:] [quote=引用 3 楼 jianwen0529 的回复:] 默认参数，默认参数只能定义在函数声明或者定义中的其中一个，不能同时拥有。 因为h是作为接口的，通常大家有共识定义在函数声明那个地方，告诉使用者这里可以使用默认参数。如果在函数定义那里，接口使用者可能根本没机会知道可以使用默认参数 这个会提高程序的灵活性吗？我感觉这么用会降低程序的可读性呀。[/quote] 那是因为你读的代码不多，默认参数用得很广泛的[/quote] 是呀，第一次见这种用法。不太习惯，估计看多了就还好。

user: user-1
content: 引用 7 楼 jianwen0529 的回复:[quote=引用 5 楼 tmog66 的回复:] [quote=引用 3 楼 jianwen0529 的回复:] 默认参数，默认参数只能定义在函数声明或者定义中的其中一个，不能同时拥有。 因为h是作为接口的，通常大家有共识定义在函数声明那个地方，告诉使用者这里可以使用默认参数。如果在函数定义那里，接口使用者可能根本没机会知道可以使用默认参数 这个会提高程序的灵活性吗？我感觉这么用会降低程序的可读性呀。[/quote] 那是因为你读的代码不多，默认参数用得很广泛的[/quote] 你说的是函数重载（C++）吗？如果是C语言编程没听说默认参数，只是有可变参数，但是可变参数又不是默认参数的概念。

user: user-2
content: 引用 5 楼 tmog66 的回复:[quote=引用 3 楼 jianwen0529 的回复:] 默认参数，默认参数只能定义在函数声明或者定义中的其中一个，不能同时拥有。 因为h是作为接口的，通常大家有共识定义在函数声明那个地方，告诉使用者这里可以使用默认参数。如果在函数定义那里，接口使用者可能根本没机会知道可以使用默认参数 这个会提高程序的灵活性吗？我感觉这么用会降低程序的可读性呀。[/quote] 那是因为你读的代码不多，默认参数用得很广泛的

user: user-0
content: 引用 3 楼 jianwen0529 的回复:默认参数，默认参数只能定义在函数声明或者定义中的其中一个，不能同时拥有。 因为h是作为接口的，通常大家有共识定义在函数声明那个地方，告诉使用者这里可以使用默认参数。如果在函数定义那里，接口使用者可能根本没机会知道可以使用默认参数 这个会提高程序的灵活性吗？我感觉这么用会降低程序的可读性呀。

user: user-3
content: 引用 5 楼 tmog66 的回复:[quote=引用 3 楼 jianwen0529 的回复:] 默认参数，默认参数只能定义在函数声明或者定义中的其中一个，不能同时拥有。 因为h是作为接口的，通常大家有共识定义在函数声明那个地方，告诉使用者这里可以使用默认参数。如果在函数定义那里，接口使用者可能根本没机会知道可以使用默认参数 这个会提高程序的灵活性吗？我感觉这么用会降低程序的可读性呀。[/quote] 怎么回这么想呢？

user: user-4
content: .h文件中的定义告诉编译器：如果这个地方调用的时候没有填值，那么就给它填一个0进去。  至于.cpp，这个地方是必须要传入一个值的。

user: user-2
content: 默认参数，默认参数只能定义在函数声明或者定义中的其中一个，不能同时拥有。 因为h是作为接口的，通常大家有共识定义在函数声明那个地方，告诉使用者这里可以使用默认参数。如果在函数定义那里，接口使用者可能根本没机会知道可以使用默认参数

user: user-3
content: baidu 默认参数

user: user-1
content: 这个是属于函数重载吧，看一下你的编译器是C++吗？C++支持函数重载
user-0 提问: 在B.h中定义一个结构体，在A.C中中使用该结构体报错提示Undefine

回复:
user: user-1
content: 引用 楼主 <span style="color:#4788C7">执念丶丶</span>的回复:多谢各位回答，已解决。 总结： 1、语法没错 2、程序结构有问题 问题如下： （1）我定义了一个head.h文件，所有的include都在这个.head文件下写着， （2）然后include <head.h>就不需要在其他.h文件中出现了，我在所有的.h中又引用了一下head.h文件 （3）这个问题导致head.h嵌套head.h文件，从而导致了 （4）另外，其他的.h文件，需要用到哪个.h就只引用哪个就行不需要引用太多。  多谢大家，卡了几个小时的问题终于解决了。<br />请问你的意思就是说head.h其实根本不需要吗

user: user-2
content: 谢谢，很强，谢谢

user: user-3
content: head.h 中加入 #pragma once

user: user-0
content: 引用 1 楼 user-5 的回复:我还是觉得是头文件加入的路径不对，再检查一下。 解决方法：反正程序也不大，要求也不多，索性直接在.c文件里定义吧。  头文件结构方式不对。所有的.h文件不需要重新引用head.h文件。否则导致了head.h嵌套head.h出错。

user: user-0
content: 多谢各位回答，已解决。 总结： 1、语法没错 2、程序结构有问题 问题如下： （1）我定义了一个head.h文件，所有的include都在这个.head文件下写着， （2）然后include <head.h>就不需要在其他.h文件中出现了，我在所有的.h中又引用了一下head.h文件 （3）这个问题导致head.h嵌套head.h文件，从而导致了 （4）另外，其他的.h文件，需要用到哪个.h就只引用哪个就行不需要引用太多。  多谢大家，卡了几个小时的问题终于解决了。

user: user-4
content: 引用 3 楼 cfjtaishan 的回复:把hw.config.h头文件加入到hw_config.c源文件里。 通过编译错误的提示，应该是hw_config.h没有找到BUFFER的声明 通过编译错误的提示，应该是hw_config.c没有找到BUFFER的声明

user: user-4
content: 把hw.config.h头文件加入到hw_config.c源文件里。 通过编译错误的提示，应该是hw_config.h没有找到BUFFER的声明

user: user-3
content: 声明函数不需要加 extern，只有变量需要。 结构体中可以用 volatile 关键字吗？我不确定。 检查 BUFFER 这个名字是不是冲突了。

user: user-5
content: 我还是觉得是头文件加入的路径不对，再检查一下。 解决方法：反正程序也不大，要求也不多，索性直接在.c文件里定义吧。
user-0 提问: VS怎么打断点，移动光标，在输出窗口显示结果

回复:
user: user-0
content: 我是先打断点，再按F9，光标是一行一行往下跳，但输出窗口没反应，只有跳到程序结束，窗口才一次性出现总的结果

user: user-1
content: 引用 2 楼 faihung 的回复:鼠标点击之后，直接F9就是断点、F11单步执行，F10 step over 、CTRL+F11 step out、CTRL+F10 直接跳到光标所在的行。好像编译器都是这样的。F5运行程序

user: user-1
content: 鼠标点击之后，直接F9就是断点、F11单步执行，F10 step over 、CTRL+F11 step out、CTRL+F10 直接跳到光标所在的行。好像编译器都是这样的。

user: user-2
content: 这种满大街的答案百度就可以了！ 编辑界面，左侧空白栏点击或者F9打断点，F10单步调试，F11内部跟踪

user: user-1
content: 引用 4 楼 fycmugua 的回复:我是先打断点，再按F9，光标是一行一行往下跳，但输出窗口没反应，只有跳到程序结束，窗口才一次性出现总的结果F9就是断点啊，为什么你打了断点后又按F9呢？ 你说的程序结束跳出结果那是说明你没有调出相应的窗口视图，在view里面可以选出来的。
user-0 提问: 如何用C语言获取服务器的路由表信息

回复:
user: user-1
content: route print >>result.txt

user: user-2
content: router >> 文件

user: user-0
content: 引用 2 楼 paschen 的回复:http://blog.csdn.net/itcastcpp/article/details/8183859 谢谢。 GetIpForwardTable这个API好像是windows下的？ 我在linux下没有找到这个接口的描述。

user: user-3
content: 最笨和最简单的方法就是字符解析吧，可以考虑将route命令执行的结果重定向到一个文件里，然后再根据路由表的格式进行读文件解析

user: user-4
content: 引用 2 楼 paschen 的回复:http://blog.csdn.net/itcastcpp/article/details/8183859 这个要保存，好好看看。不知道Linux下怎么做？

user: user-5
content: 直接运行cmd->router 获取输出！ 具体方式参考 http://bbs.csdn.net/topics/392313123

user: user-6
content: http://blog.csdn.net/itcastcpp/article/details/8183859

user: user-7
content: 调用linux系统函数system，并获取返回值即可。
user-0 提问: 这个语句时间复杂度是多少？

回复:
user: user-1
content: 如果 N趋近于无穷大是， pow(2,i)+pow(w,i-1)+.... 和 pow(2*i) 需要求二者商的极限, 极限为1 ，可以认为时间复杂都相同.

user: user-2
content: 引用 10 楼 weixin_40281816 的回复:[quote=引用 7 楼 zilaishuichina 的回复:] 计算一下你的i的变化就知道了  1    初始值 2    第一次i*=2之后 3    第一次i++之后      pow(2,2) - 1 6    第二次i*=2之后  7    第二次i++之后      pow(2,3) - 1 14  第三次i*=2之后 15  第三次i++之后      pow(2,4) - 1 30  第四次i*=2之后 31  第四次i++之后      pow(2,5) - 1   所以时间复杂度就是  log2(n)    这样算好像不大对，  第一次：i=1 第二次：i=2+1 第三次：i=pow(2,2)+pow(2,1)+1 第四次：i=pow(2,3)+pow(2,2)+pow(2,1)+1 ...... 第i+1次： pow(2,i)+pow(w,i-1)+.....  这次算下来，应该是：pow(2,i)+pow(w,i-1)+.....<n,   求i,  但这i怎么求呀？[/quote]   第一次：i=1                     这是初始值  第二次：i=2+1                 不就是pow(2,1) + 1么  ，  不就是pow(2,2) - 1么 第三次：i=pow(2,2)+pow(2,1)+1                               不就是pow(2,3) - 1么 第四次：i=pow(2,3)+pow(2,2)+pow(2,1)+1               不就是pow(2,4) - 1么 第i+1次： pow(2,i)+pow(2,i-1)+.....                            不就是pow(2,i+1) - 1么   ......

user: user-1
content: 上面算式有错误，但结果正确，懒得改了！

user: user-1
content: 1  2*1=2+0               2  2*(2+1)=2*2+2; 3  2*(2*2+2)=2*2*2+4 4  2*(2*2*2+4)=2*2*2*2+8 5  2*(2*2*2+2+8)=2*2*2*2*2+16 .... N  2^N+2*(N-1) 最后 求 lim(( 2^N+2*(N-1)) / 2^N)=1 因此 时间复杂度 等于 O(lgN)

user: user-0
content: 引用 7 楼 zilaishuichina 的回复:计算一下你的i的变化就知道了  1    初始值 2    第一次i*=2之后 3    第一次i++之后      pow(2,2) - 1 6    第二次i*=2之后  7    第二次i++之后      pow(2,3) - 1 14  第三次i*=2之后 15  第三次i++之后      pow(2,4) - 1 30  第四次i*=2之后 31  第四次i++之后      pow(2,5) - 1   所以时间复杂度就是  log2(n)    这样算好像不大对，  第一次：i=1 第二次：i=2+1 第三次：i=pow(2,2)+pow(2,1)+1 第四次：i=pow(2,3)+pow(2,2)+pow(2,1)+1 ...... 第i+1次： pow(2,i)+pow(w,i-1)+.....  这次算下来，应该是：pow(2,i)+pow(w,i-1)+.....<n,   求i,  但这i怎么求呀？

user: user-3
content: 时间复杂度和循环次数是相关的。计算一下循环次数就可以知道时间复杂度了

user: user-4
content: http://www.cppblog.com/haosola/archive/2013/11/06/204115.aspx 和你想知道的的基本上一样

user: user-5
content: O(logN)

user: user-6
content: O(log n)

user: user-2
content: 计算一下你的i的变化就知道了  1    初始值 2    第一次i*=2之后 3    第一次i++之后      pow(2,2) - 1 6    第二次i*=2之后  7    第二次i++之后      pow(2,3) - 1 14  第三次i*=2之后 15  第三次i++之后      pow(2,4) - 1 30  第四次i*=2之后 31  第四次i++之后      pow(2,5) - 1   所以时间复杂度就是  log2(n)

user: user-1
content: O(lgN)

user: user-7
content: i*=2;      n-1次   O（n）

user: user-7
content: i*=2;      n-1次   O（n）

user: user-7
content: i*=2;      n-1次   O（n）
user-0 提问: c编程入门 如何打印大于长度大于5个字符的所有输入行

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #include <string.h> #define MAXLEN 1000 char ln[MAXLEN]; FILE *f; int i,z; int b,n,L; int main(int argc,char **argv) {     if (argc<2) {         printf("Usage:%s fullpathfilename.ext\nget total blank/non-blank/total linenumbers.\n",argv[0]);         return 1;     }     f=fopen(argv[1],"r");     if (NULL==f) {         printf("Can not open file [%s]!\n",argv[1]);         return 2;     }     z=0;     b=0;     n=0;     L=0;     while (1) {         if (NULL==fgets(ln,MAXLEN,f)) break;         L=strlen(ln);         if ('\n'==ln[L-1]) {             if (0==z) {                 for (i=0;i<L-1;i++) {                     if (!(' '==ln[i] || '\t'==ln[i])) break;                 }                 if (i<L-1) z=1;//当前行不是空行             }             if (0==z) b++; else n++;             z=0;         } else {             if (0==z) {                 for (i=0;i<L;i++) {                     if (!(' '==ln[i] || '\t'==ln[i])) break;                 }                 if (i<L) z=1;//当前行不是空行             }         }     }     fclose(f);     if (L>0 && '\n'!=ln[L-1]) {         if (0==z) b++; else n++;//最后一行末尾无'\n'也计算     }     printf("File:[%s] total blank/non-blank/total linenumbers is %d/%d/%d\n",argv[1],b,n,b+n);     return 0; }

user: user-2
content: 从代码的角度看不出来你要做什么？要实现什么。
user-0 提问: 请问在Ubuntu 17 服务器里面，用它带的C编译器怎么写程序可以读出键盘上方向键的左键和右键？

回复:
user: user-0
content: 这个问题后来查了资料用 curses.h解决了，谢谢大家的帮助！

user: user-0
content: 引用 2 楼 ipqtjmqj 的回复:装下ncurses库, 链接时加上-lncurses, 写法参考https://stackoverflow.com/questions/10463201/getch-and-arrow-codes 谢谢你的提示，很有帮助！ 但是我看了你下面的“解决ubuntu中vi不能正常使用方向键和退格键的问题”的链接准备安装完整版的vim的时候，虽然能删除原来的vim common版，但是不能安装完整版的vim,连接外网一直报错： Err:1 http://it.archive.ubuntu.com/ubuntu zesty/main i386 vim-common all 2:8.0.0095-1ubuntu3 404 Not Found怎么办？你是怎么用apt-get的？

user: user-1
content: 引用 3 楼 youyiyang 的回复:[quote=引用 2 楼 ipqtjmqj 的回复:] 装下ncurses库, 链接时加上-lncurses, 写法参考https://stackoverflow.com/questions/10463201/getch-and-arrow-codes 谢谢你的提示，很有帮助！ 但是我看了你下面的“解决ubuntu中vi不能正常使用方向键和退格键的问题”的链接准备安装完整版的vim的时候，虽然能删除原来的vim common版，但是不能安装完整版的vim,连接外网一直报错： Err:1 http://it.archive.ubuntu.com/ubuntu zesty/main i386 vim-common all 2:8.0.0095-1ubuntu3 404 Not Found怎么办？你是怎么用apt-get的？[/quote] 那是CSDN的外链接，不是我们给你的回答。目前，CSDN这样做很烦人，什么都给提示，提示有时候也是驴唇不对马嘴

user: user-2
content: 装下ncurses库, 链接时加上-lncurses, 写法参考https://stackoverflow.com/questions/10463201/getch-and-arrow-codes

user: user-3
content: 这个问题，一般人回答不了你。你最正确的做法应该是去查系统API。
user-0 提问: 这个是通过字符串s1和s2判断坏键的问题，我不太明白这个里面hashtable的作用，最好说得简单易懂一点，求指导。

回复:
user: user-1
content: 引用 4 楼 u012844474 的回复:是的，是用来判断字符串1中的字符， 有没有在字符串2中出现过，  输出未出现过的字符，求指导，这个hashtable[c1]=1是什么意思？ hashtable是数组，下表是对应的字符（在字符1中出现的也在字符串2出现的字符），下表对应的值为0或1，若为0则说明没出现过，若为1说明是出现过。 下表就是其出现的字符。

user: user-0
content: 是的，是用来判断字符串1中的字符， 有没有在字符串2中出现过，  输出未出现过的字符，求指导，这个hashtable[c1]=1是什么意思？

user: user-2
content: 什么叫坏键。。。。    你贴的这段代码， 应该是用来判断字符串1中的字符， 有没有在字符串2中出现过，  输出未出现过的字符

user: user-3
content: https://baike.baidu.com/item/Hashtable/3149676?fr=aladdin

user: user-4
content: 百度搜相关关键字。