Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 链栈

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  #define ERROR 0 #define OK 1  int n=0; typedef int ElemType;  typedef struct stack {     ElemType data;     struct stack *next; }linkstack;  linkstack *initial(linkstack **top) {     /* 无意义的申请空间，申请的空间没了*/     //*top = (linkstack *)malloc(sizeof(linkstack));     *top = NULL;     return *top; }  int Empty(linkstack *top) {     return(top==NULL ? OK:ERROR); }  int push(linkstack **top) {     linkstack *p;     p = (linkstack *)malloc(sizeof(linkstack ));     if(!p)         return ERROR;     printf("请输入进栈的整数：");     scanf("%d",&p->data);     p->next = *top;     *top = p;     n++;     return OK; }  int pop(linkstack **top) {     linkstack *p;     p = *top;     if(p == NULL)         return ERROR;     printf("出栈元素为%d",p->data);     *top = (*top)->next;     free(p);     n--;     return OK; }  void print(linkstack *top) {     linkstack *p;     p=top;     if(p==NULL)         printf("栈为空");     else     {         for(p=top;p!=NULL;p=p->next)         {             printf("%d ",p->data);         }     }     putchar(10); }  int main(void) {     int i;      linkstack *top;      printf("1.链栈初始化\n2.链栈判空\n3.链栈进栈\n4.链栈出栈\n5.遍历\n\n");     while(scanf("%d",&i)==1)     {         switch(i)         {             case 1:top = initial(&top);                    printf("初始化成功");                    break;             case 2:if(Empty(top))                        printf("链栈为空\n");                    else                        printf("链栈不为空\n");                    break;             case 3:                    if(push(&top))                        printf("进栈成功\n");                    else                        printf("jinzhan shibai\n");                    break;             case 4:if(pop(&top))                        printf("出栈成功\n");                    else                        printf("栈为空\n");                    break;             case 5:                    print(top);                    break;         }         printf("\n");     } }  栈的初始化有问题，申请的空间没有使用就找不到了，内存泄露了。 栈的入栈出栈都需要传二重指针进去，不然不能得到入栈后的新的链表头，出栈不能得到新的链表头

user: user-2
content: linkstack *initial(linkstack *top) {      top=(linkstack *)malloc(sizeof(linkstack));     top->next = NULL;     return top; }  int Empty(linkstack *top) {     return(top->next ==NULL?OK:ERROR); }

user: user-2
content: linkstack *initial(linkstack *top) {      top=(linkstack *)malloc(sizeof(linkstack));     top=NULL;     return top; }  int Empty(linkstack *top) {     return(top==NULL?OK:ERROR); }   这两段错了
user-0 提问: C语言   关于int类型输入错误的问题

回复:
user: user-1
content: 输入部分改成这样试试   char a[1024] = ""; while (scanf("%s",&a)<=0)     {         printf("输入错误，请重新选择\n");         fflush(stdin);         CDtwo();     }        n = a[0] - '0';         if (n!=1&&n!=2&&n!=3&&n!=4&&n!=5)             {                 printf("输入错误，请重新选择\n");                    CDtwo();             } }

user: user-2
content: CDone();                           //返回该函数开头 这句可不是回到函数开头，这是递归，是在函数的基础上再调用自身。学名叫做递归；  CDtwo(); 这地方也是，是递归；  为什么回到函数开头呢，直接继续输入就好了。

user: user-3
content: 递归函数CDone没有退出条件吗

user: user-4
content: 可以编写一个防止暴力输入的函数，以字符串接收所输入的内容，判断字符数，当大于1时提示错误，当等于1时，利用acsii码值判断是否为1活其他数字，不符合条件时提示错误，符合时转换为int并返回。

user: user-5
content: 仅供参考：#include <stdio.h> #include <string.h> char s[80]; int i; char c; int main() {     while (1) {         printf("Input a integer:");fflush(stdout);         rewind(stdin);         fgets(s,80,stdin);         if (strlen(s)>10) {             printf("Input too long(>9)!\n");             continue;         }         if (2==sscanf(s,"%d%c",&i,&c)) {             if ('\n'==c) {                 printf("%d is a integer.\n",i);                 break;             }         }         if ('\n'==s[strlen(s)-1]) s[strlen(s)-1]=0;         printf("\"%s\" is NOT a integer!\n",s);     }     return 0; }
user-0 提问: C语言问题请教

回复:
user: user-1
content: 首先strstr是字符串操作的函数，因此传入strstr的参数需要时字符串； char a[] = {0x31,0x32,0x33,0x34,0x35,0x36,0x37};   char b[] = {0x35,0x36}; 这两个只能算是字符数组，不是字符串。因为字符数组里没有字符串结束的标记'\0'。

user: user-2
content: strstr是针对两个字符串，你要区分字符串和字符数组

user: user-0
content: 数组后面编译器不应该默认加结束符吗？那第三个程序为什么能运行成功？

user: user-3
content: 第一个程序字符串没有结束符0,,,会越界访问,导致错误. 应该这样  char a[] = {0x31,0x32,0x33,0x34,0x35,0x36,0x37, 0};   char b[] = {0x35,0x36, 0};

user: user-4
content: C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\strstr.c /*** *strstr.c - search for one string inside another * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       defines strstr() - search for one string inside another * *******************************************************************************/  #include <cruntime.h> #include <string.h>  /*** *char *strstr(string1, string2) - search for string2 in string1 * *Purpose: *       finds the first occurrence of string2 in string1 * *Entry: *       char *string1 - string to search in *       char *string2 - string to search for * *Exit: *       returns a pointer to the first occurrence of string2 in *       string1, or NULL if string2 does not occur in string1 * *Uses: * *Exceptions: * *******************************************************************************/  char * __cdecl strstr (         const char * str1,         const char * str2         ) {         char *cp = (char *) str1;         char *s1, *s2;          if ( !*str2 )             return((char *)str1);          while (*cp)         {                 s1 = cp;                 s2 = (char *) str2;                  while ( *s1 && *s2 && !(*s1-*s2) )                         s1++, s2++;                  if (!*s2)                         return(cp);                  cp++;         }          return(NULL);  }
user-0 提问: 关于C Primer plus递归例题的理解

回复:
user: user-1
content: 虽然是执行同一个函数，每次函数中的n是不同的变量，而不是同一个。其次，递归完之后，还会回到上一层函数继续执行后面代码，所以还会继续输出。具体情况建议楼主单步跟踪程序运行，观察代码执行流程及变量变化情况，很容易明白的。

user: user-2

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

user: user-4
content: void UpAndDown (int n) {     printf("Level %d: n location %p\n" , n, &n);     if (n < 4)         UpAndDown(n+1);     printf("LEVEL %d: n location %p\n" , n, &n); }   注意第二个输出是在UpAndDown(n+1)；之后运行的。n显示递增，这个是第一个输出printf打印的。然后又递减，这个是第二个printf输出的。 为什么会这样输出，原因就是递归。递归是再上一个函数（其实也是其本身）没释放就会申请自身的函数栈空间，然后进入函数栈。当n>=4时，就会输出第二个printf，然后进入n=3时的函数栈（因为n为3的函数栈没释放），然后在n=3是的位置继续向后运行，因此打印第二条printf内容，同理n=3时函数栈释放，进入n=2时的函数栈，继续执行第二条printf，直到运行到初始化的函数，即n= 1时。最后打印n=1时的printf，并释放空间，自此函数递归结束。

user: user-5
content: 减少是因为递归函数回归了上一层！

user: user-6
content: 代码块的错误，if后面用大括号包起来
user-0 提问: C关于最小公倍数最大公约数关于小程序错误求教

回复:
user: user-1
content: #include<stdio.h>  #include<math.h>  int main() {     int a,b,n,i;     int m;      scanf("%d%d",&a,&b);     n = (a<b)?a:b;      for(i = n;i >= 1; i--) {         if(a % i == 0 && b % i == 0) {             printf("最大公约数为： %d\n",i);             break;         }     }      m = (a*b)/i;      printf("最大公倍数为： %d\n",m);          return 0; } 就你的代码而言主要是语法错误，逻辑咱没问题。

user: user-2
content: 代码没问题，只是你中英文符号不对，导致编译不过去

user: user-3
content: #include<stdio.h> int gcd(int p,int q); int main(int argc,char **argv){ 	int q,p; 	scanf("%d%d",&p,&q); 	printf("最大公约数是%d",gcd(p,q)); 	return 0; }  int gcd(int p,int q){ 	return q>0?gcd(q,p%q):p; }

