Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: uva455周期串问题  求好心人看看哪里错了提交就是wa

回复:
user: user-1
content: Two consecutive input will separated by a blank line.   这种时候不要用gets这种对空行敏感的输入。谁知道这数据会出成什么样子。

user: user-2
content: 跟踪调试是必会技能。

user: user-0
content: 我想知道我这个哪里错了，运行跟你那个一样啊。

user: user-3
content: #include <stdio.h>   #include <string.h>      #define MAXN 80      int strcmplen(char a[], int s, int t, int len)   {       int i;          for(i=1; i<=len; i++) {           if(a[s] != a[t])               return a[s] - a[t];              s++;           t++;       }          return 0;   }      int main(void)   {       int n, len, i, j;       char s[MAXN+1];          scanf("%d", &n);       while(n--) {           scanf("%s", s);              len = strlen(s);              for(i=1; i<len; i++) {               if(len % i)                   continue;                  for(j=i; j<len; j+=i)                   if(strcmplen(s, 0, j, i) != 0)                       break;                  if(j == len)                   break;           }              printf("%d\n", i);           if(n)               printf("\n");       }          return 0;   }   http://blog.csdn.net/tigerisland45/article/details/52056047
user-0 提问: 求解一个输出问题？

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

user: user-2
content: 写着写着，第三个的%写成&呢 个人建议编译的时候不要放过任何警告；争取将警告也一并去掉；

user: user-3
content: scanf_s("%d%d&d",&a,&b,&c); -> scanf_s("%d%d%d",&a,&b,&c);

user: user-4
content: %d%d&d

user: user-5
content: 看编译器错误提示，就算不能直接指出错误，也能大概知道错在哪一行了。

user: user-6
content: 输入函数用的不对 详情百度scanf_s的用法  以上改为scanf也可以

user: user-0
content: 为什么输出不了三个数？
user-0 提问: 自己找不出问题，求解

回复:
user: user-1
content: #include<stdio.h>  struct Stu {     char a[10];     char name[10];     int grade1;     int grade2;     int grade3;     int sum; };  int get_max_idx(struct Stu *arr, int len);  int main() {     static struct Stu stu[100];     int i,N,max,maxi;     scanf("%d",&N);     for(i=0;i<N;i++){         scanf("%s %s %d %d %d", stu[i].a, stu[i].name,&stu[i].grade1,&stu[i].grade2,&stu[i].grade3);         stu[i].sum=stu[i].grade1+stu[i].grade2+stu[i].grade3;     } #if 1     maxi = get_max_idx(stu, N); #else     max=stu[0].sum;     for(i=1;i<N;i++){         if(max<stu[i].sum){             maxi=i;             max=stu[i].sum;         }     } #endif     printf("%s %s %d",stu[maxi].name,stu[maxi].a,stu[maxi].sum);     return 0; }  int get_max_idx(struct Stu *arr, int len) {     int i;     int max_i = 0;      for (i = 1; i < len; i++)         if (arr[i].sum > arr[max_i].sum)             max_i = i;      return max_i;  } 参考一下吧；获取总成绩最大的算法你的是没问题的，我自己写了一个函数，比你的少用一个max变量；  去掉scanf中的'\n'，另外，a，name前面的&也一并去掉；因为数组名本身就是地址；  scanf("%s %s %d %d %d", stu[i].a, stu[i].name,&stu[i].grade1,&stu[i].grade2,&stu[i].grade3);

user: user-2
content: scanf去掉‘\n’

user: user-3
content: scanf("%d\n",&N); --> scanf("%d",&N); scanf("%s %s %d %d %d\n",&stu[i].a,&stu[i].name,&stu[i].grade1,&stu[i].grade2,&stu[i].grade3); --> scanf("%s %s %d %d %d",stu[i].a,stu[i].name,&stu[i].grade1,&stu[i].grade2,&stu[i].grade3); //数组不需加&
user-0 提问: 《c程序设计语言第二版 》14页，1.5.4 单词统计，例子运行无结果输出，求指导

回复:
user: user-1
content: 引用 6 楼 儿童节 的回复:[quote=引用 5 楼 浪荡 的回复:] [quote=引用 1 楼 棉猴 的回复:] 个人感觉你的程序在while()循环中没有跳出来，也就是getchar()没有获取到EOF。 EOF是End Of File的简写，在MSDN中提到“To indicate a read error or end-of-file condition, getchar``returns EOF."就是说，当getchar()发生读取错误或者文件末尾时，getchar()函数返回EOF，而在Windows中，要用Ctrl+Z来表示EOF。所以，在输入字符串按下回车键之后，还要Ctrl+Z输入EOF。   求助大神，为什么我输入abc123 运行的结果是1 6 7  [/quote]  你啥时候把宏给改了？    #define OUT 0 //  #define OUT 1  [/quote]  感谢！！..没发现

user: user-1
content: 引用 1 楼 棉猴 的回复:个人感觉你的程序在while()循环中没有跳出来，也就是getchar()没有获取到EOF。 EOF是End Of File的简写，在MSDN中提到“To indicate a read error or end-of-file condition, getchar``returns EOF."就是说，当getchar()发生读取错误或者文件末尾时，getchar()函数返回EOF，而在Windows中，要用Ctrl+Z来表示EOF。所以，在输入字符串按下回车键之后，还要Ctrl+Z输入EOF。   求助大神，为什么我输入abc123 运行的结果是1 6 7

user: user-2
content: 引用 5 楼 浪荡 的回复:[quote=引用 1 楼 棉猴 的回复:] 个人感觉你的程序在while()循环中没有跳出来，也就是getchar()没有获取到EOF。 EOF是End Of File的简写，在MSDN中提到“To indicate a read error or end-of-file condition, getchar``returns EOF."就是说，当getchar()发生读取错误或者文件末尾时，getchar()函数返回EOF，而在Windows中，要用Ctrl+Z来表示EOF。所以，在输入字符串按下回车键之后，还要Ctrl+Z输入EOF。   求助大神，为什么我输入abc123 运行的结果是1 6 7  [/quote]  你啥时候把宏给改了？    #define OUT 0 //  #define OUT 1

user: user-3
content: #include <stdio.h>   #define IN 1 #define OUT 0   int main () {     int c, nl, nw, nc, state;       state = OUT;     nl = nw = nc = 0;     while ((c = getchar()) != EOF){         ++nc;         if (c == '\n')             ++nl;         if (c == ' ' || c == '\n' || c == '\t')             state = OUT;         else if (state == OUT){             state = IN;             ++nw;         }       }       printf("%d %d %d\n",nl,nw,nc);       return 0; } 没有输入怎么会有输出，程序在等待你的输入。 最后还要输入ctrl+D（Linux）或ctrl+Z(Windows）

user: user-4
content: 输入完成，输入 ctrl+Z

user: user-5
content: 个人感觉你的程序在while()循环中没有跳出来，也就是getchar()没有获取到EOF。 EOF是End Of File的简写，在MSDN中提到“To indicate a read error or end-of-file condition, getchar``returns EOF."就是说，当getchar()发生读取错误或者文件末尾时，getchar()函数返回EOF，而在Windows中，要用Ctrl+Z来表示EOF。所以，在输入字符串按下回车键之后，还要Ctrl+Z输入EOF。
user-0 提问: c程序设计语言第二版 14页，1.5.4 单词统计，例子运行无结果输出

回复:
user: user-1
content: #include <stdio.h>   #define IN 1 #define OUT 0   int main () {     int c, nl, nw, nc, state;       state = OUT;     nl = nw = nc = 0;     while ((c = getchar()) != EOF){         ++nc;         if (c == '\n')             ++nl;         if (c == ' ' || c == '\n' || c == '\t')             state = OUT;         else if (state == OUT){             state = IN;             ++nw;         }       }       printf("%d %d %d\n",nl,nw,nc);       return 0; } 没有输入怎么会有输出，程序在等待你的输入(getchar())。 最后还要输入ctrl+D（Linux）或ctrl+Z(Windows）

user: user-2
content: 无结果输出 你是输入有问题吧 输入结束符才能输出
user-0 提问: 新人求助，同样大小数组matlab能算C分配不出来

回复:
user: user-1
content: 容量大小从小到大：栈≤全局数据≤堆≤文件≤硬盘≤磁盘阵列≤云存储 当程序需要使用比如2GB～1TB左右的存储时，最简单的办法恐怕得是用文件读写模拟内存读写了吧。windows参考_fseeki64函数，linux参考fseeko64函数。 FILE *fA;fA=fopen("A","rb+");_fseeki64(fA,10000000000i64*sizeof(int),SEEK_SET);fputc(fA,0);//int A[10000000000]; int B; _fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fread(&B,1,sizeof(int),fA);//B=A[9999999999]; _fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fwrite(&B,1,sizeof(int),fA);//A[9999999999]=B; fclose(fA);

