Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 建立一个可以输出最小值的栈，我的代码却输出不了我想要的数据 有大神帮我回答吗 拜托了！

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h> #define MAX_STACK_SIZE 100 typedef struct {     int *base;     int *top;     int maxsize; }minStack;//类型说明 void minStackCreat(minStack&S,int maxsize)  //建立一个栈 {     S.base=(int*)malloc(MAX_STACK_SIZE*sizeof(int)) ;     if(!S.base)         exit(-1);     S.top = S.base;     S.maxsize = maxsize; } void minStackFree(minStack&S)//清空栈 {     if(!S.base)     {         printf("无需释放栈空间");     }     else     {         free(S.base);    /*释放空间*/         S.top = S.base = NULL;     } } void minStackPush(minStack&S,minStack&L,int x) {     *S.top = x;     S.top++;      if (L.base == L.top)         *L.top++ = x;     else if (x < *(L.top - 1))         *L.top++ = x;  } void minStackPop(minStack&S,minStack&L) {     if((S.base == S.top)||(L.base == L.top))         printf("已经没有可以输出的最小值！");     else     {         if(*S.top==*L.top)//出栈时，如果数据栈的栈顶数据等于最小值栈的栈顶数据，则代表该数据为数据栈内的当前最小值，         {             S.top--;             L.top--;         }//将两个栈的栈顶元素都弹出，便于求下一个最小值         else         {             S.top--;         }     } } int minStackTop(minStack &S)//获取数据栈的栈顶元素 {     return (*(S.top- 1)); } int minStackgetMin(minStack&L)//获取最小值栈的栈顶元素 {     return(*(L.top- 1)); } int main() {     minStack S;     minStack L;     minStackCreat(S, MAX_STACK_SIZE);     minStackCreat(L, MAX_STACK_SIZE); //建立两个栈，S是存放数据的栈，L的栈顶存放当前的最小值     int arr[]={20,50,12,13,0,78,5,6,9,25};     int x;     int param_3;     int param_4;     int i;     for(i=0;i<10;i++)     {         x=arr[i];         minStackPush(S,L,x);         printf("%d进栈,S栈栈顶元素为%d，L栈栈顶元素为%d\n",x, minStackTop(S),minStackgetMin(L));     }     for(i=0;i<10;i++)     {         param_3=minStackTop(S);         param_4=minStackgetMin(L);         printf("%d出栈,当前最小值是%d\n\n",param_3,param_4);         minStackPop(S,L);     }     minStackFree(S);     minStackFree(L);     return 0; } 参考一下吧，只有push和pop才会修改top的位置，其他函数如果要查看top位置的值，只能通过+1，或-1得到；
user-0 提问: c51单片机大神围观求解决，感谢！

回复:
user: user-1
content: #include<reg52.h> #define uchar unsigned char uchar data text1[16] _at_0x60; uchar xdata text2[16] _at_0x1000; void main(void) { uchar i; uchar *p1, *p2;  p1 = test1; p2 = test2; for (i = 0; i < 16; i++) {     p1[i] = i;     p2[i] = i; } /* for(i=0;i<16;i++) text1[i]=i; for(i=0;i<16;i++) text2[i]=text1[i]; */ while(1); }

user: user-0
content: 这是一个for的还是指针的啊？

user: user-0
content: 能具体点吗 ？这是一个例子吧，能具体写一下代码吗？这样能理解但还是不太清楚怎么写，感谢！

user: user-2
content: A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价
user-0 提问: Linux下执行出现“段错误（核心已转储）”

回复:
user: user-1
content: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

user: user-2
content: 1. fd描述符需要判断是否为NULL，如果不判断，并且是NULL，那么就会导致段错误； 2. 定义的buffer是8个字节，那么size/2的值大于8，就会导致buffer越界，也可能导致段错误； 3. 对于父进程，读的数据有可能超过size/2，那么应该将读到的部分数据写入目标文件；  fork是创建进程，所以头文件应该用unstd.h，而不是pthread.h 试一下下面的修改：  #include<stdio.h> #include<stdlib.h> #include <unistd.h> //#include<pthread.h>  int size;  int main() {     FILE *fp;     FILE *fd;     fp = fopen("initial.txt","r");                  //only read     fd = fopen("result.txt","w");                    //only write     if(!fd || !fd)    /* 两个文件描述符都要检查是否为NULL*/     {         printf("error");         exit(1);     }     fseek(fp,0L,SEEK_END);                         //get size     size = ftell(fp);     fseek(fp,0L,SEEK_SET);     printf("%u",size);     int len;     int total = 0;     pid_t fpid = fork();                           //creat process      if(fpid == 0)                                  //son process     {         char buffer[8];         int len = 0, cur_pos = 0;         fseek(fp, size/2, SEEK_SET);         fseek(fd, size/2, SEEK_SET);         while ((len = fread(buffer, sizeof(char), 8, fp)) > 0) {             if (cur_pos >= size/2)                 break;             fwrite(buffer,sizeof(char), len, fd);             cur_pos += len;         } #if 0         while(fread(buffer,sizeof(char),size/2,fp) != 0)         {             fwrite(buffer,sizeof(char),size/2,fd);         } #endif     }     else                                           //father process     {         char buffer[8];         fseek(fp, 0L, SEEK_SET);         fseek(fd, 0L, SEEK_SET);         while(total < size/2)         {             len = fread(buffer,sizeof(char), 8, fp);             if (total + len < size/2) {                 fwrite(buffer, sizeof(char), len, fd);                 total += len;             } else {                 len = size/2 - total;                 fwrite(buffer, sizeof(char), len, fd);                 break;             }         }     }     fclose(fp);     fclose(fd);     return 0; }
user-0 提问: vs2017的本地调试器,颜色函数,改过输出字颜色的项目,把改变颜色的代码文件去掉,换新的源文件使用开始调试输出还是彩色,只执行不调试就不改变颜色