user: user-3
content: #include<stdio.h> int gcd(int p,int q); int main(int argc,char **argv){ 	int q,p; 	scanf("%d%d",&p,&q); 	printf("最大公约数是%d",gcd(p,q)); 	return 0; }  int gcd(int p,int q){ 	return q>0?gcd(q,p%q):p; }
user-0 提问: 条件运算符不能按理想的比较大小，是有什么地方忽略了吗，求指教。谢谢啦

回复:
user: user-1
content: 若返回值与函数类型不同  默认会做类型强制转换的。

user: user-2
content: #include<stdio.h>  float max(float x,float y) {     float z ;     z = x>y?x:y;     return (z); } int main() {     float a ,b, c;      scanf("%f,%f",&a,&b);     c=max(a,b);     printf("%f\n",c);     return 0; } 参考一下吧  float转int会去掉小数部分；

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

user: user-0
content: 谢谢你们的解答，这道题我不理解的原因时条件运算符当x>y为真时执行第二条语句x，为假时执行y。我再执行时会出现不管为真为假都执行第二条语句x。而不是你们所说的强制转换。

user: user-4
content: 你的max函数都没类型的 你返回float 还用int 接收....
user-0 提问: 关于函数指针的问题，新手跪求啊！

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

user: user-2
content: 1、两种方法效果是一样的，如果你想，甚至可以写成：（*****p）（a,b）  2、确实需要定义成：（*p）（int a，int b），C语言里允许这样的隐匿转换，在C++里则会报错

user: user-1
content: 仅供参考：#include <stdio.h> double A[300][100]; double valuex[300]; double valuey[300]; int i; double fun00(double x,double y) {return x  +   y  ;}; double fun01(double x,double y) {return x*x+ 3*y  ;}; double fun02(double x,double y) {return x  + 2*y*x;}; //...  fun03(double x,double y) {return ...+...   ;}; //... //...  fun98(double x,double y) {return ...+...   ;}; double fun99(double x,double y) {return x/2+20*y  ;}; double (*funNN[100])(double,double)={     fun00,     fun01,     fun02, //  fun03, //  ... //  fun98,     fun99, }; int main() {     double x,y;     int f,FN;      for (i=0;i<300;i++) {         valuex[i]=(double)i;         valuey[i]=(double)i;     }     FN=3;     for (i=0;i<300;i++) {          x=valuex[i];          y=valuey[i];          for (f=0;f<FN;f++) A[i][f]=funNN[f](x,y);     }     for (i=0;i<3;i++) {         for (f=0;f<FN;f++) printf("%lg ",A[i][f]);         printf("\n");     }     return 0; } //0 0 0 //2 4 3 //4 10 10

user: user-3
content: C语言里面int (*p)()表示参数个数以及类型未知，不建议这么写， （*p）(a, b)和（******p）(a, b)和p(a, b)效果都是一样的  这里标准的定义是int (*p)(int, int)  帮你解释了你又不看

user: user-0
content: 第一个问题。既然定义了函数指针 int (*p)(); 并且 p=max。。为什么有变量指针调用函数的时候不是p（a,b）而是（*p）（a,b）呢？？ 这个问题谁能给出详细的解释么？

user: user-4
content: 函数指针定义时需要确定参数的个数，类型已经返回值的类型。这样函数指针才能和对应的函数匹配。 若函数指针比较多，参数个数，类型以及返回值不确定就会有问题。

user: user-4
content: #include <stdio.h>  int my_max(int a, int b);  int main(void) {     int (*pfunc)(int, int);      pfunc = my_max;      printf("%d\n", pfunc(2, 3));      return 0; }  int my_max(int a, int b) {     return (a > b ? a : b); } 参考一下吧；

user: user-1
content: //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-3
content: 这里标准的定义是int (*p)(int, int)

user: user-0
content: 顶！！求解啊！

user: user-3
content: C语言里面int (*p)()表示参数个数以及类型未知，不建议这么写， （*p）(a, b)和（******p）(a, b)和p(a, b)效果都是一样的

user: user-5
content: 正好我也在找这个问题，不懂帮顶，一起学习
user-0 提问: 求解C语言赋值运算符与逗号运算符问题

回复:
user: user-1
content: b || c是判断表达式，若b为非0，则该逗号里的表示为1，若b为0，但是c为非0，则该表示的值为1，若b和c都为0，则表达式的值为0.

user: user-1
content: 其实这个是逗号运算符的问题，逗号运算符是将最后一个表达式的值赋值给e

user: user-0
content: 逗号运算符优先级最低

user: user-2
content: 先把运算符的优先级捞出来，按照优先级高低做运算 b||c的优先级，跟逗号的优先级，谁高谁低？

user: user-2
content: e = (a + b >d,b || c,c++,++d,3+2); e = ( ( (a + b) >d),  (b || c) ,  (c++),  (++d) ,  (3+2) ); 这个逗号运算符比较好理解，e最后就是3+2的值，b||c也起不了什么作用，因为逗号运算符也不会关心之前的逻辑运算结果导致“短路”，这个应该是题目拿来迷惑的，楼主的意志要坚定 int a = 3,b = 2,c = 4,d = 8,e = 0; a += b * c;    a = 11 b-= c / b;      b = 0 d%= a;         d = 8
user-0 提问: 关于getchar()输入的问题

回复:
user: user-0
content: 因为输入sssa时，遇到了最后的a则不再打印，此时'a'已经存在了for循环的c里，因此会打印sss 后面c = getchar();接收到的是换行符'\n'，因此换行符会将最后的'a'覆盖了。因此最后打出c是换行。  ___________________________________________________________________________________ 这个我明白呢，我的意思是sssas时，换行符为什么没有了，直接显示的是ssss,而不是sss换行s。

user: user-1
content: 因为输入sssa时，遇到了最后的a则不再打印，此时'a'已经存在了for循环的c里，因此会打印sss 后面c = getchar();接收到的是换行符'\n'，因此换行符会将最后的'a'覆盖了。因此最后打出c是换行。

user: user-2
content: 楼主，换行是自己敲得吗，为啥没有回车？你的环境好神奇。 就像你的代码写的，sssa，中的a肯定不会打印出来，因为for循环结束的时候，c是‘a’ sssas的时候，for循环结束，c还是'a'，后面又输入了一个's'

user: user-1
content: 引用 3 楼 qq_36177617 的回复:因为输入sssa时，遇到了最后的a则不再打印，此时'a'已经存在了for循环的c里，因此会打印sss 后面c = getchar();接收到的是换行符'\n'，因此换行符会将最后的'a'覆盖了。因此最后打出c是换行。  ___________________________________________________________________________________ 这个我明白呢，我的意思是sssas时，换行符为什么没有了，直接显示的是ssss,而不是sss换行s。 因为'a'后面的s是被第二个getchar()接收了赋值给c，因此第二个getchar();后输出的还是s 那么回车符在哪呢？还是输入缓存里。程序运行完输入缓存清空。
user-0 提问: 求解图片的意思，不懂C语言

回复:
user: user-1
content: 其实就是strcat的实现思路，找到s1的结尾字符，然后把s2的内容复制给s1

user: user-2
content: 把字符串s2拼到字符串s1的后面。 第一个while循环找到字符串s1结束时的下标，第二个while是把字符串s2   从刚找到的下标位置    逐个逐个字符的往后写，最后加一个字符串结束标志‘\0’。 i++相当于i=i+1; s1[i++] = s2[j++]相当于{s[i] = s[j];i=i+1;j=j+1;}

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

user: user-4
content: j++ ; // 先运算，再增加， 如果 j = 1; a = j++; 则a = 1;  ++j; // 先增加再运算，如果j = 1; a = ++j; 则a = 2;

user: user-5
content: 功能是连接两个字符串，第一个while循环是找到第一个字符串的末尾，i是末尾（'\0'）的偏移。第二个循环是将第二个字符串加到第一个字符串的末尾，是一个字符一个字符赋值的。s[i] = '\0‘是给连接后的字符串加'\0'，没有'\0'不算是字符串。

user: user-6
content: 输入的字符串系统会自动在最后加个\0，所以第一个for是找到s1的末尾，第二个for是把s2加到s1后面，然后再加个\0作为字符串结尾

user: user-7
content: 自己运行一下 或者在纸上按以上算法写一下

user: user-8
content: 合并两个字符串，类似strcat的功能。

user: user-9
content: 引用 4 楼 自信男孩的回复:功能是连接两个字符串，第一个while循环是找到第一个字符串的末尾，i是末尾（'\0'）的偏移。第二个循环是将第二个字符串加到第一个字符串的末尾，是一个字符一个字符赋值的。s[i] = '\0‘是给连接后的字符串加'\0'，没有'\0'不算是字符串。 请问一下第二个while中i和j是先加一再进行赋值，还是赋值之后再加一再去判定？