user: user-2
content: 个人认为没必要一次性把所有数据需要的都放在内存，如果确实有这样的需求，可以试一试静态的变量static或全局变量；

user: user-3
content: C里面分配内存是连续的，所以问题应该出在没有连续15G的内存上。所以不要一次性分配这么大，用链表串起一系列的小块内存比较好。
user-0 提问: keil5

回复:
user: user-1
content: int main int mian

user: user-0
content: 现在又出现了这些错误   这是咋回事呢

user: user-2
content: 你的Main函数没有得到定义，就算再怎么是.h文件，前面也应该有定义

user: user-3
content: main函数在.h文件中？

user: user-4
content: 555文件连个后缀名都没有不应该是.c文件? 这个文件也没有添加到项目中去..为什么不好好看一下教程?

user: user-5
content: 你的Main函数定义好了后，它所在的555.c文件也要添加到项目里，才能编译

user: user-0
content: 有啊

user: user-6
content: 没有main函数? 程序不知道入口 不知道从哪里开始运行
user-0 提问: 两个乒乓球队进行比赛，各出三人。甲队为a,b,c三人，乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比，c说他不和x,z比，请

回复:
user: user-0
content: 我还是不懂这个答案是什么意思，能解释下为啥要用三个循环吗

user: user-1
content: 循环其实用的是字符所对应的ASCII码值。

user: user-2
content: 引用 4 楼 qq_40790112 的回复:我还是不懂这个答案是什么意思，能解释下为啥要用三个循环吗 就好比 （a,b,c）(x,y,z)找符合上述要求的比赛规格。 肯定要依次判断呀： a和x比，和y比，和z比 同样b也可以与xyz比 c也可以与xyz比 理论上相当于次数3*3*3=27次。（三次循环的理由） 但是 同一个人只能和一个人比，从而程序中就加了 这样 if(i!=j)的判断，来避免一人多比。  道理就是这样，但是这个算法虽然能实现，但是效率低。

user: user-3
content: 字符类型char or unsigned char是int类型的子集，当然可以使用。 不但字符可以，double/float也是可以的。

user: user-4
content: 计算机中所用的都是ASCII码，而'X'的ASCII码是58H，而'Z'的ASCII码是5AH，是可以放在for循环的呀

user: user-5
content: 计算机里是不存在什么字母的，所有char类型字符都是以ASCII码的形式存储在内存中 也就是说 'A'(65)＜'B'(66)
user-0 提问: 小白求解释

回复:
user: user-1
content: 应该是输入法的问题

user: user-2
content: 楼上几位大神已说

user: user-3
content: 也许你的负号 输入的是中文负号 也就是全角的负号

user: user-3
content: 代码应该是没有问题

user: user-4
content: 没问题啊，我这编译出来运行结果也是对的

user: user-5
content: 刚才测试了一下，如果逗号是中文，则就像你说的，sum是负数  如果是英文逗号，则正常  估计是你把逗号写成中文逗号了

user: user-5
content: VS2015+Windows10 64位测试正常  是否把英文逗号写成中文逗号了？

user: user-6
content: 引用 3 楼 user-11 的回复:[quote=引用 2 楼 Intel0011的回复:]int a,b,sum=0; sum必须初始化为0 这里不需要初始化sum，看清楚咯[/quote] 是的，眼花了

user: user-7
content: 问题说得不清楚，怎么不能正常运算。最好截个图。

user: user-8
content: #include<stdio.h> #include<stdlib.h>  int main() {     int a, b, sum; //,Cha,Ji,Shan;     printf("请输入两个整数用逗号隔开\n");     scanf("%d,%d",&a,&b);     sum = a+b;     printf("sun=%d\n",sum);     system("pause");     return 0; } 代码没问题； 不需要的变量建议注释掉，定义就会分配空间，即使你不用。

user: user-9
content: 可正常运行，估计是你自身环境问题

user: user-10
content: #include<stdio.h> #include<stdlib.h> int main() { 	int a; 	int b; 	int sum = 0; 	printf("请输入两个整数用逗号隔开\n"); 	scanf("%d,%d",&a,&b); 	sum=a+b; 	printf("sun=%d\n",sum); 	system("pause"); 	return 0; }

user: user-11
content: 引用 2 楼 Intel0011的回复:int a,b,sum=0; sum必须初始化为0 这里不需要初始化sum，看清楚咯

user: user-6
content: int a,b,sum=0; sum必须初始化为0

user: user-11
content: 负责人的告诉你是没有问题的，应该是你的输入法问题或者编译器问题，我调试正常运行
user-0 提问: 程序要求输出一维数组中的最小值和下标，运行后得不到正确结果。

回复:
user: user-1
content: 请看代码，你写的有问题  #include <stdio.h> #include<time.h> #include<stdlib.h> int main() { 	int x[20], n; 	int min = 0; 	int min_sub = 0; 	srand(time(0));  	for (n = 0; n <= 19; n++) 		x[n] = rand() % 100; 	for (n = 0; n <= 19; n++) 		printf("%3d", x[n]); 	min = x[0]; 	for( n = 1; n <= 19; n++) 	{ 		if(x[n] <= min) 		{ 			min = x[n]; 			min_sub = n; 		} 	} 	printf("\n%d   ", min); 	printf("下标是%d", min_sub); 	return 0; }

user: user-2
content: for(n=0,flag=0;n<=19&&flag==1;n++) flag一开始为0，就不满足flag==1，所以直接退出循环

user: user-3
content: #include <stdio.h> #include <time.h> #include <stdlib.h>  int get_min_idx(int *arr, int len); int main() {     int  x[20], min;     int i;      srand(time(0));      for(i = 0; i <= 19; i++)         x[i] = rand()%100;     for(i = 0; i <= 19 ; i++)         printf("%3d", x[i]);      min = get_min_idx(x, 20);      printf("\n%d, idx = %d\n", x[min], min);  #if 0     for(n=0,flag=0;n<=19&&flag==1;n++)          for(i=0;i<=19;i++)         { if(x[n]<=x[i])             ;             else                 flag=1;         }   #endif }  int get_min_idx(int *arr, int len) {     int i;      int min = 0;     for (i = 1; i < len; i++)         if (arr[min] > arr[i])             min = i;      return min; } 参考一下吧

user: user-4
content: flag只在外层循环开始时初始化为0，而后内层循环中如果找到一个数比X[n]小，flag就被设置为1了，而外层循环的下一次执行并不会重新把他设为0，所以只有当第一个数是最小数时才正确。因此这块代码应该这么写：  for(n=0; n <= 19 && flag == 1; n ++) { 	flag = 0; 	for(i = 0; i <= 19; i ++) 	{ 		if(x[i] < x[n]) 		{ 			flag=1; 			break; 		} 	} }

user: user-5
content: 设置断点进行单步调试
user-0 提问: 关于宏的问题

回复:
user: user-0
content: 学习了，谢谢各位。

user: user-1
content: &(x)为什么不直接写成 &x -->当x是个复杂的表达式时，两者是有差别的

user: user-2
content: 建议用inline函数代替宏

user: user-3
content: 因为宏定义展开就是等价替换，若x是一个表达式，就会有问题；  比如 #define MUL(x, y)  (x * y) MUL(6-2, 8+4)；    /*即: 6-2 * 8 + 4 */   MUL(6-2, 8+4)展开就变成(6-2 * 8 + 4) 若加上括号；就变成： (6-2) * (8+4) 这样就正常了 。

user: user-4
content: 加（）是严谨。 不加（）是不好的。 比如说&a+b 与&（a+b） ，真实需要的是a+b 再取地址，而你用第一个的话就走岔了。

user: user-5
content: 比如： #define Mul(x)    x*x  Mul(5+1)   //应该等于6*6=36  但 5+1*5+1

user: user-6
content: 当x是一个复合表达式的时候呢？
user-0 提问: 【C语言】Strtod精度问题

回复:
user: user-1
content: 引用 14 楼 zxzr1990 的回复:[quote=引用 13 楼 iloveyou418 的回复:] [quote=引用 9 楼 zxzr1990 的回复:] [quote=引用 8 楼 iloveyou418 的回复:] 用unsigned char数组来存储？这样就不会出现精度问题了.... 说的对，我就是用char来做保存的。 现在要用char保存的数据要把它变成double带入计算。。 char好像不能直接乘除吧。。[/quote] 我一般处理都是假装小数点不存在，先进行数据处理，最后再把小数点补上。。。[/quote]  还需要一个专门数小数点的函数？[/quote] char数组直接判断'.'，Cstring直接find。。。我都是如此偷懒

