Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 第61行和101有相同的错误，不懂，望各位大佬求救

回复:
user: user-0
content: 引用 9 楼 自信男孩的回复:去掉双引号，因为stdin, stdout本身就是FILE *类型的。  另外，提醒一下fflush(stdin);是未定义行为，fflush(stdout)是有效的。 解决了，三q

user: user-1
content: 去掉双引号，因为stdin, stdout本身就是FILE *类型的。  另外，提醒一下fflush(stdin);是未定义行为，fflush(stdout)是有效的。

user: user-0
content: 哈哈哈哈哈哈哈

user: user-2
content: 引用 6 楼 千梦一生 的回复:https://baike.baidu.com/item/fflush/10942194?fr=aladdin 它那儿就有现成的例子。 不是不回你，yysy，流这个名字，一直觉得怪里怪气的

user: user-2
content: https://baike.baidu.com/item/fflush/10942194?fr=aladdin

user: user-0
content: 引用 4 楼 千梦一生的回复:比如一个函数，实现了一个功能：把字符串拼接 A(字符串，字符串)  你这样调用 A(字符串)；//不对的。因为很显然，不能是一个参数对吧，因为我函数要拼接你的字符串，那肯定至少需要两个字符串才能做到你满足你的功能 A(整数变量，整数变量)；//不对的。因为很显然，不能是一个参数对吧，因为我函数要拼接你的字符串，那肯定至少需要两个字符串才能做到你所希望的功能  函数是一个过程。把某些状态从x-->y。x即是输入，y即是输出。x、y在这里可能是一种状态，但在全是数字的计算机世界种，所谓状态也不过是数据罢了。 因此，这是我个人认为，事实上一个有用的函数必定有输入和输出，只是有些是单纯的参数与返回，有些是环境变量、全局变量、云云。 既然过程、函数是把输入x-->y。那么，一个有效的x当然是必须的了。 作为参数，它以参数类型告知你它需要一个怎样的输入n才能执行n-->m的一个正确的，被希望的过程。  //////////////////// 而你这个具体的问题，你得具体的看那个函数的描述了。我对流也不怎么理解 哇，先谢谢你了

user: user-2
content: 比如一个函数，实现了一个功能：把字符串拼接 A(字符串，字符串)  你这样调用 A(字符串)；//不对的。因为很显然，不能是一个参数对吧，因为我函数要拼接你的字符串，那肯定至少需要两个字符串才能做到你满足你的功能 A(整数变量，整数变量)；//不对的。因为很显然，不能是一个参数对吧，因为我函数要拼接你的字符串，那肯定至少需要两个字符串才能做到你所希望的功能  函数是一个过程。把某些状态从x-->y。x即是输入，y即是输出。x、y在这里可能是一种状态，但在全是数字的计算机世界种，所谓状态也不过是数据罢了。 因此，这是我个人认为，事实上一个有用的函数必定有输入和输出，只是有些是单纯的参数与返回，有些是环境变量、全局变量、云云。 既然过程、函数是把输入x-->y。那么，一个有效的x当然是必须的了。 作为参数，它以参数类型告知你它需要一个怎样的输入n才能执行n-->m的一个正确的，被希望的过程。  //////////////////// 而你这个具体的问题，你得具体的看那个函数的描述了。我对流也不怎么理解

user: user-0
content: 引用 1 楼 千梦一生的回复:是不是参数没给对？你去找找这个函数需要什么输入。百度就有 这个不是清理输入缓存吗？和参数有什么关系(萌新瑟瑟发抖 )

user: user-3
content: 去翻译一下吧，报错写的很清楚了

user: user-2
content: 是不是参数没给对？你去找找这个函数需要什么输入。百度就有

user: user-4
content: 61和101都用了fflush函数，
user-0 提问: 编译错误 c6031 返回值被忽略scanf

回复:
user: user-1
content: #define _CRT_SECURE_NO_WARNINGS 有很多开关只是能让代码编译，而依然会作为警告提示给开发者