user: user-4
content: strcpy字符串复制功能，第一个while是将数组置空，第二个是循环赋值。最后把 '\0' 加到字符串末尾。
user-0 提问: 结构体变量的初始化

回复:
user: user-1
content: #include <stdio.h>  struct student {     int num;   char name[20];   char sex;    int age;    float score;    char addr[20]; }stu = {0};  int main(void) {     printf("stu.age = %d, stu.score = %f\n", stu.age, stu.score);     return 0; } 初始化也可以单独操作； #include <stdio.h>  struct student {     int num;   char name[20];   char sex;    int age;    float score;    char addr[20]; }stu = {0};  int main(void) {     printf("stu.age = %d, stu.score = %f\n", stu.age, stu.score);     stu.age=0;     stu.score=0;     return 0; }

user: user-2
content: 这样可以的。

user: user-3
content: stu.age=0,stu.score=0,这样可以吗
user-0 提问: 自定义的结构体问题

回复:
user: user-1
content: 引用 9 楼 shihengzhen101 的回复:[quote=引用 8 楼 runningfatty 的回复:] 刚刚已经成功的找到原因了，就是因为源代码中出现的if语句后面的那一行代码没有加大括号造成的 心态炸了。。。。没听说过这东西还会报错的 有没有大神能给解释下。。。。 能跑的那台电脑上也没有加过大括号就能正常用，这边为什么就不行呢。。。。 我等待大神出现[/quote]  同等，我也很好奇

user: user-2
content: 引用 8 楼 runningfatty 的回复:刚刚已经成功的找到原因了，就是因为源代码中出现的if语句后面的那一行代码没有加大括号造成的 心态炸了。。。。没听说过这东西还会报错的 有没有大神能给解释下。。。。 能跑的那台电脑上也没有加过大括号就能正常用，这边为什么就不行呢。。。。 我等待大神出现

user: user-3
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

user: user-0
content: 刚刚已经成功的找到原因了，就是因为源代码中出现的if语句后面的那一行代码没有加大括号造成的 心态炸了。。。。没听说过这东西还会报错的 有没有大神能给解释下。。。。 能跑的那台电脑上也没有加过大括号就能正常用，这边为什么就不行呢。。。。

user: user-0
content: 引用 6 楼 shihengzhen101 的回复:是不是添加应有的包含文件所在路径，那个能跑的电脑是你配置的吗 所有的电脑都是我配置的 因为我需要GPU并行运算，所以需要在这台电脑上跑起来， 但是到目前为止只有一台电脑成功的编译啦，其他的都是出现同样的问题，也不知道到底是哪里的错误，所有的配置都是按步骤一步一步来的

user: user-2
content: 是不是添加应有的包含文件所在路径，那个能跑的电脑是你配置的吗

user: user-0
content: 不要沉啊。。。

user: user-4
content: 在设置里面，把预处理头文件去掉试试？

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:找一下im定义的地方，这个不识别，是不是这个定义没有在引用的地方include头文件呢   所有的源代码中都正常的包含了所需的头文件，而且程序在另一台电脑上是能够正常跑的，新建了工程测试结构体也是正常的，就是在这里不知道为什么出错。 所有的错误都是这种，有了正常的定义，但是都无法进行正常的初始化。 这个程序里面有c代码和cuda的代码，会不会是因为这里的原因造成的？

user: user-5
content: 重构一下项目吧

user: user-6
content: 找一下im定义的地方，这个不识别，是不是这个定义没有在引用的地方include头文件呢
user-0 提问: 【C语言基础：疑问】