user: user-0
content: 引用 13 楼 iloveyou418 的回复:[quote=引用 9 楼 zxzr1990 的回复:] [quote=引用 8 楼 iloveyou418 的回复:] 用unsigned char数组来存储？这样就不会出现精度问题了.... 说的对，我就是用char来做保存的。 现在要用char保存的数据要把它变成double带入计算。。 char好像不能直接乘除吧。。[/quote] 我一般处理都是假装小数点不存在，先进行数据处理，最后再把小数点补上。。。[/quote]  还需要一个专门数小数点的函数？

user: user-2
content: 引用 9 楼 zxzr1990 的回复:[quote=引用 8 楼 iloveyou418 的回复:] 用unsigned char数组来存储？这样就不会出现精度问题了.... 说的对，我就是用char来做保存的。 现在要用char保存的数据要把它变成double带入计算。。 char好像不能直接乘除吧。。[/quote] double 的精度就是如此，16位有效数字

user: user-0
content: 引用 8 楼 iloveyou418 的回复:用unsigned char数组来存储？这样就不会出现精度问题了.... 说的对，我就是用char来做保存的。 现在要用char保存的数据要把它变成double带入计算。。 char好像不能直接乘除吧。。

user: user-1
content: 用unsigned char数组来存储？这样就不会出现精度问题了....

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:浮点数格式 http://bbs.csdn.net/topics/390676437 受教。多谢！

user: user-0
content: 引用 2 楼 hongwenjun 的回复:#include <stdio.h>      /* printf, NULL */ #include <stdlib.h>     /* strtod */  int main() {     char sz[] = "12345.6789";     char* pEnd;      double t1 = strtod(sz, &pEnd);     printf("%f", t1);     return 0; } /* output 12345.678900 */  好像没什么问题吧  默认的6位是没什么问题，目前要用精确到20位左右， 把你的%f变成%30.20f试一下，看看后面都是0吗。

user: user-1
content: 引用 9 楼 zxzr1990 的回复:[quote=引用 8 楼 iloveyou418 的回复:] 用unsigned char数组来存储？这样就不会出现精度问题了.... 说的对，我就是用char来做保存的。 现在要用char保存的数据要把它变成double带入计算。。 char好像不能直接乘除吧。。[/quote] 我一般处理都是假装小数点不存在，先进行数据处理，最后再把小数点补上。。。

user: user-3
content: 引用 7 楼 zxzr1990 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 浮点数格式 http://bbs.csdn.net/topics/390676437 受教。多谢！[/quote]

user: user-4
content: 个人觉得这个跟二进制表示浮点数的方法有关系。正如前面有朋友所说的“很多十进制的浮点数是无法用二进制精确表示的”。如果把代码改为  char* stopstring; double t1 = strtod("12345.0625", &stopstring); printf("%030.15f", t1);  此时的输出即为00000000000010.062500000000000 因为此时的小数部分0,0625是能够正好被二进制精确表示的。但是如果改为12345.6789，此时小数部分0.6789不能被二进制精确表示，所以就会出现小数部分不相同的情况。

user: user-5
content: 很多十进制的浮点数是无法用二进制精确表示的

user: user-6
content: 没有办法吧，这是浮点数的存储方式决定的。但是你可以从业务的实际出发来想办法，比如涉及金额的用分或厘做单位，以整数进行计算。

user: user-7
content: 引用 2 楼 hongwenjun 的回复:#include <stdio.h>      /* printf, NULL */ #include <stdlib.h>     /* strtod */  int main() {     char sz[] = "12345.6789";     char* pEnd;      double t1 = strtod(sz, &pEnd);     printf("%f", t1);     return 0; } /* output 12345.678900 */  好像没什么问题吧 double类型的数据应该用%lf输出，使用%f输出会影响其精度

user: user-2
content: #include <stdio.h>      /* printf, NULL */ #include <stdlib.h>     /* strtod */  int main() {     char sz[] = "12345.6789";     char* pEnd;      double t1 = strtod(sz, &pEnd);     printf("%f", t1);     return 0; } /* output 12345.678900 */  好像没什么问题吧

user: user-3
content: 浮点数格式 http://bbs.csdn.net/topics/390676437
user-0 提问: 菜鸡求教~如何将两个大小不同的二维数组互换？

回复:
user: user-1
content: 只有真正的闲才能孕育出真正的创意！

user: user-0
content: #include <stdio.h> #include <stdlib.h> #include <malloc.h> void swap(int *a, int *b); int main() { 	int line_1, row_1, line_2, row_2, i, j;  	printf("依次输入第一个int数组的行、列:"); 	scanf("%d %d", &line_1, &row_1); 	int **c = (int**)malloc(line_1 * sizeof(int*)); 	for (i = 0; i<line_1; i++) 		c[i] = (int*)malloc(row_1 * sizeof(int)); 	printf("输入第一个数组的数据.\n"); 	for (i = 0; i < line_1; i++) 		for (j = 0; j < row_1; j++) 			scanf("%d", &c[i][j]);  	printf("依次输入第二个int数组的行、列:"); 	scanf("%d %d", &line_2, &row_2); 	int **d = (int**)malloc(line_2 * sizeof(int*)); 	for (i = 0; i < line_2; i++) 		d[i] = (int*)malloc(row_2 * sizeof(int)); 	printf("输入第二个数组的数据.\n"); 	for (i = 0; i < line_2; i++) 		for (j = 0; j < row_2; j++) 			scanf("%d", &d[i][j]); 	       	swap(&c,&d); 			printf("%d ", c[i][j]); 			printf("%d ", d[i][j]); 	return 0; } void swap(int *a,int *b) {     } 我已经晕了，swap函数不知道要怎么弄了，函数里我也试过用realloc函数，可运行起来就是不对。。我也调试不出什么东西来，，我二维数组指针的传递还是理解的不好。。明天我还是再看看书吧

user: user-2
content: a是两行两列，b是3行3列，数组的长度是不一样的，可以把a中的数据放到b中，但是b中的数据放不到a中。除非他们是一样大的。

user: user-3
content: 请使用std::vector<int> ，以及std::swap， 把生命浪费在这些麻烦且容易出错的东西上面，不值得