user: user-2
content: int n = scanf("%lf%lf", &num1, &num2); if ( 2 !== n) {       错误提示       return0； }  要想让用户必须输入正确才继续下去的话，这个就复杂点儿 while ( 2 != scanf("%lf%lf", &num1, &num2) ) {        fflush(stdin);  // 清理掉键盘缓冲区当中的内容        提示输入错误，重新输入 }

user: user-0
content: 所以大神我应该怎么修改呢

user: user-2
content: scanf函数是有返回值的， 用来表述正确的从键盘获得到输入数据的个数 你这个例子来说，要求输入两个double类型， 但是如果你输入 12.3  xyz 会如何 scanf的返回值是1， 通知你只有一个double被正确的获得了， 接下来怎么处理，你自己看着办 你不管的话，num1就是正确的值， num2就不是你想要的了 后面你还当他们是正确的值来处理的话， 后果自负吧  这是提供安全检测到警告，就和此处非本单位车辆禁止停放一样， 你可以不管，后果自负
user-0 提问: 刚写个了小程序，求大佬们评价一下。。。。

回复:
user: user-1
content: 这个东西怎么看怎么像作业

user: user-2
content: 没太细看 shezhi函数有一部分代码和youxizhuti函数几乎一样，可以在shizhi函数中调用youxizhuti函数，减少重复代码。

user: user-3
content: 不对呀，我可以违反规则，让对手输啊，这个是BUG

user: user-3
content: 似乎来个选项可以人机对战好一点，毕竟身边没有小姐姐。 似乎应该拿3n-1数就可以取胜。

user: user-4

user: user-0
content: 我明明排过版了，怎么又左对齐了，难搞啊
user-0 提问: C语言 检验身份证校正码

回复:
user: user-1
content: 楼主当做整数运算还有一个问题 for(i=0;i<18;i++) {    arr[i]=ID%10;    ID=ID/10; }  这里得到的数是从低位向高位进行的, arr[0]就是身份证的第18位， arr[17]才是第一位 而用来和他做乘法的那个数组顺序和他恰好是相反的，是从高位到低位的顺序 所以后面的 for(i=0;i<17;i++)      sum+=arr[i]*a[i]; 这样写也是错误的。     用lld整数可以解决，但是方法上有不同  #include <stdio.h> #include<stdio.h>  // id是17位数， ch是最有一位校验码字符 // 如果合法返回0， 错误号码返回1 int  exam(long long id, char ch ) {     int  sum=0;     int  arr[18];     int  a[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};     char b[]={'1','0','x','9','8','7','6','5','4','3','2'};     int  i;     long long ID = id;     for(i=0;i<17;i++)     {         arr[i] = ID%10;         ID     = ID/10;     }     for(i=0;i<17;i++)         sum += arr[16-i]*a[i];     sum%=11;     char temp=b[sum];     if( temp != ch) {         printf("%lld%c : %c\n", id, ch, temp);         return 1;     } else         return 0;  } int main() {     long long ID;     int n,i,flag=0;     scanf("%d",&n);     for(i=1;i<=n;i++)     {         char ch;         //指定整数的位数，最后一个当做字符输入         while ( 2!=scanf("%17lld%c", &ID, &ch)) {             fflush(stdin);             printf("输入错误\n\                    身份证号码必须是18位，只有最后一位可以是字母而且只能是x!\n\                    请重新输入:\n");         }         flag += exam(ID, ch);     }     if(0==flag)         printf("All passed");     return 0; }

user: user-2
content: 可以简单一些：  #include <stdio.h>  int main() {   const char v[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};   const char *m = "10X98765432";    char s[19];   int n, i, c, x, p = 0;    scanf("%d", &n);   while (n--)   {     scanf("%s", s);     for (i = c = 0; x = s[i] - 48, i < 17; i++)       x >= 0 && x < 10 ? c += x * v[i] : i = 19;     i == 19 || s[17] != m[c % 11] ? p = puts(s) : 0;   }   if (!p) puts("All passed");    return 0; }

user: user-3
content: 个人觉得你的思路是有些问题的，最后一个可能是X，longlong是不能存的 #include<stdio.h> #include<string.h> int dis[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; char m[]={'1','0','X','9','8','7','6','5','4','3','2'}; char mp[100][19]; int main(){     int n,num=0,i,j,k,ans=0;     char id[19];     scanf("%d",&n);     for(i=0;i<n;i++){         int sum=0;         scanf("%s",id);         for(j=0;j<17;j++){             sum+=(id[j]-'0')*dis[j];         }         sum%=11;         if(m[sum]==id[17]){             num++;         }         else{             strcpy(mp[ans++],id);         }     }     if(num==n){         printf("All passed\n");     }     else{         for(i=0;i<ans;i++){             puts(mp[i]);         }     }     return 0; }

user: user-1
content: 而且，这个身份证号码，如果尾巴是X，你这个scanf怎么也读不进来x字符啊 用字符串作为输入类型，读入进来再转换

user: user-1
content: 你把exam都代码再放回main里面去吧  然后 下面这两个i++只可以保留一个 for(i=0;i<18;i++) { arr[i++]=ID%10; ID=ID/10; }
user-0 提问: 求大佬解答 c语言链表姓名排序问题 没有进行循环

回复:
user: user-1
content: #include <stdio.h> #include <string> #include <ctime>  typedef struct People {     char name[20];     char id[20];     struct People * next; } People;  People * create(int n) {     if ( n<1 ) return NULL;     int i; int v;     v = rand() % 1000;     People * pHead = (People*) malloc( sizeof(People));     sprintf(pHead->name, "name-%03d", v);     sprintf(pHead->id, "id-%03d", v);     People * p = pHead;     for ( i=1; i<n; i++) {         p->next = (People*) malloc( sizeof(People));         v = rand() % 1000;         sprintf(p->next->name, "name-%d", v);         sprintf(p->next->id, "id-%03d", v);         p = p->next;     }     p->next = NULL;     return pHead; };  void printList(People * pHead) {     printf("\n--------- People List ---------\n");     if ( pHead == NULL) return;     People * p = pHead;     while ( p ) {         printf("%s : %s\n", p->name, p->id);         p = p->next;     } }  People * sortList(People * pHead) {     if ( NULL == pHead || pHead->next == NULL ) return pHead;     People * pTH = (People*) malloc( sizeof(People));     pTH->next = pHead;     People * pTail = NULL;     while ( pTH->next->next != pTail ) {         People * pPrior = pTH;         People * pCur   = pTH->next;         People * pNext  = pCur->next;         do  {             if ( strcmp ( pCur->name, pNext->name)>0) {                 pCur->next   = pNext->next;                 pNext->next  = pCur;                 pPrior->next = pNext;                 People * pT = pNext;                 pNext = pCur;                 pCur = pT;             }             pNext  = pNext->next;             pCur   = pCur->next;             pPrior = pPrior->next;         } while( pNext!=pTail);         pTail = pCur;     }     pHead =pTH->next;     free(pTH);     return pHead; }; int main() {     srand(time(NULL));     People * p = create(10);     printList(p);     p = sortList(p);     printList(p);     return 0; }
user-0 提问: 大佬们求助，小弟初学C语言，有问题求助

回复:
user: user-1
content: 你的第二个程序B似乎没有定义，B应该定义为double类型，输出的时候把%d改成%lf。 第一个程序输入函数scanf中\n去掉。就像程序2就好了。第一个程序的输出也要用%lf
user-0 提问: C语言姓名排序后无法输出，求解

回复:
user: user-1
content: #include <stdio.h> #include <string> #include <ctime>  typedef struct People {     char name[20];     char id[20];     struct People * next; } People;  People * create(int n) {     if ( n<1 ) return NULL;     int i; int v;     v = rand() % 1000;     People * pHead = (People*) malloc( sizeof(People));     sprintf(pHead->name, "name-%03d", v);     sprintf(pHead->id, "id-%03d", v);     People * p = pHead;     for ( i=1; i<n; i++) {         p->next = (People*) malloc( sizeof(People));         v = rand() % 1000;         sprintf(p->next->name, "name-%d", v);         sprintf(p->next->id, "id-%03d", v);         p = p->next;     }     p->next = NULL;     return pHead; };  void printList(People * pHead) {     printf("\n--------- People List ---------\n");     if ( pHead == NULL) return;     People * p = pHead;     while ( p ) {         printf("%s : %s\n", p->name, p->id);         p = p->next;     } }  People * sortList(People * pHead) {     if ( NULL == pHead || pHead->next == NULL ) return pHead;     People * pTH = (People*) malloc( sizeof(People));     pTH->next = pHead;     People * pTail = NULL;     while ( pTH->next->next != pTail ) {         People * pPrior = pTH;         People * pCur   = pTH->next;         People * pNext  = pCur->next;         do  {             if ( strcmp ( pCur->name, pNext->name)>0) {                 pCur->next   = pNext->next;                 pNext->next  = pCur;                 pPrior->next = pNext;                 People * pT = pNext;                 pNext = pCur;                 pCur = pT;             }             pNext  = pNext->next;             pCur   = pCur->next;             pPrior = pPrior->next;         } while( pNext!=pTail);         pTail = pCur;     }     pHead =pTH->next;     free(pTH);     return pHead; }; int main() {     srand(time(NULL));     People * p = create(10);     printList(p);     p = sortList(p);     printList(p);     return 0; }

user: user-1
content: 按照你自己的思路去改吧。  这样对你自己有好处。 哪怕有问题，哪怕方法麻烦， 走通了，你就进了一大步了  sort要想改好， head节点也是要参与排序的， 而且改了之后，头结点不是它需要返回，那么函数的原型就要是 struct people * sort（struct people * head）；  调用的时候是：  head = sort(head);    用返回值更新调用它的head  要交换指针，你实际上需要三个东西 上一个节点  当前节点  下一个节点 交换的是当前和下一个节点， 但是交换后的结果，需要更改上一个节点的next指针 proir  -->  cur --> next --> more  交换前 proir --> next --> cur --> more    交换后  ptail是控制循环范围的， 第一次排序从头到结尾的 第二次控制，从头到倒数第二个 第三次控制，从头到倒数第三个 .... 因为后面都是排序好的 通过控制 while( tail  == head->next ) 来判断全部排序结束  这仅仅是一种办法。代码会比较麻烦。 但是如果节点数据结构复杂度话， 这个方法效率会很高，比交换数据要高。

user: user-0
content: 那应该怎么改呢

user: user-1
content: 他这个问题不光是复杂的问题，整体上有一堆问题， 没想好从头到尾帮着改呢，还是只给sort的建议  这个sort本来就是一个没有完成的代码，麻烦不仅仅在交换的复杂上， 还在整个交换流程的控制上 比如，head不是空头， 是有效数据，那么头也应该参与交换的， 但是它没法交换，即便交换了也返回不去 有了tail指针，本来是用来控制类似冒泡的排序过程，执行到哪儿的， 也没有利用上   前面的save函数，也只保存当前一个节点， 整个链表只是重复的输出一个节点 输入的时候， 尾巴会多一个一个没有意义的空节点  总之各种问题，整个代码的大体流程是通顺的，可那个细节上好多问题， 都不知道如何给建议了

user: user-2
content: 建议排序用交换数据部分，交换指针部分比较复杂和难处理呢
user-0 提问: 求助大神

回复:
user: user-1
content: 引用 3 楼 自信男孩 的回复:[quote=引用 1 楼 focuslight 的回复:] 第十行 scanf("%d, &num);  少了一个"  好眼力～[/quote]  有这个眼神的绝对不是老鸟， 老鸟都老眼昏花了

user: user-2
content: 引用 1 楼 focuslight 的回复:第十行 scanf("%d, &num);  少了一个"  好眼力～

user: user-3
content: 还有你的main()写成 int main()

user: user-3
content: 第十行 scanf("%d, &num);  少了一个"
user-0 提问: 删除链表中重复结点和删除数值相同的结点有区别吗？

回复:
user: user-1
content: 引用 3 楼 qq_43731685 的回复:那么链表中判断结点相同是根据结点的数值还是结点指向方向？ 通常来说是指节点的数据内容（也就是你说的数值），一般节点的指向不会同时指向一个，因为节点的指向通常是下一个节点，每一个节点的下一个节点不一样。

user: user-0
content: 引用 2 楼 qybao 的回复:有区别啊，一个是数组，内存是连续的，删除时要移动删除位置之后的元素，也就是吧被删除的位置的空缺补回来；一个是链表，内存空间不一定连续，删除时不用移动删除节点后面的元素，只需要把指针指向下一个节点就可以。这也是算法的不同点。 那么链表中判断结点相同是根据结点的数值还是结点指向方向？

user: user-1
content: 有区别啊，一个是数组，内存是连续的，删除时要移动删除位置之后的元素，也就是吧被删除的位置的空缺补回来；一个是链表，内存空间不一定连续，删除时不用移动删除节点后面的元素，只需要把指针指向下一个节点就可以。这也是算法的不同点。

user: user-2
content: 左手一个100块 右手一个100块 和双手捧着一个100块，很明显不一样
user-0 提问: 请问这一步错在哪里

回复:
user: user-1
content: 我的建议是先把c语言的基本语法学好。 c语言的语法其实很简单，关键词不过5，6十个，背一周差不多也背下来了

user: user-2
content: 你的解法是数学思维，现在的电脑还不能如此智能。 编程语言必须一步一步明确告诉电脑要做什么。 是你告诉电脑，怎么把这道题解出来了。 而不是你列了一个公式，电脑就知道你想干什么了，也许以后的电脑可以。

user: user-3
content: 数学表达式和编程语言的差异建议温习一下，编程有自己的规则，需要再温习一下～

user: user-4
content: 那你不要if就好了

user: user-0
content: 引用 3 楼 user-4的回复:表达式=0，这是神马？把a*x^2+b*x+c=0这行去掉  for example 对于非法输入，LZ自己去处理吧  float a, b, c, d; scanf("%f%f%f", &a,&b,&c); d = b*b - 4*a*c; if (d==0.0) {     printf("x1=x2=%f\n", -b/(2*a)); } else {     printf("x1=%f,x2=%f\n", (-b+sqrt(d))/(2*a), (-b-sqrt(d))/(2*a)); }  谢谢～这个地方题目不是说只考虑两个解的吗

user: user-4
content: 表达式=0，这是神马？把a*x^2+b*x+c=0这行去掉  for example 对于非法输入，LZ自己去处理吧  float a, b, c, d; scanf("%f%f%f", &a,&b,&c); d = b*b - 4*a*c; if (d==0.0) {     printf("x1=x2=%f\n", -b/(2*a)); } else {     printf("x1=%f,x2=%f\n", (-b+sqrt(d))/(2*a), (-b-sqrt(d))/(2*a)); }
user-0 提问: 运行出现ddddddddd不出现数字

回复:
user: user-1
content: void sort(int *a,int n) {     int i,j,max,temp;      for(i=0;i<n-1;i++)     {         max = i;         //for(j = i;j<n;j++)         for(j = i+1; j < n; j++)             if(a[j] > a[max])                 max = j;//把a[i]和a[max]换         if (max != i) {    //需要加一个条件             temp=a[i];             a[i]=a[max];             a[max]=temp;         }     } } 冒泡排序的写法。  供参考～

user: user-0
content: 引用 1 楼 ?Victor.??的回复:d% 这是什么东西  啊 谢谢啊～ 输错了没看出来

user: user-2
content: d% 这是什么东西
user-0 提问: 求详细解答

回复:
user: user-1
content: 如果没有C，D选项的话，没有答案。答案应该是1.  原因是参数是值传递。func中的s和main中的s是相互独立的两个指针。func中 对s的操作不影响main中的s。

user: user-0
content: 引用 7 楼 冷风1023 的回复：结果是a[0]的值啊也就是1. 原因在于s=(int *)malloc(sizeof(int));这行给s赋值的新的地址，所以fun函数就没有起到任何作用。嗯嗯，我明白啦

user: user-0
content: 引用 6 楼 真相重于对错 的回复：引用 4 楼 m0_46236484 的回复:[quote=引用 3 楼 真相重于对错 的回复：]传入指针到函数，函数内改变指针，函数结束后，指针不变。但是函数内部改变指针指向的地址，函数结束后那个地址的内容会改变。是函数的地址吗？还是s的地址 跟函数地址有什么关系？  比如 void test(int a){  a=10; } 那么你这么调用 int x=20; test(x); //这里x还是20；不会是10； 指针也是一样，指针其实就是地址，地址就是一个数。表示的内存的某个区域。 所以在函数里改变指针，对外部一点影响也没有，除非改变那个地址的内存区域的内容。[/quote]我不太懂这题咋分析

user: user-2
content: 结果是a[0]的值啊也就是1. 原因在于s=(int *)malloc(sizeof(int));这行给s赋值的新的地址，所以fun函数就没有起到任何作用。

user: user-3
content: 引用 4 楼 m0_46236484 的回复:引用 3 楼 真相重于对错 的回复：传入指针到函数，函数内改变指针，函数结束后，指针不变。但是函数内部改变指针指向的地址，函数结束后那个地址的内容会改变。是函数的地址吗？还是s的地址 跟函数地址有什么关系？  比如 void test(int a){  a=10; } 那么你这么调用 int x=20; test(x); //这里x还是20；不会是10； 指针也是一样，指针其实就是地址，地址就是一个数。表示的内存的某个区域。 所以在函数里改变指针，对外部一点影响也没有，除非改变那个地址的内存区域的内容。

user: user-4
content: 函数里那个s用malloc重新搞出来的，所以之后操作的不是开始传进来的s

user: user-0
content: 引用 3 楼 真相重于对错 的回复：传入指针到函数，函数内改变指针，函数结束后，指针不变。但是函数内部改变指针指向的地址，函数结束后那个地址的内容会改变。是函数的地址吗？还是s的地址

user: user-3
content: 传入指针到函数，函数内改变指针，函数结束后，指针不变。但是函数内部改变指针指向的地址，函数结束后那个地址的内容会改变。

user: user-0
content: 引用 1 楼 真相重于对错 的回复：A,B肯定都不对，还有答案吗？1是答案 我不明白为什么数组名作为函数参数，执行函数后，为什么s的值没有变？难道是没有return s嘛？

user: user-3
content: A,B肯定都不对，还有答案吗？
user-0 提问: 指针与数组

回复:
user: user-1
content: ​char *p= &str[7]; 指针从这里开始，所以前面的没变

user: user-2
content: if( *p>='a' && *p<'z' ) ​​​(*p)++; (*p)++这是先取引用，然后把引用的值+1。  这两条语句就是让's'变成't'，'t'变成'u'， 'u'变成'v'， 然后 else if( *p == 'z' ) ​​​*p = 'a'; 这两条语句就是让'z'变成'a'；   建议楼主还是看明白代码，代码也不复杂，不难分析。主要的就是4条语句。

user: user-3
content: 建议学会调试
user-0 提问: str[0] = "g"; 请问结果为什么输出@呢？

回复:
user: user-1
content: "g"是字符串。 字符串在C语言中，其本质是地址（特殊的）。虽说是（特殊的）地址，但确确实实就是地址  不太好给你解释  不妨试一试在打印下一行再加一句： printf("%c\n", str); //也许会有些变化。

user: user-2
content: str[0] = "g";  这句相当于把地址给了str[0];因为"g"是字符串，如果改成'g'，就可以输出g了。

user: user-3
content: str[0] = "g"; ----》 g是单个字符，应该用 单引号 'g'。
user-0 提问: 啥区别

回复:
user: user-0
content: 引用 2 楼 自信男孩的回复:这个没有合适之说吧，if和while都是基本的语言语句，根据需要来使用。 好的，我知道了

user: user-1
content: 这个没有合适之说吧，if和while都是基本的语言语句，根据需要来使用。

user: user-2
content: if 是判断， while 是循环。

user: user-3
content: 两个都是c语言基本语句
user-0 提问: 求助C语言

回复:
user: user-1
content: 每一行是一个结构体， 许多行是结构体数组。

user: user-2
content: 赶紧写吧 做出来共享一下， 我们就不用都买excel了， 都用你的， 功德无量啊

user: user-3
content: 真的要实现在表格中输入一个数值，然后求和，挺难的。因为C是控制台的，这个得需要图形编程。以windows为例，需要建立这样N*M个子窗口或控件，然后对每一列或行求和。
user-0 提问: 有大神能给帮我讲下这串Dijkstra算法代码吗

回复:
user: user-0
content: 引用 3 楼 proorck2019的回复:①情景描述 ②算法简介 ③代码实现 ④测试通过 就是要实现输入起点和终点，找最短路径啊

user: user-0
content: 引用 1 楼 寻开心的回复:你能不看代码，描述清楚Dijkstra算法是怎么工作的吗 如果能，代码就能看 如果不能， 解释也白费  这个要现有理论基础的 其实单源的我懂，这个我不太懂后面这块 dist[j] = dist[k] + G->arcs[k][j];                     t = 1;                     while(path[k][t] != 0) {                         path[j][t] = path[k][t];                         t++;                     }                     path[j][t] = k;                     path[j][t+1] = 0; 不知道t是干嘛的

user: user-1
content: ①情景描述 ②算法简介 ③代码实现 ④测试通过

user: user-0
content: 好的 我再仔细的理解下这个算法

user: user-2
content: 你能不看代码，描述清楚Dijkstra算法是怎么工作的吗 如果能，代码就能看 如果不能， 解释也白费  这个要现有理论基础的
user-0 提问: 为什么换了一下顺序就不行啊

回复:
user: user-1
content: 注意逗号是英文的才行，输入中文逗号，根据逗号占用的字符不一样（中文和英文）所以会出现你说的这个问题～

user: user-2
content: 别瞎说！ scanf输入多个数字都时候， 输入12，之后别说中间一个空格，你放100个空格也不影响， 甚至敲上八行回车再输入45也不影响正确的输入 空格，tab和回车都会被scanf自动过滤掉的  int main(){     int a, b, n;     n =scanf("%d,%d", &a, &b);     printf("n:%d, a:%d b:%d\n",n, a, b); // 马上输出你获得到a和b的值，以及scanf正确从键盘获取到有效值得个数n     。。。。

user: user-3
content: 手误空格问题。其实如果对于这种情况有疑问，可以试试Debug，我的编译器是Dev-C++，就是点击一个“√”号来Debug的，Visual应该也没啥区别

user: user-4
content: 楼上说的正解，加了空格，实际没读取到45这个值，相当于b没有被赋值，所以出现了随机大数

user: user-5
content: 你第二次输入，除了, 号还加了空格， 就出问题了， 输入要和scanf设定的格式完全一致

user: user-2
content: scanf后，你跟一句printf，把a和b输出出来，看看是不是你输入的那两个值 为避免这个问题 scanf("%d%d", &a, &b); 中间不要逗号，输入的时候也12 45 这样，数字之间用空格分开

user: user-2
content: 你第二次输入的逗号是中文的吧
user-0 提问: 数组名在内存中到底是个什么？

回复:
user: user-1
content: 汇编里没有变量名这个概念

user: user-2
content: 数组名在内存里就是一段内存的首地址，数组不能做左值。 定义一个数组，内存就会分配一段内存，而首地址就是用数组名标识的。 就是用数组名能找到申请的这块地址

user: user-3
content: a不是地址常量 也不相当于地址常量  a表示的是数组占用的内存块 数组占用的内存不会变 a也不会变

user: user-3
content: 示意图画错了 不存在一个 a存储一块内存的地址 a本身表示一块每次

user: user-4
content: 数组确实也是一种数据类型，但是数组算是二等公民，作为函数参数传递时会退化成地址，还不能作为函数的返回值。数组名其实是一个符号，编译后存在符号表中，是定死的不能被改变

user: user-5
content: 这么理解 char a[]="hello"; char *b=a; 显然a不能用于左值，但是可以用于右值。

user: user-6
content: a相当于数组首地址的常量引用，所以改不了 b是变量，内存信息可以改（内存信息也是个地址，是数组的首地址）

user: user-0
content: 引用 2 楼 真相重于对错 的回复:a 在栈里啊，b不过是指向栈内数据的一个指针。 建议，真要了解这一切，最好把汇编了解一下。 谢谢！有空时会详细看汇编的。

user: user-0
content: 引用 1 楼 寻开心 的回复:a就是数组， b就是指针 两个不同的变量啊  他们的地址都不可以改，他们的值都可以改（const的例外）这个能理解吧 数组有个特殊的地方， 他的名字和他的地址，是同一个东西， 你printf 指定%p， 传参a和&a，结果都一样 它就是特殊， 不能改！！！  b的地址你同样也改不了，改的就是b的值，以及指向的内容 可以b到值你能改，&b 和 b他就不是一个东西， 你printf一下就看到了  好像明白了。  数组名a不是个指针常量，它直接就是数组这种类型的变量。  至于a == &a ,可能是编译器内部自己把a翻译成&a对待了。

user: user-7
content: a 在栈里啊，b不过是指向栈内数据的一个指针。 建议，真要了解这一切，最好把汇编了解一下。

user: user-8
content: a就是数组， b就是指针 两个不同的变量啊  他们的地址都不可以改，他们的值都可以改（const的例外）这个能理解吧 数组有个特殊的地方， 他的名字和他的地址，是同一个东西， 你printf 指定%p， 传参a和&a，结果都一样 它就是特殊， 不能改！！！  b的地址你同样也改不了，改的就是b的值，以及指向的内容 可以b到值你能改，&b 和 b他就不是一个东西， 你printf一下就看到了
user-0 提问: 菜鸟请教，下面C代码什么意思？

回复:
user: user-1
content: 宏定义，36u，这儿的u是指unsigned，即无符号数；

user: user-2
content: C语言不支持下划线 像123_i128这样的看起来就舒服了

user: user-3
content: 你看看常量定义， 字面量 float类型的常量       1.0f double类型的常量   1.0lf，  long类型的常量       1L，   嘿嘿， 自己猜36u，u表示啥

user: user-4
content: 引用 1 楼 寻开心的回复:#define 就是个替换 后面的代码，看到 ANTCDATALEN 都换成(36u)就对了  const int32_t i32TempVir[ANTCDATALEN][AVIRDATALEN] = 就是 const int32_t i32TempVir[(36u)][(71u)] = ..... 36u, 71u 是什么？

user: user-3
content: #define 就是个替换 后面的代码，看到 ANTCDATALEN 都换成(36u)就对了  const int32_t i32TempVir[ANTCDATALEN][AVIRDATALEN] = 就是 const int32_t i32TempVir[(36u)][(71u)] = .....
user-0 提问: 求助，麻烦帮我看一下哪里错了

回复:
user: user-1
content: int ReadScore(int income[], long num[])  {    int I = 0;             do{          i++;         printf("Input person's ID and income:");          scanf("%d%ld", &num[i], &income[i]);    }   while( I<N && num[i]>0 /*&& ReadScore[i] >= 0*/);    // ReadScore[I] 没有这个数组， 不知道你要表达什么    return i;          // 这个I还是有可能是N的情况从while退出，那么返回这个i也不应该。 还是有潜在的风险的 }  int LinSearch(long num[], long x, int n)  { int  i;   for (i=0; i<=n; i++)                  {	 if (num[i] ==  x)  return (i);  } return (-1);                            }

user: user-2
content: 而且数组ReadScore[i]你都没有定义，应该是income[i]打错了吧 还有下面一个函数num[i]=x是什么神仙

user: user-2
content: ReadScore里面i没有初始化
user-0 提问: STM32F407ZGT6使用SPI1与MAX31865通信时异常，一直读到0XFF！

回复:
user: user-1
content: 解决了嘛？我也遇到同样问题了  能否交流一下

user: user-2
content: C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-3
content: 你的SPI1模式配置错误了，要么模式0：低电平和第一个跳变沿采样   模式3：高电平和第二个跳变沿采样。你搞的是低电平和第二个跳变沿采样，混用了
user-0 提问: 这样的结构声明错在哪里？

回复:
user: user-1
content: typedef struct film *Item;//为什么不能这样定义？ //struct film* Item; Item = &f; 这儿的Item是类型别名，是struct film *的别名。不是变量，因此Item = &f；是不对的。相当于int = &f一样。

user: user-2
content: typedef struct film *Item;//为什么不能这样定义？当然可以  问题是这个Item是一个类型呀 类型 = &f 当然错

user: user-3
content: typedef struct film *Item;//为什么不能这样定义？' 答：是可以这么定义的。但是这条语句的作用是，是将Item重定义成可以替换struct film * 的关键字. 使用时应该这么使用：    #include <stdio.h> struct film { 	char title[10]; 	int rating; }f; typedef struct film *Item;//为什么不能这样定义？ //struct film* Item; Item  pItem = NULL; int main() { 	pItem = &f; 	scanf("%d", &(pItem->rating)); 	printf("%d", pItem->rating); 	return 0; }
user-0 提问: 不懂

回复:
user: user-0
content: 谢谢，我知道了

user: user-1
content: while (*p != '\0')             {                 *p = *(p + 1);                 p++;             } 这个删除空白字符的方法是后面的字符向前覆盖。即后面的字符向前移动一个字符。

user: user-2
content: 不用改吧，我认为原函数写的挺清晰的  void d_blank(char* st) {     char* p;       while (*st != '\0')     {         p = st;         if (*p == ' ')         {             while (*p != '\0')             {                 *p = *(p + 1);                 p++;             }         }         st++;     } }  之所以加进来一个临时指针p，是因为在找到空格时，p已经增量到字符串末尾了。 所以每次循环都要重新赋值下p，在循环尾增量st 然后再检查下一个字符  无论是多个连续空白，还是间隔的空白，都能过滤掉。

user: user-0
content: 引用 2 楼 m0_46108109的回复:假设\0是整个字符串的结尾，且字符串中只有一个\0  当*p == ' '时， 不加while (*p != '\0') *p = *(p + 1); 只是把下一个字符，替换为了空格，下一个字符还在原位置。              while (*p != '\0')             {                 *p = *(p + 1);                 p++;             } 这样处理，就等于把空格之后的所有字符，都向前挪动一格了。 那如果不确定空白字符的数量，该怎么改？

user: user-2
content: 假设\0是整个字符串的结尾，且字符串中只有一个\0  当*p == ' '时， 不加while (*p != '\0') *p = *(p + 1); 只是把下一个字符，替换为了空格，下一个字符还在原位置。              while (*p != '\0')             {                 *p = *(p + 1);                 p++;             } 这样处理，就等于把空格之后的所有字符，都向前挪动一格了。

user: user-0
content: 如果是中间有两个空格，该怎么改？
user-0 提问: c语言问题 fatal error LNK1169: 找到一个或多个多重定义的符号

回复:
user: user-0
content: 引用 4 楼 ljn20010724 的回复:[quote=引用 2 楼 user-2 的回复:]  用vs添加类向导来添加吧。他会自动生成对应.h .cpp  你这个包含.cpp 应该不正确。一般都是include .h 您好，请问就是建立顺序表这种的话是一定要建立头文件对吗？所以我要用类向导来创建一个头文件，然后来链接他们？如果有理解偏差麻烦请见谅，我刚学，谢谢[/quote] 也就是说我的这两个文件是“地位不平等”的吗？我的意思是现在因为我这两个文件都是在源文件下创立的，我要把要引用的文件放在头文件下吗？

user: user-0
content: 引用 3 楼 m0_46108109 的回复:#include "sqlist.cpp"  这句话的意思是，把这个文件也包含了进来。 对于变量是可以的，好像结构也可以。 因为每个变量都可以是文件域 就相当于那个cpp文件不起任何作用。  但是函数不行，函数定义了，就是全局的，即使你没有在另外一个文件中声明 实际上也能在另外一个文件中使用。（这点我脑补的）  这就是文件作用域和外部链接内部链接的区别。 您好，我还是不是很清楚您讲的，可以请您告诉我怎样修改，或许我可以更好的理解，谢谢了

user: user-0
content: 引用 2 楼 user-2 的回复: 用vs添加类向导来添加吧。他会自动生成对应.h .cpp  你这个包含.cpp 应该不正确。一般都是include .h 您好，请问就是建立顺序表这种的话是一定要建立头文件对吗？所以我要用类向导来创建一个头文件，然后来链接他们？如果有理解偏差麻烦请见谅，我刚学，谢谢

user: user-0
content: 求大神求解为什么会出现这样的报错！谢谢了！

user: user-1
content: #include "sqlist.cpp"  这句话的意思是，把这个文件也包含了进来。 对于变量是可以的，好像结构也可以。 因为每个变量都可以是文件域 就相当于那个cpp文件不起任何作用。  但是函数不行，函数定义了，就是全局的，即使你没有在另外一个文件中声明 实际上也能在另外一个文件中使用。（这点我脑补的）  这就是文件作用域和外部链接内部链接的区别。

user: user-2
content: 用vs添加类向导来添加吧。他会自动生成对应.h .cpp  你这个包含.cpp 应该不正确。一般都是include .h

user: user-1
content: 这么理解，当所有内容都在一个文件里，那么就不需要声明，编译器遍历一下文件，引用的时候直接链接定义就可以了。但是把所有内容都放在一个文件里，不方便开发。所以有了把不同内容放在不同源文件里的开发模式。同样，这些内容完全也可以不使用声明，编译器只需要遍历一下所有文件，在引用的时候直接调用定义就可以了。但是这样设计必须所有的内容全部写完，才可以编译。如果两个人合作开发的话，一个人必须等待另一个人完成工作，才能完成自己的内容。所以有了声明的设计，声明只是声明了数据类型，例如函数的声明其实只是声明了一个函数指针。大家都包含了一个需要用到的声明文件，就可以不必等其他人定义完，才能工作。这么做开发小工程可以，但是多人开发大工程就会出现问题。a负责一个源文件，他有自己的开发习惯，他声明了一个全局变量。b在自己的文件里也使用了一个同名的全局变量。两个人都不肯放弃自己的习惯。所以有了文件作用域的设计。ab在自己文件中定义的全局变量具有文件作用域，只在自己的文件中可见。那么又如何使ab都可见一个全局变量呢，那就是引用关键字，引用具有外部链接，a和b同时引用了一个同名变量，然后都定义了就会发生重定义错误(这个是我脑补的，一会儿试验一下)。也就是说，没有引用声明的，都是内部链接，具有文件域。引用声明的具有外部链接是全局变量。函数则不同，我想之所以与变量不一致，可能是因为链接的关系。c的编译器和连接器是分成这两部分完成编译的。单独编译a和b同名函数没有任何问题，函数就是个函数指针，也是个变量。但是要链接a和b的同名函数就有问题了，连接器不知道应该链接哪一个函数。当然函数也可以设计成具有文件域，需要在另外文件中使用的时候，在另外文件中引用这个函数。但是c的基本功能就是通过函数库来实现的，假设你开发了一个函数，和函数库中的函数重名，第三方同时使用你的函数和同名函数库中的其他函数时，链接器不知道应该链接哪个。这个是c的缺点，你会发现虽然标准委员会建议淘汰旧函数，使用新函数，即便新旧函数的原型完全一样，新函数也会更名，而不会重载旧函数，就是因为函数都是全局的，不能重复定义。
user-0 提问: 算法萌新求教，求时间复杂度

回复:
user: user-1
content: i=1，j循环1次，i=2，j循环2次，i=3，j循环3次，。。。i=n，j循环n次， 所以一共循环 1+2+3+...+n=n*(n+1)/2 所以时间复杂度是n平方，即O(n^2)

user: user-0
content: 引用 1 楼 user-1的回复:i=1，j循环1次，i=2，j循环2次，i=3，j循环3次，。。。i=n，j循环n次， 所以一共循环 1+2+3+...+n=n*(n+1)/2 所以时间复杂度是n平方，即O(n^2) 大佬你真牛逼，我关注你了
user-0 提问: 形参中的数组名是其实是假数组？ 

回复:
user: user-1
content: 形参数组名，编译器就是当成指针处理了。其实也是指针。

user: user-2
content: 数组确实有些特殊   数组名是数据的地址、指针    &数组名， 还是它  这个有点儿像函数指针的使用方法  int (*pFunc)(int);      (*pFunc)(1)  和  pFunc(1)是一样的  都是属于语法的规定

user: user-3
content: 数组名就是指针，例如字符串char*

user: user-4
content: 有一点不同 我看的书里这样说 应该这样写 a = dates2;  写成 a = &dates2; 或 a = &dates2[0]; 都是不专业的

user: user-2
content: 哪怕你参数你写成func(const int a);  函数里面你还可以强制类型转换成非cosnt类型继续改， * (int *)(&a) = 3;  这个和 const char * = "abc";  不能改字符串的值不一样， abc是真的分配在只读内存的，你改不了 函数传参都在系统栈里面，都是可读可写的， 所以随便改吧， 只要你知道自己明确的目的是什么

user: user-2
content: 传参的时候，记住————永远传递的是值！！！ 哪怕是指针， 传递进来的也是指针的值， 不是指针指向的内容；和传递一个普通的类型变量一样，都是值。  这个值，被放到了系统的栈里面， 成为函数体里面的参数变量了， 从此和调用它的变量毫不相干 既然毫不相干，还是个变量，那么你想怎么改怎么改， 反正也跑不出函数这个范围， 对函数外面毫无影响

user: user-2
content: 恭喜你， 终于得道了！    传参的时候，就是一个指针， 根本就不是整个数组进来的，哪怕你参数写成func (int arry[10] ); 函数里面sizeof（arry）返回的依然是指针的大小  作为一个指针， 函数只知道它的指针类型， 不知道它对应的有效数据后面有多长的， 所以后面还必须带一个整数来告知

user: user-5
content: 对了即使是(int*)dates也是存在警告的

user: user-4
content: 是的。写成a[]，只是为了方便理解。 而且，似乎 根本就没有数组，数组名就是一个不可修改的指针。 short dates[SIZE] = {23,24,25,26}; short* p=dates； 通过p就可以操作数组。

user: user-5
content: 11点半了你的帖子居然能出来  void main警告  此处应当是有警告的，其实编译器更希望你传&dates
user-0 提问: 为什么要typedef一个结构，为什么不直接用struct

回复:
user: user-1
content: typedef　struct　film　Item; struct　film　Item; 这两条语句差距很大的。第一个是别名一个结构体类型。Item不是变量而是一个类型。即struct film的类型  第二个语句是定义的结构体变量，Item是变量。

user: user-2
content: 懒，那是开个玩笑  方便修改是真的，而且也可以定义多种类型的别名，比如item，*pitem

user: user-3
content: 楼上的观点是正确的，就是为了偷懒，而且也不容易出错

user: user-4
content: typedef 是定义别名，相当于Item就代表struct film，之后再定义类似的变量，就可以直接用Item来定义了，比如Item data。

user: user-5
content: 方便啊，少写几个字母
user-0 提问: 不能正确执行scanf（）函数，如何解决

回复:
user: user-1
content: scanf("%c", &answer); 这条语句前加一个getchar();吧 因为这条语句是%c，正好匹配输入缓存里的'\n'。这个'\n'是上一个输入留下的。

user: user-2
content: for( ; ; )         {                 printf("\n Enter a value:");                 scanf("%lf", &value);                 total += value;                 ++count;                  printf("\n Do you want to enter another value?(Y or N):");                 getchar();                 scanf("%c", &answer);                  if(tolower(answer) == 'n')                         break;         }  加一个getchar()，大概原因是第一个scanf存在换行符，恰好用在了第二个scanf上，先用getchar()把换行符吸收了，就可以了
user-0 提问: 新手求教double和float

回复:
user: user-1
content: 简单说 float可以表示 0.0000000 那么 double可以表示 0.00000000000000(只是比喻，具体取值范围请看书)

user: user-2
content: sizeof 一个是单精度，一个是双精度 浮点运算消耗时间，一般的数值运算，小数点后面太多的位数没有意义。 C的设计原则是效率，所以在不需要双精度的地方用单精度。 但是为了支持数学运算，好像还有llf，不知道实现一样不一样。
user-0 提问: C语言快速排序用数组实现交换swap为什么不能用数组类型，一定要用指针类型？可以使用数组类型吗？

回复:
user: user-0
content: 打错一个字，最后一句话是:那传入值:图一又该怎么解释呢？

user: user-0
content: 传入值:图一: 传入值:图二: 传入地址:图一: 传入地址:图二:  果然，我现在又举了几个例子，发现如果是传入数字，swap只改变形参的值，不改变实参的值。但如果是传入地址，那么swap通过交换(改变)形参的地址，从而交换(改变)实参的地址，从而改变实参的值。   但是我不理解chxchxkkk三楼说的，传入变量在函数退出时，变量值也清空了，是C语言中在函数里面定义的局部变量确实会在函数结束之后被释放掉这个意思吗？     那传入值:图一有该怎么解释呢？

user: user-1
content: 数组类型作为参数和指针作为参数是同等的效果，数组类型作为参数其实就是指针作为参数。  swap用指针的原因是修改的是调用swap的实参，如果用普通变量，那么根据参数传递是值传递，形参是局部变量，交换了形参只是交换了局部变量，对于实参没做任何修改。

user: user-2
content: 传入变量在函数退出时，变量值也清空了，所以要传入指针才能修改主函数里的变量值

user: user-3
content: 嗯嗯，打错了。  传入数字，是在swap函数内创建了x,y的副本a,b，交换的是被调函数内的创建的副本a,b的值，无法作用于实参。  对于传入的实参x，y没有影响。因为x,y是在main函数内创建的，所以它们要等到整个程序结束的时候才会释放。

user: user-0
content: 哦哦，明白了，但是这句话“对传入的实参a，b没有影响”应该是"对于传入的实参x,y没有影响"吧，回答了我就结贴了。

user: user-3
content: 果然，我现在又举了几个例子，发现如果是传入数字，swap只改变形参的值，不改变实参的值。但如果是传入地址，那么swap通过交换(改变)形参的地址，从而交换(改变)实参的地址，从而改变实参的值。[/quote]  传入数字，是在swap函数内创建了a,b的副本，交换的是被调函数内的创建的副本a,b的值，无法作用于实参。更不是说改变了形参的值，“形参”就是形式参数，是用来表示传入实参的类型的，是拿来看的，没有具体的值。 在你的这个函数中，通过传入两个实参的地址，直接交换了实参的值，并不是说通过交换实参的地址，从而改变实参的值。  但是我不理解chxchxkkk三楼说的，传入变量在函数退出时，变量值也清空了，是C语言中在函数里面定义的局部变量确实会在函数结束之后被释放掉这个意思吗？     那传入值:图一有该怎么解释呢？[/quote] 函数结束之后函数内创建的局部变量会被释放，也就是创建的副本a,b被释放掉了，对传入的实参a，b没有影响，所以你输出的交换后的值还是5，8。因为a,b是在main函数内创建的，所以它们要等到整个程序结束的时候才会释放。

user: user-4
content: 传入指针是修改的是a[i]和a[j]的值，传入数组时只是传进去两个数字，swap里的修改不会影响a[i]a[j]的值，只是函数里面的形式参数p  q被改变。
user-0 提问: 哪位好心人帮我一下，解释一下这道题

回复:
user: user-0
content: 引用 1 楼 后入赵丽颖的回复:字母通过改变ASCII值变化成其它字母 谢谢一楼的同学

user: user-0
content: 引用 3 楼 初学小菜的回复:就是字符的加减，写的复杂了些而已 问题解决，谢谢大家

user: user-0
content: 引用 3 楼 初学小菜的回复:就是字符的加减，写的复杂了些而已 谢谢初学小菜，

user: user-1
content: 就是字符的加减，写的复杂了些而已

user: user-1
content: 直接强制转化就行呀 不需要其他操作，比如一个int a=1;要转化成char ch; 直接ch=a+96就可以

user: user-2
content: 字母通过改变ASCII值变化成其它字母
user-0 提问: C语言用函数实现在n个整数中找到最大的k个数

回复:
user: user-1
content: 排序然后顺序去取就可以了。排序方法，建议楼主从网上搜一下：冒泡，选择，快排都可以的。

user: user-2
content: 排序前是个数组，排序后也是个数组，操作数组的能力不够强啊。

user: user-3
content: 参考以下帖子吧，这种问题，有不少人问过了 https://bbs.csdn.net/topics/395884394

user: user-4
content: 这孩子没救了， 怎么排完序还不会了呢  哪怕错了，你也把自己代码贴出来吧 看代码说话

user: user-5
content: 引用 3 楼 weixin_46476023 的回复:[quote=引用 1 楼 與蘤舊縐的回复:]排序之后取你需要的数不就行了  初学的话排序一般就冒泡了 就是排完序不会取了[/quote]  从大到小取k个  一个for循环，i=k;i>0;i--不就行了

user: user-0
content: 引用 1 楼 與蘤舊縐的回复:排序之后取你需要的数不就行了  初学的话排序一般就冒泡了 就是排完序不会取了😭😭

user: user-5
content: 你也可以找多次最大值，每次找出后把最大的删了

user: user-5
content: 排序之后取你需要的数不就行了  初学的话排序一般就冒泡了
user-0 提问: {SDOI2014]数数：段错误

回复:
user: user-1
content: sprintf(N[j-1],"%d",j); 这里似乎得用个工具函数，ltoa

user: user-2
content: 10^9+7 你认为这样定义的数是多大？^运算是按位异或 10的二进制是.1010 ，9的二进制 是1001，二者异或是0011就是3 ，3+7 等于10

user: user-3
content: 你这程序什么输入？ 怎么溢出的？

user: user-3
content: 10=8+2    1010 9=8+1 1001 --------- 0011=3  10^9+7 = 10 10*200*2 = 4000  = 4kB  看上去堆栈溢出的可能性不太大。 帮你运行一下。

user: user-1
content: char s[200][10^9+7];把这儿改成11试试，是不是没保存\0
user-0 提问: 测试函数运行时间

回复:
user: user-0
content: 多谢！我已经找到方法了 用for循环 //循环多次调用 #define MAXK 1e7 for(i = 1;  i <= MAXK;  i++)

user: user-0
content: 引用 2 楼 初学小菜 的回复：不是无法显示，是你这个程序复杂度太低，算的太快了， 你在计时的中间可以加一下这个 k=1000000000； while(k){ 	k--; }  在跑一下就有时间啦我的目的是：想要测试有秦九昭和没有秦九昭算法，函数的运算速度

user: user-1
content: 不是无法显示，是你这个程序复杂度太低，算的太快了， 你在计时的中间可以加一下这个 k=1000000000； while(k){ 	k--; }  在跑一下就有时间啦

user: user-0
content: 为什么无法出现测试时间？
user-0 提问: 超级简单问题求助

回复:
user: user-1
content: 我只想说，现在初中生的信息课都能做这个题 这个和专业真实屁关系都没有的，也和学业基础没啥关系  回去看书吧  你知道大学和高中初中小学相比最大的区别在哪儿吗？ 就是要开始自学了， 老师不会再带你一步一步的做题了， 大学就是要培养自学能力的，这个从大一进来的授课方式上就不同了 以前老师给你讲道理，给你板书一步步的解题，甚至留作业批改， 还回过头来逐个辅导 这个事儿，从进入大学的门就没啦， 没啦， 没啦  这是步入大学必须转变的东西 大学只教你知识框架，告诉你什么类型的题目用什么公式和方法解， 不告诉你为什了么 不再带你一步步的计算，告诉你个最终结果剩下的自己玩儿去吧  从这个课程上早点体验到这个转变，挺好

user: user-2
content: 必须学，又不学，就很怪。算了吧，没人帮你，天道酬勤。加油，楼主。 只有自强之人才更容易为他人所愿意帮助

user: user-0
content: 不是不做 我是真的不会   我的专业和这个无关 但必须学  这是我第一次接触c语言 上了2节课老师就让做这个 我是真的不会

user: user-3
content: 这么简单题都不做，那就不要学了。
user-0 提问: 变量顺序问题？

回复:
user: user-1
content: 放在外面，每次结果不对的时候sn也可能被累加了，循环到对的那次，sn已经大于i了

user: user-2
content: 引用 3 楼 qq_20466297 的回复:[quote=引用 2 楼 真相重于对错的回复:]在for内部定义，每次循环都是0 在for外边定义，结果会保存 百度一下变量的生命周期 为什么Sn在外对结果什么也不输出？[/quote] 学会调试， f10 单步执行   f11 单步执行，遇到子函数就进入并且继续单步执行。

user: user-0
content: 引用 2 楼 真相重于对错的回复:在for内部定义，每次循环都是0 在for外边定义，结果会保存 百度一下变量的生命周期 为什么Sn在外对结果什么也不输出？

user: user-2
content: 在for内部定义，每次循环都是0 在for外边定义，结果会保存 百度一下变量的生命周期

user: user-3
content: 贴一下代码好吗 看不清呀
user-0 提问: 结构体中如何使用数组

回复:
user: user-1
content: 这里有两个概念： 1、int num跟 char num[N]的区别，前者存的是整形数据，后者存的是字符串数据 2、看你需求，这里可以使用int num也可以使用char num[N]，只要你后续函数里根据不同类型进行处理就好了。

user: user-2
content: 可以使用int，只要以后把这个成员按int处理就可以。 因为像邮政编码什么的，一般当字符串处理。

user: user-0
content: 求大佬看一下
user-0 提问: 求100以内的偶数的和，为什么出现了多个数值，但最终结果是对的

回复:
user: user-1
content: 你把 printf ( "%d\n" , sum );  拿出来 放在for循环外面试试

user: user-2
content: for ( i = 1; i <= 100; i++ ) { if ( i%2==0 ) { sum = sum + i; } printf ( "%d\n" , sum );   } 看一下这段代码，你的printf是在for循环里面的，也就是说，每一次偶数相加你都输出了一遍sum 如果只是想要最后的结果，把这个printf放到外面一层就可以了！ #include <stdio.h>  void main ()  { int sum = 0; int i; for ( i = 1; i <= 100; i++ ) { if ( i%2==0 ) { sum = sum + i; } } 	printf ( "%d\n" , sum );  }
user-0 提问: 大佬们能不能看一下这个怎么改了，整了一天了。。。

回复:
user: user-1
content: 代码没排版，所以没怎么细看 除了2L说的代码书写问题，处理逻辑上也有一些问题 比如case 2后面没有break

user: user-2
content: 你这个问题应该很好找，排除法依次排除即可，我一分钟不到就找到了。。

user: user-2
content: 你的排版太乱了，这样影响你查看BUG的，2个地方，一个是main后面多了一个;，一个是printf_shezhi少了后半截花括号

user: user-0
content: 我用的编译器是vc++6.0，老是出这两个错误 error C2447: missing function header (old-style formal list?) fatal error C1004: unexpected end of file found
user-0 提问: C语言while的使用

回复:
user: user-1
content: 前后都不执行了。只会一直执行while (1) ;这也是死循环。  建议楼主自己写个程序测试一下～

user: user-2
content: 只有几行代码，其实你可以把代码写出来运行一下。

user: user-3
content: 这是典型的死循环，这个程序执行过程是这样的： 语句①--->语句②--->while(1) ; 到这里，一直没有跳出while循环，一直在执行一个空的语句 所以while循环下面的语句③④都没有执行，而上面的语句①②只执行了一次。

user: user-0
content: 这是一个按键控制蜂鸣器的代码，按k1蜂鸣器响，按k2蜂鸣器就不响，但是如果我一直按着k2不送开的话，按上面说的：那代码就一直处在while（！k2）；的位置，也就不会往下运行，蜂鸣器也还是响的，可我不管是长按k2还是短按，蜂鸣器都不再响

user: user-0
content: #include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16;	  //对数据类型进行声明定义typedef unsigned char u8; sbit k1=P3^1; sbit k2=P3^0; sbit beep=P1^5; u8 start=0; /******************************************************************************** 函 数 名         : delay* 函数功能		   : 延时函数，i=1时，大约延时10us*******************************************************************************/ void delay(u16 i) {	 while(i--);	 } void sound() {	   u8 i=100;	   while(i--) 	{		beep=~beep; 		delay(100);		} } void keypros() { 	if(k1==0)			 //开始 	{	 	delay(1000);	 	if(k1==0)	 	{ 			start=1; 	} 		while(!k1);	 } 	if(k2==0)			  //停止 	{ 		delay(1000); 		if(k2==0) 		{			start=0;				}	 	while(!k2); 	} }/******************************************************************************** 函 数 名       : main* 函数功能		 : 主函数* 输    入       : 无* 输    出    	 : 无*******************************************************************************/ void main() { 		while(1) 	{	 	keypros();	 	if(start==1)	 	{			sound();		} 		else		{			beep=1;		}			 }		 }

user: user-4
content: 不会重复执行while前面的语句 展开你就懂了 while (1) {      ; }  会一直执行while里面的空语句，也就是执行完语句1和语句2，就停在while(1)上了，什么都不做。

user: user-5
content: 是的，一直在死循环中
user-0 提问: 为啥我这goto语句不执行啊

回复:
user: user-1
content: fflush(stdin);不是针对所有的编译器都有效的，因为对于一些编译器这个函数操作stdin是未定义行为。  建议用getchar();替换fflush();  未执行goto，是因为执行goto语句的条件没满足。很有可能fflush(stdin)没有起作用，建议用getchar();  另外，command是char类型，"yes"是字符串不是字符。这个是一个bug。  #include <stdio.h>  int main () {     double num1,num2;     char character,command;     double value; lable:     printf("请输入第一个数:\n");     scanf("%lf",&num1);     printf("请输入第二个数:\n");     scanf("%lf",&num2);     printf("请输入计算符号\n");     //fflush(stdin);     getchar();    //for '\n'     scanf("%c",&character);     getchar();    //for '\n'     switch(character)     {         case'+':             value=num1+num2;             printf("两式相加结果为：%lf\n",value);             break;         case'-':             value=num1-num2;             printf("两式相减结果为：%lf\n",value);             break;         case'*':             value=num1*num2;             printf("两式相乘结果为：%lf\n",value);             break;         case'/':              value=num1/num2;             printf("两式相除的结果为%lf\n",value);                break;      }     printf("是否还要继续进行运算，请在下方输入y/n\n");     fflush(stdin);     scanf("%c",&command);     getchar();   //for '\n'      //if(command=='yes')     if(command=='y')     {         //fflush(stdin);          goto lable;      }     else         printf("请关闭程序\n");      return 0; }  供参考～

user: user-2
content: 因为判断失败，command只取了'y'。scanf("%c",&command);
user-0 提问: C语言数组里既有汉字又有数字，怎么比较数组内容是否相同

回复:
user: user-1
content: char * p1 = "不明白你要比较什么"; char p2[] = "不明白你要比较什么"; size_t len = p1_len = strlen(p1); strncmp(p1, p2, p1_len) == 0;  这样就行啊  你写那些循环搞毛线

user: user-0
content: 引用 2 楼 u012538549的回复:直接strncmp就可以比较    汉字也是由二进制组成的  一个汉字占用多个字节，每个字节高位都是1   没有冲突 我用这个方法比较时，完全找不到相同元素，count一直为0,代码如下 for(j=0;j<160;j++)      { 	           fgets(StrLine2[j],1024,fp2);  //读取一行          count=0；          for(i=0;i<110;i++) 		 { 		 	fgets(StrLine1[i],1024,fp1); 			if(strncmp(StrLine2[j],StrLine1[i],3)==0) 				count++;          } 这个是什么原因

user: user-1
content: 直接strncmp就可以比较    汉字也是由二进制组成的  一个汉字占用多个字节，每个字节高位都是1   没有冲突

user: user-0
content: 用什么方法可以比较类似这样的数组

user: user-0
content: 引用 4 楼 user-3的回复:[quote=引用 3 楼 Lgoloria 的回复:] [quote=引用 2 楼 u012538549的回复:]直接strncmp就可以比较    汉字也是由二进制组成的  一个汉字占用多个字节，每个字节高位都是1   没有冲突 我用这个方法比较时，完全找不到相同元素，count一直为0,代码如下 for(j=0;j<160;j++)      { 	           fgets(StrLine2[j],1024,fp2);  //读取一行          count=0；          for(i=0;i<110;i++) 		 { 		 	fgets(StrLine1[i],1024,fp1); 			if(strncmp(StrLine2[j],StrLine1[i],3)==0) 				count++;          } 这个是什么原因 [/quote]fp1 需要重置  [/quote] 后面跟上rewind(fp1)还是没效果……

user: user-2
content: 用strcmp/strncmp/memcmp都可以比较呢？  调用这些函数也是一个字符一个字符的比较。

user: user-3
content: 引用 3 楼 Lgoloria 的回复:[quote=引用 2 楼 u012538549的回复:]直接strncmp就可以比较    汉字也是由二进制组成的  一个汉字占用多个字节，每个字节高位都是1   没有冲突 我用这个方法比较时，完全找不到相同元素，count一直为0,代码如下 for(j=0;j<160;j++)      { 	           fgets(StrLine2[j],1024,fp2);  //读取一行          count=0；          for(i=0;i<110;i++) 		 { 		 	fgets(StrLine1[i],1024,fp1); 			if(strncmp(StrLine2[j],StrLine1[i],3)==0) 				count++;          } 这个是什么原因 [/quote]fp1 需要重置
user-0 提问: 求大神解答为什么会出现这样的错误：LINK : fatal error LNK1104: 无法打开文件“stdio.lib”

回复:
user: user-0
content: 还有这个错误：error LNK2019: 无法解析的外部符号 _main，该符号在函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中被引用

user: user-0
content: 补充：用的编译器是VS 2017
user-0 提问: 关于c语言char型与int型在unsigned条件下的输出值问题。

回复:
user: user-0
content: 弄懂了！！谢谢各位这么细心帮我找出错误！

user: user-1
content: printf 函数是不定参数的，即函数参数没有定义类型， 而且参数类型不固定，而是根据  %d  %s ... 来分析后面的每个参数长度。 所以  如你的写法问题很大  ，  windows  vc，编译器有很大容错性（当然也不是好事 ）,  linux 可能 错的更离谱请强转。 %d  对应 int ,  所以这里要强转 (int)b,    另外：  unsigned int  b = -1  ,  和 int b = -1,  在内存中是一样的。  既然是%d， 都认为是int , 都是 -1

user: user-2
content: while(++a>0) { b=a; }	 这句到什么时候可以退出循环呢？ 显然是a=0；那么此时b是多少呢， b是0xFF也就是255  至于printf的输出的问题，和itoa都问题，其实都是一个函数的参数过程当中的类型转换的问题 传参都是传递值， 当参数和类型不匹配的时候，怎么处理呢？ 那就是类型转换  无论a是unsigned char还是unsigned int a-1 这个减法本身就是整数减法（ 因为1是整数）， a是0，减法的结果就是-1， 这就没有什么好说的了  差异出现在unsgined char b和unsigned int b上了 前者b 是0xff，后者是0xffffffff 传参的时候，从unsigned char 转换成int的时候， int值就是255 而从unsigned int 到int的时候， 实际上是越界了， int越界的处理结果是自动回绕，结果依然是0xFFFFFFFF的二进制  不用想到那么复杂，最简单的测试如下：    unsigned char bc = 0xff;     unsigned int  bn = 0xffffffff;     int ic = bc;     int in = bn;     printf("%d %d\n", ic, in);

user: user-3
content: 用%u，或者这么理解。 因为char虽然是一字节，但是占用的是int 字节。 当用%d显示的时候，char的高位是0，所以翻译成255了

user: user-4
content: %d是输出一个有符号的10进制int类型 %u,输出一个10进制的无符号数 所以你的输出格式有问题0XFFFFFFFF就是%d就是-1

user: user-5
content: unsigned int类型的数据应该用%u输出，如果用%d输出，那么会按照有符号数格式输出。  unsigned char类型的数据用%d输出是属于类型提升，a = -1;即对于unsigned char来讲，是255.因为是无符号数。255提升int类型，即255.

user: user-5
content: unsigned int类型的数据应该用%u输出，如果用%d输出，那么会按照有符号数格式输出。  unsigned char类型的数据用%d输出是属于类型提升，a = -1;即对于unsigned char来讲，是255.因为是无符号数。255提升int类型，即255.
user-0 提问: 请问c++中*(a+2)[2]如何理解

回复:
user: user-1
content: 这个表达式等同于取a+4的地址，然后解引用。

user: user-2
content: 好像是指针数组的*a[4]

user: user-3
content: 看不懂就拆开
user-0 提问: for还有这样的用法？

回复:
user: user-1
content: 连续三个判断，相等且各自不为零。

user: user-0
content: 引用 4 楼 寻开心的回复:for（j=0；p[j]==a[i]&&a[i]&&p[j]；i++，j++）；  等价于  j = 0； for (;  p[j]==a[i]  && a[i] && p[j];  ) {          i++;          j++; }  for（ ；； ）这个语句的两个分号分割出来的三段，就是三个表达式 第一个表达式， 这里的j=0 是最先执行的， 而且只执行一次 然后， 就执行第二表达式， p[j]==a[i]  && a[i] && p[j]  这个表达式的结果决定要不要执行花括号里面的代码 最后都第三个表达式， 是在花括号内语句全部执行完， 再次进行第二个表达式判断之前执行的 所以，拆开那个语句，就是前面给到样子了  p[j]==a[i]  && a[i] && p[j] 是三个bool运算，  而且是短路计算 先判断p[j]==a[i]是不是相同，如果不相同，后面的都不判断直接返回false了 如果相同才继续判断a[i]， 它只要不是0， 都是表示真； 是真就继续后面的判断，否则整个表达式就返回false了 最后才判断p[j]  for（表达式1； 表达式2； 表达式3） {} 三个表达式，都可以是复杂度多个语句，中间用逗号分割的 好感动我真的好感动

user: user-2
content: for是三个表达式语句，因此中间的那个是判断表达式，虽然由 && &&连起来的，但是判断的是最后的结果。

user: user-3
content: for（j=0；p[j]==a[i]&&a[i]&&p[j]；i++，j++）；  等价于  j = 0； for (;  p[j]==a[i]  && a[i] && p[j];  ) {          i++;          j++; }  for（ ；； ）这个语句的两个分号分割出来的三段，就是三个表达式 第一个表达式， 这里的j=0 是最先执行的， 而且只执行一次 然后， 就执行第二表达式， p[j]==a[i]  && a[i] && p[j]  这个表达式的结果决定要不要执行花括号里面的代码 最后都第三个表达式， 是在花括号内语句全部执行完， 再次进行第二个表达式判断之前执行的 所以，拆开那个语句，就是前面给到样子了  p[j]==a[i]  && a[i] && p[j] 是三个bool运算，  而且是短路计算 先判断p[j]==a[i]是不是相同，如果不相同，后面的都不判断直接返回false了 如果相同才继续判断a[i]， 它只要不是0， 都是表示真； 是真就继续后面的判断，否则整个表达式就返回false了 最后才判断p[j]  for（表达式1； 表达式2； 表达式3） {} 三个表达式，都可以是复杂度多个语句，中间用逗号分割的

user: user-4
content: 引用 2 楼 贵阳老马马善福专业维修游泳池堵漏防水工程 的回复:也就是 for (j = 0 ; p[j] == a[i] && a[i] != 0 && p[j] != 0; i++,j++) ; 也就是 j = 0; while (p[j] == a[i] && a[i] != 0 && p[j != 0]) { i++; j++; } 这就是我说的，咱们的大学教C语言的，大多数都是野路子，教学生的不是编程，而是街头杂耍。 对，老师就是念着ppt教我们，几乎没教过怎么写代码

user: user-5
content: 也就是 for (j = 0 ; p[j] == a[i] && a[i] != 0 && p[j] != 0; i++,j++) ; 也就是 j = 0; while (p[j] == a[i] && a[i] != 0 && p[j != 0]) { i++; j++; } 这就是我说的，咱们的大学教C语言的，大多数都是野路子，教学生的不是编程，而是街头杂耍。

user: user-4
content: p[j]==a[i]&&a[i]&&p[j] 就是p[j]  and  a[i] 一样 并且都不是0
user-0 提问: 哥哥姐姐们有没有会编程计算表达式的值啊，这个程度怎么写呀，刚学C语言不太明白明白

回复:
user: user-1
content: 是不是4.8？

user: user-2
content: 5/2 是个考点，整数相除，取商的整数部分。 5%2是另一个考点，取余数，也是整数。

user: user-0
content: 引用 4 楼 木  土  硎的回复:#include <studio.h> int main(){ float f=5.0/2.0; printf("%f",3.6+f+1.2+5%2); return 0; } 好的 谢谢谢谢

user: user-3
content: #include <studio.h> int main(){ float f=5.0/2.0; printf("%f",3.6+f+1.2+5%2); return 0; }

user: user-4
content: 引用 2 楼 m0_46466604 的回复:[quote=引用 1 楼 ?Victor.??的回复:]#include<stdio.h> int main() { 	float f; 	f = 5.0/2; 	printf("%f",3.6+f+1.2+5%2); 	return 0; } 没有太具体的要求，写法很多呀 fioat代表什么意思呀  我刚开始学 简单点好复杂的看不懂[/quote] float必须有呀，（先不说double了），不然5/2就得2了，结果不对了，学一学就懂了，至于float是什么,我建议你还是找本书看看吧

user: user-0
content: 引用 1 楼 ?Victor.??的回复:#include<stdio.h> int main() { 	float f; 	f = 5.0/2; 	printf("%f",3.6+f+1.2+5%2); 	return 0; } 没有太具体的要求，写法很多呀 fioat代表什么意思呀  我刚开始学 简单点好复杂的看不懂

user: user-4
content: #include<stdio.h> int main() { 	float f; 	f = 5.0/2; 	printf("%f",3.6+f+1.2+5%2); 	return 0; } 没有太具体的要求，写法很多呀
user-0 提问: 哪里错了，这个？？(´;︵;`)

回复:
user: user-0
content: 引用 6 楼 自信男孩的回复:# include<stdio.h> int main() {     int a,b;     scanf("%d %d",&a,&b);      printf("%d + %d = %d\n",a,b,a+b);     printf("%d - %d = %d\n",a,b,a-b);     printf("%d * %d = %d\n",a,b,a*b);     if (b != 0)         printf("%d / %d = %d\n",a,b,a/b);     printf("%d %% %d = %d\n",a,b,a%b);      return 0; }  供参考～  注意b不能为0，另外%是特殊字符，因此用%% 好的，谢谢😜

user: user-1
content: # include<stdio.h> int main() {     int a,b;     scanf("%d %d",&a,&b);      printf("%d + %d = %d\n",a,b,a+b);     printf("%d - %d = %d\n",a,b,a-b);     printf("%d * %d = %d\n",a,b,a*b);     if (b != 0)         printf("%d / %d = %d\n",a,b,a/b);     printf("%d %% %d = %d\n",a,b,a%b);      return 0; }  供参考～  注意b不能为0，另外%是特殊字符，因此用%%

user: user-0
content: 为什么 是   %%    百度也不知道

user: user-2
content: 可能只写一个或用转义符，编译器实现起来麻烦吧。我也不知道为什么。

user: user-0
content: 引用 2 楼 m0_46108109的回复:printf("%d %% %d = %d\n", a, b, a % b); 为什么是两个%%

user: user-2
content: printf("%d %% %d = %d\n", a, b, a % b);

user: user-0
content: a.c: In function ‘main’: a.c:10:17: warning: conversion lacks type at end of format [-Wformat=]      printf("%d % %d = %d\n",a,b,a%b);                  ^ a.c:5:2: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]   scanf("%d %d",&a,&b);   ^~~~~~~~~~~
user-0 提问: 这里有c->的形式可以用吗？

回复:
user: user-0
content: 谢谢各位  ！

user: user-1
content: 这样用是没问题的。等价于:int b = 5;  因为c是指针，存放的是地址。通过malloc相当于在堆上申请了空间，*c = 5;即将5放到堆上申请的空间里。 int b = 5;b是在栈或数据段申请的空间，并将5放在申请的空间里。

user: user-2
content: int * c = (int * )malloc(sizeof(int *)); int *和int的大小不一定相等。 .才对应的-> *对应的&

user: user-3
content: 如果c是结构体指针就可以，否则c没有成员
user-0 提问: 表达式必须是可操作性的左值问题？

回复:
user: user-1
content: 引用 3 楼 千梦一生 的回复:else？ struct再if里 你这行表达式在else里 是这样的吗？那是2张截图  属于代码的不同片段  问题不是这里

user: user-2
content: else？ struct再if里 你这行表达式在else里 是这样的吗？

user: user-3
content: 数组名不能做左值。可以考虑用strcmp/memcpy实现赋值

user: user-4
content: number是数组名，数组名不能被赋值。
user-0 提问: mmap映射地址访问问题

回复:
user: user-1
content: 引用 4 楼 flyfreely2008 的回复:引用 3 楼 自信男孩 的回复:[quote=引用 2 楼 flyfreely2008 的回复:] [quote=引用 1 楼 自信男孩 的回复:] 超过肯定是不能访问的。 问题是根本没超过啊。。。。。您看一下分配的地址空间和我访问的空间 401000000000这个地址很大呀，你说一下起始地址的16进制是多少？确定是这个地址吗？[/quote] 这个是自定义的起始地址呀，64位的机子。。。拜托不懂就不要乱回答啦 让懂得人回答一下吧。。。谢谢啦[/quote] 不回答了，让懂得人给你回答一下。我也等着懂得人，本人“不懂”。

user: user-0
content: 已经解决了，是因为/dev mount的空间太小，所以导致mmap地址即使分配出来了也不可用

user: user-2
content: 我也遇到了类似的问题, 请问是如何定位到这个原因的? mmap分配的时候如果空间不足不是应该返回(void*)-1吗? 是有某种情况, 即使分配成功了但是可用的size跟传入的size不符的情况?

user: user-0
content: 引用 3 楼 自信男孩 的回复:引用 2 楼 flyfreely2008 的回复:[quote=引用 1 楼 自信男孩 的回复:] 超过肯定是不能访问的。 问题是根本没超过啊。。。。。您看一下分配的地址空间和我访问的空间 401000000000这个地址很大呀，你说一下起始地址的16进制是多少？确定是这个地址吗？[/quote] 这个是自定义的起始地址呀，64位的机子。。。拜托不懂就不要乱回答啦 让懂得人回答一下吧。。。谢谢啦

user: user-1
content: 引用 2 楼 flyfreely2008 的回复:引用 1 楼 自信男孩 的回复:超过肯定是不能访问的。 问题是根本没超过啊。。。。。您看一下分配的地址空间和我访问的空间 401000000000这个地址很大呀，你说一下起始地址的16进制是多少？确定是这个地址吗？

user: user-0
content: 引用 1 楼 自信男孩 的回复:超过肯定是不能访问的。 问题是根本没超过啊。。。。。您看一下分配的地址空间和我访问的空间

user: user-1
content: 超过肯定是不能访问的。
user-0 提问: 指针与二维数组，求二维数组的最大值

回复:
user: user-0
content: 引用 1 楼 m0_46108109 的回复：pa=a； for（i=0；i<n*m;i++,pa++） pa=a; max=*pa; max<*(p+i); max=*(p+i);谢谢！

user: user-1
content: pa=a； for（i=0；i<n*m;i++,pa++） pa=a; max=*pa; max<*(p+i); max=*(p+i);
user-0 提问: C语言排序问题

回复:
user: user-1
content: 数组下标从0开始的，有时候for循环要注意下标问题，如果你只开了num个，那么就要从0-（num-1）,若是到num，会数组越界，结果虽然不会改变，但你交到OJ上会爆，所以在开数组的时候一般习惯开目标个数+1，然后从1开始操作

user: user-2
content: 建议多在编译器上编写和测试。

user: user-3
content: 用黑色的，黑色的符合人类思考习惯。 就是先取出第一个，然后和第二个比 取出第n个和n+1比
user-0 提问: 大佬们看看我这哪里出错了

回复:
user: user-1
content: #include<stdio.h> #include<math.h>  int main(void) {     int a, b, c;     double delate;     double x1, x2;      //scanf("%f %f %f",&a,&b,&c);     scanf("%d %d %d",&a,&b,&c);     delate = (b * b) - (4 * a *c);      if (delate>0)     {         printf("该二元一次方程组有两个解\n");         x1 = (-b + sqrt(b * b - 4 * a *c))* 1.0/2 * a;         x2 = (-b - sqrt(b * b - 4 * a *c)) * 1.0/2 * a;         //printf("x1 = %f,x2 = %f\n",x1,x2);         printf("x1 = %lf,x2 = %lf\n",x1,x2);     }     else if (delate == 0)     {         printf("该二元一次方程组有一个解\n");         x1 = (-b) / 2 * a;         x2 = x1;         //printf("x1 = %f,x2 = %f\n", x1, x2);         printf("x1 = %lf,x2 = %lf\n", x1, x2);     }      else     {         printf("该二元一次方程组无解\n");      }      return 0; }  供参考～  注意a, b, c定义的都是int  另外，double的输出格式是%lf

user: user-2
content: x1 = (-b + sqrt(b * b - 4 * a *c))/(2 * a); 这里得加个括号
user-0 提问: 请问大佬这个问题

回复:
user: user-1
content: 引用 9 楼 自信男孩 的回复:[quote=引用 2 楼 lin5161678 的回复:]  printf("%d\n",strlen(c));        //5 这个才是不确定      printf("%d\n",sizeof(b));        //不确定  sizeof 结果全部确定 注意b的strlen(b)是确定的。因为b指向的是字符串。[/quote]我就当你回复错了

user: user-2
content: 引用 2 楼 lin5161678 的回复:printf("%d\n",strlen(c));        //5 这个才是不确定      printf("%d\n",sizeof(b));        //不确定  sizeof 结果全部确定 注意b的strlen(b)是确定的。因为b指向的是字符串。

user: user-0
content: 引用 7 楼 寻开心 的回复:字符数组的名字被当字符串指针使用的时候， 字符串函数不管它到底是数组还是字符串，只会按照strlen自己的逻辑来处理，从指针指向的地址开始，一直向后找到'\0'为止， 什么时候找到什么时候返回；所以，c数组的有效范围内没有0， strlen找到什么时候找到0，天知道 好的，谢谢大佬，明白了

user: user-3
content: 字符数组的名字被当字符串指针使用的时候， 字符串函数不管它到底是数组还是字符串，只会按照strlen自己的逻辑来处理，从指针指向的地址开始，一直向后找到'\0'为止， 什么时候找到什么时候返回；所以，c数组的有效范围内没有0， strlen找到什么时候找到0，天知道

user: user-3
content: sizeof是算内存占用量 strlen是遇到0字符才返回长度但是不算0在内 数组就是数组， 只是同样类型的若干个数据连续排列 字符串是遇到0才算结束，定义的常量尾巴都是默认带0的 字符数组可以用来当字符串用，但是毕竟不是字符串， 所以要注意自己补上0——在合适的位置

user: user-3
content: #include<stdio.h> #include<string.h> int main() {     char a[] = "abcde";     char* b = "abcde";     char c[] = {'a','b','c','d','e'};     printf("%d\n",sizeof(a));      //6  尾巴是有0字符的，也占内存     printf("%d\n",strlen(a));        //5 尾巴0字符不占字符串长度     printf("%d\n",strlen(c));        //5 这个才是没谱的，c数组后面遇到0才会结束strlen的长度     printf("%d\n",sizeof(b));        //不确定 这个是指针类型的内存大小，32位系统下4，64位下是8     printf("%d\n",sizeof("abcde"));  //6 这个同样要算尾巴0的内存空间     return 0; }

user: user-0
content: 引用 1 楼 自信男孩 的回复:对，sizeof是统计数组的长度。数组的长度就会包含'\0'。 而strlen是计算字符串的有效长度，不包括'\0' 我的理解是字符串后面会有'\0' 字符数组没有，这么理解对吗？ 还有 printf("%d\n",strlen(c));这个为什么是不确定呢？

user: user-0
content: 引用 2 楼 lin5161678 的回复:printf("%d\n",strlen(c));        //5 这个才是不确定      printf("%d\n",sizeof(b));        //不确定  sizeof 结果全部确定 抱歉，打错了，请问那个为什么是不确定呢？

user: user-1
content: printf("%d\n",strlen(c));        //5 这个才是不确定      printf("%d\n",sizeof(b));        //不确定  sizeof 结果全部确定

user: user-2
content: 对，sizeof是统计数组的长度。数组的长度就会包含'\0'。 而strlen是计算字符串的有效长度，不包括'\0'
user-0 提问: 为什么vs2019system("cls")用不了

回复:
user: user-1
content: 想问一下楼主  ，也是vs2019，终端上能用cls ，但是 也遇到了这个问题

user: user-2
content: 楼主怎么解决的啊

user: user-0
content: 引用 1 楼 自信男孩的回复:[quote=引用 楼主 m0_46078443 的回复:] 加了stdlib.h Windows.h Conio.h就是不行，system(pause) 可以用，没有任何报错就是清不了屏 建议在终端上试一下cls看一下能不能执行。如果不可以，建议用clean/clear试试[/quote] 已解决谢谢了

user: user-0
content: 引用 1 楼 自信男孩的回复:[quote=引用 楼主 m0_46078443 的回复:] 加了stdlib.h Windows.h Conio.h就是不行，system(pause) 可以用，没有任何报错就是清不了屏 建议在终端上试一下cls看一下能不能执行。如果不可以，建议用clean/clear试试[/quote] cmd上可以codeblock也可以。。

user: user-3
content: 引用 楼主 m0_46078443 的回复:加了stdlib.h Windows.h Conio.h就是不行，system(pause) 可以用，没有任何报错就是清不了屏 建议在终端上试一下cls看一下能不能执行。如果不可以，建议用clean/clear试试