回复:
user: user-1
content: 以下内容摘自ANSI.SYS联机帮助：  ESC[Ps;...;Psm     Set Graphics Mode: Calls the graphics functions specified by the     following values. These specified functions remain active until the next     occurrence of this escape sequence. Graphics mode changes the colors and     attributes of text (such as bold and underline) displayed on the     screen.      Text attributes        0    All attributes off        1    Bold on        4    Underscore (on monochrome display adapter only)        5    Blink on        7    Reverse video on        8    Concealed on      Foreground colors        30    Black        31    Red        32    Green        33    Yellow        34    Blue        35    Magenta        36    Cyan        37    White      Background colors        40    Black        41    Red        42    Green        43    Yellow        44    Blue        45    Magenta        46    Cyan        47    White      Parameters 30 through 47 meet the ISO 6429 standard.

user: user-1
content: console屏幕处理例子程序。终端窗口屏幕处理相关API使用例子。来自MSVC20\SAMPLES\win32\console\ http://download.csdn.net/detail/zhao4zhong1/3461309

user: user-2
content: 你可以做一个函数，用来打印一个彩色的字符串 在函数内部，返回前把颜色设置回默认的。 我这个是打印Unicode字符串的，打印GBK的可以用WriteConsoleA或者WriteConsole（根据字符集自动选择char还是wchar_t）void ColorPrint(const wchar_t* str, WORD color) { 	if (str != nullptr) 	{ 		DWORD dw; 		if (color != 0x0007) 		{ 			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color); 			//显式的使用宽字符版本 			WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), str, wcslen(str), &dw, NULL); 			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x0007); 		} 		else 			WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), str, wcslen(str), &dw, NULL); 	} }

user: user-0
content: 引用 1 楼 user-3 的回复:可能cmd程序将设置保存到了配置文件中，下次运行时自动设置为上一次修改了的 请问是vs的配置文件还是cmd的,能告知具体路径吗?谢谢

user: user-3
content: 可能cmd程序将设置保存到了配置文件中，下次运行时自动设置为上一次修改了的
user-0 提问: 可以帮忙解决一下问题吗？为什么出来的心是歪的？

回复:
user: user-1
content: for(i=1;i<80;i++) { if(i==25) { printf(" I love you "); i+=30; }  改为 for(i=1;i<80;i++) { if(i==33) { printf(" I love you "); i+=12; } 再试下？？？？？
user-0 提问: 求大神指导为什么以下程序运行不了？刚刚接触c语言见笑

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

user: user-2
content: 加油 ，先把基础打好。

user: user-3
content: main函数没见过返回值是double类型，一般都是int

user: user-3
content: #include<stdio.h>  int main(){     double a,b,c,d;     printf("请输入方程的未知数系数和常数项，并按Enter键求解：");     scanf("%lf%lf%lf%lf",&a,&b,&c,&d);     double x;     for(x=0.00;;x=x+0.01)         if(a*x+b == c*x){             printf("解：x=%lf\n",x);             break;         }     return 0; } scanf第一个参数不对； 对于浮点数比较是否相等，方法是求相差的决定值小于1e-6；比如  double a, b; if (fabs(a-b) < 1e-6)    printf("a == b\n"); else    printf("a != b\n");

user: user-4
content: scanf("%%%%",&a,&b,&c,&d);// 问题在这一句上面，%后面没有指定类型。

user: user-5
content: #include<stdio.h> double main(){ double a,b,c,d; printf("请输入方程的未知数系数和常数项，并按Enter键求解："); scanf("%f%f%%f%f",&a,&b,&c,&d); double x; for(x=0.00;;x=x+0.01) //一遍一遍的循环知道找到解 if(a*x+b==c*x){ //判断x+2是否等于4 printf("解：x=%f\n",x); //输出结果 break; //退出循环 } return 0.00; }   你试试这个，可能是你本身输入数据的问题

user: user-6
content: main()返回值不应该是int吗？
user-0 提问: c语言的数组与指针

回复:
user: user-1
content: 引用 3 楼 Army123 的回复:有本书叫C和指针

user: user-2
content: 主要的还是理论和实践相结合，这样对于理解会有帮助；实践就是多敲敲代码，运行一下，调试一下；

user: user-2
content: http://blog.csdn.net/imred/article/details/45441457 网上有很多说明，可以从网上找一下；

user: user-3
content: 有本书叫C和指针

user: user-4
content: c语言这本书里有最基础的数组和指针

user: user-5
content: http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组
user-0 提问: ++kase什么意思

回复:
user: user-1
content: 应该是kase自增1，然后把自增过后的值赋给kase，同理--kase。LZ需要注意的是kase++和++kase的区别

user: user-2
content: 变量kase先自加,再运算

user: user-3
content: 先对kase进行运算,再把kase+1

user: user-4
content: 先加一 再取值

user: user-5

user: user-6

user: user-7
content: kase = kase + 1;

user: user-8
content: 引用 3 楼 user-13 的回复:kase = kase + 1 赞同； 建议楼主看一下前自加和后自加的问题，同理还有自减

user: user-9
content: kase = kase + 1

user: user-10
content: kase = kase + 1；混一波积分，嘻嘻

user: user-11
content: 就是你定义了一个变量kase，让它先自加再运算；跟++i是一样的

user: user-12
content: kase + 1

user: user-13
content: kase = kase + 1
user-0 提问: C语言快速排序最后递归代码问题，不是很懂？求教！！

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

user: user-2
content: 引用 2 楼 jk24680 的回复:你好，请问#1和#2在  if (l < r)语句的外面，为什么是递归执行的条件呢？不是很懂？ #1和#2在if的语句块内部啊

user: user-0
content: 你好，请问#1和#2在  if (l < r)语句的外面，为什么是递归执行的条件呢？不是很懂？

user: user-2
content: 退出条件是数组只有1个元素时候退出 看递归函数第一句 if (l < r)  就是递归执行的条件，反之就是退出条件  执行完#1后，#1改变了i的值，#2使用的是#1执行后改变了的i的值?还是#2和#1使用的都是未改变的i的值？ #1没改变i的值，因为函数参数是值传递，传过去的是拷贝，函数内部再怎么改动i，不影响外面的i，除非用指针参数或者引用，那么里面的i变了，外面的i跟着一起变
user-0 提问: c51单片机大神帮忙看看，感谢！

回复:
user: user-1
content: 两个循环合在一起，不就是一个循环完成了两个循环的操作；

user: user-0
content: 非常感谢您的这代码,汇编能找到,但是太多太杂乱了,您能具体写一下上边这代码汇编有用的具体的内容吗?在这小弟先感谢了,谢谢!

user: user-2
content: for(i=0;i<16;i++){ text1[i]=i; text2[i]=text1[i]; }  编译器可以直接把c编译成汇编代码
user-0 提问: 求大佬指教，为什么结果叠加了

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

user: user-2
content: 在while里面，你的t没有重新复制，他肯定会一直加下去

user: user-3
content: #include <stdio.h>  int main() {     int i,y,m,d,t=0;     int a[13]={0,31,29,31,30,31,30,31,31,30,31,30,31},         b[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};     while(scanf("%d/%d/%d",&y,&m,&d)!=EOF)     {         if(y%400==0||(y%4==0&&y%100!=0))         {             for(i=0;i<m;i++)                 t+=a[i];         }         else         {for(i=0;i<m;i++)             t+=b[i];}         t+=d;         printf("%d\n",t);         t = 0;    /* 重新初始化 */     }     return 0; } 在while循环中对t重新初始化

user: user-4
content: t在循环外边声明的 把它放在里边 或者每次重置一下
user-0 提问: C语言关于快速排序代码的分析，我表示不能理解！求教！

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

user: user-2
content: 对于这几种排序方法，函数实现肯定都是按照排序定义实现的，你看看快排的定义，或许就知道为什么那么做了！
user-0 提问: 关于C语言递归函数的一段代码，我有个地方不能理解？求助

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

user: user-1
content: http://www.codeproject.com/Articles/418776/How-to-replace-recursive-functions-using-stack-and

user: user-2
content: 建议所有用递归的地方,都用栈来替代.曾经做femto的DM模块,递归省代码,但是内存耗费巨大.改成栈,代码虽然多一点,但是内存省了好多哦.

user: user-3
content: 因为递归是不断在函数栈上申请自己的函数栈，根据栈的特性：先进后出，所以进入的顺序是1， 2， 3， 4自然，出的顺序是倒过来； 需要理解函数的调用是在栈上申请一个函数栈（一个函数在栈上需要的空间，函数名是函数栈的开始位置），递归就是不停叠加申请自己的函数栈（所以递归是消耗栈空间），当条件不满足，则不在申请函数栈，而是根据上次执行的位置逐步反向释放函数栈空间

user: user-4
content: 当参数为4的时候，只是不满足函数中的if条件，从而不再继续递归，但程序会继续执行if后的语句，也就是输出第4级返回
user-0 提问: 输入5个字符，将大写字母变小写，其他类型不变。求解！

回复:
user: user-1
content: C语言输入多个字符都是用的数组,字母转换大小写有专门的函数可以解决

user: user-2
content: 我c语言不好说错了莫见怪  固定分配或者动态分配一块内存 之后用指针访问 貌似也是一样的

user: user-2
content: 不知道结构体算不算数组

user: user-3
content: 要用数组才行

user: user-4
content: 不用数组，如何存储这5个字符？

user: user-0
user-0 提问: 为什么算出来的数不对呢

回复:
user: user-1
content: 计算1000！，仅供参考：#include<stdio.h> #define N 1000    //要计算的N long s[N]={1,1},n=N,t=2,a=1,b=0; int main()//雨中飞燕之作 {     for(;a<=*s||(++t<=n?(b=0,a=1):0);(*s==a++&&b)?(*s)++:0)         s[a]=(b+=s[a]*t)%10000,b/=10000;     for(printf("%d",s[*s]);--*s>0;) printf("%04d",s[*s]);     return 0; }

user: user-1
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-2
content: 引用 1 楼 redRnt 的回复:是的 我们查看一下原型：  里面的参数是double类型，如果我们写的是10，就会存在类型转换的问题。改为10.0就好了。 #include <iostream> #include <cmath> using namespace std; int main(){ 	int i,a,n,sum; 	//输入  	cout << "N: "; 	cin >> n; 	cout << "A: "; 	cin >> a; 	cout << endl; 	sum = a; 	 	for(int i = 1; i < n; i++){ 		sum = sum + a * pow(10.0,i); 	}  	cout << sum; 	return 0; }   结果：   如果写成10，结果就是221 结果应该是222吧，而不是221

user: user-3
content: 引用 9 楼 Lraxer 的回复:[quote=引用 8 楼 xsklld 的回复:] [quote=引用 6 楼 Lraxer 的回复:] [quote=引用 4 楼 xsklld 的回复:] 浮点运算有误差 但是按照上上楼的说法，强制定义pow函数为float就是对的，为什么[/quote] 凑巧而已。double、float、int转来转去各种精度损失夹在一起恰好结果对了而已。[/quote] 用Pow函数应当如何规避这种误差呢[/quote] 不用pow函数，整数次幂的话自己写一个函数。

user: user-0
content: 引用 5 楼 baidu_37097818 的回复:按照你的题目说明，答案不应该是2+22+222=246吗？  不要看那个注释了（误）这个代码是我胡乱写的不小心发现了问题

user: user-0
content: 引用 4 楼 xsklld 的回复:浮点运算有误差 但是按照上上楼的说法，强制定义pow函数为float就是对的，为什么

user: user-4
content: 按照你的题目说明，答案不应该是2+22+222=246吗？

user: user-0
content: 引用 8 楼 xsklld 的回复:[quote=引用 6 楼 Lraxer 的回复:] [quote=引用 4 楼 xsklld 的回复:] 浮点运算有误差 但是按照上上楼的说法，强制定义pow函数为float就是对的，为什么[/quote] 凑巧而已。double、float、int转来转去各种精度损失夹在一起恰好结果对了而已。[/quote] 用Pow函数应当如何规避这种误差呢

user: user-3
content: 引用 6 楼 Lraxer 的回复:[quote=引用 4 楼 xsklld 的回复:] 浮点运算有误差 但是按照上上楼的说法，强制定义pow函数为float就是对的，为什么[/quote] 凑巧而已。double、float、int转来转去各种精度损失夹在一起恰好结果对了而已。

user: user-3
content: 浮点运算有误差

user: user-0
content: 引用 1 楼 redRnt 的回复:是的 我们查看一下原型：  里面的参数是double类型，如果我们写的是10，就会存在类型转换的问题。改为10.0就好了。 #include <iostream> #include <cmath> using namespace std; int main(){ 	int i,a,n,sum; 	//输入  	cout << "N: "; 	cin >> n; 	cout << "A: "; 	cin >> a; 	cout << endl; 	sum = a; 	 	for(int i = 1; i < n; i++){ 		sum = sum + a * pow(10.0,i); 	}  	cout << sum; 	return 0; }   结果：   如果写成10，结果就是221 为什么将整型转化成双精度浮点型还会有这样的问题呢。。

user: user-5
content: 虽然不知道啥原因，但是你把pow强制转换为float，即(float)pow(10,i)结果就正确了，转换为double结果也是221.哈哈

user: user-6
content: 是的 我们查看一下原型：  里面的参数是double类型，如果我们写的是10，就会存在类型转换的问题。改为10.0就好了。 #include <iostream> #include <cmath> using namespace std; int main(){ 	int i,a,n,sum; 	//输入  	cout << "N: "; 	cin >> n; 	cout << "A: "; 	cin >> a; 	cout << endl; 	sum = a; 	 	for(int i = 1; i < n; i++){ 		sum = sum + a * pow(10.0,i); 	}  	cout << sum; 	return 0; }   结果：   如果写成10，结果就是221
user-0 提问: HDU-1096

输出格式不正确

回复:
user: user-0
content: #include<iostream>  #include<cstdio>  using namespace std;  int main()  { int n,k,a,sum;  scanf("%d",&n);  while(n--)  { sum=0;  scanf("%d",&k);  for(int i=0;i<k;i++)  {  scanf("%d",&a);  sum+=a;  }  if(n!=0)  printf("%d\n\n",sum);  else printf("%d\n",sum);  }  }这是其中的一个正确答案，我想知道我的代码和这个有什么不同。

user: user-0
content: 引用 2 楼 自信男孩的回复:[quote=引用 1 楼 qq_15556277 的回复:] #include<iostream>  #include<cstdio>  using namespace std;  int main()  { int n,k,a,sum;  scanf("%d",&n);  while(n--)  { sum=0;  scanf("%d",&k);  for(int i=0;i<k;i++)  {  scanf("%d",&a);  sum+=a;  }  if(n!=0)  printf("%d\n\n",sum);  else printf("%d\n",sum);  }  }这是其中的一个正确答案，我想知道我的代码和这个有什么不同。 你的代码，n不可能等于0 ，因为如果n等于0 ，那么循环体里无法执行，那么自然无需判断n的值是否0； 改一下你的循环条件吧；  #include<stdio.h>  int main(void) {     int a, b, n, i, x, c;      scanf("%d", &n);      for(i = n-1;i >= 0; i--)     {         scanf("%d", &c);         for(x=1, b=0;x <= c;x++)         {             scanf("%d", &a);             b+=a;         }         if(i != 0)             printf("%d\n\n", b);         else             printf("%d\n", b);     }     return 0; } [/quote] 谢谢你！成功解决问题。

user: user-1
content: 引用 1 楼 qq_15556277 的回复:#include<iostream>  #include<cstdio>  using namespace std;  int main()  { int n,k,a,sum;  scanf("%d",&n);  while(n--)  { sum=0;  scanf("%d",&k);  for(int i=0;i<k;i++)  {  scanf("%d",&a);  sum+=a;  }  if(n!=0)  printf("%d\n\n",sum);  else printf("%d\n",sum);  }  }这是其中的一个正确答案，我想知道我的代码和这个有什么不同。 你的代码，n不可能等于0 ，因为如果n等于0 ，那么循环体里无法执行，那么自然无需判断n的值是否0； 改一下你的循环条件吧；  #include<stdio.h>  int main(void) {     int a, b, n, i, x, c;      scanf("%d", &n);      for(i = n-1;i >= 0; i--)     {         scanf("%d", &c);         for(x=1, b=0;x <= c;x++)         {             scanf("%d", &a);             b+=a;         }         if(i != 0)             printf("%d\n\n", b);         else             printf("%d\n", b);     }     return 0; }
user-0 提问: C语言快速排序递归部分的代码我不是很懂，求解，思考了很久！！

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

user: user-2
content: 引用 3 楼 cfjtaishan 的回复:递归是不断在栈上创建本身的函数栈，比如第一执行i = 5；那么i - 1，那么下次是4， 3， 2， 1，最后i = 1，然后当i为1时，然后执行quick_sort(s, i + 1, r); i+1, ... 根据栈的特性，之前创建的函数栈会逐步出栈，直到执行完（也就是所有的数据都完成排序）； 函数并不是执行完一次就退出，回调是在新的栈上开辟新的（本身）函数栈空间 回调改成递归，用词不当

user: user-2
content: 递归是不断在栈上创建本身的函数栈，比如第一执行i = 5；那么i - 1，那么下次是4， 3， 2， 1，最后i = 1，然后当i为1时，然后执行quick_sort(s, i + 1, r); i+1, ... 根据栈的特性，之前创建的函数栈会逐步出栈，直到执行完（也就是所有的数据都完成排序）； 函数并不是执行完一次就退出，回调是在新的栈上开辟新的（本身）函数栈空间

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

user: user-3
content: 当然是同一个值，i没变，递归函数传递的是值，又没传引用。
user-0 提问: C的一个数据细节小问题

回复:
user: user-0
content: 引用 9 楼 zhao4zhong1 的回复:关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775 理解和讨论之前请先学会如何观察！  计算机组成原理→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执行停在该断点处的时候。  感谢大佬

user: user-0
content: 引用 11 楼 jiangzyu 的回复:这种问题都是有病 天知道为什么会有计算机二级这个东西，而且还完全乱命名不说，代码都是贼乱，疯掉

user: user-1
content: 这种问题都是有病

user: user-2
content: 关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775 理解和讨论之前请先学会如何观察！  计算机组成原理→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执行停在该断点处的时候。

user: user-3
content: 实际上真没必要这么做。 多写几行，条理清晰，更好。

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:逗号运算符的优先级是最低的，所以先计算c+=c++, 然后是c+8, ++c，然后把++c的值和括号外的数值相加。 最好自己编辑，编译和运行一下，然后根据结果或调试来推测为什么是这样的结果； 编程应该多动手和动脑，而不只是想和推测； 大神说的很有道理！！！确实应该多动手

user: user-0
content: 引用 1 楼 qq_38204686 的回复:逗号运算符 先计算左边的 后计算右边的 结果取最右 万分感激

user: user-0
content: 感谢各位大神的解答，小弟已经略懂了

user: user-4
content: 再给你出道题哦， a+++a+++a 你说一下怎么运算的吧，哈哈哈

user: user-4
content: 连这个你都不知道哦，看来你是菜鸟哦，好菜哈，哈哈哈。 你对运算符都不清楚哦。 了解单目运算符、双目运算符、多目运算你就不会晕哦。 顺便说一下，这个运算后，结果是a=22.隐藏着c=20.

user: user-5
content: 逗号运算符的优先级是最低的，所以先计算c+=c++, 然后是c+8, ++c，然后把++c的值和括号外的数值相加。 最好自己编辑，编译和运行一下，然后根据结果或调试来推测为什么是这样的结果； 编程应该多动手和动脑，而不只是想和推测；

user: user-6
content: 逗号运算符 先计算左边的 后计算右边的 结果取最右
user-0 提问: c语言，解引用求教

回复:
user: user-1
content: 这个的原因在于printf函数的定义吧~~

user: user-2
content: *message是字符，message是字符串

user: user-3
content: %s是指打印字符串，就必须传字符串首地址进去啊！如果你传了*message，就变成字符了，那打印格式就是%c。当然你也可以用%c，循环把字符串打出来。

user: user-4
content: 可以，但是*message的输出，应该用%c，因为*message是取字符串第一个字符的值。

user: user-5
content: message是个字符串指针，占位符是s%,要输出字符串，后面当然放字符串指针，*message只是这个字符串的首个字符

user: user-6
content: 解引用表示char，只能是单个字符， char*才是字符串，遇到\0结束字符串
user-0 提问: 逆向arm的so遇到一个问题

回复:
user: user-0
content: var_24=-0x24 STR RO,[R11,#0x14+var_24]；RO放到R11+#x014-0x24= R11-0x10 的偏移处 LDR R3,[R11,#var_10]；R3从R11+#var_10=R11-0x10的偏移处取值 也就是R3=R0   看书后，发现是这样的，由问题可以指正
user-0 提问: 求助，C语言中怎么进行地址间的排列组合？

回复:
user: user-1
content: 会比较麻烦，其实对数列进行排列组合就已经比较麻烦了。  建议分开来弄，即先将地址进行排列组合，然后再分别传入end

user: user-2
content: signature_t s1 = { 31, f1, w1 }, s2 = { 16, f2, w2 }, s3 = { 2, f3, w3 };  你为每个变量都定义名字当然麻烦了，用数组：  signature_t s[100];  每个元毒的地址可以用 (s+n)或 &s[n]表示，其中，n的值为 [0,99]  这样就可以用对数组元素排列组合的方法了。

user: user-0
content: 我目前查到的排列组合的算法都是针对字符或者数组中的元素的排列组合，没有关于怎么进行地址间的排列组合。。而且这个地址似乎也不是数组。。
user-0 提问: 关于用C实现繁星闪烁的问题

回复:
user: user-1
content: #pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <time.h> #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <windows.h> extern "C" HWND WINAPI GetConsoleWindow(); void HideTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = FALSE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } void ShowTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = TRUE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } int main() {     HWND  hwnd;     HDC   hdc;     RECT  r;     COLORREF c;      int i,v;     int x[20];     int y[20];      srand(time(NULL));     system("color 07");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     GetClientRect(hwnd,&r);     for (i=0;i<20;i++) {         x[i]=rand()%r.right;         y[i]=rand()%r.bottom;     }     while (1) {         for (i=0;i<20;i++) {             v=40+20*(rand()%11);             c=(COLORREF)(v<<16|v<<8|v);             SetPixel(hdc,x[i],y[i],c);         }         Sleep(100+rand()%200);         if (kbhit()) {getch();break;}     }      ReleaseDC(hwnd,hdc);     system("color 07");     system("cls");     ShowTheCursor();     return 0; }

user: user-2
content: 用c语言？直接定义哥xy坐标，随机生成星辰坐标，然后在该坐标显示*之类的符号，然后每生成一边刷新一边就可以了。

user: user-3
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: user-0
content: 图标隐藏是哪个函数

user: user-4
content: 可以先绘制一个图，在其上增加一些图标，然后随机对这些图标进行隐藏和显示处理

user: user-5
content: 闪烁的可以考虑用随机性，行数和列数用随机值，这样可以做到随机某个点闪烁

user: user-6
content: 用printf或者cout之类的肯定不行 要用到windows控制台的API，比如SetConsoleCursorPosition设置光标位置，挺麻烦的，自己去搜索相关的资料吧。 具体思路是获取控制台屏幕的长度和宽度，随机产生一定数量的坐标，循环使得这些坐标显示或者擦除字符，时间也是随机
user-0 提问: C语言udp服务器接收BC95模块发送的十六进制数据

回复:
user: user-1
content: 是的，字符串是靠‘\0’来判定是否结束的 这对于byte[]的接收不适用 一般都是包头携带数据长度，根据数据长度来判定是否结束

user: user-2
content: 用strlen来判断接收数据大小，只适用于该数据刚好是字符串的情况，BC95_Senddata是如何发送数据的，你清楚吗？若不知道，改成直接把buf全部打印出来，研究一下。

user: user-0
content: void print_client_info(const struct sockaddr_in *client_addr) { 	char ipstr[128] = {0}; 	inet_ntop(AF_INET, &(client_addr->sin_addr).s_addr, ipstr, sizeof(ipstr)); 	int client_port = ntohs(client_addr->sin_port); 	printf("client IP = %s, PORT = %d\n", ipstr, client_port); }  int main(int agrc, const char *argv[]) { 	int socket_fd; 	socklen_t addr_len; 	struct sockaddr_in serveraddr, clientaddr; 	unsigned char buf[MAXLINE] = {0};  	bzero(&serveraddr, sizeof(serveraddr)); 	bzero(&clientaddr, sizeof(clientaddr));  	serveraddr.sin_family = AF_INET; 	serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); 	serveraddr.sin_port = htons(SERVER_PORT);  	addr_len = sizeof(clientaddr);  	socket_fd = socket(AF_INET, SOCK_DGRAM, 0); 	bind(socket_fd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)); 	while(1) {  		addr_len = sizeof(clientaddr);  		memset(buf, 0, sizeof(buf));  		recvfrom(socket_fd, buf, sizeof(buf), 0, (struct sockaddr *)&clientaddr, &addr_len);  		print_client_info(&clientaddr);  	//	printf("recive from client:\n %s\n",buf); 		printf("buf大小: %d\n",strlen(buf));  		for(int i = 0; i < strlen(buf); i++) { 			buf[i] = toupper(buf[i]); 			printf("%X\n",buf[i]); 		} 		printf("\n");  		sendto(socket_fd, buf, strlen(buf), 0, (const struct sockaddr *)&clientaddr, sizeof(clientaddr)); 	} 	close(socket_fd); 	return 0; }

user: user-2
content: 你都没说具体出错信息，怎么帮你
user-0 提问: 二维字符串输入问题 

回复:
user: user-1
content: 引用 3 楼 LiuCunZhiPu 的回复:引用 1 楼 hezhe1008 的回复:char a[10][10];没用啊 memset(a, 0, 100);

user: user-0
content: 引用 1 楼 hezhe1008 的回复:char a[10][10];没用啊

user: user-2
content: char *a[10]; 这里只是分配了指针，但没有为字符串分配空间，需要： a[0] = new char[100]; 否则会出现异常

user: user-1
content: char a[10][10];

user: user-3
content: char *a[10]; 表是有10个char*指针的数组，但每个指针初始并没有指向一块有效的内存，你需要初始化之后再赋值  解决办法，可以先为每个指针动态申请空间

user: user-4
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  void ascend(char **X) {     int i,j;     char *t;     for(i=0;i<9;i++)         for(j=0;j<9-i;j++)             if(strcmp(X[j],X[j+1])>0){                 t=X[j];                 X[j]=X[j+1];                 X[j+1]=t;             } }  int main() {     char *a[10];     int i;      for(i=0;i<10;i++) {         a[i] = (char *)malloc(sizeof(char) * 10);         if (!a[i])             return -1;         scanf("%s", a[i]);     }      ascend(a);     for(i=0;i<10;i++) {         printf("%s ",a[i]);         free(a[i]);     }     putchar(10);      return 0; } char *a[10]是10个野指针，直接用肯定是不可以的。所以需要用new或malloc申请堆上的空间，然后就可以直接赋值了。
user-0 提问: 给定一个日期，输出这个日期是该年的第几天。

回复:
user: user-1
content: 引用 2 楼 hdt 的回复:c/c++其中有很多陷阱，有过一本书叫好像叫 《c 陷阱》 如果你去一个一个试错，来学习c++/c的话，估计猴年马月也学不会。 建议先找一本，比较基础，入门教程，系统的学习一下。 回错了

user: user-1
content: c/c++其中有很多陷阱，有过一本书叫好像叫 《c 陷阱》 如果你去一个一个试错，来学习c++/c的话，估计猴年马月也学不会。 建议先找一本，比较基础，入门教程，系统的学习一下。

user: user-2
content: /* valid return 1, invalid return 0*/ int check_value(int year, int month, int day) {     int leap = 0, ret = 1;      if ((year % 400) || (year % 4 == 0 && year % 100 != 0))         leap = 1;     if (month <= 0 || month > 12) {         fprintf(stdout, "Month invalid!\n");         ret = 0;         return ret;     }      switch (month) {         case 1:         case 3:         case 5:         case 7:         case 8:         case 10:         case 12:             if (day > 31 || day <= 0) {                 fprintf(stdout, "Day invalid!\n");                 ret = 0;             }             break;          case 2:             if (leap) {                 if (day > 29 || day <= 0) {                     fprintf(stdout, "Day invalid!\n");                     ret = 0;                 }             } else {                 if (day > 28 || day <= 0) {                     fprintf(stdout, "Day invalid!\n");                     ret = 0;                 }             }             break;          case 4:         case 6:         case 9:         case 11:             if (day > 30 || day <= 0) {                 fprintf(stdout, "Day invalid!\n");                 ret = 0;             }             break;          default:             break;     }     return ret; } 每次输入年月日后都做一次检测，检测算法仅供参考

user: user-3
content: CSpanTime类

user: user-4
content: 用CTime吧, 把当前日期与当年的第一天相减, 就得到相关天数, 这样就不难得出是当年第几天了.
user-0 提问: 输出两个链表的共同元素，链表仍使用原来的La链表，为啥这个输入abc     bcz 时只输出b啊

回复:
user: user-1
content: void MergeList_3(LinkList &La,LinkList &Lb) {     LNode *pa,*pb,*p;     pa = La->next;     pb = Lb->next;     p = La;     p->next = NULL;     while(pa && pb)     {         if(pa->data == pb->data)         {             LNode *temp;             temp = pa;             pa = pa->next;             pb = pb->next;             temp->next = p->next;             p->next = temp;         }         else if(pa->data < pb->data)         {             pa = pa->next;         }         else         {             pb = pb->next;         }     } } 可以参考一下上面的代码； 问题出在 if(pa->data == pb->data)判断条件体里。因为楼主的逻辑里，在将La链表里的数据放到新的链表里时，修改了原La的链表的下个节点。即当节点pa指向'b'时，pa->next就指向了NULL，所以La的'c'节点找不到了。 修改的办法如上，用temp指向要加到新的La的链表，然后让pa指向下一个节点，即‘c'，最后再将temp链到新的La上。 最后的while(pa), while(pb)没有意义，建议删除。
user-0 提问: 如图所示，我已经用了strcut结构语句，为什么显示我错误呢？

回复:
user: user-1
content: 楼主还是使用typedef来定义吧！ 楼主的问题我也经常遇到，后来放弃了。用typedef就方便多了。

user: user-2
content: 声明前加Enum和struct

user: user-3
content: C语言不像C++那样可以直接用结构体名或者枚举名来定义变量，需要前面加上关键字struct 或enum 如果实在想直接使用某个名字而不想加struct或者enum，可以typedef一下，typedef的使用建议查一下

user: user-4
content: struct PCB {  }; struct PCB a;  //struct不能少   如果不想用加struct,使用typedef  typedef struct PCB {  }MyPCB;  MyPCB a;

user: user-0

user: user-5
content: 错误提示都告诉你了，要再申明前面加关键字Enum和struct

user: user-6
content: struct PCB XXX enum State XXX 声明时前面加上各自的struct 和State

user: user-7
content: 你用的是c吧？？？ 改成c++的试试
user-0 提问: 为什么没有执行最后的求和程序就退出了

回复:
user: user-1
content: #include<stdio.h>  int main(void) {     long num;     long sum = 0L;     int status;      printf("please enter an integer to be summed ");     printf("(q to quit): ");     status = scanf("%ld", &num);     while (status == 1)     {         sum= sum + num;         printf("please enter next integer (q to quit): ");         status=scanf("%ld", &num);      }     printf("Those integers sum to %ld.\n", sum);      return 0; }  sum的输出应该是使用%ld格式。 程序可以输出结果，如果是cmd闪一下退出，建议加两行getchar();或者system("pause");（需要包含头文件stdlib.h)

user: user-2
content: ctrl f5             system("pause")

user: user-3
content: 复制了楼主代码，可以运行，结果也正确
user-0 提问: 用C语言编链栈 但是老是显示为空是怎么回事？

回复:
user: user-1
content: 初始化和创建栈有问题呢，一个问题没有将初始化的top带到main函数里，即main里的top->next并没有初始化为NULL，另一个问题，即创建栈没有什么操作，只是做了一个无用的循环，并且也没有将创建的栈带回main函数里的top，即top没变动。 对于楼主用链表模拟栈操作，建议不要创建栈了，直接在入栈和出栈的地方创建节点和释放节点。
user-0 提问: 顺序表删除，想要实现任意输入一串字符，删除其中任意位置。最后main函数内的内容不知道该怎么修改

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h>  #define OK 1 #define OVERFLOW 0 #define ERROR -1 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define elemtype char  typedef struct {     char * elem;     int length;     int listsize; }SqList;  int Initlist(SqList *L) {     L->elem = (char*)malloc(LIST_INIT_SIZE*sizeof(char));     if (!(L->elem))         exit(OVERFLOW);     L->length = 0;     L->listsize = LIST_INIT_SIZE;      return OK; } int listDelete_sq(SqList *L, int i, int *e) {     if(i < 1 || i > L->length)         return ERROR;     char * p, *q;     if (!L->elem)         exit(OVERFLOW);     p = &(L->elem[i-1]);     *e = *p;   /* 类型不匹配 */     q = L->elem + L->length-1;     for(++p; p <= q; ++p)         *(p-1) = *p;     --L->length;      return OK; } int main(void) {     int pos, ch;     SqList L;     int i;     Initlist(&L);     printf("please input the data:");     for (i = 0; i < 10; i++)     {         if ((ch = getchar()) == '\n')             break;         L.elem[i] = ch;         L.length++;     }     printf("cur pos %d\n", L.length);     printf("Input position: ");     scanf("%d", &pos);     listDelete_sq(&L, pos, &ch);     printf("Delete: %c\n", ch);     printf("the final array is:");     for(i = 0; i < L.length; i++)     {         printf("%c", L.elem[i]);     }     putchar(10);     return 0; }  上面的代码已经调试好，参考一下吧； 源代码里：初始化和删除操作的函数都需要改动；  另外，有两处循环逻辑有问题；
user-0 提问: 百思不得其解的代码，求大佬指教。

回复:
user: user-1
content: 参考一下吧 #include <stdio.h> #include <ctype.h>  #define ID_LEN 18 const unsigned char weight_list[] = { 7,     9, 10, 5, 8,     4, 2, 1, 6,     3, 7, 9, 10,     5, 8, 4, 2 }; const char check_code[] = { '1',     '0', 'X', '9', '8', '7',     '6', '5', '4', '3', '2' };  int check_digit(char *sid); int check_id(char *sid);  int main(void) {     char id[20];     int num, flag = 0;      scanf("%d", &num);      while (num--) {         scanf("%s", id);         if (check_digit(id)) {             if (!check_id(id)) {   /* Invalid ID */                 flag = 1;                 printf("%s\n", id);             }         } else {             flag = 1;             printf("%s\n", id);   /* Invalid ID */         }     }     if (!flag)         printf("All path!\n");      return 0; }  int check_digit(char *sid) {     int i;      for (i = 0; i < ID_LEN - 1; i++)         if (!isdigit(sid[i]))             return 0;      return 1; }   int check_id(char *sid) {     int weight_sum = 0, mode;     int i;      for (i = 0; i < ID_LEN - 1; i++)         weight_sum += (sid[i] - '0') * weight_list[i];     mode = weight_sum % 11;      if (sid[ID_LEN-1] == check_code[mode])         return 1;     else         return 0; }

user: user-2
content: 首先，你检查前17位是否包含“X”是不对的，这对于你这4个输入没问题，但不符合题目里“检查前17位是否全为数字”这句话，正确的做法是检查其值是否在48到57范围内。 其次，后面做检查的代码并没有完全写对啊，比如第二个检查应该是arr[i][17] == '0'并且answer == 1，仔细核对一遍再试吧。

user: user-3
content: #include <atlstr.h>  #include <time.h> //随机生成大于18岁的身份证号 CString GenerationId(int OldThan = 18) {     time_t t = time(NULL);     tm *tTm = localtime(&t);     int iBaseYear = 1950;     int YearRange = tTm->tm_year + 1900 - iBaseYear - OldThan;     srand(t + rand());     int SixHead = rand() % 999999 + 111111;     int Year = rand() % YearRange + iBaseYear;     int Month = rand() % 12 + 1;     int Day = rand() % 28 + 1;     int ThrEnd = rand() % 999;     TCHAR chi[12] = TEXT("10X98765432");     int Wi[18] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 };     TCHAR strID[19] = {0};     _stprintf(strID, TEXT("%06d%04d%02d%02d%03d"), SixHead, Year, Month, Day, ThrEnd);     int Sum = 0;     TCHAR buf[MAX_PATH] = {0};     for(int i = 0; i < 17; i++)     {         Sum += Wi[i] * (strID[i] - '0');     }     TCHAR cLast = chi[Sum % 11];     strID[17] = cLast;     CString tStr = strID;     return tStr; }  //校验身份证号合法性, 传入身份证串. BOOL checkValid(const char *idStr) {     char chi[12] = "10X98765432";     int Wi[18] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 };     int Sum = 0;     for(int i = 0; i < 17; i++)     {         Sum += Wi[i] * (idStr[i] - '0');     }     char cLast = chi[Sum % 11];     return idStr[17] == cLast; }
user-0 提问: c语言中，将要释放的指针作为参数传递后，取址载传入另一个函数，再释放有问题吗？

回复:
user: user-1
content: 没看出来这么做的必要性 但是这么释放肯定是可以的

user: user-2
content: 你的代码看不出你要表达的逻辑； 申请空间就要释放，不需要去释放同一指针，但是要保留申请时空间的首地址。

user: user-3
content: 代码很乱啊，ppData是什么？cJSON_Delete就是释放内存的函数吗？如果ppData就是x，应该没问题。
user-0 提问: 小萌新求解

回复:
user: user-1
content: 首先for语句的判断条件肯定是可以为符号的，这里的‘=’ 对应的ascii码是61，你可以理解为‘=’对应的就是整数61.接下来不能进入循环就是你对for循环判断条件的理解不对，条件为真才进入循环，f声明之后没有初始化，f=='=' 不为真故进不了循环的，这就跟你测试结果一直了。 而表达式（I=5）默认就为真，故可以进入到循环。 以上请了解。

user: user-2
content: 建议看一下for循环的3个表达式代表的意思；当第二个条件（判断表达式）为真时才会执行循环体； 变量f，若初始值为'='，则循环体会执行，否则循环体是不会执行的。 还有另外一种办法，就是在循环前，将f的初始值设置为非'='，然后在循环体里对f赋值'='（当然是在需要的时候）。循环判断条件编程 for (l = 0; f != '='; l++)

user: user-3
content: for循环中的第二个判断语句为真时，才会执行for中的逻辑，你写成f==‘=’不会执行是因为，f不是'='所以，明白了for的执行过程在写逻辑就行了
user-0 提问: 新人求教

回复:
user: user-1
content: return  0；

user: user-2
content: 如果是int main()那么最后要有一个返回值也就是return 0; 其次分号不可以加在while后面小括号外面，分号会打断循环，也就是终止。

user: user-3
content: while ()后不能有;号 且，一般最后一句都要加个return 0;

user: user-4
content: while后面不加分号，主函数最后一句语句加一个return 0;表示程序正常结束。

user: user-5
content: 如果你输入的k是大于0的数字，那么while循环满足条件，但是会陷入死循环，不会往下执行。

user: user-6
content: while ()后的;号  造成了死循环，执行不到后面的语句。

user: user-7
content: 引用 2 楼 weixin_40051278 的回复:while ()后不能有;号 且，一般最后一句都要加个return 0; 赞同 while后加分号，那么就相当于while没有循环体。

user: user-0
content: 补图
user-0 提问: 新手求教

回复:
user: user-0
content: 输入s 用double 定义

user: user-0
content: 引用 1 楼 醉少爷的回复:使用long long数据类型 谢谢，我的不支持long long

user: user-1
content: 引用 楼主 JZhao1998 的回复:#include <stdio.h> int main() { unsigned long int i,n,sum; 	scanf("%d",&n); 	sum=0; 	for(i=1;i<=n;i++) 	{ 		sum=sum+i; 	} 	printf("%d",sum); 	return 0; }  题目要求1  < =  n  < =  1,000,000,000 这样已经超出了范围 ,该怎么办呢 楼主： 个人的几个粗浅的看法：1、unsigned long int（无符号整数型）最大支持整数为4294967295也就是约42个亿，因此，SUM汇总值应该能够放的下；                                              2、printf("%d",sum)中的%d表示一个有符号的整数数值在正负21亿，出错了。如果改成printf("%u",sum)中的%u表示一个无符号的整数数值在42亿结果就正确了；                                              3、double型如全是整数,最多提供15位有效数字。_int64无符号类型支持所有19位及以下的有效数字（c语言支持）。  这个为修改printf("%d",sum)为printf("%u",sum)的运算结果，应该符合要求O(∩_∩)O

user: user-0
content: 引用 6 楼 ciji6985的回复:10亿了，double好像也不够吧？？ double应该够了吧，数量级是十的三十二次方

user: user-0
content: 引用 5 楼 自信男孩的回复:用double是可行的，如果不用double可以考虑大数据的加法运算（数组模拟大数据） 这种还没学，不懂得写。

user: user-2
content: 为什么double可以

user: user-3
content: 10亿了，double好像也不够吧？？

user: user-0
content: 大家，不用了，我已经解决了

user: user-4
content: 使用long long数据类型

user: user-5
content: 用double是可行的，如果不用double可以考虑大数据的加法运算（数组模拟大数据）
user-0 提问: 技术小白发帖求救   望大神解惑

回复:
user: user-1
content: 求一个短整型的补码：先输入一个八进制的短整型数，然后调用函数计算出这个数的补码，然后以八进制输出;函数中的语句主要是通过位运算与0100000来取得最高位的值，然后判断最高是位是否为1，如果为1，那补码就等于原码取反加1，否则补码等于原码;

user: user-2
content: 建议查一下&， ～运算符； &是按位与，~是按位取反。都是对于二进制而言的。
user-0 提问: 新手报到，看看这有啥问题啊，求助进制转换

回复:
user: user-1
content: int定量整形，输入时应该用%d而不用%f

user: user-2
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉

user: user-3
content: scanf时类型应给是d%

user: user-4
content: 8进制，16进制都是对整型数而言的。 浮点数和整型数在内存里的存储方式是不一样的。所以，浮点数不能用整型数的去输出（八进制和十六进制都是整型数）
user-0 提问: c primer plus上一个简单的文件压缩程序

回复:
user: user-0
content: 谢谢各位了 问题已解决

user: user-0
content: 引用 8 楼 cfjtaishan 的回复:[quote=引用 3 楼 BlackMitnick 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 有可能是文件不存在，建议加一条调试语句看一下文件打开失败的原因；  if ((in = fopen(argv[1], "r")) == NULL)     {         fprintf(stderr, "I couldn't open the file \"%s\"\n",                 argv[1]);         fprintf(stderr, " open error: %s\n", strerror(errno));         exit(2);     } 使用strerror(errno)注意，加头文件errno.h 谢谢dalao 我试了一下  I couldn't open the file “eddy” open error No such file or directory 我在那个目录下新建了一个eddy文件呀 麻烦详细解释一下 对于文件输入/输出这一部分实在有点懵[/quote] 这句提示就是没有找到文件，或者文件名不对，或者路径不对[/quote] 谢谢大佬 我弄好了 第一个确实没加txt的原因 第二我发现eddy.txt前面要加路径

user: user-1
content: 引用 3 楼 BlackMitnick 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 有可能是文件不存在，建议加一条调试语句看一下文件打开失败的原因；  if ((in = fopen(argv[1], "r")) == NULL)     {         fprintf(stderr, "I couldn't open the file \"%s\"\n",                 argv[1]);         fprintf(stderr, " open error: %s\n", strerror(errno));         exit(2);     } 使用strerror(errno)注意，加头文件errno.h 谢谢dalao 我试了一下  I couldn't open the file “eddy” open error No such file or directory 我在那个目录下新建了一个eddy文件呀 麻烦详细解释一下 对于文件输入/输出这一部分实在有点懵[/quote] 这句提示就是没有找到文件，或者文件名不对，或者路径不对

user: user-1
content: 引用 5 楼 BlackMitnick 的回复:[quote=引用 4 楼 u010165006 的回复:] 当前目录下没有eddy 这个文件，你可以dir看一下。 呃 我在那个目录下新建了一个eddy.txt文件 还是提示I couldn't open the file “eddy”  但是我如果把argv[1]改成argv[0] 程序成功运行了 生成了一个reducto.exe.red文件 我不知道为什么 麻烦详细解释一下[/quote] 你创建的文件名是eddy.txt，但是你程序里要打开的是eddy，很明显对不上号。

user: user-2
content: 文件名没加后缀吧，是eddy.txt不是eddy

user: user-0
content: 引用 4 楼 u010165006 的回复:当前目录下没有eddy 这个文件，你可以dir看一下。 呃 我在那个目录下新建了一个eddy.txt文件 还是提示I couldn't open the file “eddy”  但是我如果把argv[1]改成argv[0] 程序成功运行了 生成了一个reducto.exe.red文件 我不知道为什么 麻烦详细解释一下

user: user-3
content: 当前目录下没有eddy 这个文件，你可以dir看一下。

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:有可能是文件不存在，建议加一条调试语句看一下文件打开失败的原因；  if ((in = fopen(argv[1], "r")) == NULL)     {         fprintf(stderr, "I couldn't open the file \"%s\"\n",                 argv[1]);         fprintf(stderr, " open error: %s\n", strerror(errno));         exit(2);     } 使用strerror(errno)注意，加头文件errno.h 谢谢dalao 我试了一下  I couldn't open the file “eddy” open error No such file or directory 我在那个目录下新建了一个eddy文件呀 麻烦详细解释一下 对于文件输入/输出这一部分实在有点懵

user: user-4
content: 说明打开文件没有成功，另外命令行中如果文件路径中有空格需要加上引号，你检查下是什么原因

user: user-1
content: 有可能是文件不存在，建议加一条调试语句看一下文件打开失败的原因；  if ((in = fopen(argv[1], "r")) == NULL)     {         fprintf(stderr, "I couldn't open the file \"%s\"\n",                 argv[1]);         fprintf(stderr, " open error: %s\n", strerror(errno));         exit(2);     } 使用strerror(errno)注意，加头文件errno.h
user-0 提问: register变量的存储问题

回复:
user: user-1
content: register关键字 是声明变量的存储位置的，与范围无关。  这个关键字现在很少使用了，编译器会处理这个事情，而且即使你应用了这个关键字，在一些场合，编译器依然会“我行我素”的

user: user-2
content: double表示的范围大约是：1.79769e+308 ~ 2.22507e-308，具体可搜索浮点数内存表示方式  而int可表示的范围只是：2^31-1 ~ -2^31，long long是：2^63-1 ~ -2^63  这与是否为register没有关系

user: user-3
content: double的范围是多少
user-0 提问: makefile里加了个变量，结果编译错误，求解 

回复:
user: user-0
content: 结贴了。自己搜到了答案：美元符号“$”在Makefile中有特殊的含义，在命令或者文件名中使用“$”时需要用两个美元符号“ 改成了下面这样就行了 SVNREVSTR=$(shell svn info | grep Revision | awk '{print $$2}') TC_CFLAGS+=-DSVNREV=$(SVNREVSTR)  感谢各位的回答！

user: user-1
content: 可能是你的svn不在默认的路径中，带上全路径试一下吧

user: user-2
content: 百度搜“跟我一起写makefile”

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:是不是-D后面应该有一个空格，但你的Makefile里没有这个空格 这儿不需要空格的

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:百度搜“跟我一起写makefile” 谢谢赵老师。我正在看。不过我这几句makefile还是看不出啥问题啊

user: user-3
content: 是不是-D后面应该有一个空格，但你的Makefile里没有这个空格
user-0 提问: 为什么我的结果是正确的但是提交后总是错误？

回复:
user: user-1
content: 引用 2楼赵4老师 的回复:边界条件 输入输出格式 ……赵老师是我们学习的榜样

user: user-2
content: 边界条件 输入输出格式 ……

user: user-3
content: 把你的需求贴一下
user-0 提问: c语言缓冲区问题，求解

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

user: user-1
content: 提醒：scanf是开源的。 参考crt\src\input.c

user: user-2
content: #include<stdio.h> int main(void) {     int a;     char b;     printf("shuzi:");     scanf("%d", &a);           getchar();    /*接收换行符\n*/           printf("zimu:");     scanf("%c",&b);     printf("a = %d, b = %c", a,b);           return 0; }
user-0 提问: 一种输出正确，一种却错了，求指导

回复:
user: user-1
content: 个人建议，对于系统库头文件的引用使用<>，对于自定义头文件使用""

user: user-1
content: #include <stdio.h> #include <stdlib.h>  int main() {     system("color f0");     int j = 0;     char ch[100], tran[100];     printf("input ciper code:");     gets(ch);     printf("ciper code:%s\n",ch);     while (ch[j] != '\0')     {         if (ch[j] >= 'A'&& ch[j] <= 'Z')             tran[j] = 155 - ch[j];         else if (ch[j] >= 'a' && ch[j] <= 'z')             tran[j] = 219 - ch[j];         else             tran[j] = ch[j];         j++;     }     tran[j] = 0;    /*'\0' 字符串结束标记*/     printf("original text:");     puts(tran);     system("pause");     return 0; } 第一个程序是puts，需要的参数是字符串，但是tran缺少字符串结束标记，所以应该加上，这样就一样了。

user: user-0
content: 谢谢指导和提醒，是要加上tran[ j ]=' \0 '表示字符串结束。
user-0 提问: 入门级选手，求教

回复:
user: user-1
content: a除b 或者b除a 有一个结果是整数

user: user-2

user: user-3
content: #include<stdio.h> #include <stdbool.h>  bool check_denominator(int n) {     if(1 == n)         return false;     else if(0 == n % 2)         return check_denominator(n/2);     else if(0 == n % 5)         return check_denominator(n/5);     else         return true; }  int greatest_common_divisor(int a, int b) {     int common = b % a;     while (common != 0) {         b = a;         a = common;         common = b % a;     }     return a; }   int main(){      int a, b, n, ret = 1;     int common;      scanf("%d", &n);     while (n--) {         ret = scanf("%d%d", &a, &b);         common = greatest_common_divisor(a, b);         if (false == check_denominator(b/common))             printf("Yes\n");         else if(true == check_denominator(b/common))             printf("No\n");     }     return 0; } 分母只含有2或5的任意次方或者2与5结合的整数的分数都能化成有限小数 除此之外的分数都能化成无限循环小数 遇到问题，还是建议楼主多动手，多去查查资料。 遇到问题就直接请别人帮忙反而不好。请人帮忙是解决问题的一种方法，但是不是首选的，或者第一步做的。而应该是最后一步做的，前面的应该是自己在努力想办法解决问题。

user: user-4
content: 参考：http://blog.csdn.net/stpeace/article/details/11696307

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:#include<stdio.h> #include <stdbool.h>  bool check_denominator(int n) {     if(1 == n)         return false;     else if(0 == n % 2)         return check_denominator(n/2);     else if(0 == n % 5)         return check_denominator(n/5);     else         return true; }  int greatest_common_divisor(int a, int b) {     int common = b % a;     while (common != 0) {         b = a;         a = common;         common = b % a;     }     return a; }   int main(){      int a, b, n, ret = 1;     int common;      scanf("%d", &n);     while (n--) {         ret = scanf("%d%d", &a, &b);         common = greatest_common_divisor(a, b);         if (false == check_denominator(b/common))             printf("Yes\n");         else if(true == check_denominator(b/common))             printf("No\n");     }     return 0; } 分母只含有2或5的任意次方或者2与5结合的整数的分数都能化成有限小数 除此之外的分数都能化成无限循环小数 遇到问题，还是建议楼主多动手，多去查查资料。 遇到问题就直接请别人帮忙反而不好。请人帮忙是解决问题的一种方法，但是不是首选的，或者第一步做的。而应该是最后一步做的，前面的应该是自己在努力想办法解决问题。 谢谢你了，我自己也想了，但是没有头绪，所以来这里问你们

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复: 谢谢你，其实我自己也想了好久，我找的资料说，例如m/n得来的小数，如果小数点后面位数大于n为则为无限小数，所以我就想来这里问问人
user-0 提问: STM32  ZIgbee  问题 

回复:
user: user-1
content: 百度搜相关关键字。

user: user-0
content: 自己顶 ~~~~~

user: user-0
content: 帮顶 ！！！ 有没有人呀！

user: user-0
content: 不知道AT命令怎么发送 能否告知一下！
user-0 提问: fopen 返回 NULL，请问怎样解决？

回复:
user: user-1
content: 引用 6 楼 paschen 的回复:可能被系统重定位了，32位程序在64位系统上运行时，系统默认会对文件、注册表进行重定位，相关内容可以在MSDN上搜索，你程序实际可能定位到了：SysWOW64目录 64 位 Windows 平台注意点之文件系统重定向 http://www.cnblogs.com/jiake/p/4981555.html

user: user-2
content: 可能被系统重定位了，32位程序在64位系统上运行时，系统默认会对文件、注册表进行重定位，相关内容可以在MSDN上搜索，你程序实际可能定位到了：SysWOW64目录

user: user-1
content: 关闭UAC、防火墙、杀毒软件、…… 用管理员身份运行

user: user-3
content: 建议查看一下返回原因，使用strerror(errno)查看是什么原因导致的NULL，   引用 3 楼 jaklsdkfjosfij 的回复:但是这个文件确实是存在的啊。 2017-10-16 15:16:28.443 Error   ():<Util.cpp  310> ComputFileMd5(fopen C:\WINDOWS\system32\PBOC_LIB.dll failed!)  文件名对不上吧。

user: user-0
content: 但是这个文件确实是存在的啊。 2017-10-16 15:16:28.443 Error   ():<Util.cpp  310> ComputFileMd5(fopen C:\WINDOWS\system32\PBOC_LIB.dll failed!)

user: user-0
content: GetLastError 返回2，什么原因？

user: user-4
content: getlasterror()，判断一下错误原因 估计是权限问题！