user: user-4
content: 。。用两个字符指针就ok了 如下： int main()  {  	char **a, **b; 	for (int i = 0; i < 2; i++) { 		a = new (char*); 		for (int j = 0; j < 2; j++) { 			*a = new char; 		} 	} 	//b同样操作 	for (int i = 0; i < 3; i++) { 		b = new (char*); 		for (int j = 0; j < 3; j++) { 			*b = new char; 		} 	} 	//然后就可以把a,b当作数组操作了，注意别越界 	for (int i = 0; i < 2; i++) { 		for (int j = 0; j < 2; j++) { 			scanf("%c", &a[i][j]); 		} 	} 	for (int i = 0; i < 3; i++) { 		for (int j = 0; j < 3; j++) { 			scanf("%c", &b[i][j]); 		} 	} 	//输出 	printf("\n,array B:   "); 	for (int i = 0; i < 2; i++) { 		for (int j = 0; j < 2; j++) { 			printf("%c ", a[i][j]); 		} 		printf("\n"); 	} 	printf("\n,array B:   "); 	for (int i = 0; i < 3; i++) { 		for (int j = 0; j < 3; j++) { 			scanf("%c ", b[i][j]); 		} 		printf("\n"); 	} 	printf("\n"); 	//以下是swap操作 	char **c; 	c = b; 	b = a; 	a = c; 	//输出 	printf("\n,array B:   "); 	for (int i = 0; i < 3; i++) { 		for (int j = 0; j < 3; j++) { 			printf("%c ", a[i][j]); 		} 		printf("\n"); 	} 	printf("\n,array B:   ");  	for (int i = 0; i < 2; i++) { 		for (int j = 0; j < 2; j++) { 			scanf("%c ", b[i][j]); 		} 		printf("\n"); 	} 	printf("\n"); 	//完成 	return 0; }    。。我真是闲的。。

user: user-5
content: 百度 动态数组 二维动态数组

user: user-0
user-0 提问: 服务端和客户端聊天

回复:
user: user-1
content: 客户端建立套接字连接服务器以后 就可以send啊  都是调用函数 百度不少源码

user: user-2
content: 如果是简单的一问一答形式，很容易，recv后再send 如果不是这样简单的形式，那么多线程。一个线程recv，一个线程send，多线程要处理线程同步的情况，比较复杂了。
user-0 提问: mmap问题

回复:
user: user-1
content: log.txt 文件大小比sizeof(int)小？

user: user-2
content: 映射/dev/zero会自动创建一个制定长度的映射区，但是对于普通文件是不可以。

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/mman.h>   int main(void) {     int zero = 100;     int fd = open("log.txt",O_RDWR|O_CREAT,0666);     write(fd, &zero, sizeof(int));     int *mmp = (int *)mmap( NULL,sizeof(int),PROT_READ |             PROT_WRITE,MAP_SHARED,fd,0 );     if (mmp == MAP_FAILED) {         fprintf(stderr, "map error!\n");         goto errno_r;     }      close(fd);     printf("%d\n", *mmp);     *mmp = 0;     printf("%d\n", *mmp);  errno_r:     munmap(mmp, sizeof(int));      return 0; } write(fd, &zero, sizeof(int));是需要的，因为若不加这句，fd的偏移不是sizeof(int)个字节； 若不加这句，可以打开/dev/zero文件，即：  #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/mman.h>   int main(void) {     int zero = 100;     //int fd = open("log.txt",O_RDWR|O_CREAT,0666);     int fd = open("/dev/zero",O_RDWR|O_CREAT,0666);     //write(fd, &zero, sizeof(int));     int *mmp = (int *)mmap( NULL,sizeof(int),PROT_READ |             PROT_WRITE,MAP_SHARED,fd,0 );     if (mmp == MAP_FAILED) {         fprintf(stderr, "map error!\n");         goto errno_r;     }      close(fd);     printf("%d\n", *mmp);     *mmp = 10;     printf("%d\n", *mmp);  errno_r:     munmap(mmp, sizeof(int));      return 0; } 另外，建议加上对mmap返回值的判断
user-0 提问: 牛顿迭代法解高次方程和超越方程,新手求教

回复:
user: user-1
content: 这个方程有无数个解，你可以画出图像看一下，牛顿迭代法依赖于初值，初值不同，收敛区间不同也就导致收敛得到的结果不同，上面1.114157和-9.317243是对的，应该是你带回去的时候弧度和角度没进行转换。

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

回复:
user: user-1
content: 边界条件 输入输出格式 ……

user: user-0
content: 输入最多十行加上去并没有什么作用,输出就是按行输出

user: user-0
content: 他的输入要求最大可以输入100位的数,你这个long long int应该表示不了那么大的数

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h>  #define MAX_NUM     10  int main(void) {  #if 1     unsigned long long num, diff;     int cnt = 0, s_digit;      while (1 == scanf("%llu", &num) && num > 0) {         if (cnt++ > MAX_NUM)             break;         s_digit = num % 10;         diff = llabs(num / 10 - s_digit * 5);          if (diff % 17 == 0)             printf("1\n");         else             printf("0\n");      } #else     int i,length,num=0,n=0;      char s[102];      while(1)     {          gets(s);          if(s[0]=='0')              break;          length = strlen(s);          for(i=0;i<length;i++)          {              num += (s[i]-'0')*(int)pow(10,length-1-i); //注意pow返回值类型为double          }          num = num/10-num%10*5;          if(0 == num%17)              printf("1\n");          else              printf("0\n");          num = 0;      } #endif     return 0;  } 参考一下吧～
user-0 提问: 新人跪求大神解释fgets源码	*s  = str ->_Back[--str->_Nback]; 这是啥意思啊

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

user: user-2
content: str的_Nback成员自减1，然后把它当作数组索引，取str的_Back数组成员，赋给s指针。

user: user-0
content: 引用 6 楼 hzy_76 的回复:凭以上代码猜测，_Back是文件的栈式缓冲区，栈顶是最前面的字符，_Nback是栈大小，至于_Rend，还没想明白，在遍历完文件时设置的，会是什么呢？#include <string.h> #include "xstdio.h"   char *(fgets)(char *buf, int n, FILE *str) //get a line from stream    {   	unsigned char *s;     	if(n <= 1)   		return (NULL);    	for(s = (unsigned char * )buf; 0 < --n && str -> _Nback; )   	{   		//deliver pushed bach chars    		*s  = str ->_Back[--str->_Nback];    		if(str->_Nback == 0)   			   			str->_Rend = str->_Rsave;    		   		if(*s++ == '\n')   		{               //terminate full line   			*s = '\0';    			return (buf);    		}   	}     while(0 < n)     {     	//ensure buffer has chars       	if(str->_Next < str ->_Rend)      		else if (_Frpre(str) < 0)     			return (NULL);      		else if(str -> _Mode & _MEOF)     			break;              {             	 //copy as many as possible               	unsigned char *s1 = memchr(str->_Next,              		'\n', str->_Rend - str ->_Next);              	size_t m = (s1 ? s1 + 1 : str->_Rend) - str->_Next;               	if ( n < m)             		s1 = NULL, m  = n;              	memcpy(s, str->_Next, m);              	s += m, n -= m;              	str -> _Next += m;              	if(s1)             	{             		//terminate full line             		*s = '\0';              		return (buf);              	}             }             }      if(s == (unsigned char * ) buf)      	return (NULL)      else       {   //termintate partial line      	*s = '\0';       	return (buf);      }    } /* 摘于《C标准库》一书，作者Plauger */

user: user-2
content: 凭以上代码猜测，_Back是文件的栈式缓冲区，栈顶是最前面的字符，_Nback是栈大小，至于_Rend，还没想明白，在遍历完文件时设置的，会是什么呢？

user: user-2
content: 这个要看你具体的环境了，或者你能看到FILE结构体定义的话，发上来看看也许能猜到。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素谢谢赵老师！

user: user-0
content: 引用 1 楼 hzy_76 的回复:str的_Nback成员自减1，然后把它当作数组索引，取str的_Back数组成员，赋给s指针。能具体说说_Back，Nback，  _Rend 的意思吗，非常感谢
user-0 提问: 【求助】链表实现一元多项式的带余除法运算

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-2
content: 建议给出完整的代码，尤其是调用的形式（即main中的调用关系）

user: user-3
content: 跟踪调试是必会技能。
user-0 提问: C语言求二次函数的根

回复:
user: user-1
content: #include<stdio.h> #include<math.h> #include<String> #define EOX 0.000001        //代码中的数值都是浮点数，如果和int型的0比较大小就会发生错误，所以此处我自己定义了一个精度，(-EXO,EXO)区间代表0  double Equationsolving(double a, double b, double c)//定义一个求解子函数（接口） {      if ((a > -EOX) && (a < EOX))//如果a在（-EXO，EXO）区间内代表a=0，那就不是一个一元二次方程     {         printf("这不是一个一元二次方程\n");     }     else     {         double d  = b*b - 4 * a*c;                   double x1 = (-b + sqrt(d)) / 2 * a; //两个求解的公式         double x2 = (-b - sqrt(d)) / 2 * a;         if (d>=EOX)               //d大于零，方程有两个不同的解         {             printf("该方程有两个不同的解：x1 = %lf,  x2 = %lf\n", x1, x2);         }         else         {             if ((d > -EOX) && (d < EOX)) //d等于零，方程有两个相同的解             {                 printf("该方程有两个相同的解：x1 = x2 = %lf\n", x1);             }             else             {                 printf("该方程无解\n");  // d小于零，方程无解             }         }     }     return 0; }  int main() {     printf("请输入要求解的一元二次方程的三个系数a,b,c的值：");     double a = 0;     double b = 0;     double c = 0;     scanf_s("%lf%lf%lf", &a, &b, &c); //从键盘上输入a，b，c的值，这里的scanf_s语句是编译器自带的，通常情况下还是写scanf     Equationsolving(a, b, c); //调用子函数（接口）     system("pause");          //暂停功能     return 0; }

user: user-2
content: 当F<0时直接输出没有解

user: user-3
content: 如果是实数根，b平方减4ac有可能为负数，此时没有根，应中断。 如果需要虚数根，需要先查看sqrt函数能否对负数参数输出虚数。

user: user-4
content: #include <stdio.h> #include <math.h> int main() { 	double a,b,c,disc,x1,x2,realpart,imagpart;     scanf("%1f,%1f,%1f",&a,&b,&c); 	printf("the question\n"); 	if(fabs(a)<=1e-6) 		printf("is not the quadratic.\n"); 	else 	{ 		disc=b*b-4*a*c; 		if(fabs(disc)<=1e-6) 			printf("has two equal rooots:%8.4f\n",-b/(2*a)); 		else 			if(disc>1e-6) 		{ 				x1=(-b+sqrt(disc))/(2*a); 			    x2=(-b-sqrt(disc))/(2*a); 				printf("has two different roots:%8.4f and %8.4f\n",x1,x2); 		} 		else  		{ 			realpart=-b/(2*a); 			imagpart=sqrt(-disc)/(2*a); 			printf("has complex roots:\n"); 			printf("%8.4f+%8.4fi\n",realpart,imagpart); 			printf("%8.4f-%8.4fi\n",realpart,imagpart);  		}  	} 	return 0; }

user: user-5
content: 把结果打出来啊，是不是-e什么的

user: user-6
content: c 语言能开负数的平方根吗？
user-0 提问: 跪求大神分析下代码哪里有错哈（题目是：一个整数，它加上100 后是一个完全平方数，再加上168 又是一个完全平方数，请问该数是多少？）

回复:
user: user-1
content: return 0 应该放到最外面，当所有的平方数都测试完成，没有符合的才是返回 false。 当有符合的就返回 true。

user: user-0
content: 我明白了，judge函数else里面应该是continue

user: user-0
content: 这样改没用啊，程序运行还是什么也没有
user-0 提问: 新人基础问题求教

回复:
user: user-1
content: 上面那个是字符串结尾为  ‘\0'

user: user-2
content: 字符串也是一种数组,但是它的最后一位是 \0  表示结束,c primer plus上有具体讲

user: user-3
content: char b[5]="abcd";//这是一个字符串，在内存的内容是：“abcd\0"共计5个字符组成； char a[5]={'a','b','c','d','e'};//这是一个char（字符）数组，每个数组就是一个char（字符），总共有5个char（字符）。 这是二个完成不同的概念，一个是字符串，一个是数组，不过这里却保存char（字符）内容O(∩_∩)O

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

user: user-5
content: 字符串未尾有个'\0'，虽然他存在，但你看不见。

user: user-6
content: 第一个是字符串，第二个是字符，字符串结尾有\0占据一位

user: user-7
content: char b[5]="abcd";//字符串结尾带‘\0’ char a[5]={'a','b','c','d','e'};//字符不带

user: user-8
content: 怎么输出？ 第一个数组是有4个字符，第二个数组有5个字符，若用循环%c输出，那么都能输出5个字符，（第一个数组的a[4]是'\0'无法显现到终端） 但是，若以%s输出，那么第二个数组不是字符串，而是字符数组；所以以%s输出，第二个数组是会越界的。 因为%s是按照字符串的形式输出，那么第二个字符数组没有'\0'，所以输出时就一直找到'\0'才停止输出；

user: user-9
content: 字符串 和 字符的区别

user: user-10
content: <button onclick="xzf();">xzf</button>   function xzf(){   alert(ok); }

user: user-10
content: 源代码

user: user-11
content: 分别sizeof  和 strlen 看看就明白了

user: user-12
content: char b[5]="abcd";  等价于  char b[5] = {'a','b','c','d','\0'}; C语言中的字符串是由'\0'结束，系统会在字符串后加一个'\0'作为结束符。

user: user-13
content: 字符串"abcd"的话，数组中第五个元素存的是"\0"

user: user-0
content: 求教啊，大佬们人呢
user-0 提问: 求解释！！！！

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

user: user-2
content: 上面是常量的字符串赋值，默认都判定的。 下面是单个字符赋值，如果你赋值‘\0’，肯定不会报错。 所以上面是字符串赋值，下面是字符赋值，层级不一样，判定也不一样。

user: user-3
content: 在VS中按F9添加断点，按F5进行调试。查看监视和内存就很清楚了。

user: user-4
content: 怎么输出？ 第一个数组是有4个字符，第二个数组有5个字符，若用循环%c输出，那么都能输出5个字符，（第一个数组的a[4]是'\0'无法显现到终端） 但是，若以%s输出，那么第二个数组不是字符串，而是字符数组；所以以%s输出，第二个数组是会越界的。

user: user-5
content: 字符串和字符数组      分别sizeof  和  strlen  看看

user: user-6
content: char b[5] = "abcd"; // 编译器转化为char b[5] = { 'a', 'b', 'c', 'd', '\0' }; b可以作为字符串使用，因为有结尾符'\0' char a[5] = { 'a', 'b', 'c', 'd', 'e' }; //因为没有'\0'，所以不能作为字符串使用

user: user-7
content: 上面是以字符串形式保存的，字符串末尾会有'\0'，占一个字符

user: user-8
content: 上面那一种，系统会自动在最后面加一个'\0'
user-0 提问: C语言求助，简单的球和

回复:
user: user-1
content: printf("sum = %d \n", &sum);   //error

user: user-2
content: //printf("sum = %d \n", &sum);  //scanf才需要对sum取地址       printf("sum = %d \n", sum);     }

user: user-3
content: 打印的是sum的地址信息

user: user-4
content: 1、printf内对sum取址 2、求和应该是每次sum+=i吧

user: user-5
content: printf("sum = %d \n", &sum);     // 这里你取 sum的地址，是错误的
user-0 提问: C语言新手求指导，接受批评，rand()函数还有二维数组，实在不知道要怎么改了，求指出问题，

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h> #include<time.h> int main() { 	int a[50][5]; 	int GPA, i, j, m, n = 0; 	srand(time(0)); 	for (i = 0; i <= 49; i++) { 		for (j = 0; j <= 4; j++) {  			m = rand() % 101;  			if (m >= 90) 				a[i][j] = 9; 			else if (m >= 80) 				a[i][j] = 8; 			else if (m >= 70) 				a[i][j] = 7; 			else if (m >= 60) 				a[i][j] = 6; 			else if (m >= 0) 				a[i][j] = 0; 		} 		n = a[i][0] * 3 + a[i][1] * 4 + a[i][2] * 2 + a[i][3] * 5 + a[i][4] * 1; //改这里 		GPA = n / 15; 		printf("%d\n", GPA); 	} 	return 0; }

user: user-2
content: 我感觉你这方法可以形成随机数，是二维数组的下标出问题了。 定义的是int a[50][5]； n=a[i][1]*3+a[i][2]*4+a[i][3]*2+a[i][4]*5+a[i][5]*1; 这里不能出现a[i][5]的，这样会越界产生随机大数。 rand()应该不会产生负值，否则还要考虑m产生负值的情况，希望对你有帮助

user: user-3
content: 看视频可以知道，如果种子数(1)，随机数是固定。 第一个种子可以用时间当种子数

user: user-3
content: /* srand example */ #include <stdio.h>      /* printf, NULL */ #include <stdlib.h>     /* srand, rand */ #include <time.h>       /* time */  int main () {   printf ("First number: %d\n", rand()%100);   srand (time(NULL));   printf ("Random number: %d\n", rand()%100);   srand (1);   printf ("Again the first number: %d\n", rand()%100);    return 0; }
user-0 提问: C语言题目求助

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <math.h>  int is_prime(int num);  int main(void) {  #if 1     int m, n, cnt = 0, sum = 0;     int i;      scanf("%d%d", &m, &n);      if (m < n)         return 0;      for (i = 2; i < 200; i++)         if (is_prime(i)) {             printf("%d\n", i);             cnt++;             if (cnt > m)                 break;              if (cnt >= n)                  sum += i;         }     printf("sum = %d\n", sum); #else      int data[200],i,n,m,dataNumber=2,sum=0;     for(i=0;i<             200;i++)     {         if(dataNumber=2)         {             data[i]=dataNumber;             dataNumber++;         }         else         {             data[i]=dataNumber;             dataNumber=dataNumber+2;         }     }     scanf("%d%d",&n,&m);     for(n<=m;n++;)     {         sum=sum+data[n];     }     printf("%d\n",sum); #endif     return 0; }  /*check prime */ int is_prime(int num) {     int i;      int len = sqrt(num) + 1;     for (i = 2; i< len; i++)         if (num % i == 0)             break;      if (i >= len)         return 1;     else         return 0; } 参考一下吧

user: user-2
content: 寻找素数的算法有问题： 1.楼主的方法除了2以外，寻找的都是奇数，奇数不一定是素数。 2.  if(dataNumber=2)这一句会导致寻找的200个素数全部为2。 后续计算问题： 1.  for(n<=m;n++;)会导致循环无法退出。 附上根据楼主的思路修改的程序，请查阅，有问题请指出 int main(void) {    int data[200],i,n,m,dataNumber=2,sum=0;     for(i=0;i<200;i++)     {         if(dataNumber==2)         {             data[i]=dataNumber;             dataNumber++;             printf("%d\n",data[i]);         }         else         {             int j=2;             for(j=2;j<dataNumber;j++)             {                 if(dataNumber%j==0)                 {                     dataNumber+=2;                 }             }             data[i]=dataNumber;             dataNumber=dataNumber+2;             printf("%d\n",data[i]);         }     }      scanf("%d%d",&n,&m);     for(;n<=m;n++)     {         sum=sum+data[n];     }     printf("%d\n",sum);     return 0; }  这个问题其实分两步： 1. 找出200个素数。 2. 计算第n与第m之间的素数和。  我的建议是： 1. 先寻找素数。从寻找5个素数开始，逐步增加，并打印信息，可以迅速定位问题。然后扩展到200个素数。 2. 进行计算和。 3. 考虑异常情况。  如有错误，请指出。

user: user-3
content: 请看代码，不懂留言  #include <stdio.h> int judgePrime(int num); //这是用来判断是否是素数的 int main() { 	int n = 1, m = 9, sum = 0; 	for(int i = n; i <= m ; i++) 	{ 		if( judgePrime(i)) 		{ 			printf("%d\n",i); 			sum = sum + i; 		} 	} 	printf("所有的素数的和是%d\n",sum); } int judgePrime(int num) //判断素数的函数的实现 { 	int i = 2,j = num; 	for( i ; i < j ; i++) 	{ 		if( num % i == 0 ) 		{ 			return 0; 		} 	} 	return 1; }

user: user-4
content: 算法有误，可以打印出来看看。

user: user-5
content: 1.语法问题 if(dataNumber=2) ---> if(dataNumber==2) for(n<=m;n++;) --> for(;n<=m;n++) 2.另外你的素数产生算法是错误的
user-0 提问: 一个明显的错误

回复:
user: user-0
content: 引用 6 楼 冷羽的回复:这时由于 long long a 是 8 个字节而你的第一个是 %d 表示一个32为整数，这样 a 的高位 0 就会被第二个 %d 所输出 0，第三个 %d 才会输出 sizeof(long long),而 最后一个 sizeof(b) 就没有被用到。  32 为系统中的压栈， int，char，long ， ULONG 等压入的时候，都占用 4 个字节，而如果压入 的是 int64 longlong 的时候，是占用的8 字节，所以，就会出现这种不对应的情况。 可以修改为 printf("%I64d,%d,%d\n",a,sizeof(long long),sizeof(b)); 告诉第一次参数 a 是64位的，这样就不会出错了。 get!      非常感谢

user: user-1
content: 引用 6 楼 XiaoFang 的回复:这时由于 long long a 是 8 个字节而你的第一个是 %d 表示一个32为整数，这样 a 的高位 0 就会被第二个 %d 所输出 0，第三个 %d 才会输出 sizeof(long long),而 最后一个 sizeof(b) 就没有被用到。  32 为系统中的压栈， int，char，long ， ULONG 等压入的时候，都占用 4 个字节，而如果压入 的是 int64 longlong 的时候，是占用的8 字节，所以，就会出现这种不对应的情况。 可以修改为 printf("%I64d,%d,%d\n",a,sizeof(long long),sizeof(b)); 告诉第一次参数 a 是64位的，这样就不会出错了。 学习了。谢

user: user-2
content: 这时由于 long long a 是 8 个字节而你的第一个是 %d 表示一个32为整数，这样 a 的高位 0 就会被第二个 %d 所输出 0，第三个 %d 才会输出 sizeof(long long),而 最后一个 sizeof(b) 就没有被用到。  32 为系统中的压栈， int，char，long ， ULONG 等压入的时候，都占用 4 个字节，而如果压入 的是 int64 longlong 的时候，是占用的8 字节，所以，就会出现这种不对应的情况。 可以修改为 printf("%I64d,%d,%d\n",a,sizeof(long long),sizeof(b)); 告诉第一次参数 a 是64位的，这样就不会出错了。

user: user-3
content: printf("%lld,%d\n",a,sizeof(long long)); 输出0

user: user-3
content: 引用 3 楼 shw014 的回复:printf("%d,%d\n",a,sizeof(long long)); [code=c][/printf("%lld,%d\n",a,sizeof(long long)); 输出0code]

user: user-3
content: int、long、long long在printf中的格式     http://blog.csdn.net/fz_ywj/article/details/8107582 printf("%d,%d\n",a,sizeof(long long));

user: user-1
content: 我和楼主一样 win7，codeblocks      printf("%d,%d\n",a,sizeof(long long)); 输出0     printf("%d,%d\n",sizeof(long long),a); 输出8     printf("%d",sizeof(long long)); 输出8  给了一个警告warning: format '%d' expects argument of type 'int', but argument 2 has type 'long long int' [-Wformat=]|  好像是sizeof返回的size_tl类型的问题。 什么%zu、%u、%lu %llu， 反正都是不好使。 求大神指点。

user: user-4
content: 在Linux下测试，结果是：1 8,1 不会出现你的那种结果； 另外，a的输出和sizeof的输出，应该分别是用%lld， %lu
user-0 提问: C语言函数怎样做才能做到引用传递

回复:
user: user-1
content: 把要返回的数组成一个数组，例如在主函数里定义一个数组，在被调函数中将数组名作为形参。注，用指向数组的指针做形参也可以。

user: user-2
content: & 取地址不就好了 百度 引用传递 很多吧
user-0 提问: for循环语句有问题啊，该怎么弄

回复:
user: user-1
content: #include<stdio.h> int main() { char ch; char wrs; printf("请输入您要进行的功能（a/A加密，b/B解密）："); scanf("%c", &ch); if (ch =='a' || ch == 'A') { printf("输入要转换的字符：");  fflush(stdin); for (fflush(stdin);(wrs = getchar()) != '\n'; ){ 	wrs = wrs + 2; 	printf("%d", wrs);  } } else { printf("输入要转换的字符："); fflush(stdin); for (; wrs != '\n'; wrs = getchar()) wrs = wrs - 2; printf("%d", wrs); }  return 0; }
user-0 提问: 分别构造插入到表头、表中和表尾三种情况的测试用例进行测试。

回复:
user: user-1
content: 单步你的程序可以发现，linklist p = head->next这句p被赋值NULL，之后while (p->info<x)反问NULL指针导致出错

user: user-2
content: 错误场景一:   输入一组升序排列的整数： 请输入整数序列（空格分开，以0结束）: 0 List is:  请输入要插入的值：1 程序崩溃  原因，insert函数中，初始化p为head->next，此时p为NULL，通过空指针访问数据当然崩溃    好好调试！
user-0 提问: C/C++批量处理问题，菜鸟求助

回复:
user: user-1
content: 引用 4 楼 zhuimengdeluntai 的回复:[quote=引用 2 楼 jack960330 的回复:] 使用文件搜索的方法搜索，遍历目录 涉及到哪些函数或者类呢？[/quote] 去查查windows API和c/c++库的方法 要学会自助学会查文档

user: user-2
content: system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad  c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住，能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作，而不要用各种API获取或者操作，因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时，API会处理的不全面或陷入死循环，而shell命令不会。 如果嫌system黑窗口一闪，将system("...")替换为WinExec("cmd /c ...",SW_HIDE);

user: user-0
content: 引用 8 楼 hzy_76 的回复:涉及的函数，要看你的环境了，Windows/Linux/VC？ windows环境。能不能给写个例子啊，比如D盘下面有个文件夹AAA，AAA下面有很多个子文件夹。每个子文件夹里面有相同名字的文件，111.txt  222.txt   333.txt。要依次访问每一个子文件夹里面的txt，并将处理的结果写成txt，放在该子文件夹下面。

user: user-3
content: 我有写过VC的，要晚上才能给你翻翻代码，貌似楼上说的是对的。

user: user-3
content: 找到一段VC代码，仅供参考：  void CHYXQuantTraderDlg::OnImpStrategyBtn() { 	TCHAR pszPath[MAX_PATH]; 	CString pathAndSuffix; 	CString fileName[MAX_IMP_FILE_NUM]; 	int fileNum = 0; 	BROWSEINFO bi; 	bi.hwndOwner = this->GetSafeHwnd(); 	bi.pidlRoot = NULL; 	bi.pszDisplayName = NULL; 	bi.lpszTitle = TEXT("请选择策略文件所在目录"); 	bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT; 	bi.lpfn = NULL; 	bi.lParam = 0; 	bi.iImage = 0;  	if (!CTPStatus.initFinished) 	{ 		AfxMessageBox(_T("系统未初始化完毕，请稍候")); 		return; 	}  	if (addingNewStrategy) 	{ 		AfxMessageBox(_T("有新策略未初始化完毕，请稍候")); 		return; 	}  	if (impStrategyDlg.IsWindowVisible()) 	{ 		DEBUG_LOG("导入窗口已打开"); 		return; 	}  	LPITEMIDLIST pidl = SHBrowseForFolder(&bi); 	if (pidl == NULL) 	{ 		return; 	}  	if (SHGetPathFromIDList(pidl, pszPath)) 	{ 		//AfxMessageBox(pszPath); 		CFileFind tempFind; 		//是否成功找到文件 		BOOL bFound;  		pathAndSuffix.Format(_T("%s\\*.sth"), pszPath);	//修改"*.*"可限定查找文件类型 		bFound = tempFind.FindFile(pathAndSuffix);   		//遍历文件，找够100个就中断 		while (bFound && fileNum < MAX_IMP_FILE_NUM) 		{ 			//第一次执行FindNextFile是选择第一个文件，以后执行为选择下一个文件 			bFound = tempFind.FindNextFile();  			//如果找到的是返回上层的目录 则结束本次查找 			if (tempFind.IsDots()) 				continue;  			if (tempFind.IsDirectory()) 			{ 				//找到的是文件夹，不处理 			} 			else 			{ 				//得到文件名，包括后缀名，存入数组 				fileName[fileNum] = tempFind.GetFileName(); 				fileNum ++; 			} 		}  		tempFind.Close();  		//打开导入管理窗口 		impStrategyDlg.SetFileList(pszPath, fileName, fileNum); 		impStrategyDlg.ShowWindow(SW_SHOW); 	}  	return; }

user: user-4
content: FindFirstFile,FindNextFile

user: user-5
content: 可以使用cmd命令， system(...)中调用此命令

user: user-3
content: 涉及的函数，要看你的环境了，Windows/Linux/VC？

user: user-0
content: 引用 2 楼 jack960330 的回复:使用文件搜索的方法搜索，遍历目录 涉及到哪些函数或者类呢？

user: user-0
content: 引用 1 楼 hzy_76 的回复:父文件夹要做成参数的形式，运行时输入； 子文件夹、文件，都用扫描的方式找出来，再一个个处理就好了。 请问，能不能说的再详细一些呢？比如会涉及到哪些函数或者类？

user: user-6
content: dir /S /A /B *.cpp  > list.txt

user: user-7
content: 这时候我就建议用python了          个人网站www.qtdoc.cn

user: user-8
content: 遍历文件目录，然后依次调用你的处理程序即可，遍历方法网上很多代码

user: user-1
content: 使用文件搜索的方法搜索，遍历目录

user: user-3
content: 父文件夹要做成参数的形式，运行时输入； 子文件夹、文件，都用扫描的方式找出来，再一个个处理就好了。
user-0 提问: VS2013软件下的printf输出问题

回复:
user: user-1
content: 改成scanf_s("%s", name, 40);  或者  scanf("%s", name);  scanf_s还需要一个参数用于确认缓冲区大小

user: user-2
content: 作者：benpigchu 链接：https://www.zhihu.com/question/53311855/answer/134429152 来源：知乎 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。  scanf_s 和 scanf 几乎是一样的，但是 scanf_s 在字符串的读入上有不同，允许在参数中指定读入字符串的长度上限，以避免读入的内容长度超过已有的内存空间的长度。比如，如果我们这样写： char word[10]; scanf("%s",word); 然后运行的时候输入了一个这样的字符串：tooyoungtoosimplesometimesnaive 那么这么长的字符串就会全部填在 word 数组里，超过它的长度，这样会出偏差的。为了避免出现这样的偏差，scanf_s 允许你指定读入串的长度上限，于是我们改成下面这样： scanf_s("%s",word,(rsize_t)sizeof word); 这样输入过长时就会产生错误，执行你之前在 set_constraint_handler_s 中定义的错误处理函数（如果你没有定义的话，系统会给你准备一个，也许是直接忽略，也许是直接停止运行），你的程序就不会在这里搞出什么偏差。而且，如果你传入的参数有空指针的话，也会产生错误，执行你定义的错误处理函数。也就是说，使用 scanf_s 比使用 scanf 要更安全。不过，并不是所有的标准库都实现了 scanf_s，你可以通过检测 __STDC_LIB_EXT1__ 是否被 #define 了，检测标准库是否支持，然后在代码最前面加上下面这一行：#define __STDC_WANT_LIB_EXT1__ 1 来开启标准库对于 scanf_s 以及其他一些函数的更安全的版本（比如 strcpy_s memset_s 之类的）的支持。这是 C11 新增的内容。

user: user-3
content: scanf_s("%s", name, 40); scanf_s使用时缺少参数，详细的请查阅一下scanf_s的原型
user-0 提问: 关于八皇后问题

回复:
user: user-1
content: 你确定不出错？？？

user: user-0
content: 我确定的可以运行，自己也试过，完全没问题，反倒是更改后就是各种问题，运行不了。

user: user-2
content: 可编译可运行； 但是i = 8，肯定越界，可能并未运行到i=8时刻，已经return了

user: user-3
content: 传进来的数组有查看过吗?

user: user-4
content: 若QueenArr是的实参是8个元素的数组，那么标红色的循环确实是越界访问；当i=8时就越界了
user-0 提问: 求分析

回复:
user: user-1
content: #include<stdio.h> #include<math.h> int main() {      double pi = 0,i=1,temp = 1;      //3.141591 #if 1     int count1 = 1;     while(fabs(temp)>=1e-6)     {         pi += temp;         i = i+2;         temp = pow(-1,count1++)*1.0/i;     } #else     //3.141595     int count2 = 1;     while(fabs(temp)>=1e-6)     {       temp = pow(-1,count2++)*1.0/i;       pi += temp;       i = i+2;     } #endif     pi = pi * 4;     printf("%.6f\n",pi);      return 0; }   区别不是这两句执行的前后吗？：       pi += temp;       i = i+2;

user: user-0
content: 这前后应该没什么影响吧?但是两种方式算出来的答案就是不一样,第一种是标准答案,第二种就是错的
user-0 提问: 计算2的n次方，不能使用乘法运算和循环

回复:
user: user-1
content: pow函数的参数可以是double类型的

user: user-1
content: x的y次方: pow(x,y); pow(2,n);可以么？

user: user-2
content: int two_x(int x) { int num = 1; num = num << x; return num; }

user: user-3
content: 引用 3 楼 FoolCarpe的回复:不能使用乘法运算和循环， 用递归？ 递归不也是循环…嵌套循环…

user: user-4
content: 对代表指数部份的段位加n，就可以了啊。

user: user-0
content: 引用 10 楼 zhao4zhong1 的回复:[quote=引用 9 楼 Intel0011 的回复:] [quote=引用 8 楼 zhao4zhong1 的回复:] 你咋不想万一 要计算2的-1.2+2.3i次方捏？！ 不用搬出复数吧，如果n足够大的话，再强的机器也无法得到结果[/quote] 矫枉必须过正！[/quote] 我的想法也是这样，万一遇到浮点型的要考虑，毕竟题目没有说n的整数。真的需要考虑c的库函数，单纯去编是做不到的

user: user-0
content: 真的需要考虑c的库函数，单纯去编是做不到的

user: user-5
content: 计算2的n方：pow(2.0,n)  2要写成2.0   头文件  #include<math>

user: user-6
content: 应该说只需要 与非 ( ~（A&B）， 储存（ LDR/STR ）， 分支( if )   就够了 ...  没循环的话， 很多操作要展开， 会写的很长 ....  不过也可以 .....

user: user-6
content: 只用位运算 ( &, |, ^, <<, >>) 完全可以实现所有的 运算， 就稍微麻烦点， 浮点数，  复数啥的也没啥问题,  以前应该贴过 ....

user: user-7
content: 引用 7 楼 Intel0011 的回复:如果可以使用C库函数的话，直接 double pow (double base, double exponent); 这位仁兄正解。哈哈哈

user: user-8
content: 感觉就是考位运算的

user: user-9
content: 过犹不及...

user: user-10
content: 找pow函数的源代码看看。 参考一下：http://blog.csdn.net/xiaoxiongli/article/details/2134626

user: user-11
content: 引用 9 楼 Intel0011 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] 你咋不想万一 要计算2的-1.2+2.3i次方捏？！ 不用搬出复数吧，如果n足够大的话，再强的机器也无法得到结果[/quote] 矫枉必须过正！

user: user-12
content: 引用 8 楼 zhao4zhong1 的回复:你咋不想万一 要计算2的-1.2+2.3i次方捏？！ 不用搬出复数吧，如果n足够大的话，再强的机器也无法得到结果

user: user-11
content: 你咋不想万一 要计算2的-1.2+2.3i次方捏？！

user: user-12
content: 如果可以使用C库函数的话，直接 double pow (double base, double exponent);

user: user-13
content: 次方最基本的定义是:n为正整数，

user: user-11
content: <<
user-0 提问: 括号匹配问题

回复:
user: user-1
content: #include <stdio.h> #include <string.h>  char Stack[10002], c[10002];  int main() {     int len;     while(~scanf("%s", c))     {         int top = 0; 	len = strlen(c);         for(int i = 0; i < len; i++)         {             if(top == 0 && (c[i] == ')' || c[i] == ']' || c[i] == '}' || c[i] == '>'))                 break;              switch(c[i])             {                 case '(': case '[': case '{': case '<':                     Stack[++top] = c[i];                     break;                 case ')':                     if(top>0 && Stack[top] == '(')                         top--;                     break;                 case ']':                     if(top>0 && Stack[top] == '[')                         top--;                     break;                 case '}':                     if(top>0 && Stack[top] == '{')                         top--;                     break;                 case '>':                     if(top>0 && Stack[top] == '<')                         top--;                     break;             }         }          if(top)             printf("NO\n");         else             printf("YES\n");     }      return 0; } 改成这样，把strlen(c);放到循环外，因为每次判断都需要计算一下，没必要，用一个变量len计算一次即可； 另外，你的程序不健壮，因为只输入}或者]或者)也会输出YES，这是逻辑的缺陷，建议继续查一下；

user: user-2
content: 引用 2 楼 user-3 的回复:for(int i = 0; i < strlen(c); i++) 光把这句改掉估计就能过了 赞同，在循环里使用strlen特别耗时。

user: user-3
content: for(int i = 0; i < strlen(c); i++) 光把这句改掉估计就能过了

user: user-0
content: #include <stdio.h> #include <string.h>  char Stack[10002], c[10002];  int main() {     while(~scanf("%s", c))     {         int top = 0;          for(int i = 0; i < strlen(c); i++)         {             if(top == 0 && (c[i] == ')' || c[i] == ']' || c[i] == '}' || c[i] == '>'))                 break;              switch(c[i])             {                 case '(': case '[': case '{': case '<':                     Stack[++top] = c[i];                     break;                 case ')':                     if(top>0 && Stack[top] == '(')                         top--;                     break;                 case ']':                     if(top>0 && Stack[top] == '[')                         top--;                     break;                 case '}':                     if(top>0 && Stack[top] == '{')                         top--;                     break;                 case '>':                     if(top>0 && Stack[top] == '<')                         top--;                     break;             }         }          if(top)             printf("NO\n");         else             printf("YES\n");     }      return 0; }
user-0 提问: 如图

回复:
user: user-1
content: /* scanf example */ #include <stdio.h>  int main () {   char str [80];   int i;    printf ("Enter your family name: ");   scanf ("%s",str);     printf ("Enter your age: ");   scanf ("%d",&i);   printf ("Mr. %s , %d years old.\n",str,i);   printf ("Enter a hexadecimal number: ");   scanf ("%x",&i);   printf ("You have entered %#x (%d).\n",i,i);      return 0; }

user: user-2
content: main函数标准的写法是返回int型，有些系统会以该返回值判断程序是否返回成功，比如Makefile；另外一般还带2个参数：int argc, char **argv，用来传入参数，即形如"test arg1 arg2 agr3"这样的命令行调用。

user: user-3
content: 引用 5 楼 qq_27014717 的回复:[quote=引用 4 楼 Season__0_0 的回复:] 除了上面的问题，还有main函数没有类型，没有返回值，一开始学养成良好的习惯吧 #include <stdio.h> int main() { int a; scanf("%d",&a); printf("%d",a); return 0; }教材上主函数都是void型，为什么你写的是int型，这个有什么说法吗，我看codeblocks新建源文件时打开的主函数也是int型[/quote]  选本靠谱的教材吧

user: user-4
content: 同意一楼说法，另外，楼主，这不是anyview的作业吗，哈哈哈哈

user: user-5
content: 引用 4 楼 Season__0_0 的回复:除了上面的问题，还有main函数没有类型，没有返回值，一开始学养成良好的习惯吧 #include <stdio.h> int main() { int a; scanf("%d",&a); printf("%d",a); return 0; }教材上主函数都是void型，为什么你写的是int型，这个有什么说法吗，我看codeblocks新建源文件时打开的主函数也是int型

user: user-6
content: 除了上面的问题，还有main函数没有类型，没有返回值，一开始学养成良好的习惯吧 #include <stdio.h> int main() { int a; scanf("%d",&a); printf("%d",a); return 0; }

user: user-7
content: 引用 1 楼 hzy_76 的回复:空格用来分割输入，所以带空格时，+被当作了输入，他不是一个合法数字，a就是随机的值；没空格时+3就是3了。 赞同！  scanf函数是格式化输入，若不按照该函数指定的函数输入，那么结果可能是未定义的。

user: user-8
content: 因为你把正号赋予了变量a，当遇到空格，则输入结束。

user: user-2
content: 空格用来分割输入，所以带空格时，+被当作了输入，他不是一个合法数字，a就是随机的值；没空格时+3就是3了。
user-0 提问: 怎样让codeblocks使用最新的gcc和gdb?

回复:
user: user-1
content: 1. 首先要下载并安装mingw，下载的是一个zip压缩文件，解压你就进入解压文件下，有一个MinGW-5.1.6.exe，点开后按提示安装就好了（记住路径）。 2. codeblocks配置MinGW，settings-->compiler-->selected compiler（选择GNU GCC Compiler）-->Toolchain executables：   compiler's installation directory：选择你的安装路径   点Auto-detect   重复第2步，直到selected compiler和compiler's installation directory显示都正确。 3. windows下安装gdb可以参考这个链接：https://blog.csdn.net/codebattle/article/details/38868313。 4. 编译完了，找到gdb目录下的gdb.exe文件，复制到MinGW\bin目录下。 5. 在codeblocks下配置调试器，setting-->debugger-->default-->executable path选择你的gdb.exe文件。

user: user-0
content: 引用 4 楼 xsklld 的回复:https://sourceforge.net/projects/mingw-w64/ 非常感谢

user: user-0
content: 引用 6 楼 hongwenjun 的回复:CB集成的是 TDM-GCC   你可以下载单独的 TDM-GCC  64，自己配置一下 CB 2018版快要出了，可以再等等 非常感谢，cb真是款好软件

user: user-2
content: CB集成的是 TDM-GCC   你可以下载单独的 TDM-GCC  64，自己配置一下 CB 2018版快要出了，可以再等等

user: user-2
content: Git_Vim_Gcc安装和使用视频  http://vc.yiche.com/vplay/136129.html

user: user-3
content: https://sourceforge.net/projects/mingw-w64/

user: user-0
content: 引用 2 楼 paschen 的回复:软件是不会自动帮你去下载的，需要你自己下载需要的编译器，然后安装设置 您好，不知道那些从gcc、gdb官网下载的文件怎么编译成.exe，在网上也找不到相关的教程

user: user-4
content: 软件是不会自动帮你去下载的，需要你自己下载需要的编译器，然后安装设置

user: user-5
content: 去官网上下载，再根据官网上的说明文档安装。不过，官网的文档似乎都是英文的，如果看不懂可以找一下翻译软件。
user-0 提问: 请大家帮我看看这个问题

回复:
user: user-0
content: 还有个问题，问什么新建源文件的时候主函数默认是int型（教材上都是void型），而且有输出hello world的语句？

user: user-0
content: 引用 2 楼 wang0635 的回复:两个文件的时候，由于调用aver的文件中没有它的声明，编译器就自行假定它的返回值是int型的了。实际的返回值在赋值给av之前已经另行解释成int了（不是强制转换），因此与你预期的不一样没看懂为什么结果是10

user: user-0
content: 哇，真的可以，多谢各位

user: user-1
content: 对，函数应该在主函数那页声明一下，才能正常的调用。

user: user-2
content: 两个文件的时候，由于调用aver的文件中没有它的声明，编译器就自行假定它的返回值是int型的了。实际的返回值在赋值给av之前已经另行解释成int了（不是强制转换），因此与你预期的不一样

user: user-3
content: 没发现有啥问题，放在两个文件里编译有没有提示警告？ aver函数需要在main.c文件里声明一下的，不然应该会提示警告
user-0 提问: 集合问题

回复:
user: user-1
content: 引用 4 楼 倦怠的回复:递归效率不高，可以用动态规划解决 看你程序定位，如果只是小程序，就没必要追求极高效率

user: user-2
content: 递归效率不高，可以用动态规划解决

user: user-1
content: 可以试试用递归，在输出各个组合的时候判断m是否等于组合元素相加

user: user-0
content: 只有相加，但不是两两，有可能三三四四，就是从集合中挑1到n个数相加。比如说：集合｛12345｝,1+2+3和1+2+3+4+5，这些都是它的拓展域。现在给定一个数m，判断是否m在拓展的集合，比如n=3时｛1 2 3｝可拓展为｛123456｝ 当输入m为1到6时 输出yes,否则输出no

user: user-3
content: 这个集合的拓扑就是通过原有集合元素两两相加得到吗？还是有其他要求？比如，相乘，相减，相除，取余等等