回复:
user: user-0
content: 明白了，谢谢大家～～(´･ω･`)

user: user-1
content: status=scanf("%1d",&num); 都是%1d中的1惹的祸，因为输入个是1d，所以只得到一个一位数，10是两位数。 去掉1，正常运行。

user: user-2
content: 引用 4 楼 iloveyou418 的回复:%1d。。。这个你输入10的话它会当成两次输入依次是1，0，所以会出现这个现象。。。  正解

user: user-3
content: %1d。。。这个你输入10的话它会当成两次输入依次是1，0，所以会出现这个现象。。。

user: user-2
content: 你判断的是scanf的返回值  返回值的定义如下： Return Value  These functions return the number of input items successfully matched and assigned, which can be fewer than provided for, or even zero in the event of an early matching failure.  The value EOF is returned if the end of input is reached before either the first successful conversion or a matching failure occurs. EOF is also returned if a read error occurs, in which case the error indicator for the stream (see ferror(3)) is set, and errno is set indicate the error.  理解这段话就好了！

user: user-0
content: 其实我对这个while的循环条件判断耶不是很明白，为何是status==1?只要我第二次输入的num！=1，那不就跳出循环了吗？这样的话又为什么会输出1～9求和的正确结果呢？？（以上代码，出自C Primer Plus）

user: user-0
content: 编译器是CLion
user-0 提问: 求解两道C语言问题

回复:
user: user-1
content: \x11是一个转义字符，代表的是十六进制， \101是八进制。

user: user-2
content: 先说第二个t = (double)k;这个赋值操作是现将k的值转成double类型，然后赋值给t。这个操作注意是k的值，即内存里存放的值，而不是k转double。因此k还是int类型。k的类型是由其定义时决定的，中间不能改变其类型。  第一个输出字符长度，个人建议先运行一下strlen()，看输出结果是多少，然后分析一下; 该字符串中有两个转义字符\，第一个\x说明后面11是十六进制数。'\101'输出值是65，即是8进制数。 因此这两个转义后的只能算是2个字符，再加上3个字母，总共是5个字符长度。
user-0 提问: 关于C primer Plus 第七章一个例题

回复:
user: user-1
content: 1. 首先假定它是一个素数，所以设置标志位为真， 假如找到能够整除它的因子，证明它不是素数，就可以把标志位设置为假了  2.  程序是用div来试除待测试的数 if (num % div == 0) 表示div能够整除num，相当于说num有因子，不是素数  反过来，假如num是一个素数，就不可能找到一个数能够整除它。 因此假如num是一个素数，就不会执行这个if语句
user-0 提问: strcpy失败问题

回复:
user: user-1
content: #include <stdio.h> #include <string.h>  int main() {     char str[12] = { 0 };      strcpy(str,"abcd");     strcpy(str + 4, "1234");      puts(str);     system("pause");     return 0; } 出现这样的错误是随机的，原因是数组越界，数组越界是未定义行为，可能会导致你的这种现象，也可能正常输出；  建议将str长度定义更大写，保证能够接收要拷贝的字符，另外加一个'\0'；如果用循环赋值，不用考虑'\0'，但是楼主用的是strcpy，这个是字符串拷贝函数，仅用于字符串拷贝用。

user: user-2
content: 引用 2 楼 Tianzez 的回复:但我这不是字符数组吗？数组也要加‘\0’结尾？strcpy会在最后自动补\0，所以越界。

user: user-0
content: 但我这不是字符数组吗？数组也要加‘\0’结尾？

user: user-2
content: 字符串长度不够，要给\0留一个位置
user-0 提问: C语言写题目遇到一点问题，求助！

回复:
user: user-1
content: 引用 3 楼 wkr145 的回复:首先谢谢，第一个题解决了，但是第二个题有点问题，改成   long a 之后如图。 #include <stdio.h>  long Jie(int n);   int main()  {    int n;    long result;    printf("Please input the number u want:");    scanf_s("%d", &n);    result = Jie(n);    return 0;  }  long Jie(int n) {    int i, j;    long a;    a = 1;    for (i = 1;i <= n;i++)    {       //for (j = 1;j <= i;j++)       {          a *= i;       }       printf("%d! = %ld\n",i, a);    }    return 0; }

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

user: user-3
content: 求阶乘不是只需要第一个for语句吗？第二个不是有多吗？？？？

user: user-0
content: 首先谢谢，第一个题解决了，但是第二个题有点问题，改成   long a 之后如图。

user: user-4
content: double 类型输入用%lf，输出用%f %lf都行。不过你为什么要用double类型，明明计算结果和返回值都是int 类型啊

user: user-5
content: 第一题 输出语句的数据类型不对了两种改法： 一种是把 double number; 改成 long number;  另一种是把printf("This  you have :  %ld", number); 改成 printf("This  you have :  %f", number); //输出浮点型数  第二题 也是输出语句的数据类型不对了两种改法： 一种是把 double a; 改成 long a； 另一种是把printf("%d! = %ld\n",i, a);改成 printf("%d! = %f\n",i, a);//输出浮点型数

user: user-6
content: 引用 4 楼 cfjtaishan 的回复:第一个改一下数据类型就可以。将double改成long或者改一下输出格式用%.0lf输出。 第二个是改一下输出格式%.0lf;  这两个问题主要是浮点数和整型数在内存里的存放格式不一样。因此应该用 应该用对应的格式输出对应的数据。

user: user-6
content: 第一个改一下数据类型就可以。将double改成long或者改一下输出格式用%.0lf输出。 第二个是改一下输出格式%.0lf;  这两个问题主要是浮点数和整型数在内存里的存放格式不一样。因此应该用
user-0 提问: C语言将字符写入文件失败是什么原因

回复:
user: user-1
content: 积分少啊。可怜

user: user-2
content: Administrator的用户目录，权限够吗

user: user-0
content: 引用 1楼jiht594 的回复:路径存在吗？ 换个路径试试确定路径正确……

user: user-3
content: 如果程序正常运行，不应该不创建文件并写文件； 文件如果没打开失败（程序里有提示若打开失败），建议到对应目录下寻找文件；  程序没发现问题；建议若文件打开成功加一条打印信息，文件打开成功；这样保证文件能够正常打开（创建）

user: user-4
content: 路径存在吗？ 换个路径试试

user: user-5
content: fflush
user-0 提问: 请问：free释放指针为什么会出错

回复:
user: user-0
content: 是 int *temp =(int*) malloc(len * sizeof(int)); 这里要这样才可以，谢谢。

user: user-1
content: 应该是访问堆内在越界了，导致堆破坏，从而在释放时出错

user: user-2
content: n2是什么？  printf("%d  %d\n",n1,n2);	   malloc大小错误  int *temp =(int*) malloc(len * sizeof(int));

user: user-3
content: 看代码貌似没错，除非temp的值为空，或被踩，但这种情况应该在前面就出错。未见得是free的错误，你把temp换到栈空间（使用局部变量temp[64]）看一下，如果还出错就不是指针释放的问题，可能栈空间溢出。建议你把宕机时的调用栈信息贴出来。
user-0 提问: 新人求助

回复:
user: user-1
content: 引用 1 楼 user-2 的回复:#include<stdio.h> int F(int x) { int m = 0; if(x == 1) 	return ++m; else if(x % 2 == 0) 	m = 1 + F(x/2); else 	m = 1 + F(3*x + 1);  return m;  }   int main(void){ int x; scanf("%d",&x); printf("%d",F(x)); return 0; }  高手！这是什么算法啊，你是怎么抽象出来的？

user: user-2
content: #include<stdio.h> int F(int x) { int m = 0; if(x == 1) 	return ++m; else if(x % 2 == 0) 	m = 1 + F(x/2); else 	m = 1 + F(3*x + 1);  return m;  }   int main(void){ int x; scanf("%d",&x); printf("%d",F(x)); return 0; }
user-0 提问: C语言中一个指针问题

回复:
user: user-1
content: 引用 8 楼 u011261943 的回复:[quote=引用 7 楼 cfjtaishan 的回复:] [quote=引用 3 楼 u011261943 的回复:] cArray 是在函数 testX()内声明的变量，当 testX()执行完之后， cArray就会被释放。 准确地说，在将cArray的所指向的地址传给p之后，整个cArray数组就被释放了。 此时，p就是一个野指针，它指向一段垃圾内存。 p不是野指针，而是已经固定的指针。内存释放但不会对p做任何修改；p指向的还是已经释放的区域。  对于野指针的定义，建议还需要看一下概念；[/quote]  指向一个已删除的对象或未申请访问受限内存区域的指针。cArray这里属于 指向一个已删除的对象。[/quote]  sorry，说错了，不是cArray，  p属于指向一个已删除的对象的情况。

user: user-1
content: 引用 7 楼 cfjtaishan 的回复:[quote=引用 3 楼 u011261943 的回复:] cArray 是在函数 testX()内声明的变量，当 testX()执行完之后， cArray就会被释放。 准确地说，在将cArray的所指向的地址传给p之后，整个cArray数组就被释放了。 此时，p就是一个野指针，它指向一段垃圾内存。 p不是野指针，而是已经固定的指针。内存释放但不会对p做任何修改；p指向的还是已经释放的区域。  对于野指针的定义，建议还需要看一下概念；[/quote]  指向一个已删除的对象或未申请访问受限内存区域的指针。cArray这里属于 指向一个已删除的对象。

user: user-2
content: 引用 3 楼 u011261943 的回复:cArray 是在函数 testX()内声明的变量，当 testX()执行完之后， cArray就会被释放。 准确地说，在将cArray的所指向的地址传给p之后，整个cArray数组就被释放了。 此时，p就是一个野指针，它指向一段垃圾内存。 p不是野指针，而是已经固定的指针。内存释放但不会对p做任何修改；p指向的还是已经释放的区域。  对于野指针的定义，建议还需要看一下概念；

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:这个是经典问题了：返回局部数组；只是未定义行为。 因为局部变量数组是在栈上申请空间，函数testX调用结束后会自动被释放，因此返回局部变量数组没有意义。局部数组的生命周期是从定义开始，到函数调用结束而结束； 如果想继续使用，那么通过数组定义时加static或者数组从堆上申请空间（malloc/free），这样可以改变它的生命周期。 加static后数组是在静态数据段申请空间，生命周期是从定义开始，到程序运行结束而结束； 一个是函数运行结束而结束，一个是程序运行结束而结束； 非常感谢,通俗易懂,再次谢谢,我明白了

user: user-0
content: 引用 2 楼 user-3 的回复:你的cArray是个局部变量，testX函数结束后就销毁了，这就是为什么不要返回指向局部变量的指针的原因 谢谢,我明白了

user: user-0
content: 引用 3 楼 u011261943 的回复:cArray 是在函数 testX()内声明的变量，当 testX()执行完之后， cArray就会被释放。 准确地说，在将cArray的所指向的地址传给p之后，整个cArray数组就被释放了。 此时，p就是一个野指针，它指向一段垃圾内存。 谢谢,不过我没有分了,给上面的第一个回答的了,谢谢

user: user-1
content: cArray 是在函数 testX()内声明的变量，当 testX()执行完之后， cArray就会被释放。 准确地说，在将cArray的所指向的地址传给p之后，整个cArray数组就被释放了。 此时，p就是一个野指针，它指向一段垃圾内存。

user: user-3
content: 你的cArray是个局部变量，testX函数结束后就销毁了，这就是为什么不要返回指向局部变量的指针的原因

user: user-2
content: 这个是经典问题了：返回局部数组；只是未定义行为。 因为局部变量数组是在栈上申请空间，函数testX调用结束后会自动被释放，因此返回局部变量数组没有意义。局部数组的生命周期是从定义开始，到函数调用结束而结束； 如果想继续使用，那么通过数组定义时加static或者数组从堆上申请空间（malloc/free），这样可以改变它的生命周期。 加static后数组是在静态数据段申请空间，生命周期是从定义开始，到程序运行结束而结束； 一个是函数运行结束而结束，一个是程序运行结束而结束；
user-0 提问: 热烈庆祝本人受关注人数即将突破14000大关！散分！！+超大文件排序源代码

回复:
user: user-1
content: Hi,老师，我现在碰到一个问题，就是如何修改拖曳文件的打开顺序，毫无头绪现在。求老师解答。 现有思路：修改HDROP指向的内存内容，但不知道如何操作。想要用PostMessage模拟WM_DROPFILES消息，但是不知怎么构造参数 帖子地址：https://bbs.csdn.net/topics/392345182  私信功能不行了，只能来这里找您了

user: user-2
content: 谢谢分享，赵老师

user: user-0
content: 引用 55 楼 flagoop 的回复:千万中取首，如梭，如风，如闪电

user: user-3
content: 千万中取首，如梭，如风，如闪电

user: user-4
content: 试试

user: user-5
content: 【让窗体永远在前面】 有时候你希望某个窗体永远在前面，使用【csdn967】程序能够帮你做到！ 求你们也去关注一下me===CSDN967

user: user-6
content: 好厉害，膜拜尼古拉斯·赵老师

user: user-7
content: 额额额顶一个

user: user-8
content: 恭喜恭喜，我也关注下大佬

user: user-9

user: user-10
content: 引用 40 楼 zhao4zhong1 的回复:不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！赵老师说的对啊

user: user-0
content: WindowsXP，如果磁盘上有1TB的数据需要排序，但只有1GB的内存，你怎么做？

user: user-11
content: 赵老师,我来看望您老人家

user: user-12

user: user-13
content: 引用 40 楼 zhao4zhong1 的回复:不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  路过学习，事实上也是“做到才能得到”

user: user-14
content: 厉害了。一直被模仿，

user: user-15

user: user-16
content: 还没仔细研究，不过赵老师出版，必属佳品！

user: user-17
content: https://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=gbk&word=%D6%F7%B2%A5&fr=ala&ala=1&alatpl=adress&pos=0&hs=2&xthttps=111111

user: user-18
user-0 提问: 键盘输入ctrl+z作用是什么？

回复:
user: user-0
content: 引用 3 楼 赵4老师的回复:File: "C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\internal.h"        69: #define CTRLZ 26        /* ctrl-z means eof for text */ File: "C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\read.c"      277:                     if (*p == CTRLZ) {      478:                     if (*pu == CTRLZ) { File: "C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\write.c"      494:                 else if ((_osfile(fh) & FDEV) && *(char *)buf == CTRLZ)   嗷嗷，多谢。能问下为什么ctrl+z前面有字符的时候，它就会忽略这一行ctrl+z后的字符，并且按回车也不结束输入呢？(而且出现了图里的箭头……)

user: user-1
content: File: "C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\internal.h"        69: #define CTRLZ 26        /* ctrl-z means eof for text */ File: "C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\read.c"      277:                     if (*p == CTRLZ) {      478:                     if (*pu == CTRLZ) { File: "C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\write.c"      494:                 else if ((_osfile(fh) & FDEV) && *(char *)buf == CTRLZ)

user: user-0
content: 引用 1 楼 自信男孩的回复:ctrl+z是Windows下输入EOF的命令。输入EOF，首先程序里需要有判断输入的是否位EOF。所以，如果输入Ctrl+z没有效果，要看程序里有没有判断EOF 建议贴出你的代码 就很简单的定义了一个字符数组，用gets()和puts()输入输出字符串，没别的了。图里最后一行是输出的。 我还了解到是不是和什么阻塞和非阻塞有关？

user: user-2
content: ctrl+z是Windows下输入EOF的命令。输入EOF，首先程序里需要有判断输入的是否位EOF。所以，如果输入Ctrl+z没有效果，要看程序里有没有判断EOF 建议贴出你的代码
user-0 提问: C 指针跟数组问题求组

回复:
user: user-0
content: 十分感谢 确实越界了  @ cfjtaishan @ yx777777

user: user-1
content: 第三个函数里面a指向的地址已经变过了，所以直接输出会从后面开始

user: user-1
content: #include<stdio.h> #define SIZE 5  void copy_arr(double ar[], double a[], int n); void copy_ptr(double *a, double *b, int n); void copy_ptrs(double *a, double *b, double *end);  int main() { 	double source[SIZE] = { 1.1, 2.2, 3.3, 4.4, 5.5 }; 	double target1[SIZE]; 	double target2[SIZE]; 	double target3[SIZE];  	copy_arr(target1, source, SIZE);  	copy_ptr(target2, source, SIZE);  	copy_ptrs(target3, source, source + SIZE); 	return 0; }   void copy_arr(double ar[], double a[], int n) { 	int i; 	for (i = 0; i<n; i++) 		ar[i] = a[i]; 	for (i = 0; i<n; i++) 	{ 		printf("target1[%d] = %.2lf", i, ar[i]); 		printf("\n"); 	} }  void copy_ptr(double *a, double *b, int n) { 	int i; 	for (i = 0; i<n; i++) 		*(a + i) = *(b + i); 	for (i = 0; i<n; i++) 	{ 		printf("target2[%d] = %.2lf", i, a[i]); 		printf("\n"); 	} }   void copy_ptrs(double *a, double *b, double *end) { 	int i; 	double *c; 	c = a; 	while (b < end) 	{ 		*a = *b; 		b++; 		a++; 	}  	for (i = 0; i < SIZE; i++) 	{ 		printf("target3[%d] = %.2lf ", i, *(c+i)); 		printf("\n"); 	} }

user: user-2
content: void copy_ptrs(double *a, double *b,double *end) {     int i;     double *tmp = a;     while(b<end)     {         *tmp = *b;         b++;         tmp++;     }      for(i=0;i<SIZE;i++)     {         printf("target3[%d] = %.2lf ", i, *(a+i));         printf("\n");     } } 其他函数没问题，最后一个函数的问题是a已经指向数组的末尾，所以a+i已经是越界。 解决办法是赋值用一个tmp代替a，这样a还是指向目标数组的开始位置；

user: user-3
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
user-0 提问: C语言进阶求帮助

回复:
user: user-0
content: 字体用错了颜色不好意思啊

user: user-1
content: #include <stdio.h> #include <stdlib.h>  struct student {     int num;     double score;     struct student *next; };  #define LEN sizeof(struct student)  struct student *create(struct student **pphead, int num) {     int i = 0;     struct student *pnew, *pcur;      while (i < num) {         pnew = (struct student *)malloc(LEN);         if (!pnew)             exit(0);         scanf("%d%lf",&pnew->num, &pnew->score);         if (!(*pphead)) {             *pphead = pnew;             pcur = *pphead;         } else {             pcur->next = pnew;             pcur = pnew;         }         i++;     }     pcur->next = NULL;      return *pphead; }   void print_link(struct student *phead) {     struct student *p = phead;      while (p) {         printf("%d %.lf\n", p->num, p->score);         p = p->next;     } }   int main() {     int n,m;     scanf("%d%d",&n,&m);              //两个链表节点数     int i=0;   #if 0     struct student *phead1, *phead2, *p;     phead1 = phead2 = NULL;      create(&phead1, m);     create(&phead2, n);      p = phead1;     while (p->next)         p = p->next;     p->next = phead2;      print_link(phead1);  #else     struct student *head1,*p1,*p2;    //定义链表一      //p2=(struct student*)malloc(100);  //动态开辟空间     p1=(struct student*)malloc(LEN);     scanf("%d%lf",&p1->num,&p1->score); //输入链表一头链表的值     head1 = p1;     p2=p1;     while(i < n-1)     {         p1=(struct student*)malloc(LEN);         scanf("%d%lf",&p1->num,&p1->score);         p2->next = p1;         p2 = p1;         i++;     }     p2->next=NULL;      i=0;     struct student *head2,*p3,*p4;           //定义链表二     p3=(struct student*)malloc(LEN);     //p4=(struct student*)malloc(100);     scanf("%d%lf",&p3->num,&p3->score);      //输入链表二头链表的值     head2 = p3;     p4 = p3;     while(i < m-1)     {         p3=(struct student*)malloc(LEN);         scanf("%d%lf",&p3->num,&p3->score);         p4->next=p3;         p4 = p3;         i++;     }     p4->next=NULL;      p2->next=head2;       //将链表二的头节点赋值给链表一尾next指针      p1 = head1;     while(p1)  //输出合并后的链表     {         printf("%d %.lf\n",p1->num,p1->score);         p1 = p1->next;     } #endif     return 0; } 参考一下吧 代码有冗余，可以将链表创建单独用一个函数实现，然后创建两个链表时直接调用自定义函数； 自定义函数详见上面的代码；仅供参考～

user: user-2
content: 出错时中断下来，通过调用堆栈定位到相关位置，分析原因，必要时单步跟踪程序运行，观察变量变化情况
user-0 提问: C语言求教

回复:
user: user-1
content: 仅供参考  int compress(char array[], int count[]) { //start  	// 0 for char '0' 	// 1 for char '1' 	int flag = 0;   	int len = strlen(array); 	int i = 0;  	int tail = 0; 	count[tail] = 0;  	for (i = 0; i < len; ++i)  	{ 		switch (array[i]) 		{ 		case '0': 			if (flag != 0)  			{ 				flag = 0; 				++tail; 				count[tail] = 0; 			} 			break;  		case '1': 			if (flag != 1) 			{ 				flag = 1; 				++tail; 				count[tail] = 0; 			} 			break;  		default: 			continue; 		}  		++count[tail]; 	}  	return tail; //end }

user: user-2
content: #include "stdio.h" #define Len 100 	int compress(char array[],int count[ ]) { 	int num; 	int i = 0; 	int j=0;  	while(i<100) 	{ 		num = 0; 		if(array[i]=='0'||array[i]=='1') 		{ 			while(array[i]=='0') { num++;i++;} 			count[j++]=num; 			num = 0;  			while(array[i]=='1'){ num++;i++;} 			count[j++]=num; 		} 		else return j-1; 	} 	return j-1; 	}  int main() { 	char array[Len]={'0','0','0','0','0','1','1','1','1','0','0','0','0','1','1','0','0','1','1','1'}; 	char array1[Len]={'0','0','0','0','0','0','1','1','1','1','0','0','0','1','1','1','1','0','0','0','0','0','1','1'}; 	int count[Len]; 	int i; 	int tail;  	tail = compress(array1,count); 	for(i=0;i<=tail;i++) 		i<tail?printf("%d ",count[i]):printf("%d ",count[i]); }

user: user-3
content: 可以参考这篇：http://blog.csdn.net/u012455213/article/details/45502573

user: user-2
content: 这个就是游程编码啊，顺序扫描连续0的个数和1的个数，转换成数字

user: user-4
content: 压缩算法你不说出来。。。。这个怎么写，，，
user-0 提问: C语言问题：判断该天是本年的第几天

回复:
user: user-1
content: #include<stdio.h>  int main() {     int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};     int year,month,day;     int days=0,i;     scanf("%d%d%d",&year,&month,&day);     for(i = 0; i < month -1;i++)         days+=a[i];     days+=day;     if(((year%4==0&&year%100!=0)||(year%400==0))&& month >= 3)         days+=1;     printf("%d\n",days);     return 0; } 参考一下吧 主要是3个问题： 问题1：    for(i = 0; i < month -1;i++)         days+=a[i]; a下标是从0开始，不能从-1开始，若i= 0；那么i-1岂不是-1;所以，i的退出条件应该改为i < month -1 问题2：判断条件，应该是这样的：  if(((year%4==0&&year%100!=0)||(year%400==0))&& month >= 3) 问题3：最后的输出没必要days - year吧。这样得到的是61 - 2017，是一个负值

user: user-2
content: scanf("%d,%d,%d",&year,&month,&day); scanf("%d %d %d",&year,&month,&day);
user-0 提问: 数据结构静态链表（A-B）∪(B-A)伪码不太理解

回复:
user: user-1
content: 伪代码不容易看懂，建议从网上找到对应的代码，然后直接看实现代码；

user: user-2
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  《数据结构（C语言描述）》

user: user-3
content: 亲，有人吗。。。
user-0 提问: 怎样查看硬盘或U盘地址空间存储的数据?

回复:
user: user-1
content: 机械硬盘，从0柱面、0扇区、0磁头开始……

user: user-2
content: windows用ue、ue studio，linux下用xxd，hexdump

user: user-3
content: 有各种工具软件显示16进制数据的文件。具体可以去网上搜。 自己实现简单的也不是很难。 我写过一个小函数，以16进制显示一段内存数据的//以16进制打印一段内存（字符串） void dumpdata(const char* buff, int len) { 	for (int i = 0; i < len; i++) 	{ 		printf("%02X ", (unsigned char)buff[i]); 	} 	printf("\n"); }

user: user-4
content: Linux下，可以使用“od -x 文件名”命令查看文件的二进制内容； od -xc file >file.txt是将file的二进制形式的内容放到file.txt文件里，打开file.txt文件就可以看到file文件的二进制内容；  Windows下考虑一下这样的工具： http://blog.csdn.net/andrew57/article/details/51537798

user: user-1
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
user-0 提问: 一个小问题，关于共同体

回复:
user: user-1
content: 静态变量存储的时候，如果没有初值，那么就是 0 . 而你的堆栈变量，如果没有初值，那么就是随机的。 int 是 4 个字节的，而 char[2] 是 2 个字节的。你需要把 4 个字节都赋值。

user: user-2
content: 因为一个int有4字节，而char x[2]只有两字节，你实际只对int的两个字节进行了赋值，另外两个字节没有赋值，是随机值，输出什么取决于编译器实现。如果另外两个字节刚好为0，结果就是266，但你自己不能这样去保证

user: user-3
content: 如果你先用 memset(&a, 0, sizeof(Cookies))进行清零的步骤，那么得到的是你希望的结果。

user: user-3
content: 内存中的随机值，在联合中，int的高32位没赋值，随机了。
user-0 提问: 计算机入门，关于指针

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

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

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

user: user-2
content: %c是输出字符，%d输出是十进制数

user: user-3
content: 因为是用%d输出的，所以输出的就是ASCII值，若是用%c输出则是ASCII字符； #include<stdio.h>  int main() {     char a='w',b='c',*pa,*pb,*pc;     pa = &a;     pb = &b;     printf("a:%c,b:%c,*pa:%c,*pb:%c\n",a,b,*pa,*pb);     pc=pa;     pa=pb;     pb=pc;     printf("a:%c,b:%c,*pa:%c,*pb:%c\n",a,b,*pa,*pb); }     pc=pa;     pa=pb;     pb=pc; 这样的交换只是交换了指针指向的地址，即pa原来指向&a,pb指向&b，通过这三条语句后，就改变了pa, pb的指向，即pa指向&b, pb指向了&a，但是并没有改变变量a和变量b的值。

user: user-4
content: 你用%d輸出，那不就是ASCII碼值！
user-0 提问: 有人可以看看吗？

回复:
user: user-1
content: 首先说一下你的需求在哪里用，如果是嵌入式设备，带系统的可以考虑用sleep(1)，休眠1秒；如果是不带系统的，比如单片机，那么要根据单片机的CPU频率。一般可以用while循环 比如  while (i < 10000)     ;  上面的代码循环10000次表示一秒；

user: user-2
content: #include <iostream> #include <Windows.h>  int main() { 	for (int i = 0; i <= 100; i++) 	{ 		std::cout << i << std::endl; 		Sleep(1000); 	} }这个？

user: user-3
content: 啥叫用函数延迟？ Sleep可以么
user-0 提问: 有关c语言if语句选择输出结构体中数据

回复:
user: user-1
content: 结构体比较不能直接拿数和结构比较，应该是拿数据和结构体的某个成员比较；

user: user-2
content: if后面必须带着一个语句或语句块，你这段显然有语法错误：   for ( i = 0; i < 4; i++)  {  if(j>tra[i].price)  }

user: user-3
content: scanf("%d", j);  改成：scanf("%d", &j);i  f(j>tra[i].price) 后面加上你要的执行的语句

user: user-4
content: scanf("%d", j); -> scanf("%d", &j);
user-0 提问: C语言初学者，求各位帮忙看看这道ACM我为什么错了

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  int main() {     int i, j, k;     int tm, num, ch, cnt;     char *list;      scanf("%d", &tm);      k = 0;     while (k < tm) {         scanf("%d", &num);         getchar();   /*for '\n' */          list = (char *)malloc(sizeof(char) * num);         if (!list)             return -1;          i = 0;         cnt = 0;         while ((ch = getchar()) != '\n') {             if (ch == ' ')                 continue;             list[i] = ch;             for (j = 0; j < i; j++)                 if (ch == list[j])                     break;             if (j >= i)                 cnt++;             i++;             if (i >= num)                 break;         }         printf("case#%x: %d\n", k+1, cnt);         k++;      }      /*     int t,l,m,c[1000],k,y;     char j1;     char a[1000][1000],b[1000][1000];     scanf("%d",&t);     for(int i=0;i<t;i++)     {         k=0;m=0;y=1;         scanf("%d",&c[i]);         getchar();     /*for '\n' */         while((j1=getchar())!='\n')         {             if(j1!=' ')             {                 b[i][k]=j1;                 k++;             }         }         for(int j=0;j<k;j++)         {             l=0;             for(int z=j;z<k;z++)             {                 if(b[i][j]==b[i][z])                 {                     l+=1;                 }             }             if(l==1)             {                 m++;             }         }         printf("Case #%d:%d\n",i+1,m);     }     */     return 0; }  参考一下吧；   scanf("%d",&c[i]);去掉第一个参数的'\n'，然后在scanf后面加一句getchar();，该getchar()作为接收scanf输入后的换行符'\n'
user-0 提问: 有关UNIX系统识别文件结束

回复:
user: user-1
content: 我也看到这里！

user: user-0
content: 引用 2 楼 adlay 的回复:都是说的没有使用特殊字符来作为文件结束的标记 谢谢！

user: user-0
content: 引用 1 楼 user-3 的回复:这两种说法并不矛盾，后者更针对于文本文件 呃呃，我似乎有点明白您的意思了。 感谢版主，百忙之中抽时间回答我的问题。十分感谢！

user: user-2
content: 都是说的没有使用特殊字符来作为文件结束的标记

user: user-3
content: 这两种说法并不矛盾，后者更针对于文本文件
user-0 提问: C语言新手求助

回复:
user: user-1
content: #include <stdio.h>  int Digit2Char (long int x,char a[]) {   long int x1=x; //复制一个同样的值   int j,times,flag,t,b[20],k,sum=0;   /*for(j=7;(j>=0)&&(x1!=0);j--) //从个位开始赋值给b数组   //error  串长小于8   { 	b[j]=x1%10; 	x1=x1/10; 	sum+=b[j];   }   */   for(j = 0; x1 ; ++j)   { 	  b[j] = x1 % 10; 	  x1 /= 10; 	  sum += b[j];   }       for(times=1;times<j;times++)//比较次数为7次            //修改     for(flag=0;flag<j-times;flag++)//比较相邻两个数的位置     if(b[flag+1]>b[flag])     t=b[flag+1],b[flag+1]=b[flag],b[flag]=t;//比较前后数字大小并排序     for(k=0;k<j;k++)     //修改 	a[k]=b[k] +'0'; //把b数组的数字转换为a数组的字符      a[j] = '\0';   if (x<=99999999&&x>=0)//判断是否为8位以内的有效数字 	return sum;   else     return 0;//有效数字超过8位返回0 }   int main(void) { 	char a[7] = "\0";  	long int y; 	scanf("%ld",&y);  	if(Digit2Char(y,a)) 		printf("%d,%s",Digit2Char(y,a),a); 	else printf("%s\n","Input Error!\n"); 	 	return 0; }

user: user-2
content: 我也是新人，不一定是最简单的方法

user: user-2
content: #include<stdio.h> #include<math.h> void main() { 	int n,a[8],sum,i,j,k,t,new,g; 	scanf("%d",&n); 	for(i=0,sum=0;n;i++) 	{ 		a[i]=n%10; 		sum+=a[i]; 		n/=10; 	} 	g=i;/*记住输入的是几位数*/ 	if(g<=8) 	{ 	   for(i=0;i<g-1;i++) 	   { 		   for(j=i+1,k=i;j<g;j++) 		   if(a[k]>a[j])k=j; 		   if(k!=i){t=a[i];a[i]=a[k];a[k]=t;} 	   } 	   for(i=0,new=0;i<g;i++) 	   new+=a[i]*pow(10,i); 	   printf("%d,%d\n",sum,new); 	} 	else printf("Input Error!\n"); }
user-0 提问: 一个C语言，很困扰，请大神解答！！！

回复:
user: user-1
content: s[j+1]=s[j]; s[j+1]='*';

user: user-2
content: while(s[i+1+n]!='\0') n++; 这两行代码就是计算当前i位置距离字符串末尾还有多少个字符，可以通过在while循环后打出n的值来确认； 最后的执行结果是在每个数字后面都加一个*号，代码也是这样执行的。 那么楼主想实现什么？

user: user-3
content: 引用 楼主 qq_36974603 的回复:这部分我有疑问：当循环到第一个数字字符3时，i=2，然后判断s[i+1+n]!='\0'之后，不是应该执行n++;语句然后n=1吗？ 如果按照我的思路，应该接下来是j=4,然后s[5]=s[4];s[4]='*';才对啊！可答案好像不是我这样的！ 第1句是对的，但接下来不是立即执行第2句，因为循环还未结束，等循环结束后，n的值是8，所以j的值不是4，而是2+8+1=11 加个输出语句看看便知 void fun(char *s) {    int i,j,n;    for(i=0;s[i]!='\0';i++)       if(s[i]>='0' && s[i]<='9')       {          n=0;                    while(s[i+1+n]!='\0') n++;          //printf("%d\n", n); return;           for(j=i+n+1;j>i;j--)          {             //printf("%d\n", j); return;             s[j+1]=s[j];          }          s[j+1]='*';          i=i+1;       } }
user-0 提问: 循环语句知识 求大佬解决

回复:
user: user-1
content: 不执行continue那么，就会执行后面的printf。continue是停止之后后面的语句，从当前位置跳转到循环体开始位置：修改循环变量，判断循环条件，执行循环体；

user: user-2
content: if语句只对它下面的第一条语句有效。 不管if条件成不成立，都会执行printf语句。

user: user-3
content: 路上两位说的都对。 如果if条件不满足，则不会执行continue语句（if的作用域就continue这一句），后面的printf语句是会执行的。 如果if条件满足，则会执行continue语句，continue执行会跳过本次for循环后面的语句，直接进入下一次for循环。  楼主可以单步调试感受一下，下面三种方式的区别：  #include<stdio.h> int main() { 	int n; 	for(n=100;n<=200;n++) 	{ 		if(n%3==0) 			continue;			 		printf("%d",n); 	} 	printf("\n"); 	return 0; }   #include<stdio.h> int main() { 	int n; 	for(n=100;n<=200;n++) 	{ 		if(n%3==0) 			//continue;			 		printf("%d",n); 	} 	printf("\n"); 	return 0; }   #include<stdio.h> int main() { 	int n; 	for(n=100;n<=200;n++) 	{ 		//if(n%3==0) 			continue;			 		printf("%d",n); 	} 	printf("\n"); 	return 0; }  另建议楼主写代码if条件时，加上{}养成好的习惯：  #include<stdio.h> int main() { 	int n; 	for(n=100;n<=200;n++) 	{ 		if(n%3==0) 		{ 			continue; 		} 		printf("%d",n); 	} 	printf("\n"); 	return 0; }

user: user-4
content: 虽然不执行continue（不重新开始下一次循环），但还是会继续执行完本次循环，也就是后面的代码仍然会继续执行

user: user-5
content: if(n%s==0) -->  if(n%3==0)  continue; 意思是能被3整除，执行 continue，即跳过下面的printf，执行下一个循环 不能被3整除时不执行 continue，再执行下面的printf
user-0 提问: 新手求助，为什么会产生default segment?

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

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

user: user-2
content: struct student * s[5]; //只声明了结构指针数组，没有未该指针初始化 s[0]指向哪里，没有为指针分配结构，需要分配一个结构，再将结构的地址赋给s[0] 其他同理
user-0 提问: 程序中所说的线程、进程， 和CPU的线程（如四核八线程）有什么区别

回复:
user: user-1
content: 程序的线程是指能同时并发执行的逻辑单元的个数，是通过时间片分配算法实现的；cpu的线程是指将cpu的指令执行过程（取指、译指、执行，访存、写数）做出流水线从而提高并发度的方法

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:CPU的线程是指指令流水线的条数。我猜。 呃呃，赵老师您好！

user: user-2
content: CPU的线程是指指令流水线的条数。我猜。

user: user-3
content: CPU的指的是CPU可以同时运行的线程数量，是可以同时执行的代码路径数量，程序中的表示你实际用到的，如果程序的线程数多于CPU的线程数，那敢并不是真正的并行，各线程会占用在一个很短的时间片里依次得到执行，用户看似是同时运行的

user: user-4
content: 程序说的线程进程是软件的概念。一个程序就是一个进程，每个进程至少1个线程（在windows系统是这样）。 操作系统通过时间分片算法，可以在一个CPU上让多个线程轮流执行，看起来似乎是很多线程进程同时运行了。 CPU的线程是硬件的概念。八线程就是能让八个线程同步执行。

user: user-5
content: 进程是线程的容器，系统的调度单位是线程，程序的线程需要在CPU核上的线程上跑
user-0 提问: C语言指针问题

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

user: user-2
content: 。。。弄错了(*(p + 1)[2])才是p[1][2]   这里的就是p[3][0]

user: user-1
content: 仅供参考：//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-2
content: 这里考察数组的地址都是连续，所以可以这样赋值，(*ptr)[2]是一个数组指针， *((ptr + 1)[2])表示ptr[1][2]即ptr[2][0], 降维的话是Ptr[4]， a[4][3]二维将一维可以变为A[12],   Ptr[4]]就是A[4]    所以值是5

user: user-3
content: ptr指向的数组是a[4][2];因此列数长度是2;*((ptr+1)[2])即ptr[3][0]

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

user: user-4
content: 你懂汇编么？反汇编看下数组在汇编里怎么表示就懂了，很简单的事情

user: user-5
content: ptr是一个指向一维数组的指针，该一维数组有两个元素 所以ptr+1指向下一个一维数组的指针，跳过的距离与一维数组有几个元素有关

user: user-5
content: (ptr + 1)[2]相当于*(ptr + 1 +2) -> *(ptr + 3)  *((ptr + 1)[2]) ->  **(ptr + 3) ptr+0 -> 1 2 ptr+1 -> 3 4  ptr+2 -> 5 6 ptr+3 -> 7 8 so,  **(ptr + 3) == 7  *(*(ptr + 3)+1) == 8

user: user-0
content: 刚才调试了下看了地址得到的表面理解，但是不知道对不对，请大神们指正： 1.如何取值取决于指针，*(ptr+1)要以2列为标准，而比如*(a+1)就要以3列为标准计算 2.(ptr+1)[2]中的[2]部分仍是行控制，表示在ptr向下+1行后再向下+2行 3.(ptr+1)[2]+1中的+1部分才是列控制，表示在此行向右移动一列
user-0 提问: 新手刚学C语言，想修改一段代码可以帮下忙吗

回复:
user: user-1
content: 可以是可以，但显示中文会影响位置 另putchar(f<=0.0f?".:-=*#%@"[(int)(f*-8.0f)]:3);是不是改为 putchar(f<=0.0f?".:-=*#%@"[(int)(f*-8.0f)]:‘3’); #include <stdio.h> #include <math.h> #include <locale.h>  int main(void) {    float x, y, z, f;    setlocale(LC_ALL, "chs");     for (y = 1.5f; y > -1.5f; y -= 0.1f)    {       for (x = -1.5f; x < 1.5f; x += 0.05f)       {          z = x * x + y * y - 1;          f = z * z * z - x * x * y * y * y;          //putwchar(f <= 0.0f ? L".:-=*#%@"[(int)(f * -8.0f)] : L'8'); //有些平台上不显示          f <= 0.0f ? wprintf(L"%c", L".:-=*#%中"[(int)(f * -8.0f)]) : wprintf(L"%c", L'8');       }       putchar('\n');    }     //getchar();    return 0; }

user: user-2
content: putchar只能输出单个字符，而你试图输出一大串字符串，请改用printf

user: user-3
content: 要输出非Ascii字符，需要用到另外一些函数。  #include <stdio.h> #include <stdlib.h> #include <locale.h> #include <wchar.h>  void main()     {     setlocale(LC_ALL, "");      wprintf(L"Why? 为什么？\n");     }  给一个简单范例，这块深入学习需要了解Unicode,Encoding等概念，还是比较麻烦的。

user: user-4
content: 换成中文可以，但是一个中文字符不能用一个字符表示；建议看一下查一下putwchar； 不过直接用putwchar也是不行的，还得熟悉这个算法；
user-0 提问: 求助！Debug/shiyan.exe : fatal error LNK1169: one or more multiply defined symbols 

回复:
user: user-1
content: 改为以下即可 #include<stdio.h>  int jj(int a[500],int b[500],int n,int m) { 	int i, j, sum=0; 	for(i=0;i<n;i++) 	{ 		for(j=0;j<m;j++) 		{ 			if(a[i]==b[j]) 			{ 				printf("%d ",a[i]); 				sum=1; 			} 		} 	} 	if(sum==0)printf("空"); 	printf("\n"); 	return 0; }  int bj(int a[500],int b[500],int n,int m) {       int i, j;  	for(i=0;i<n;i++) 	{ 		printf("%d ",a[i]); 	} 	for(i=0;i<m;i++) 	{ 		int sum=0; 		for(j=0;j<n;j++) 		{ 			if(b[i]==a[j])sum++; 		} 		if(sum==0)printf("%d ",b[i]); 	} 	printf("\n"); 	return 0; }  int cj(int a[500],int b[500],int n,int m) { 	int i, j, sum=0; 	for(i=0;i<n;i++) 	{ 		int k=0; 		for(j=0;j<m;j++) 		{ 			if(a[i]==b[j])k=1; 		} 		if(k==0) 		{ 			printf("%d ",a[i]); 			sum=1; 		} 	} 	if(sum==0)printf("空"); 	printf("\n"); 	return 0; }  int main() { 	int a[500],b[500]; 	int i,j,k,n,m; 	printf("A集合元素的个数："); 	scanf("%d",&n); 	printf("A集合的元素（两个元素之间用空格隔开）："); 	for(i=0;i<n;i++) 		scanf("%d",&a[i]); 	printf("B集合元素的个数："); 	scanf("%d",&m); 	printf("B集合的元素（两个元素之间用空格隔开）："); 	for(j=0;j<m;j++) 		scanf("%d",&b[j]); 	printf("操作指令：输入1求交集，输入2求并集，输入3求差集，输入0退出程序。\n");  	while(1) 	{ 		scanf("%d",&k); 		if(k==0)break; 		else if(k==1) 		{ 			printf("交集："); 			jj(a,b,n,m); 		} 		else if(k==2) 		{ 			printf("并集："); 			bj(a,b,n,m); 		} 		else if(k==3) 		{ 			printf("差集："); 			cj(a,b,n,m); 		} 		else printf("The input is error! Please enter again.\n"); 	} 	return 0;	 }
user-0 提问: c语言问题，大佬们提供下思路

回复:
user: user-0
content: 感谢感谢谢谢大佬的帮助，平时c primer plus基本没看，内容大多晦涩难懂

user: user-1
content: #include <stdio.h>  struct train {     char code[15];     //车次     char data[15];     //日期     char lp[15];       //left place 起点     char ap[15];       //arrive place 终点     char lt[15];       //left time 开车时间     char at[15];       //arrive time 到达时间     int  price;       // 票价 };  void train(void) {     struct train tn[4];     int i;      for (i = 0; i < 4; i++)     {         printf("请输入车次");         scanf("%s", tn[i].code);         printf("请输入日期");         scanf("%s", tn[i].data);         printf("请输入起点");         scanf("%s", tn[i].lp);         printf("请输入终点");         scanf("%s", tn[i].ap);         printf("请输入开车时间");         scanf("%s", tn[i].lt);         printf("请输入到达时间");         scanf("%s", tn[i].at);         printf("请输入票价");         scanf("%d", &tn[i].price);     } } 参考一下吧；  结构体声明，一般会放在函数外，结构体定义变量和数组，建议还是看一下书本，看书本上例子是怎么用的。基础知识，建议多翻翻书，敲敲书本上的例子代码；
user-0 提问: 大一c语言问题

回复:
user: user-1
content: 容易引起歧义的代码请用括号来进行分隔开，比如连续多个 ? :

user: user-2
content: c=a>b? ++a:++b; 其实可以拆分为： C=某某为最后执行 右边的为三元表达， 如果a大于b为真，返回a，++a会先计算，也就是返回的是a+1后的值 如果a小于吧，也就是a》b为假，返回吧，++b会先加1再返回b+1后的值，如果这个题变一下b++，就会先返回b，并不是返回b+1后的值。 然后c就算出来了

user: user-3
content: #include <stdio.h> int main() {     int a=5,b=4,c;     c = a > b ? ++a : ++b;     printf("%d %d %d\n",a,b,c);     c = (b-a? a+b:a-3)? b:a;     printf("%d %d %d\n",a,b,c);     return 0; }  如上的code输出结果是6 4 4，而不是6 4 10，因为加了括号，影响了表达式的运算优先级；自然，若是输出6 4 10原因是：  c=b-a? a+b:a-3? b:a; 表达式是从右向左运算，a - 3 位3，即非0，所以接下来运算c = b - a ? a + b ： b；最后的结果是a+b赋值给c，所以是10； 第二个打印b不是5，因为++b没有执行，a > b，那么会把++a的值赋值给c；所以++b没有执行；自然第二个打印b还是4；

user: user-4
content: 1. a>b 真，所以c = ++a，而++b未求值，即a增一，b不变，c赋值为a的值（6） 2. 相当于：c = (b-a)? (a+b): (a-3? b:a); 先求值，再赋值，b-a真，求值a+b为10，赋值给c
user-0 提问: 字符串比较问题其扩展距离。

回复:
user: user-1
content: 递归式： val(i,j)=min{val(i-1,j)+k,val(i,j-1)+k,val(i-1,j-1)+dist(a_i,b_j) 算法是递归的，程序实现是递推的，这是个公共的算法，建议自己先搜一下： http://blog.csdn.net/asce1885/article/details/5618788

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

回复:
user: user-0
content: 引用 2 楼 cfjtaishan 的回复:看不懂你的计算逻辑， int index=abs(nums[i])-1;         if(nums[index]<0) 这样用index不会越界吗？ 比如这样输入：  5 100 200 300 400 100  这样必定会越界的。  所以，你的算法应该有问题； 数组里的数是小于数组长度的，不好意思忘记说了

user: user-1
content: 出错时中断下来，通过调用堆栈定准到相关位置，分析原因，必要时，在相关位置设置断点，然后单步跟踪程序运行，观察变量变化情况，查掉是否越界，是否访问了无效指针等

user: user-2
content: 看不懂你的计算逻辑， int index=abs(nums[i])-1;         if(nums[index]<0) 这样用index不会越界吗？ 比如这样输入：  5 100 200 300 400 100  这样必定会越界的。  所以，你的算法应该有问题；

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