Question: C语言新手问题：怎么在函数之间传一个可变长数组？

引用 1 楼 自信男孩 的回复:#include <stdio.h> #include <stdlib.h>  struct array {     int n;     int *arr; };  static struct array *func1(); static int func2(struct array *);  struct array *func1() { #if 0     struct array *p1;     struct array p1_t;     int i , n;      n = 16; // assume n will change based on user input     p1 = &p1_t;     p1->n = n;     p1->arr = (int *)malloc(sizeof(int) * n);     for (i = 1 ; i <= n ; i++) p1->arr[i - 1] = i;     return p1;    //返回的是p1_t的地址，这个地址是局部变量的地址，根据局部变量的生命周期是本函数内，因此返回的p1无效，还导致内存泄露，因为malloc的没释放。 #else     struct array *p1;     int n, i;      p1 = (struct array *)malloc(sizeof(struct array));     if (!p1)         exit(0);      n = 16;     p1->n = n;     p1->arr = (int *)malloc(sizeof(int) * n);     if (!p1->arr) {         free(p1);         exit(0);     }     for (i = 1; i<= n; i++)         p1->arr[i-1] = i;      return p1;  #endif }  int func2(struct array *p2) {     int i , n;      n = p2->n;     for (i = 1 ; i <= n ; i++)         p2->arr[i - 1] = n + 1 - i;      return 1; }  int main() {     struct array *p;     int i , n;      p = func1();     n = p->n;     for (i = 1 ; i <= n ; i++)         printf("%d, " , p->arr[i - 1]);     printf("after func1.\n");     func2(p);     for (i = 1 ; i <= n ; i++)         printf("%d, " , p->arr[i - 1]);     printf("after func2.\n");      free(p->arr);     free(p);      return 1; } 供参考～  谢谢，您的代码风格很好，向您学习！

我寻思着你这也不是可变数组而是链表啊，你可以找找怎么写链表的看看


Question: 不得了了，赵4老柿的编码风格太神啦！

#include <stdio.h> char a[]={'c','h'}; char b[]="啊"; int main() {     int i,n;     char buf[9+1];//给"0xXX 0xXX"留的空间      sprintf(buf,"0x%02X 0x%02X",(unsigned char)a[0],(unsigned char)a[1]);     printf("[%s]\n",buf);//[0x63 0x68]      sprintf(buf,"0x%02X 0x%02X",(unsigned char)b[0],(unsigned char)b[1]);     printf("[%s]\n",buf);//[0xB0 0xA1]      sprintf(buf,"0x%02X 0x%02X",a[0],a[1]);     printf("[%s]\n",buf);//[0x63 0x68]      sprintf(buf,"0x%02X 0x%02X",b[0],b[1]);     printf("[%s]\n",buf);//运气好了输出[0xFFFFFFB0 0xFFFFFFA1]；运气不好buf越界，程序异常退出！      return 0; }  不放一挂鞭，不够热闹哈！

赵4老师在哪开直播的

可不是咋滴，上面只是个比喻，真实的经过是这样的：那天我发现赵老湿写了一个小程序： char a [] = "cp"; printf ("0x%02X", (unsigned char) a [0]); 程序大致是上面这样。我跟赵老湿说，赵老湿啊赵老湿，你就显示'c'和'p'的字符编码，就不要强转成(unsigned char)了吧，脱kz放p，看着别扭。赵老湿不肯。楼内网友一连声地说赵老湿对，我是错的，“挺赵老湿！””站赵老湿“！赵老湿看大家都支持他，脸上泛起了红光，用食指在碗里醮了酒，在桌子上把程序改了一下： char a [] = "啊"; 然后对我说，看，在这种情况下，转成 unsigned char 不就有用了么！ 我刚准备跟赵老湿说，那你要是改成 L"啊"、u"啊"或者U"啊"，怎么办呢？楼内又是一阵骚动，“挺赵老湿”！”站赵老湿！“。赵老湿激动起来，口里喃喃地说什么“long long固长，short固短”之类的，店里又充满了快活的气氛。

哈哈，这是和赵4老师顶上了

就算你写一个 #include <iostream> #include <string> using namespace std; inline int compare(string str1,string str2) {//相等返回0，大于返回1，小于返回-1          if (str1.size()>str2.size()) return 1; //长度长的整数大于长度小的整数     else if (str1.size()<str2.size()) return -1;     else                              return str1.compare(str2); //若长度相等，则头到尾按位比较 } string SUB_INT(string str1,string str2); string ADD_INT(string str1,string str2) {//高精度加法     int sign=1; //sign 为符号位     string str;     if (str1[0]=='-') {         if (str2[0]=='-') {             sign=-1;             str=ADD_INT(str1.erase(0,1),str2.erase(0,1));         } else {             str=SUB_INT(str2,str1.erase(0,1));         }     } else {         if (str2[0]=='-') {             str=SUB_INT(str1,str2.erase(0,1));         } else { //把两个整数对齐，短整数前面加0补齐             string::size_type L1,L2;             int i;             L1=str1.size();             L2=str2.size();             if (L1<L2) {                 for (i=1;i<=L2-L1;i++) str1="0"+str1;             } else {                 for (i=1;i<=L1-L2;i++) str2="0"+str2;             }             int int1=0,int2=0; //int2 记录进位             for (i=str1.size()-1;i>=0;i--) {                 int1=(int(str1[i])-'0'+int(str2[i])-'0'+int2)%10;                 int2=(int(str1[i])-'0'+int(str2[i])-'0'+int2)/10;                 str=char(int1+'0')+str;             }             if (int2!=0) str=char(int2+'0')+str;         }     }     //运算后处理符号位     if ((sign==-1)&&(str[0]!='0')) str="-"+str;     return str; } string SUB_INT(string str1,string str2) {//高精度减法     int sign=1; //sign 为符号位     string str;     int i,j;     if (str2[0]=='-') {         str=ADD_INT(str1,str2.erase(0,1));     } else {         int res=compare(str1,str2);         if (res==0) return "0";         if (res<0) {             sign=-1;             string temp =str1;             str1=str2;             str2=temp;         }         string::size_type tempint;         tempint=str1.size()-str2.size();         for (i=str2.size()-1;i>=0;i--) {             if (str1[i+tempint]<str2[i]) {                 j=1;                 while (1) {//zhao4zhong1添加                     if (str1[i+tempint-j]=='0') {                         str1[i+tempint-j]='9';                         j++;                     } else {                         str1[i+tempint-j]=char(int(str1[i+tempint-j])-1);                         break;                     }                 }                 str=char(str1[i+tempint]-str2[i]+':')+str;             } else {                 str=char(str1[i+tempint]-str2[i]+'0')+str;             }         }         for (i=tempint-1;i>=0;i--) str=str1[i]+str;     }     //去除结果中多余的前导0     str.erase(0,str.find_first_not_of('0'));     if (str.empty()) str="0";     if ((sign==-1) && (str[0]!='0')) str ="-"+str;     return str; } string MUL_INT(string str1,string str2) {//高精度乘法     int sign=1; //sign 为符号位     string str;     if (str1[0]=='-') {         sign*=-1;         str1 =str1.erase(0,1);     }     if (str2[0]=='-') {         sign*=-1;         str2 =str2.erase(0,1);     }     int i,j;     string::size_type L1,L2;     L1=str1.size();     L2=str2.size();     for (i=L2-1;i>=0;i--) { //模拟手工乘法竖式         string tempstr;         int int1=0,int2=0,int3=int(str2[i])-'0';         if (int3!=0) {             for (j=1;j<=(int)(L2-1-i);j++) tempstr="0"+tempstr;             for (j=L1-1;j>=0;j--) {                 int1=(int3*(int(str1[j])-'0')+int2)%10;                 int2=(int3*(int(str1[j])-'0')+int2)/10;                 tempstr=char(int1+'0')+tempstr;             }             if (int2!=0) tempstr=char(int2+'0')+tempstr;         }         str=ADD_INT(str,tempstr);     }     //去除结果中的前导0     str.erase(0,str.find_first_not_of('0'));     if (str.empty()) str="0";     if ((sign==-1) && (str[0]!='0')) str="-"+str;     return str; } string DIVIDE_INT(string str1,string str2,int flag) {//高精度除法。flag==1时,返回商; flag==0时,返回余数     string quotient,residue; //定义商和余数     int sign1=1,sign2=1;     if (str2 == "0") {  //判断除数是否为0         quotient= "ERROR!";         residue = "ERROR!";         if (flag==1) return quotient;         else         return residue ;     }     if (str1=="0") { //判断被除数是否为0         quotient="0";         residue ="0";     }     if (str1[0]=='-') {         str1   = str1.erase(0,1);         sign1 *= -1;         sign2  = -1;     }     if (str2[0]=='-') {         str2   = str2.erase(0,1);         sign1 *= -1;     }     int res=compare(str1,str2);     if (res<0) {         quotient="0";         residue =str1;     } else if (res == 0) {         quotient="1";         residue ="0";     } else {         string::size_type L1,L2;         L1=str1.size();         L2=str2.size();         string tempstr;         tempstr.append(str1,0,L2-1);         for (int i=L2-1;i<L1;i++) { //模拟手工除法竖式             tempstr=tempstr+str1[i];             tempstr.erase(0,tempstr.find_first_not_of('0'));//zhao4zhong1添加             if (tempstr.empty()) tempstr="0";//zhao4zhong1添加             for (char ch='9';ch>='0';ch--) { //试商                 string str;                 str=str+ch;                 if (compare(MUL_INT(str2,str),tempstr)<=0) {                     quotient=quotient+ch;                     tempstr =SUB_INT(tempstr,MUL_INT(str2,str));                     break;                 }             }         }         residue=tempstr;     }     //去除结果中的前导0     quotient.erase(0,quotient.find_first_not_of('0'));     if (quotient.empty()) quotient="0";     if ((sign1==-1)&&(quotient[0]!='0')) quotient="-"+quotient;     if ((sign2==-1)&&(residue [0]!='0')) residue ="-"+residue ;     if (flag==1) return quotient;     else         return residue ; } string DIV_INT(string str1,string str2) {//高精度除法,返回商     return DIVIDE_INT(str1,str2,1); } string MOD_INT(string str1,string str2) {//高精度除法,返回余数     return DIVIDE_INT(str1,str2,0); } int main() {     char ch;     string s1,s2,res;      while (cin>>s1>>ch>>s2) {         switch (ch) {             case '+':res=ADD_INT(s1,s2);break;             case '-':res=SUB_INT(s1,s2);break;             case '*':res=MUL_INT(s1,s2);break;             case '/':res=DIV_INT(s1,s2);break;             case '%':res=MOD_INT(s1,s2);break;             default :                   break;         }         cout<<res<<endl;     }     return(0); }  他赵老湿也会说那 万一输入一个1亿亿亿亿亿亿亿亿位的数呢？ 万一输入罗马数字呢？ 万一输入中文大写数字呢？ 万一不是数呢？

经一事，长一智! 习惯这东西，不好改

引用 10 楼 均陵鼠侠 的回复:赵老湿能不能改一下程序，让数组a能同时应付和保存char，wchar_t，char16_t和char32_t类型的编码？这事要是做成了，也是大功一件。  [quote=引用 8 楼 赵4老师 的回复:]我特别喜欢“快活的气氛”这个字眼。 疫情下，全球郁闷的氛围中，缺的不就是“快活的气氛”嘛！ [/quote] 那你还是饶了我这把老骨头吧。  字符串那些事儿：BSTR-LPSTR-LPWSTR-CString-VARIANT-COleVariant-_variant_t-CComBSTR-_bstr_t.txt http://blog.csdn.net/pizi0475/archive/2010/03/04/5346708.aspx  人生路， 美梦似路长 路里风霜， 风霜扑面干

楼主真正搞笑的只有告诉老赵(unsigned int)a[i]更正确这一句，其他所有的“插科打诨”都是为了掩盖这一句，把你的喜剧天赋发挥得淋漓尽致～～～

赵老湿能不能改一下程序，让数组a能同时应付和保存char，wchar_t，char16_t和char32_t类型的编码？这事要是做成了，也是大功一件。  引用 8 楼 赵4老师 的回复:我特别喜欢“快活的气氛”这个字眼。 疫情下，全球郁闷的氛围中，缺的不就是“快活的气氛”嘛！

CSDN的人气越来越不济了，自己顶一顶。 我就说赵老湿，你就演示一个5加7等于12，何必弄一个long long signed，搞一个int还省力气，你也不嫌累。赵老湿哪肯啊，当时就改了一下程序，说你看， this_is_a_var_a = 12394572389446723543; 这不就有用了吗？赵老湿的神武一下子让大家佩服得不行不行的，楼里都说我不对，夸赵老湿你well done，干得漂亮，就应该这样！不声明成long long数字就容易被截断出现错误。看了大家的发言，越老湿一下子神气起来，酒店里充满了快活的空气。


Question: 请教，没有指定形参的函数，为啥可以传参？谢谢

引用 23 楼 早打大打打核战争 的回复:跟“编译器的漏洞”没关系，C的函数原型f()等于f(...)，而C++的f()等于f(void)，这是C和C++的重要区别之一 谢谢大神

有的编译器没检查，有的会检查，这么用肯定是不对的，所以可以理解为编译器的漏洞，不要这么用就可以了

引用 20 楼 oracleperl 的回复:[quote=引用 9 楼 5250 的回复:]没有参数  默认是可以传递参数的  除非参数为void 谢谢大神， 那最多可以传几个参数呢？ 谢谢[/quote]  内存角度来看，函数的参数是要入栈的，栈区大小决定了参数的个数。一般C语言程序运行时默认1M的栈空间，以int类型的参数来看，1M=1024KB=1024*1024字节，32位系统中int类型占4个字节，所以理论上一个函数最多有262144个int类型的参数。实际中要远远小于这个数，因为应用程序中的局部变量都需要占用栈空间。

引用 9 楼 5250 的回复:没有参数  默认是可以传递参数的  除非参数为void 谢谢大神， 那最多可以传几个参数呢？ 谢谢

调用约定 https://docs.microsoft.com/zh-cn/cpp/cpp/calling-conventions?view=vs-2017

引用 7 楼 赵4老师 的回复:不看编译器源代码，不看每句C/C++语句对应的汇编指令，你永远是“隔靴搔痒”。   __cdecl   :C和C++缺省调用方式      例子：        void   Input(   int   &m,int   &n);         /*相当于void   __cdecl   Input(int   &m,int   &n);*/      以下是相应的汇编代码：    00401068   lea   eax,[ebp-8]   ;取[ebp-8]地址(ebp-8),存到eax       0040106B   push   eax   ;然后压栈       0040106C   lea   ecx,[ebp-4]   ;取[ebp-4]地址(ebp-4),存到ecx         0040106F   push   ecx   ;然后压栈       00401070   call   @ILT+5(Input)   (0040100a);然后调用Input函数       00401075   add   esp,8   ;恢复栈       从以上调用Input函数的过程可以看出：在调用此函数之前，首先压栈ebp-8,然后压栈ebp-4,然后调用函数Input,最后Input函数调用结束后，利用esp+8恢复栈。由此可见，在C语言调用中默认的函数修饰_cdecl，由主调用函数进行参数压栈并且恢复堆栈。 https://blog.csdn.net/My_heart_/article/details/51520363 https://blog.csdn.net/luoweifu/article/details/52425733    能看明白吗?总之在_cdecl 调用方式中,由调用者来维护参数.如果被调用的函数没有使用任何参数,不对栈进行读取和操作.那么传递任何东西是无所谓的.但是其他调用约定就不行了.具体我没有实验,大体就是这么个事儿

引用 14 楼 oracleperl 的回复:[quote=引用 9 楼 5250 的回复:]没有参数  默认是可以传递参数的  除非参数为void  f2 () { return 20; }  f1 (void) { return 20; }  int main() { printf("result is=%d\n",f2(100)); //不会出错 printf("result is=%d\n",f1(100)); //出错 return 0; }  谢谢大神，类似 f() 那么可以I传几个参数，参数的类型是什么? [/quote]  自己写一个简单的程序看一下不就行了  几个参数 参数的类型你就试试呗

不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  你尤其要迷信你手头的这款编译器。毕竟县官不如现管。

这样的写法可以传几个参数？每个参数的类型都是int？我查阅了一些书籍，没找到相关说明 int f() { return 0; }

引用 9 楼 5250 的回复:没有参数  默认是可以传递参数的  除非参数为void  f2 () { return 20; }  f1 (void) { return 20; }  int main() { printf("result is=%d\n",f2(100)); //不会出错 printf("result is=%d\n",f1(100)); //出错 return 0; }  谢谢大神，类似 f() 那么可以I传几个参数，参数的类型是什么?

引用 8 楼 oracleperl 的回复:[quote=引用 7 楼 赵4老师 的回复:]不看编译器源代码，不看每句C/C++语句对应的汇编指令，你永远是“隔靴搔痒”。 谢谢赵老师提醒， 您说的编译器源码，C/C++语句对应的汇编指令，我在哪里看到？ 感谢赵老师[/quote] 编译器源代码：初级Tiny C Compiler；终极gcc/g++ C/C++语句对应的汇编指令：Windows VS20xx，调试时打开汇编指令窗口；Linux g++，gdb调试时，layout asm

老编译器的毛病。。。。。。

引用 7 楼 赵4老师 的回复:不看编译器源代码，不看每句C/C++语句对应的汇编指令，你永远是“隔靴搔痒”。 谢谢赵老师提醒， 您说的编译器源码，C/C++语句对应的汇编指令，我在哪里看到？ 感谢赵老师

不看编译器源代码，不看每句C/C++语句对应的汇编指令，你永远是“隔靴搔痒”。

引用 5 楼 自信男孩 的回复:[quote=引用 3 楼 oracleperl 的回复:][quote=引用 1 楼 自信男孩 的回复:]c.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int]  f2 ()  ^~   走的默认。如果楼主要明白诸如此类问题，可以读一下C标准，了解编译器编译的语法检查规则～ 请教下什么默认？有书籍，文档说明吗？比如C标准？ 哪里可以看到？ 感谢[/quote]  感谢大神 默认的意思就是如果没有定义或者声明，按照int来处理～[/quote] 有书籍或者官方文档说明吗？ 我看到K&R C那本书上说，不指定函数返回类型，那么默认int 但是对函数的参数，假设是 F() 没有说有几个参数，也没说默认是恩么类型 谢谢

引用 12 楼 oracleperl 的回复:[quote=引用 9 楼 5250 的回复:]没有参数  默认是可以传递参数的  除非参数为void  f2 () { return 20; }  f1 (void) { return 20; }  int main() { printf("result is=%d\n",f2(100)); //不会出错 printf("result is=%d\n",f1(100)); //出错 return 0; }  可以I传几个参数？参数的数据类型是什么？ 我仔细阅读了《C和指针》英文版，感觉对函数那一章的陈述，前言不搭后语，没有把概念说清楚 对于没有参数的函数，那本书上是说“假定是正确的”  对于什么是函数原型，更是没有说清楚。。 貌似 int f(int a);  这一行肯定就是函数原型 那么 如下代码的int f(int a) 算不算函数原型呢？ int f(int a) { return 1; } [/quote]  对于无参函数来说，参数是不确定的  你可以给它设置多个参数，多个类型 只要能在栈上放下 理论上都没有错误 但是不建议这样做 不安全。 int f(int a);//这里只是申明了函数，函数的原型即函数的定义   定义的函数要和函数的申明一致 int f(int a) { return 1; } 这个就是函数的原型了   关于函数的申明和定义参考下面链接 https://blog.csdn.net/xingzhe22222/article/details/98870457

引用 9 楼 5250 的回复:没有参数  默认是可以传递参数的  除非参数为void  f2 () { return 20; }  f1 (void) { return 20; }  int main() { printf("result is=%d\n",f2(100)); //不会出错 printf("result is=%d\n",f1(100)); //出错 return 0; }  可以I传几个参数？参数的数据类型是什么？ 我仔细阅读了《C和指针》英文版，感觉对函数那一章的陈述，前言不搭后语，没有把概念说清楚 对于没有参数的函数，那本书上是说“假定是正确的”  对于什么是函数原型，更是没有说清楚。。 貌似 int f(int a); 这一行肯定就是函数原型 那么 如下代码的int f(int a) 算不算函数原型呢？ int f(int a) { return 1; }


Question: 新手c语言求解，新手比较穷，没积分

引用 2 楼 user-1的回复: 第162行多打了，修改如下：	while (scanf("%f", &x) != 1 ) 老哥，谢谢了又是你

修改如下，供参考：#include <stdio.h> int main() { 	char ch,c, s[2]; 	int m, n,l,i,a; 	float x, y,z; 	printf("Enter the operation of your choice:"); 	printf("\na.  add         s.subtract\n"); 	printf("m.  multiply       d.divide\n"); 	printf("q.quit\n"); 	scanf_s("%s", s,2); 	ch = s[0]; 	rewind(stdin); 	while (ch != 'q') 	{ 		switch (ch) 		{ 			case 'a': 			{  printf("Enter  first number:\n"); 			while (scanf_s("%f", &x) != 1) 			{ 				//char   c ;                                 while ((c = getchar())!='\n')                                        putchar(c); 				printf(" is not a number ,the correct number such as -1 ,3 or 25,please enter again\n"); 				} 				for (i = 10,m=0,l=1;l != 0;i *= 10) 				{ 				a = (int)(x * i); 				l = a % 10; 				if (l != 0) 					 m++; 			 				} 				printf("Enter second number:\n"); 				while (scanf_s("%f", &y) != 1) 				{ 					//c = 0; 				while ((c=getchar()) != '\n') 					putchar(c); 				printf(" is not a number ,the correct number such as -1 ,3 or 25,please enter again\n"); 				} 				for (i = 10, n = 0,l=1;l != 0;i *= 10) 				{ 				a = (int)(x * i); 				l = a % 10; 				if (l != 0) 					n++;  				} 				z = x + y; 				if (m == 0 && n == 0) 				printf("%.*f+%.*f=%.*f\n", m, x,m, y,m, z); 				else 				{ 					if (m > n)  						printf("%.*f+%.*f=%.*f\n", m, x,m, y,m, z); 					else 						printf("%.*f+%.*f=%.*f\n", n, x,n, y,n, z); 				} 				  				break; 			} 			case 's': 			{  printf("Enter  first number:\n"); 			while (scanf_s("%f", &x) != 1) 			{ 				 //char  c = 0; 				while ((c=getchar()) != '\n') 					putchar(c); 				printf(" is not a number ,the correct number such as -1 ,3 or 25,please enter again\n"); 			} 			for (i = 10, m = 0,l=1;l != 0;i *= 10) 			{ 				a = (int)(x *i); 				l = a % 10; 				if (l != 0) 					m++;  			} 			printf("Enter second number:\n"); 			while (scanf_s("%f", &y) != 1) 			{ 				 //char  c = 0; 				while ((c=getchar()) != '\n') 					putchar(c); 				printf(" is not a number ,the correct number such as -1 ,3 or 25,please enter again\n"); 			} 			for (i = 10, n = 0,l=1;l != 0;i *= 10) 			{ 				a = (int)(x * i); 				l = a % 10; 				if (l != 0) 					n++;  			} 			z = x - y; 			if (m == 0 && n == 0) 				printf("%.*f-%.*f=%.*f\n", 0, x,0, y, 0,z); 			else 			{ 				if (m > n)  					printf("%.*f-%.*f=%.*f\n", m, x, m, y, m, z); 				else 					printf("%.*f-%.*f=%.*f\n", n, x, n, y, n, z); 			}  			break; 			} 			case 'm': 			{  printf("Enter  first number:\n"); 			while (scanf_s("%f", &x) != 1) 			{                                 //char c = 0; 				while ((c=getchar()) != '\n') 					putchar(c); 				printf(" is not a number ,the correct number such as -1 ,3 or 25,please enter again\n"); 			} 			for (i = 10, m = 0,l=1;l != 0;i *= 10) 			{ 				a = (int)(x * i); 				l = a % 10; 				if (l != 0) 					m++;  			} 			printf("Enter second number:\n"); 			while (scanf_s("%f", &y) != 1) 			{ 				 // char c = 0; 				while ((c=getchar()) != '\n') 					putchar(c); 				printf(" is not a number ,the correct number such as -1 ,3 or 25,please enter again\n"); 			} 			for (i = 10, n = 0,l=1;l != 0;i *= 10) 			{ 				a = (int)(x * i); 				l = a % 10; 				if (l != 0) 					n++;  			} 			z = x * y; 			if (m == 0 && n == 0) 				printf("%.*f*%.*f=%.*f\n", 0, x,0, y,0, z); 			else 			{ 				if (m > n)  					printf("%.*f*%.*f=%.*f\n", m, x, m, y, m, z); 				else 					printf("%.*f*%.*f=%.*f\n", n, x, n, y, n, z); 			}  			break; 			} 			case 'd': 			{  printf("Enter  first number:\n"); 			while (scanf_s("%f", &x) != 1) != 1) 			{ 				//char c = 0; 				while ((c = getchar()) != '\n') 					putchar(c); 				printf(" is not a number ,the correct number such as -1 ,3 or 25,please enter again\n"); 			} 			for (i = 10, m = 0, l = 1;l != 0;i *= 10) 			{ 				a = (int)(x * i); 				l = a % 10; 				if (l != 0) 					m++;  			} 			printf("Enter second number:\n"); 			while (scanf_s("%f", &y) != 1 && !((y > -0.0000001) && (y < 0.0000001))) 			{ 				//char c = 0; 				while ((c = getchar()) != '\n') 					putchar(c); 				printf(" is not a number ,the correct number such as -1 ,3 or 25,please enter again\n"); 				if ((y > -0.0000001) && (y < 0.0000001)) 				{ 					printf("the divisor can not be 0. please enter again\n"); 					continue; 				} 			} 			for (i = 10, n = 0, l = 1;l != 0;i *= 10) 			{ 				a = (int)(x * i); 				l = a % 10; 				if (l != 0) 					n++; 			} 			z = x / y; 			if (m == 0 && n== 0) 				printf("%.*f/%.*f=%.*f\n", 0, x,0, y,0, z); 			else 			{ 				if (m > n)  					printf("%.*f/%.*f=%.*f\n", m, x, m, y, m, z); 				else 					printf("%.*f/%.*f=%.*f\n", n, x, n, y, n, z); 			}  			break; 			}  			case 'q': break; 			default : 			{ 				printf("Enter the operation of your choice:"); 				printf("\na.  add         s.subtract\n"); 				printf("m.  multiply       d.divide\n"); 				printf("q.quit\n"); 				scanf_s("%s", s, 2); 				ch = s[0]; 				continue; 			}  		} 		printf("Enter the operation of your choice:"); 		printf("\na.  add         s.subtract\n"); 		printf("m.  multiply       d.divide\n"); 		printf("q.quit\n"); 		scanf_s("%s", s, 2); 		ch = s[0]; 	} 	return 0; }


Question: 如何用C语言读取一个TXT文件里的特定数据

//方案一,逻辑简单粗暴 BOOL CheckStr(char *src,char *comp) { 	if(NULL==src)  return FALSE; //原串未分配 	if(NULL==comp) return FALSE; //比较串未分配 	if(*src<0x20)  return FALSE; //原串空串 	if(*comp<0x20) return FALSE; //比较串空串 	char *p1=src,*p2=src; 	char *p3=comp,*p4=comp; 	while(1)  	{ 		if(*(p4+1)<0x20) break;    //比较串串尾 		if(*p2<0x20) return FALSE; //原串比比较串还短 		p4++; 		p2++; 	} 	while(1) 	{ 		if(*p2<0x20) return FALSE; //原串扫描完成,没有匹配上串 		char *pa=p1; 		char *pb=p3; 		while(1) 		{ 			if(*pa!=*pb) break; 			if(pb==p4) return TRUE; //匹配成功 			pa++; 			pb++; 		} 		p1++; 		p2++; 	} 	return FALSE; //这里其实永远不会被执行了 }  应用 if(CheckStr(buf,"ACCE\0")) { 	printf("文本行%s里包含的串ACCE\n"); }

我是要把MATLAB转成C语言，然后在板子上跑，不是单纯的提取数据

你用EXCEL不香么 先用冒号，分成不同的列。 然后按关键字排序 也行吧

谢谢您的参考，我现在做的是要把MATLAB程序转成C程序，在MATLAB文件里他是把ACCE、GYRO、MAGN以及GNSS后面的数据一条一条的放在了矩阵里，那在C语言里我想就是放在二维数组里，我想做到就是读文件相对应的数据放在数组里，后续用的时候可以直接提取相对应的数组。因为是刚接触，所以不太会改你的这个参考，您能针对我的情况写个大概的参考嘛，万分感谢~

仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %31[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8

一行一行的读取，然后比较，比如可以比较关键字，找到ACCE


Question: 新手求助，，，谢谢 程序编译不了，求能帮忙找到错误，程序较大，另一点以发回复

谢谢谢谢

#include <conio.h> #include <stdio.h> #include <string.h> #include <stdlib.h> const int N=1000; typedef struct { 	char name[10]; 	char num[10]; 	float c; } stu; void menu() { 	system("cls");  //清屏 	printf("\n\n\n\n\t\t\t*********   c语言成绩记录薄   ***********\n"); 	printf("\t\t\t|==========================================|\n"); 	printf("\t\t\t|*************1.  录入信息  ***************|\n"); 	printf("\t\t\t|*************2.  查询成绩  ***************|\n"); 	printf("\t\t\t|*************3.  修改信息  ***************|\n"); 	printf("\t\t\t|*************4.  添加学生  ***************|\n"); 	printf("\t\t\t|*************5.  删除成绩  ***************|\n"); 	printf("\t\t\t|*************6.  显示成绩  ***************|\n"); 	printf("\t\t\t|*************7.    统计    ***************|\n"); 	printf("\t\t\t|*************0.    退出    ***************|\n"); 	printf("\t\t\t|==========================================|\n"); 	printf("\t\t\t|******************************************|\n"); 	printf("\n\n\t\t\t      请选择相应的功能<输入编号>:"); } //录入信息 void input() { 	FILE *fp; 	stu	xs;									  /*定义一个结构体变量来装从文件中读出来的数据*/ 	if((fp=fopen("d:\\作业\\C语言成绩记录簿\\c语言txt","wb"))==NULL) { 		printf("\nopen file error"); 		getchar(); 		exit(1); 		printf("\n录入格式: 姓名 学号 C语言 \n"); 		printf("当输入姓名为 end 结束录入\n"); 		while(1) { 			scanf("%s",xs.name); 			if(strcmp(xs.name,"end")==0) break;   //判断姓名是否为LAST，用字符串判断 			scanf("%s%f",&xs.num,&xs.c); 			fprintf(fp,"%s%s%f",xs.name,xs.num,xs.c);        //将成绩信息写入文件 		} 		fclose(fp); 	} } //姓名定义 void xingming() { 	FILE *fp; 	stu	xs; 	char nam[10]; 	printf("\n请输入需要查询的学生姓名: "); 	scanf("%s",nam); 	if((fp=fopen("d:\\作业\\C语言成绩记录簿\\c语言txt","rb"))==NULL) { 		printf("can't open the file!\n");exit(0); 	} 	while(!feof(fp))						   //判断文件是否到达末尾，即读取文件失败时 	{ 		fread(&xs,sizeof(stu),1,fp); 		if(strcmp(xs.name,nam)==0)//按姓名查询时判断输入的姓名是否存在，会循环从数据中找取 		{ 			printf(" 学生的信息如下:\n"); 			printf("\n%10s %6s %6s\n","姓名","学号","C语言"); 			printf("%10s %6s %6.2f\n",xs.name,xs.num,xs.c); 			break; 		} 	} 	if(feof(fp)) { 		printf("ERROR，查找失败!!!"); /*学生不存在*/ 		fclose(fp); 	} } //学号定义 void xuehao() { 	FILE *fp; 	stu	xs; 	int	num; 	printf("\n请输入需要查询的学生学号: "); 	scanf("%d",&num); 	if((fp=fopen("d:\\作业\\C语言成绩记录簿\\c语言txt","rb"))==NULL) { 		printf("can't open the file");exit(0); 	} 	while(!feof(fp)) { 		fread(&xs,sizeof(stu),1,fp); 		char numstr[10];sprintf(numstr,"%d",num); 		if(0==strcmp(xs.num,numstr))/*按学号查询时判断输入的学号是否存在，会循环从数据中找取*/ 		{ 			printf(" 学生的信息如下:\n"); 			printf("\n%10s %6s %6s\n","姓名","学号","C语言"); 			printf("%10s %6s %6.2f\n",xs.name,xs.num,xs.c); 			break; 		} 	} 	if(feof(fp)) 		printf("ERROR，查找失败!!!"); 	fclose(fp); } //查询 void search() { 	char ch1; 	system("cls"); 	printf("请选择何种方式查询<编号>:\n"); 	printf("1->姓名，2->学号:"); 	ch1=getchar();				/*用字符接收*/ 	switch(ch1)					/*判断*/ 	{ 	case '1':xingming();break; 	case '2':xuehao();break; 	} 	getch();					   /*让屏幕停留同时按任意键返回*/ } //修改:输入学生的姓名,查找该学生，若找到则修改该生的成绩信息，并显示修改前后的结果; void modify1() {  	stu	xs; 	FILE *fp; 	char name[10]; 	printf("\n请输入要修改的学生姓名: "); 	scanf("%s",name); 	if((fp=fopen("d:\\作业\\C语言成绩记录簿\\c语言txt","rb+"))==NULL) { 		printf("can't open the file!\n");exit(0); 	} 	while(!feof(fp)) { 		fread(&xs,sizeof(stu),1,fp); 		if(strcmp(xs.name,name)==0)						 /*判断输入要修改的姓名是否存在*/ 		{ 			printf(" 修改前学生的信息:\n"); 			printf("\n%10s %6s %6s\n","姓名","学号","C语言"); 			printf("%10s %6s %6.2f\n",xs.name,xs.num,xs.c); 			printf("\n请输入 C语言成绩 :"); 			scanf("%f",&xs.c); 			break; 		} 	} 	if(!feof(fp)) { 		printf(" \n 修改后的学生的信息如下:\n"); 		printf("\n%10s %6s %6s\n","姓名","学号","C语言"); 		printf("%10s %6s %6.2f\n",xs.name,xs.num,xs.c); 		fseek(fp,-sizeof(stu),1);	//负号表示后退，1表示文件当前位置 		fprintf(fp,"%s%s%f",xs.name,xs.num,xs.c);  //再重新写入，同时把之前的要修改的覆盖掉 	} else 		printf("\nERROR，学生不存在，修改失败!!"); 	fclose(fp); 	getch(); } //修改:输入学生的学号,查找该学生，若找到则修改该生的成绩信息，并显示修改前后的结果; void modify2() { 	stu	xs; 	FILE *fp; 	int	num; 	printf("\n请输入要修改的学生学号: "); 	scanf("%d",&num); 	if((fp=fopen("d:\\作业\\C语言成绩记录簿\\c语言txt","rb+"))==NULL) { 		printf("can't open the file!\n");exit(0); 	}  	while(!feof(fp)) { 		fread(&xs,sizeof(stu),1,fp); 		char numstr[10];sprintf(numstr,"%d",num); 		if(0==strcmp(xs.num,numstr))/*按学号查询时判断输入的学号是否存在，会循环从数据中找取*/ 		{ 			printf(" 修改前学生的信息如下:\n"); 			printf("\n%10s %6s %6s\n","姓名","学号","C语言"); 			printf("%10s %6s %6.2f\n",xs.name,xs.num,xs.c); 			printf("\n请输入C语言"); 			scanf("%f",&xs.c); 			break; 		} 	} 	if(!feof(fp)) { 		printf(" \n 修改后的学生的信息如下:\n"); 		printf("\n%10s %6s %6s\n","姓名","学号","C语言"); 		printf("%10s %6s %6.2f\n",xs.name,xs.num,xs.c); 		fseek(fp,-sizeof(stu),1); 		fwrite(&xs,sizeof(stu),1,fp); 	} else 		printf("\nERROR，学生不存在，修改失败!!"); 	getch(); 	fclose(fp);  } //选择修改方式 void modiway() { 	char ch1; 	system("cls"); 	printf("请输入按何种方式修改<编号>:\n"); 	printf("1->姓名，2->学号:"); 	ch1=getchar();		 /*用字符接收*/ 	switch(ch1)			 /*判断*/ 	{ 	case '1':modify1();break; 	case '2':modify2();break; 	}  	getch();/*让屏幕停留同时按任意键返回*/ } //插入:输入学生的平时的各项成绩，插入到指定位置;当指定的位置超出范围时，将其插入到全班的最后，并显示插入成功后的结果 void insert() { 	int	i=0,j,k,lenth; 	FILE *fp; 	stu	s,xs[N]; 	system("cls"); 	printf("\n请输入添加的学生的姓名:"); 	scanf("%s",&s.name); 	printf("\n学生的学号:");scanf("%s",s.num); 	printf("\n学生的成绩：C语言:");scanf("%f",&s.c); 	printf("\n请输入插入到第几行:");scanf("%d",&k); 	if((fp=fopen("d:\\作业\\C语言成绩记录簿\\c语言txt","rb"))==NULL) { 		printf("can't open the file!\n");exit(0); 	} 	while(!feof(fp)) { 		fread(&xs[i],sizeof(stu),1,fp);/*把数据读入到结构体数组中*/ 		if(feof(fp)) break; 		i++; 	} 	fclose(fp); 	lenth=i;							//记录此时lenth最大 	if(k<lenth && k>=0)					/*k的位置要位于数组范围之内*/ 	{ 		for(j=lenth-1;j>=k;j--) 			xs[j+1]=xs[j];				 /*一开始j是最大的，往后移一个这样移动避免数据被覆盖*/ 		xs[k]=s;					 /*将输入的学生信息加入这个k位置*/ 		lenth++;				   //增加一个学生空间，否则会少一个数据 		if((fp=fopen("d:\\作业\\C语言成绩记录簿\\c语言txt","wb"))==NULL) { 			printf("不能建立文件!!\n");exit(0); 		} 		for(i=0;i<lenth;i++) 			fwrite(&xs[i],sizeof(stu),1,fp);  //存入数据 	} else/*不再数组范围之内*/ 	{ 		if((fp=fopen("d:\\作业\\C语言成绩记录簿\\c语言txt","ab"))==NULL) { 			printf("不能建立文件!!\n");exit(0); 		} 		fwrite(&s,sizeof(stu),1,fp); 	} 	fclose(fp); } //显示 void print() { 	FILE *fp; 	stu	s; 	system("cls"); 	if((fp=fopen("d:\\作业\\C语言成绩记录簿\\c语言txt","rb"))==NULL) { 		printf("can't open the file!\n");exit(0); 	} 	printf("\n%10s %s %6s\n","姓名","学号","C语言"); 	while(!feof(fp)) { 		fread(&s,sizeof(stu),1,fp);	 //从文件中读取成绩信息 		if(feof(fp)) break;		  //判断是否文件尾 		printf("%10s %s %6.2f\n",s.name,s.num,s.c); 	} 	fclose(fp); 	getch(); } //删除:输入学生姓名，若该学生存在，则删除，并显示删除后余下的学生成绩信息  void delete1() {  	stu	xs[N]; 	FILE *fp; 	char name[10]; 	int	i=0,len,k=-1/*k<0是为后面if判断用的*/; 	system("cls"); 	printf("\n请输入要删除的学生姓名: ");scanf("%s",name); 	if((fp=fopen("d:\\作业\\C语言成绩记录簿\\c语言txt","rb+"))==NULL) { 		printf("can't open the file!\n");exit(0); 	} 	while(!feof(fp)) { 		fread(&xs[i],sizeof(stu),1,fp); 		if(feof(fp)) break; 		if(strcmp(xs[i].name,name)==0) k=i; 		i++; 	} 	fclose(fp);  	//以下是删除后重新写文件  	len=i;/*结构体数组上限*/ 	if(k>=0)/*k>0说明找到删除学生位置*/ 	{ 		if((fp=fopen("d:\\作业\\C语言成绩记录簿\\c语言txt","wb+"))==NULL) { 			printf("can't open the file!\n");exit(0); 		} 		for(i=0;i<len;i++) { 			if(i==k) continue;/*从这个位置开始写入*/ 			fwrite(&xs[i],sizeof(stu),1,fp); 		} 		fclose(fp); 	} else { 		printf("ERROR,删除失败!!!\n");getch(); 	} /*失败后重新返回菜单*/ 	print(); } //删除:输入学生学号，若该学生存在，则删除，并显示删除后余下的学生成绩信息  void delete2() { 	stu	xs[N]; 	FILE *fp; 	int	num; 	int	i=0,len,k=-1/*k<0是为后面if判断用的*/; 	system("cls"); 	printf("\n请输入要删除的学生学号: "); 	scanf("%d",&num); 	if((fp=fopen("d:\\作业\\C语言成绩记录簿\\c语言txt","rb+"))==NULL) { 		printf("can't open the file!\n");exit(0); 	} 	char numstr[10];sprintf(numstr,"%d",num); 	while(!feof(fp)) { 		fread(&xs[i],sizeof(stu),1,fp); 		if(feof(fp)) break; 		if(0==strcmp(xs[i].num,numstr))/*按学号查询时判断输入的学号是否存在，会循环从数据中找取*/ 			k=i; 		i++; 	} 	fclose(fp); 	//以下是删除后重新写文件  	len=i;/*结构体数组上限*/ 	if(k>=0)/*k>0说明找到删除学生位置*/ 	{ 		if((fp=fopen("d:\\作业\\C语言成绩记录簿\\c语言txt","wb+"))==NULL) { 			printf("can't openfile!\n");exit(0); 		} 		for(i=0;i<len;i++) { 			if(i==k) continue;/*从这个位置开始写入*/ 			fwrite(&xs[i],sizeof(stu),1,fp); 		} 		fclose(fp); 	} else { 		printf("ERROR,删除失败!!!\n");getch(); 	} /*失败后重新返回菜单*/ 	print(); } //删除  void deleteway() { 	char ch1; 	system("cls"); 	printf("请输入按何种方式删除:\n"); 	printf("1->姓名，2->学号:"); 	ch1=getchar();/*用字符接收*/ 	switch(ch1)/*判断*/ 	{ 	case '1':delete1();break; 	case '2':delete2();break; 	} 	getch();/*让屏幕停留同时按任意键返回*/ } //统计C语言成绩情况  void count() { 	int	i=0,j=0,k=0,l=0,m=0,n,p,q,r,t,u;   //j,k,m,l分别是指各个分数段，n,p,q,r也是 	FILE *fp; 	stu	s[N], *p1[N],*p2[N],*p3[N],*p4[N];/*用指针数组*/ 	system("cls"); 	if((fp=fopen("d:\\作业\\C语言成绩记录簿\\c语言txt","rb"))==NULL) { 		printf("can't open the file!\n");exit(0); 	} 	while(!feof(fp)) { 		fread(&s[i++],sizeof(stu),1,fp);/*读入数据*/ 		if(feof(fp)) break;	 //到文件末尾中断程序 	} 	t=i;i=0;		   //t 指最大 	for(u=0;u<t;u++)/*以下每个指针数组用于指向各分数段的学生信息*/ 	{ 		if(s[i].c<60) { 			p1[j++]=&s[i++];continue; 		}									  /*每个学生信息只能位于一个分数段*/ 		if(s[i].c>=60 && s[i].c<80)	{ 			p2[k++]=&s[i++];continue; 		} 		if(s[i].c>=80 && s[i].c<90)	{ 			p3[l++]=&s[i++];continue; 		} 		if(s[i].c>=90) { 			p4[m++]=&s[i++];continue; 		} 	} 	printf("     不及格:姓名 学号 C语言\n"); 	for(n=0;n<j-1;n++) { 		printf("%14s %4s %6.2f\n",p1[n]->name,p1[n]->num,p1[n]->c);      //逐个显示个分数段信息，显示上面指针的内容 	} 	printf(" 60-79分之间:姓名 学号 C语言\n"); 	for(p=0;p<k;p++) { 		printf("%16s %4s %6.2f\n",p2[p]->name,p2[p]->num,p2[p]->c); 	} 	printf(" 80-89分之间:姓名 学号 C语言\n"); 	for(q=0;q<l;q++) { 		printf("%16s %4s %6.2f\n",p3[q]->name,p3[q]->num,p3[q]->c); 	} 	printf("90以上:姓名 学号 C语言\n"); 	for(r=0;r<m;r++) { 		printf("%12s %4s %6.2f\n",p4[r]->name,p4[r]->num,p4[r]->c); 	} 	fclose(fp); 	getch(); } int	main() { 	FILE *fp; 	if((fp=fopen("d:\\作业\\C语言成绩记录簿\\c语言txt","wb"))==NULL) 	{ 		printf("\nopen file error"); 		getchar(); 		exit(1); 	} 	char ch; 	while(1) 	{ 		menu();// 显示菜单 		ch=getch();//选择菜单 		if(ch=='0') 		break; 		switch(ch)//判断功能项 		{ 			case '1':input();break; 			case '2':search();break; 			case '3':modiway();break; 			case '4':insert();break; 			case '5':deleteway();break; 			case '6':print();break; 			case '7':count();break; 		} 	} 	printf("\n\n\n\t\t\t\tWelcome to use,Goodbye!\02!\n"); 	return 0; }

出错信息呢？

很疑惑，自己写的代码怎么会编译不过去呢？还一下子写这么多，不应该的。  有些函数会要求对应的库函数，需要include对应的头文件。  如果是从别处拷贝的代码，建议了解一下代码的编译运行环境，比如编译器等等。然后再修改成自己编译器识别的函数。

盯住第一条出错信息，思考，改之，然后再编译。

"%14s %4s %6.2f\n",p1[n]->name,p1[n]->num,p1[n]->c);      //逐个显示个分数段信息，显示上面指针的内容 	}     printf(" 60-79分之间:姓名 学号 C语言\n");     for(p=0;p<k;p++) 	{         printf("%16s %4s %6.2f\n",p2[p]->name,p2[p]->num,p2[p]->c); 	}     printf(" 80-89分之间:姓名 学号 C语言\n");     for(q=0;q<l;q++) 	{         printf("%16s %4s %6.2f\n",p3[q]->name,p3[q]->num,p3[q]->c); 	}     printf("90以上:姓名 学号 C语言\n");     for(r=0;r<m;r++) 	{         printf("%12s %4s %6.2f\n",p4[r]->name,p4[r]->num,p4[r]->c); 	}     fclose(fp);     getch(); } int main() { FILE *fp; if((fp=fopen("d:\\作业\\C语言成绩记录簿\\c语言txt","wb"))==NULL) { printf("\nopen file error"); getchar(); exit(1); } char ch;     while(1) 	{       menu();// 显示菜单       ch=getch();//选择菜单       if(ch=='0')  		  break;       switch(ch)//判断功能项 	  {       case '1':input();break;       case '2':search();break;       case '3':modiway();break;       case '4':insert();break; 	  case '5':deleteway();break;       case '6':print();break; 	  case '7':count();break; 	  } 	}  	printf("\n\n\n\t\t\t\tWelcome to use,Goodbye!\02!\n"); 	return ; }


Question: 水仙花数

引用 4 楼 weixin_54530767 的回复:[quote=引用 1 楼 自信男孩的回复:]先求出水仙花，然后对10取余。从低位到高位，最后留出前两位就好了吧 请问可以给一下求出水仙花后的代码吗，谢谢大佬了[/quote] 你先把求水仙花的代码发出来吧，我在你的基础上做一下修改

供参考：int main() {    int m,n,sum;    for(int i=100;i<1000;i++){       m = i;       sum=0;       while(m){           n=m%10;           m/=10;           sum += n*n*n;       }       if(sum == i)printf("i=%d,%d,%d\n",i,i/100,i/10%10);    }     return 0; }

#include <stdio.h> #include <math.h>  int check_narcissus (int num, char *digit, int len) {     int tmp = num;     int sum = 0, i = 0;      while (tmp) {         sum += pow(tmp % 10, 3);         digit[i%len] = tmp % 10 + '0';         tmp /= 10;         i++;     }     if (sum == num)         return 1;      return 0; }  int main() { #if 0     int i;     char digit[3] = {0};      for (i = 100; i < 1000000; i++) {         if (check_narcissus(i, digit, 2))             printf("%d is narcissus number, %s!\n", i, digit);     }  #else     int data,hun,ten,digit,count=0;      for(data=100;data<1000;data++)     {         hun = data/100  % 10;         //ten=(data-data-hun*100);         ten = (data / 10) % 10;         digit = data%10;         //if(data==hun*hun*hun+ten*ten*ten*digit*digit*digit)         if(data==hun*hun*hun+ten*ten*ten+digit*digit*digit)             printf("%d, two bit: %d\n", data, data / 10);     }  #endif      return 0; } 供参考～  既然知道水仙数是一个三位数，求前两位不很容易吗？直接除10就能得到了，也不用我这么麻烦。  楼主的求水仙数有问题。

#include<stdio.h> int main() {    int data,hun,ten,digit,count=0;    for(data=100;data<1000;data++)       {         hun=data/100;         ten=data/10%10;       //ten=(data-data-hun*100);         digit=data%10;       //if(data==hun*hun*hun+ten*ten*ten*digit*digit*digit)         if(data==hun*hun*hun+ten*ten*ten+digit*digit*digit)           {             count++;             if(count<=2) printf("%d\n",data);           }       }     return 0; }

引用 8 楼 自信男孩的回复:[quote=引用 4 楼 weixin_54530767 的回复:][quote=引用 1 楼 自信男孩的回复:]先求出水仙花，然后对10取余。从低位到高位，最后留出前两位就好了吧 请问可以给一下求出水仙花后的代码吗，谢谢大佬了[/quote] 你先把求水仙花的代码发出来吧，我在你的基础上做一下修改[/quote] #include<stdio.h> int main() { int data,hun,ten,digit,count=0; for(data=100;data<1000;data++) { hun=data/100; ten=(data-data-hun*100); digit=data%10; if(data==hun*hun*hun+ten*ten*ten*digit*digit*digit) printf("%d",data); } return 0; }  然后后面怎么计数输出2个水仙花数我就不会了。

while (m != 0)//求m各位数字并求它们立方和             {                 o = m % 10;                 m = m / 10;                 sum = sum + o * o * o;             }                           if (sum == m)//当立方和=本身即输出

直接输出a/10就好了么。

引用 1 楼 自信男孩的回复:先求出水仙花，然后对10取余。从低位到高位，最后留出前两位就好了吧 请问可以给一下求出水仙花后的代码吗，谢谢大佬了

咦？我2楼的写法从前好用啊，为啥现在不好用了？ 哪位大佬释疑？

printf("%d\b\n",a); 了解一下？

先求出水仙花，然后对10取余。从低位到高位，最后留出前两位就好了吧


Question: 结构体无法赋值问题

这里我输入了两班这个目的地的但是只出了一班，已输入编号就直接卡住了，也不知道怎么办好。 下午就要交作业了，要崩溃了，老师讲这里都没细讲都是自己学。都很懵

引用 6 楼 自信男孩 的回复:[quote=引用 2 楼 wu5_chen 的回复:]那请问p0怎么初始化，我这些很多都是从老师给的那个例案抽出来了，然后这里又没学好  然后大佬能解释一下这段while(p0 && p0->next!=NULL&&strcmp(hb_city,p0->hb_city)!=0)是什么意思吗逻辑不是很懂为什么你要加p0&& 因为确保p0不为NULL，如果p0为NULL，主要是针对第一次循环而言的。[/quote] 现在我在订票那里卡住了他订票那不会显示出所有的订单，只有一条订单，然后一输入完乘坐航班编号就直接崩了

引用 2 楼 wu5_chen 的回复:那请问p0怎么初始化，我这些很多都是从老师给的那个例案抽出来了，然后这里又没学好  然后大佬能解释一下这段while(p0 && p0->next!=NULL&&strcmp(hb_city,p0->hb_city)!=0)是什么意思吗逻辑不是很懂为什么你要加p0&& 因为确保p0不为NULL，如果p0为NULL，主要是针对第一次循环而言的。

typedef struct hangban {     char hb_num[20];     char hb_time[20];     char hb_city[20];     int hb_price;     int hb_discount;     int hb_seat;     struct hangban *next;//hangnban改为hangban     int n; }HB;

#include<stdio.h> #include <string.h> #include <stdlib.h> #include<conio.h> #define Max 100  typedef struct hangban { 	char hb_num[20]; 	char hb_time[20]; 	char hb_city[20]; 	int hb_price; 	int hb_discount; 	int hb_seat; 	struct hangnban *next; 	int n; }HB;  typedef struct kehu { 	char kh_name[20]; 	char kh_id[20]; 	char kh_plane_num[20]; 	char kh_plane_time[20]; 	int  kh_seat_num; 	struct kehu *next; }KH;  HB *p_hb; KH *p_kh; int n=0; void Wecome(); void Admin(); void Login(); int Menu(); void Menu_select(); void Init(); void New_flight(); void query(); void booking(); void refund_ticket(); void Save(); void Save_hb(); void Save_kh(); void Load(); void Load_hb(); void Load_kh();    void Wecome()  //登录界面 { 	system("cls"); 	printf("\n\n\n\t\t================================================\n"); 	printf("\t\t==                                            ==\n"); 	printf("\t\t==                                            ==\n"); 	printf("\t\t==            欢迎使用飞机订票系统:           ==\n"); 	printf("\t\t==      Welcome to the air booking system     ==\n"); 	printf("\t\t==                                            ==\n"); 	printf("\t\t==                                            ==\n"); 	printf("\t\t================================================\n"); 	printf("\t\t按任意键进入系统..........\n"); 	getch(); 	system("cls"); }  void Admin()  //管理员系统 { 	char yn[2]; 	printf("是否进入管理员系统?(Y/N):\n"); 	printf("Do you want to enter the administrator system?(Y/N):"); 	scanf("%s",yn); 	if((strcmp(yn,"Y")==0)||(strcmp(yn,"y")==0)) 	{ 		system("cls"); 		Login(); 	}else 	{ 		system("cls"); 		Menu(); 	} }  void Login()  //管理员登陆 { 	char admin[12],mima[12]; 	char yn[2];  	printf("管理员登录模块...\n"); 	printf("Administrator login module...\n"); 	printf("请输入管理员用户名:\n"); 	printf("Please enter the administrator user name:"); 	scanf("%s",admin); 	printf("请输入管理员密码:\n"); 	printf("Please enter the administrator password:"); 	scanf("%s",mima); 	if((strcmp(admin,"123"))==0&&(strcmp(mima,"123"))==0) 	{ 		printf("用户名密码正确!!!请按任意键继续...\n"); 		printf("User name and password are correct! Please press any key to continue\n"); 		getch(); 		system("cls"); 		New_flight(); 	} 	else 	{ 		printf("用户名密码错误!!!是否继续输入用户名密码(Y/N):\n"); 		printf("User name and password error! Do you want to continue to enter user name and password (Y / N):"); 		scanf("%s",yn); 		if((strcmp(yn,"Y")==0)||(strcmp(yn,"y")==0)) 		{ 			system("cls"); 			Login(); 		} 		else 		{ 			printf("请按任意键返回界面!!!"); 			printf("Please press any key to return to the interface!!!"); 			getch(); 			system("cls"); 			Wecome(); 			Menu(); 		} 	} }  void Init() //初始化 { 	HB *p; 	p=(HB *)malloc(sizeof(HB)); 	p_hb=p;  	printf("航班信息初始化开始\n"); 	printf("航班编号:\n"); 	scanf("%s",p->hb_num); 	printf("航班起降时间:\n"); 	scanf("%s",p->hb_time); 	printf("航班目的地城市:\n"); 	scanf("%s",p->hb_city); 	printf("机票价格:\n"); 	scanf("%d",&p->hb_price); 	printf("机票享受折扣:\n"); 	scanf("%d",&p->hb_discount); 	printf("航班座位数:\n"); 	scanf("%d",&p->hb_seat);   	p->next=NULL; 	p->n=++n; 	printf("\n航班信息初始化完成!!!请按任意键继续..."); 	getch(); 	system("cls"); }  int Menu()  //菜单 { 	int dm; 	printf("\n\n\n\t\t================================================\n"); 	printf("\t\t==                                            ==\n"); 	printf("\t\t==           1------录入                      ==\n"); 	printf("\t\t==           2------查询                      ==\n"); 	printf("\t\t==           3------订票                      ==\n"); 	printf("\t\t==           4------退票                      ==\n"); 	printf("\t\t==           5------退出                      ==\n"); 	printf("\t\t==                                            ==\n"); 	printf("\t\t================================================\n"); 	printf("请输入相应编号:"); 	for(;;) 	{  		scanf("%d",&dm); 		if(dm<1||dm>5) 		{ 			printf("\t\t编号错误!!!请重新输入:!!!"); 		} 		else 			break; 	} 	return dm;   }  void Menu_select()  //菜单选择 { 	for(;;) 	{ 		switch(Menu()) 		{ 		case 5: 			system("cls"); 			Save();	 			printf("\n\n\n\t\t================================================\n"); 			printf("\t\t==                                            ==\n"); 			printf("\t\t==              文件保存成功!!!               ==\n"); 			printf("\t\t==            欢迎下次使用本系统!!!           ==\n"); 			printf("\t\t==                                            ==\n"); 			printf("\t\t================================================\n"); 			getch(); 			exit(0); 		case 1:Admin();break; 		case 2:query();break; 		case 3:booking();break; 		//case 4:refund_ticket();break; 		default:printf("\n错误!!!"); 		 		exit(0); 		} 	} }  void New_flight() //录入新航班 { 	HB *p,*p0,*p1; 	p=p1=p_hb; 	printf("新航班录入模块...\n"); 	printf("请输入您要录入的新航班信息\n"); 	p0=(HB *)malloc(sizeof(HB));  S: 	printf("航班编号:\n"); 	scanf("%s",p0->hb_num); 	 	while(strcmp(p0->hb_num,p1->hb_num)!=0&&p1->next!=NULL) 		p1=p1->next;  	if(strcmp(p0->hb_num,p1->hb_num)==0) 	{ 		printf("该航班编号已存在!!!请重新输入:"); 		goto S; 		system("cls"); 	} 	else 	{ 		printf("航班起降时间:\n"); 		scanf("%s",p0->hb_time); 		printf("航班目的地城市:\n"); 		scanf("%s",p0->hb_city); 		printf("机票价格:\n"); 		scanf("%d",&p0->hb_price); 		printf("机票享受折扣:\n"); 		scanf("%d",&p0->hb_discount); 		printf("航班座位数:\n"); 		scanf("%d",&p0->hb_seat); 		 		while(p->next)  			p=p->next; 			 		if(p_hb==NULL)  			p_hb=p0;   /*此处分两种情况,链表中没有数据,head直接指向p0处*/ 			 		else  			p->next=p0; 	  		p0->next=NULL; 	    p0->n=++n; 	} 	printf("\n新航班已录入完毕!!!请按任意键继续..."); 	getch(); 	system("cls"); 	Wecome();  }  void query()  //查询 { 	HB *p; 	int i,x; 	char city[20],num[20]; 	p=p_hb;   	printf("\n\n\n\t\t======================================================\n"); 	printf("\t\t==            查询系统:                             ==\n"); 	printf("\t\t==           1------客户ID查询                      ==\n"); 	printf("\t\t==           2------目的地查询                      ==\n"); 	printf("\t\t==           3------返回界面                        ==\n"); 	printf("\t\t==                                                  ==\n"); 	printf("\t\t==                                                  ==\n"); 	printf("\t\t==                                                  ==\n"); 	printf("\t\t======================================================\n"); 	printf("请输入编号(1-3):"); 	scanf("%d",&x); 	switch(x) 	{ 	case 1:printf("请输入您的客户ID:"); 		scanf("%s",&num); 		printf("您输入客户ID已订票的航班如下:\n"); 	case 2:printf("请输入您的目的地:"); 	scanf("%s",&city); 	printf("您输入的目的地现有航班如下:\n"); 	printf("航班编号\t起降时间\t目的地城市\t机票价格\t机票折扣\t航班座位\n");  	for(i=0;i<p->n;i++) 	{ 		if(strcmp(city,p->hb_city)==0) 		{ 			printf("%s\t%s\t%s\t%d\t%d\t%d\n",p->hb_num,p->hb_time,p->hb_city,p->hb_price,p->hb_discount,p->hb_seat); 			p=p->next;  		} 	} 	printf("航班信息打印完毕!按任意键继续下一步操作..."); 	getch(); 	system("cls"); 	Menu(); 	case 3:getch(); 		system("cls"); 		Menu(); 	 	} }  void booking()  //订票 {     HB *p0; KH *p1,*p2,*p3;     int i;     char hb_city[20],hb_time[20];     p1=p3=p_kh;     p2=(KH *)malloc(sizeof(KH)); 	p0=p_hb;    I:     printf("订票系统...\n");     printf("请输入您的客户ID:\n");     scanf("%s",p2->kh_id);     //while(strcmp(p2->kh_id,p3->kh_id)!=0&&p3->next!=NULL)   //如果p3本身就是NULL怎么办？     while(p3 && strcmp(p2->kh_id,p3->kh_id)!=0&&p3->next!=NULL)   //如果p3本身就是NULL怎么办？         p3=p3->next;     if(p3 && strcmp(p2->kh_id,p3->kh_id)==0)     {         printf("该客户ID已存在!!!请勿进行多次订票");         goto I;         system("cls");     }         printf("请输入您的名字:\n");         scanf("%s",p2->kh_name);     printf("请输入您要前往的目的地:\n");     scanf("%s", hb_city);        while(p0 && p0->next!=NULL&&strcmp(hb_city,p0->hb_city)!=0)         p0=p0->next;     if(p0 && p0->next!=NULL&&(strcmp(hb_city,p0->hb_city)!=0))     {         printf("没有前往该目的地的航班!!!");         printf("请按任意键返回\n");     }else     {         printf("您输入的目的地现有航班如下:\n");         printf("航班编号\t起降时间\t目的地城市\t机票价格\t机票折扣\t航班座位\n");           for(i=0;i<p0->n;i++)         {             if(strcmp(p0->hb_city,hb_city)==0)             {                 printf("%s\t%s\t%s\t%d\t%d\t%d\n",p0->hb_num,p0->hb_time,p0->hb_city,p0->hb_price,p0->hb_discount,p0->hb_seat);                 p0=p0->next;             }         } 		printf("请输入您要乘坐的航班编号:"); 		scanf("%s",p2->kh_plane_num); 		while(p0 && p0->next!=NULL&&strcmp(p2->kh_plane_num,p0->hb_num)!=0) 			p0=p0->next;  		for(i=0;i<p0->n;i++) 		{ 			if(strcmp(p2->kh_plane_num,p0->hb_num)==0) 			{ 				strcpy(p2->kh_plane_num,p0->hb_num); 				strcpy(p2->kh_plane_time,p0->hb_time); 				p2->kh_seat_num++; 				 			} 		}     }   } void Save() { 	Save_hb(); 	Save_kh(); }  void Save_hb() { 	FILE *fh_hb; 	HB *t,*t0; 	t=p_hb; 	if((fh_hb=fopen("hangban.txt","wb"))==NULL) 	{ 		printf("\n文件保存失败!\n请重启本系统..."); 		exit(0); 	} 	while(t!=NULL) 	{ 		if(fwrite(t,sizeof(HB),1,fh_hb)!=1)  //写入文件 		{ 			printf("\n写入文件失败!\n请重启本系统...\n"); 			t0=t; 			t=t->next; 			free(t0);  //释放所有结点 		} 	} }  void Save_kh() { 	FILE *fh_kh; 	KH *t,*t0; 	t=p_kh; 	if((fh_kh=fopen("kehu.txt","wb"))==NULL) 	{ 		printf("\n文件保存失败!\n请重启本系统..."); 		exit(0); 	} 	while(t!=NULL) 	{ 		if(fwrite(t,sizeof(KH),1,fh_kh)!=1)  //写入文件 		{ 			printf("\n写入文件失败!\n请重启本系统...\n"); 			t0=t; 			t=t->next; 			free(t0); 		} 	} }  void Load() { 	Load_hb(); 	Load_kh(); }  void Load_hb() { 	HB *p1,*p2,*p3; 	FILE *fh; 	fh=fopen("hangban.txt","rb"); 	p1=(HB *)malloc(sizeof(HB)); 	fread(p1,sizeof(HB),1,fh); 	p_hb=p3=p2=p1; 	while(! feof(fh)) 	{ 		p1=(HB *)malloc(sizeof(HB)); 		fread(p1,sizeof(HB),1,fh); 		p2->next=p1; 		p3=p2; 		p2=p1; 	} 	p3->next=NULL; 	free(p1); 	fclose(fh);  //关闭文件 }  void Load_kh() { 	KH *p1,*p2,*p3; 	FILE *fh; 	fh=fopen("kehu.txt","rb"); 	p1=(HB *)malloc(sizeof(HB)); 	fread(p1,sizeof(HB),1,fh); 	p_kh=p3=p2=p1; 	while(! feof(fh)) 	{ 		p1=(KH *)malloc(sizeof(KH)); 		fread(p1,sizeof(KH),1,fh); 		p2->next=p1; 		p3=p2; 		p2=p1; 	} 	p3->next=NULL; 	free(p1); 	fclose(fh); }  int main() { 	FILE *fh_hb,*fh_kh; 	Wecome(); 	if((fh_hb=fopen("hangban.txt","rb"))==NULL||(fh_kh=fopen("kehu.txt","rb"))==NULL) 	{ 		Init(); 	}else 		Load();  	Menu_select(); }

typedef struct hangban {     char hb_num[20];     char hb_time[20];     char hb_city[20];     int hb_price;     int hb_discount;     int hb_seat;     //struct hb *next;     struct hangban *next;     int n; }HB;  typedef struct kehu {     char kh_name[20];     char kh_id[20];     char kh_plane_num[20];     char kh_plane_time[20];     int  kh_seat_num;     //struct kh *next;     struct kehu *next; }KH; 修改结构体定义  void booking()  //订票 {     HB *p0; KH *p1,*p2,*p3;     int i;     char hb_city[20],hb_time[20];     p1=p3=p_kh;     p2=(KH *)malloc(sizeof(KH));  I:     printf("订票系统...\n");     printf("请输入您的客户ID:\n");     scanf("%s",p2->kh_id);     //while(strcmp(p2->kh_id,p3->kh_id)!=0&&p3->next!=NULL)   //如果p3本身就是NULL怎么办？     while(p3 && strcmp(p2->kh_id,p3->kh_id)!=0&&p3->next!=NULL)   //如果p3本身就是NULL怎么办？         p3=p3->next;     if(p3 && strcmp(p2->kh_id,p3->kh_id)==0)     {         printf("该客户ID已存在!!!请勿进行多次订票");         goto I;         system("cls");     }     else     {         printf("请输入您的名字:\n");         scanf("%s",p1->kh_name);     }     printf("请输入您要前往的目的地:\n");     //scanf("%s",&hb_city);     scanf("%s", hb_city);     p0 = p_hb;   //需要初始化p0     //while(p0->next!=NULL&&strcmp(hb_city,p0->hb_city)!=0)   //p0没有初始化，是一个野指针     while(p0 && p0->next!=NULL&&strcmp(hb_city,p0->hb_city)!=0)   //p0没有初始化，是一个野指针         p0=p0->next;     if(p0 && p0->next!=NULL&&(strcmp(hb_city,p0->hb_city)!=0))     {         printf("没有前往该目的地的航班!!!");         printf("请按任意键返回\n");     }else     {         printf("您输入的目的地现有航班如下:\n");         printf("航班编号\t起降时间\t目的地城市\t机票价格\t机票折扣\t航班座位\n");          for(i=0;i<p0->n;i++)         {             if(strcmp(p0->hb_city,hb_city)==0)             {                 printf("%s\t%s\t%s\t%d\t%d\t%d\n",p0->hb_num,p0->hb_time,p0->hb_city,p0->hb_price,p0->hb_discount,p0->hb_seat);                 p0=p0->next;             }         }     }  }  函数的修改  供参考～


Question: GDB脚本问题

对gdb没有或暂时不会用的显示自定义数据及其自定义数据值功能，我都是自己写一小段程序完成对应功能辅助调试的。  不要依赖调试器输出复杂数据结构！而要将复杂数据结构的整个内容在处理它的每一步使用一小段代码按自己很容易理解的格式输出，非常有助于调试！或者可以说是“基础设施”  参考： 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

gcc内嵌汇编语法？这跟gdb脚本有什么关系？能为我讲解一下吗，我是新手不是很懂


Question: 请教原型的概念，谢谢

第一，我不是大神。 第二，我的启蒙教材也是K&R系语法，而且不是你这个这么经典。我只不过走过弯路在总结教训。我后来观念的改正是零零碎碎的，不是整体读哪本书来的。所以没法推荐教材。

引用 3 楼 forever74 的回复:现代C语言和K&R C的关系，就像汉语普通话和北京腔的关系。  您要全盘照搬啊？那以后...瞧好儿吧您内～ 大神，那我该看哪本书呢？推荐下?

看在你读书认真的面子上，建议首先更换信息源/教材，然后学会辩证分析。

第二种没怎么看打过这样定义函数了，这个应该是比较老C语言标准版本支持的吧，现在的不清楚是否支持。第二种和第一种是一样的吧，只是写法不一样而已。  第三种，也不建议这样写，虽然没有定义a的类型，编译器会默认按照int处理。  不同的编译器（新旧）可能编译结果不一样，有些可能编译没问题，有些会报错。  但是和楼主要讨论的似乎没关系。三个函数都是函数定义。


Question: 请教函数传入float型，为啥返回的值不对？

double f (double a)

引用 8 楼 赵4老师 的回复:[quote=引用 7 楼 oracleperl 的回复:][quote=引用 6 楼 赵4老师 的回复:]double f (double a) 谢谢赵老师，我想请教下，我那样写错在哪里？编译并没报错。[/quote] 编译不报错是因为要兼容旧的语法规定，参数不声明类型，就默认int[/quote] 谢谢赵老师，关于参数不指定类型，默认是int的说法，我查阅了几本书，K&R 《C程序设计语言》英文版《C和指针》，谭浩强老师的《C程序设计》 都没做说明，或许我没看到，是否有“官方文档”或者这基本书籍上有相关说明  另外，如果一个函数 没有指定返回类型，那么默认返回类型是int，这个K&R 《C程序设计语言》里有明确说明  谢谢赵老师

楼主的程序，在g++，gcc下编译均不能通过。提示a没有类型。

引用 7 楼 oracleperl 的回复:[quote=引用 6 楼 赵4老师 的回复:]double f (double a) 谢谢赵老师，我想请教下，我那样写错在哪里？编译并没报错。[/quote] 编译不报错是因为要兼容旧的语法规定，参数不声明类型，就默认int

引用 6 楼 赵4老师 的回复:double f (double a) 谢谢赵老师，我想请教下，我那样写错在哪里？编译并没报错。

你的思路仍然有问题。  比如说，我是说假如 有本家长手册，上面写着：可以吓唬孩子说再不听话就打断他的腿，但是你不能真的打断他的腿。 这句话被孩子看到了，作为正常孩子，难道还去测试一下，故意不听话会不会被亲爹打断腿？  我的意思是，咱学习是为了写正确的代码，没必要急于研究每一种错误的写法为什么错，是怎么错的。 一方面还有大把的算法啊什么的天空等着咱去征服； 另一方面随着学习逐步前进，有些事“等你长大了自然就明白了”。

引用 3 楼 forever74 的回复:稍稍思考一下，猿s和编译器从某个恰当的角度看，是处于对立状态的。 K&R当年的那段描述是在建议编译器应该如何迁就懒惰的猿s，其实那话儿根本就不是写给猿s的，也不该作为猿s偷懒的借口。  你都下决心学C语言了，难道你还承认自己懒惰，偏偏懒得写一个类型名？ 一头合格的C猿，压根不会考虑偷那点小懒。 不是偷懒，是想搞明白为什么。。

为你超强的方向感鼓掌。  现代的我们读经典的时候也要辩证，也要批判地继承嘛。  读K&R更多的是感受其中的艺术气息--BTW,翻译过程很难保证这一点，建议原文。 而不是当作教材。

make c cc     c.c   -o c c.c: In function ‘f’: c.c:4:8: warning: type of ‘a’ defaults to ‘int’ [-Wimplicit-int]  double f (a)  这是编译过程和结果；make按照C语言的语法编译的，G++不支持楼主的这种方法。通过编译结果可以确定，形参a当成int处理。  结果是result is=1.000000   看到楼主最近在纠结“函数原型”这个名词，看书不建议钻牛角尖，编程还是要注重实践，有些名词，定义不明白，可以先放放，后面的学习和实践中会慢慢解决你之前的疑问，另外，实践也要去指导理论，将两者相结合来学习吧


Question: 静电场分析

请问这个该怎么写呢

C语言写操作系统都没问题，你还用得着怀疑它？？？


Question: dalao们帮忙看看这个链表哪里有问题orz~

#include<stdio.h> #include<string.h> #include<stdlib.h> #define N 5 typedef struct stuNode {     char ID[15];     char name[10];     char sex[4];     char grade[5];     char major[20];     struct stuNode *next; }stuNode, * stuNodeP; stuNodeP headStu; #define LEN sizeof(stuNode) stuNodeP Create_StuList(int n) {     int i;     stuNodeP headStu;     stuNodeP p0, p1;     headStu = p0 = (stuNode *)malloc(LEN);     for (i = 1; i <= n; i++)     {         p1 = (stuNode *)malloc(LEN);         printf("请输入学生的学号，姓名，性别，班级，专业：\n");         scanf("%s%s%s%s%s",p1->ID,p1->name,p1->sex,p1->grade,p1->major);         p0->next = p1;         p0 = p1;     }     p1->next = NULL;     return headStu; } stuNodeP delete_StuList(stuNodeP headStu, char delID[15]) {     stuNodeP lp=0, p=0;      lp = headStu;     p = lp->next;      puts(delID);     while (p && strcmp(p->ID, delID) != 0) {         //puts(p->ID);         lp = p;         p = p->next;     }     if (!p) {         printf("没有查找到该名学生，无法删除！\n");         return headStu;     }     lp->next = p->next;     free(p);      /*     while ((strcmp(p->ID, delID) != 0) && (p->next != NULL))     {         lp = p;         p = p->next;     }     if (strcmp(p->ID, delID) == 0)     {         lp->next = p->next;         free(p);     }     else         printf("没有查找到该名学生，无法删除！\n");     */     return headStu; }  /* 添加有序，但是创建链表的时候并没有按照有序操作的，所以这里不能保证一直有意义*/ stuNodeP add(stuNodeP headStu, char newID[15]) {     stuNodeP p = headStu, q = headStu->next;     stuNodeP newstuNode;       newstuNode = (stuNode *)malloc(sizeof(LEN));     strcpy(newstuNode->ID, newID);     printf("请输入学生的学号，姓名，性别，班级，专业：");     scanf("%s%s%s%s%s",newstuNode->ID, newstuNode->name, newstuNode->sex, newstuNode->grade, newstuNode->major);      while (q && strcmp(q->ID, newID) < 0) {         p = p->next;         q = q->next;     }      if (!q) {         p->next = newstuNode;         newstuNode->next = NULL;         return headStu;     }      newstuNode->next = q;     p->next = newstuNode;      /*     //while((strcmp(q->ID, newID) < 0) && (q->next != NULL));   //多一个分号     while((strcmp(q->ID, newID) < 0) && (q->next != NULL))     {         p = p->next;         q = q->next;     }     newstuNode = (stuNode *)malloc(sizeof(LEN));     strcpy(newstuNode->ID, newID);     printf("请输入学生的学号，姓名，性别，班级，专业：");     scanf("%s%s%s%s%s",newstuNode->ID, newstuNode->name, newstuNode->sex, newstuNode->grade, newstuNode->major);     if (strcmp(q->ID, newID) < 0)         p = q;     newstuNode->next = p->next;     p->next = newstuNode;     */     return headStu; } void show(stuNodeP headStu) {     int num=0;     stuNode *p;     p = headStu->next;     while (p != NULL)     {         printf("%d:%s,%s,%s,%s,%s\n",++num, p->ID, p->name, p->sex, p->grade, p->major);         p = p->next;     } } int main() {     stuNodeP head;     char ID[15];     head = Create_StuList(N);     show(head);     printf("请输入要删除学生的学号信息：\n");     //scanf("%s", &ID);     scanf("%s", ID);     //head = delete_StuList(headStu, ID);     head = delete_StuList(head, ID);     show(head);     //head = add(headStu,ID);     head = add(head,ID);     show(head);     return 0; } 供参考～

谢谢老师了~

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

有个报错， 引发了异常: 读取访问权限冲突。 **lp** 是 nullptr。


Question: 新手求助 我这个程序是编制一个C语言成绩记录簿，每个学生信息包括：学号、姓名、C语言成绩。由于字数限制，程序不完整的地方评论接

求求各位了，救救宝宝吧

}     printf(" 60-79分之间:姓名 学号 C语言\n");     for(p=0;p<k;p++) 	{         printf("%16s %4d %6.2f\n",p2[p]->name,p2[p]->num,p2[p]->c); 	}     printf(" 80-89分之间:姓名 学号 C语言\n");     for(q=0;q<l;q++) 	{         printf("%16s %4d %6.2f\n",p3[q]->name,p3[q]->num,p3[q]->c); 	}     printf("90以上:姓名 学号 C语言\n");     for(r=0;r<m;r++) 	{         printf("%12s %4d %6.2f\n",p4[r]->name,p4[r]->num,p4[r]->c); 	}     fclose(fp);     getch(); } int main() { FILE *fp; if((fp=fopen("d:\\作业\\C语言成绩记录簿\\c语言txt","wb"))==NULL) { printf("\nopen file error"); getchar(); exit(1); } char ch;     while(1) 	{       menu();// 显示菜单       ch=getch();//选择菜单       if(ch=='0')  		  break;       switch(ch)//判断功能项 	  {       case '1':input();break;       case '2':search();break;       case '3':modiway();break;       case '4':insert();break; 	  case '5':deleteway();break;       case '6':print();break; 	  case '7':count();break; 	  } 	}  	printf("\n\n\n\t\t\t\tWelcome to use,Goodbye!\02!\n"); 	return ; }


Question: 请教为啥说“函数调用的参数是表达式”？谢谢

表达式是个含义很广的概念。  说一台全自动的...的洗衣机是个equipment也对吧？

建议楼主确定一下表达式的定义。找一下表达式的定义。  F（10）这里的10按照什么类型，char, unsigned char， int， unsigned int都能表示10这个数，那么它是int，因为默认是按照int处理的。那么这是第一步，第二步还要看函数F的形参，它是什么类型，如果是char，那么如果这个实参是129，那么可能就会被截断。  这就是“把参数传递给函数时也可能进行类型转换”这句话的理解～

比如定义函数void Func(int x)，只接受int类型的变量，但是调用时传入Func(10+0.2)，会将10+0.2的结果（double类型）自动转换成int类型。 这里10+0.2其实就是表达式，所以说“函数调用的参数是表达式”没有问题。  这句话的重点应该是“在把参数传递给函数时也可能进行类型转换”，重点理解这句就对了。

10 你想说立即数吧? 那立即数也是表达式没毛病

MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl


Question: 将结构体数据录入文件中出现问题

引用 1 楼 user-3的回复:直接贴代码不好吗，报错信息是啥，波浪线的提示是什么，是不是没有包含相应的头文件？ 没有报错，程序可以运行，但输入后的数据存不到打开的文件中

引用 1 楼 user-3的回复:直接贴代码不好吗，报错信息是啥，波浪线的提示是什么，是不是没有包含相应的头文件？ 不知道怎么贴😂😂

引用 2 楼 qzjhjxj 的回复:供参考：#include <stdio.h> #include <stdlib.h>  typedef struct staffmessages{         long worknum;         char name[10];         int  award;//基本工资         int  award1;//职务工资         int  award2;//岗位津贴         int  award3;//特殊津贴         int  award4;//工资 }STA;  int printdata(STA sta1[]) {     int i=1,a=0;     for(;;){        printf("请输入工号:");        fflush(stdout);        rewind(stdin);        scanf("%ld",&sta1[a].worknum);//scanf_s("%ld",&sta1[a].worknum);        printf("请输入姓名:");        fflush(stdout);        rewind(stdin);        scanf("%s",sta1[a].name);//scanf_s("",sta1[a].name,sizoef(sta1.[a].name));        printf("请输入基本工资:");        fflush(stdout);        rewind(stdin);        scanf("%d",&sta1[a].award);//scanf_s("%d",&sta1[a].award);        printf("请输入职务工资:");        fflush(stdout);        rewind(stdin);        scanf("%d",&sta1[a].award1);//scsnf_s("%d",&sta1[a].award1);        printf("请输入岗位津贴:");        fflush(stdout);        rewind(stdin);        scanf("%d",&sta1[a].award2);//scanf_s("%d",&sta12[a].award2);        printf("请输入特殊津贴:");        fflush(stdout);        rewind(stdin);        scanf("%d",&sta1[a].award3);//scanf_s("%d",&sta1[a].award3);         sta1[a].award4=sta1[a].award + sta1[a].award1 + sta1[a].award2 + sta1[a].award3;        printf("工资:%d\n",sta1[a].award4);        a++;        printf("是否继续录入(如是则输入1，否则输入0):");        fflush(stdout);        rewind(stdin);        scanf("%d",&i);//scanf_s("%d",&i);        if(i==0) break;     }     return a; }  void writetofile(STA sta1[],int a) {     FILE *fp;     int i;     fp=fopen("cb.txt","w");     if(fp == NULL){//if(fopen_s(&fa,"cb.txt","w")==NULL){        printf("Failure to open text");        exit(0);     }     for(i=0;i<a;i++){       fprintf(fp,"%10ld%8s%5d%5d%5d%5d%5d",       sta1[i].worknum,sta1[i].name,sta1[i].award,sta1[i].award1,sta1[i].award2,sta1[i].award2,sta1[i].award3,sta1[i].award4);     }     fclose(fp); }  int main(void) {    //FILE *fp;    STA sta[100];    int b;    b=printdata(sta);    writetofile(sta,b);     return 0; } vs里不支持scanf吧。  另外：fflush(stdout);这个是做什么？


Question: 小白求大佬带

引用 1 楼 qzjhjxj 的回复:蹭分，供参考：#include<stdio.h> int main() {     int n,k,i;     int a[100]={0};     scanf("%d %d",&n,&k);     for(i=0;i<n;i++)       scanf("%d",&a[i]);      for(i=0;i<n;i++)       if(a[i]>k) printf("%d ",a[i]);     printf("\n");      return 0; } 如果先确定某个数是多少，那么没必要用用数组了，直接根据输入的数据比较，大于的直接输出。  另外，如果n>100呢，是否需要考虑是否越界呢，所以如果先确定某个数的值，不建议用数组了，用了反而给自己找了麻烦，因为需要确定n是否大于你定义的数组长度。


Question: C语言编写

struct StudentInfo {     int number; // 学号     char name[20]; // 姓名     char gender; // 性别     int age; // 年龄     int grade; // 年级     int consume; // 年消费     char phone[12]; // 联系电话 }Stu[10]; 结构体数组定义好了，加油！

有没有兄弟能帮我

用C语言写第十题

看题目要求主要用到结构体数组、文件、排序这些知识点，建议自己按模块写代码，遇到出错的地方不会解决再来求助，让别人从头给你写代码，虽然不难，但估计没人愿意写。


Question: 请教C的函数，什么是“有函数原型”，什么是“没有函数原型”？谢谢

ISO/IEC 9899:2018, p28.： 6.2.1 Scopes of identifiers A function prototype is a declaration of a function that declares the types of its parameters.

引用 6 楼 oracleperl 的回复:[quote=引用 3 楼 均陵鼠侠 的回复:] 因为函数有原型声明，所以在调用时，编译器可以知道传入的参数应该如何转换。  谢谢大神，请教下：  如下称作没有有函数原型？ float f (a, b) {     return a * b; }  float f (a, b) int a,b; {     return a * b; }  如下称作有函数原型？ float f (int a, int b) {     return a * b; }  那么 float f (a, b) int a,b; {     return a * b; } 和 float f (int a, int b) {     return a * b; } 有区别吗？不都是定义了形参的类型为int了吗？ [/quote]  这方面的问题还是得紧扣定义。 “带有参数类型声明的函数声明叫做函数原型（prototype）” 不管是有函数体的函数声明，还是无函数体的函数声明，只要声明了参数的类型，就是函数原型。

引用 3 楼 均陵鼠侠 的回复:因为函数有原型声明，所以在调用时，编译器可以知道传入的参数应该如何转换。  谢谢大神，请教下：  如下称作没有有函数原型？ float f (a, b) {     return a * b; }  float f (a, b) int a,b; {     return a * b; }  如下称作有函数原型？ float f (int a, int b) {     return a * b; }  那么 float f (a, b) int a,b; {     return a * b; } 和 float f (int a, int b) {     return a * b; } 有区别吗？不都是定义了形参的类型为int了吗？

If the expression that denotes the called function has a type that does not include a prototype, the integer promotions are performed on each argument, and arguments that have type float are promoted to double. These are called the default argument promotions.

在C语言标准化之前，函数的声明是这样的，即使它实际上带有参数：  # include <stdio.h>  float f  ();            //K&R 的传统函数声明  int main () {     printf ("%.2f\n", f (2, 3));    //2和3按照它们本来的类型int传入，而不是转换为float传入，所以计算结果是错误的。     return 0; }  float f (a, b) float a, b; {     return a * b; }   显然，因为传统的函数声明里没有参数声明，函数调用时不知道参数如何传进去。只能按照默认，char和short转换为int，float转换为double。 标准化的C语言引入了函数原型，即，要求函数的声明中必须有参数类型的说明： # include <stdio.h>  float f  (float, float);            //标准化之后的原型声明，带有参数类型。  int main () {     printf ("%.2f\n", f (2, 3));           //2和3从int转换为float之后传入，所以计算结果是正确的。     return 0; }  float f (float a, float b)                 //标准化之后的函数定义 {     return a * b; }   因为函数有原型声明，所以在调用时，编译器可以知道传入的参数应该如何转换。

倒是没听说过“没有函数原型”的描述，没这个词吧。

函数原型可以理解为函数定义，函数定义时会定义参数的类型，char 和short转int，是因为int的范围比char short的范围大，有时候会自动转换；  没有函数原型，那就是没有定义了。


Question: 请教哪里有标准C的官方文档，我想整体全面学习标准C的所有函数，谢谢

引用 6 楼 均陵鼠侠 的回复:叽叽喳喳，答非所问，成何体统！ C标准是要收费的。C99的标准网上可以搜到，很多；C11最后提交的讨论草案是N1570，搜索N1570.pdf或者直接搜索C11；C18的可以搜索ansi 的C18，这个是ANSI的正版文档。 谢谢。 c18 搜不到，有官网吗？如果是付费下载，我可以付费的

互喷，而且只有互喷，才是我们事业进步的动力和法宝，才能使我们IT人永葆青春！

只有互喷，才能增加CSDN C/C++论坛的热度。

不，“屁话篓子”对你更精确一点。

引用 16 楼 赵4老师 的回复:[quote=引用 15 楼 均陵鼠侠 的回复:][quote=引用 14 楼 赵4老师 的回复:]不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  迷信CPU？有些CPU是有缺陷的； 迷信编译器？有些编译器是有BUG的； 迷信调试器？有些调试器会莫名其妙崩掉； 迷信运行结果？未定义的行为在不同的机器上有不同的结果，我该信哪一个呢？ 就在昨天，我听说你迷信的某些CPU被Linux剔除了。[/quote] 送你一个雅号——“杠精”[/quote]   我也送你一个雅号：屁话大王。

引用 15 楼 均陵鼠侠 的回复:[quote=引用 14 楼 赵4老师 的回复:]不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  迷信CPU？有些CPU是有缺陷的； 迷信编译器？有些编译器是有BUG的； 迷信调试器？有些调试器会莫名其妙崩掉； 迷信运行结果？未定义的行为在不同的机器上有不同的结果，我该信哪一个呢？ 就在昨天，我听说你迷信的某些CPU被Linux剔除了。[/quote] 送你一个雅号——“杠精”

引用 14 楼 赵4老师 的回复:不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  迷信CPU？有些CPU是有缺陷的； 迷信编译器？有些编译器是有BUG的； 迷信调试器？有些调试器会莫名其妙崩掉； 迷信运行结果？未定义的行为在不同的机器上有不同的结果，我该信哪一个呢？ 就在昨天，我听说你迷信的某些CPU被Linux剔除了。

说到过时，  由于标准的向后兼容性，除了一些安全问题造成的特例以外，越老的标准写出来的代码其实就（在不同编译器和系统）越通用。 请注意我说的是标准，不是希望保留历史上遗留下来的糟粕级代码写法。  举个例子，如果你有很ANSI的习惯，在语句块开头集中声明局部变量，然后再开始写执行类语句，那么你就无需在这个问题上担心编译器种类和版本。

https://zh.cppreference.com/w/c/header 楼上网站的数据太老 早就过时了

计算机学术讨论组 312811740 这个群里有C标准文档。C18和C11差别不大，C18主要是对C11做了技术修正和澄清，没有加入什么新特性。当然，C18和C11还是有些问题的，比如原子类型和原子操作的表述还是有问题。下一个版本应该能解决。说到库函数，顺便说一下，C11删除了gets函数。

引用 9 楼 oracleperl 的回复:[quote=引用 8 楼 均陵鼠侠 的回复:][quote=引用 5 楼 赵4老师 的回复:]MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO  微软公司和C语言基本上是没啥关系了。从C99开始，就和C语言新标准分道扬鏣了。C++之类的，才是微软的亲儿子。[/quote] C程序，不都是可以用VS2010编译的吗？咋会没关系呢？[/quote]  VS2010支持的是C++吧，你该不会觉得它是C编译器吧。不过你可以试试下面的程序它能不能编译过去：  int main (void) {     printf (_Generic (666, int : (char []) {"int!"}, default : "Unknown."));     quick_exit (0); }

引用 10 楼 oracleperl 的回复:[quote=引用 6 楼 均陵鼠侠 的回复:]叽叽喳喳，答非所问，成何体统！ C标准是要收费的。C99的标准网上可以搜到，很多；C11最后提交的讨论草案是N1570，搜索N1570.pdf或者直接搜索C11；C18的可以搜索ansi 的C18，这个是ANSI的正版文档。 请教，要收费的是啥意思啊？想看这个标准要付费吗？[/quote]  ISO/IEC 的标准文档，是需要花钱购买的，即使是PDF文件。折合人民币1500块吧。但是网上有草案，跟正式文档差不太多，可以参考。标准文档的后面就是C标准库，包含了所有标准库函数。标准里有的函数才是标准库函数，你从网上查的函数，如果是标准里没有的，就是野函数。

引用 6 楼 均陵鼠侠 的回复:叽叽喳喳，答非所问，成何体统！ C标准是要收费的。C99的标准网上可以搜到，很多；C11最后提交的讨论草案是N1570，搜索N1570.pdf或者直接搜索C11；C18的可以搜索ansi 的C18，这个是ANSI的正版文档。 请教，要收费的是啥意思啊？想看这个标准要付费吗？

引用 8 楼 均陵鼠侠 的回复:[quote=引用 5 楼 赵4老师 的回复:]MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO  微软公司和C语言基本上是没啥关系了。从C99开始，就和C语言新标准分道扬鏣了。C++之类的，才是微软的亲儿子。[/quote] C程序，不都是可以用VS2010编译的吗？咋会没关系呢？

引用 5 楼 赵4老师 的回复:MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO  微软公司和C语言基本上是没啥关系了。从C99开始，就和C语言新标准分道扬鏣了。C++之类的，才是微软的亲儿子。

MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl


Question: 为啥switch语句输入什么都是执行default

引用 6 楼 qzjhjxj的回复: 第二个在发帖之前改过了，不过手机上还没改，不过第一个确实没发现，vc也没报错，现在改过来程序对了，万分感谢

void keyDown() {     int userkey;     struct student tempData;     //scanf("%d,&userkey");     scanf("%d", &userkey);     if (userkey < 0 || userkey > 5) {         return;     }     userkey += '0';      switch(userkey)     {         case '0':             printf("\t\t0.【退出系统】\n");             system("pause");             exit(0);         case '1':             printf("\t\t1.【插入信息】\n");             printf("请输入学生的学号，姓名，项目，奖励。");             scanf("%d%s%s%d",tempData.num,tempData.name,tempData.preject,tempData.reward);             struct Node* list;   insertNodeByHead(list,tempData);             saveinfotofile("student.txt",list);             break;         case '2':             printf("\t\t2.【浏览信息】\n");             printlist(list);             break;         case '3':             printf("\t\t3.【删除信息】\n");             printf("请输入要删除的学生的姓名:");             scanf("%s",tempData.name);             deleteNodeByAppoinName(list,tempData.name);             saveinfotofile("student.txt",list);             break;         case '4':             printf("\t\t4.【修改信息】\n");             printf("请输入要修改学生的学号:");             scanf("%s",tempData.num);             if(searchNodeByAppoinNum(list,tempData.num)==NULL)                 printf("未找到相关信息");              else             {                 struct Node* curNode=searchNodeByAppoinNum(list,tempData.num);                 printf("请输入新的学生奖励信息：学号，姓名，项目，奖励");                 scanf("%d%s%s%d",curNode->data.num,curNode->data.name,curNode->data.preject,curNode->data.reward);                 saveinfotofile("student.txt",list);             }             break;         case '5':             printf("\t\t5.【查找信息】\n");             printf("请输入要查找学生的学号：");             scanf("%s",tempData.num);             if(searchNodeByAppoinNum(list,tempData.num)==NULL)                 printf("未找到相关信息");             else                 printNode(searchNodeByAppoinNum(list,tempData.num));         default :             printf("输入错误请重新输入\n");     } }  供参考～

计算机中，‘0’！=0，一个是字符，一个是数字，不同的ascii值。

把每一句case语句后面'0'的单引号去掉。case 0:

单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

引用 1 楼 chxchxkkk的回复:把每一句case语句后面'0'的单引号去掉。case 0: 试过了，没用，


Question: 请教 2.1*3 这里的2.1是float型还是double型？谢谢

引用 9 楼 赵4老师 的回复: 谢谢赵老师

引用 1 楼 user-4 的回复:2.1为double 2.1f为float 引用 7 楼 均陵鼠侠 的回复:我不敢保证国内的大学教授是否见过或者看过C标准。路子不是一般的“野”。 谢谢，现在好像有C18了，哪里可以C标准的完整文档呢？ 谢谢

我不敢保证国内的大学教授是否见过或者看过C标准。路子不是一般的“野”。

C Integer Constants An “integer constant” is a decimal (base 10), octal (base 8), or hexadecimal (base 16) number that represents an integral value. Use integer constants to represent integer values that cannot be changed.  Syntax  integer-constant :  decimal-constant integer-suffix opt octal-constant integer-suffix opt hexadecimal-constant integer-suffix opt  decimal-constant :  nonzero-digit decimal-constant digit  octal-constant :  0 octal-constant octal-digit  hexadecimal-constant :  0x hexadecimal-digit 0X hexadecimal-digit hexadecimal-constant hexadecimal-digit  nonzero-digit : one of  1 2 3 4 5 6 7 8 9  octal-digit : one of  0 1 2 3 4 5 6 7  hexadecimal-digit : one of  0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F  integer-suffix :  unsigned-suffix long-suffix opt long-suffix unsigned-suffix opt   unsigned-suffix : one of  u U  long-suffix : one of  l L  64-bit integer-suffix :  i64  Integer constants are positive unless they are preceded by a minus sign (–). The minus sign is interpreted as the unary arithmetic negation operator. (See Unary Arithmetic Operators in Chapter 4 for information about this operator.)  If an integer constant begins with the letters 0x or 0X, it is hexadecimal. If it begins with the digit 0, it is octal. Otherwise, it is assumed to be decimal.   The following lines are equivalent:  0x1C   /* = Hexadecimal representation for decimal 28 */ 034    /* = Octal representation for decimal 28 */  No white-space characters can separate the digits of an integer constant. These examples show valid decimal, octal, and hexadecimal constants.   /* Decimal Constants */ 10 132 32179  /* Octal Constants */ 012 0204 076663  /* Hexadecimal Constants */ 0xa or 0xA 0x84 0x7dB3 or 0X7DB3

常量当然也有类型： C Floating-Point Constants A “floating-point constant” is a decimal number that represents a signed real number. The representation of a signed real number includes an integer portion, a fractional portion, and an exponent. Use floating-point constants to represent floating-point values that cannot be changed.   Syntax  floating-point-constant :  fractional-constant exponent-part opt floating-suffix opt digit-sequence exponent-part floating-suffix opt  fractional-constant :  digit-sequence opt . digit-sequence digit-sequence .  exponent-part :  e sign opt digit-sequence E sign opt digit-sequence  sign : one of  +  –  digit-sequence :  digit digit-sequence digit  floating-suffix : one of  f  l  F  L  You can omit either the digits before the decimal point (the integer portion of the value) or the digits after the decimal point (the fractional portion), but not both. You can leave out the decimal point only if you include an exponent. No white-space characters can separate the digits or characters of the constant.   The following examples illustrate some forms of floating-point constants and expressions:  15.75 1.575E1   /* = 15.75   */ 1575e-2   /* = 15.75   */ -2.5e-3   /* = -0.0025 */ 25E-4     /* =  0.0025 */  Floating-point constants are positive unless they are preceded by a minus sign (–). In this case, the minus sign is treated as a unary arithmetic negation operator. Floating-point constants have type float, double, long, or long double.  A floating-point constant without an f, F, l, or L suffix has type double. If the letter f or F is the suffix, the constant has type float. If suffixed by the letter l or L, it has type long double. For example:     100L  /* Has type long double  */ 100F  /* Has type float        */ 100D  /* Has type double       */  Note that the Microsoft C compiler maps long double to type double. See Storage of Basic Types in Chapter 3 for information about type double, float, and long.  You can omit the integer portion of the floating-point constant, as shown in the following examples. The number .75 can be expressed in many ways, including the following:  .0075e2 0.075e1 .075e1 75e-2

2.1 ×3默认是按照double（高一级的精度）来处理的。除非指定，比如2.1f * 3这是按照float类型来计算的。

2.1为double 2.1f为float


Question: 请教下，powf()和powl() 函数有啥用？谢谢

处理的范围不一样，可以找一下这些函数的原型，可以看到函数的形参和返回值类型；         #include <math.h>         double pow(double x, double y);        float powf(float x, float y);        long double powl(long double x, long double y);

对于c++标准来说计算精度不一样，pow针对double,powf 参数是long double 在vs下 double = long double 都是64位 在gcc 64位下long double 128位 c++标准里面long double 是80位

遗留下来的函数吧，原来C是没有函数重载的，并不支持同名不同参的函数，所以很多旧的C语言代码就大量使用这种把参数类型加到函数名的方式对函数归类，比如你给的这两个函数，powf中f代指pow float，powl代指 pow long float（double）


Question: c语言问题

引用 3 楼 弓人水的回复:1、c=getchar()          // getchar() 得到 1，赋值给c后c = '1' 2、getchar()!='#'      // getchar() 得到 2，不等于'#'条件成立，进入循环体 3、putchar(c)           // 控制台打印c：1 4、进入第二次循环，赋值语句是for的第三个表达式 5、c=getchar()        // getchar() 得到 3，赋值给c后c = '3' 6、getchar()!='#'      // getchar() 得到 4，不等于'#'条件成立，进入循环体 7、putchar(c)           // 控制台打印c：3 8、进入第三次循环，赋值语句是for的第三个表达式 9、c=getchar()        // getchar() 得到 5，赋值给c后c = '5' 10、getchar()!='#'      // getchar() 得到 #，不等于'#'条件不成立了，退出循环体 11、退出main，控制台打印结果：13 感谢感谢

第一个是'1'，赋值给c，判断又有一个getchar();因此是'2'  != '#'，输出'1'，c = getchar();继续是'3',赋值给c；判断'4' != '#'  输出'3'，'5'赋值给c，'#' != '#'为假，退出，综上所述，输出应该是'1' '3'，即13

for语句3个表达式第一个是赋初值第二个是判断第三个是循环执行


Question: C语言的几道特别简单的题

几道特别简单的题，就不要发上来了。 浪费CSDN资源，浪费网友时间。 地地道道的损人不利己。


Question: 哪位大神帮我看一下？

fflush(stdin);

我5楼说的不算哈，当时貌似走神中。 咋没人直我的罗锅捏？

//请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

借鉴论坛赵老师的经验总结： 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);

引用 1 楼 forever74 的回复:第一次它得到的是前一个scanf后面剩下在缓冲区里的回车。请问怎么解决这个问题啊，我是个新手

第一次它得到的是前一个scanf后面剩下在缓冲区里的回车。


Question: 求一个字符串处理的程序

引用 5 楼 merry_via 的回复:有个strtok函数了解下 strtok已经被我升级了： #include <stdio.h> #include <string.h> char string[80]; char seps1[3]; char seps2[3]; char *token; char *zzstrtok (     char *string,     const char *control1,//连续出现时视为中间夹空token     const char *control2 //连续出现时视为中间无空token     ) {     unsigned char *str;     const unsigned char *ctrl1 = (const unsigned char *)control1;     const unsigned char *ctrl2 = (const unsigned char *)control2;     unsigned char map1[32],map2[32];     static char *nextoken;     static char flag=0;     unsigned char c;     int L;      memset(map1,0,32);     memset(map2,0,32);     do {         map1[*ctrl1 >> 3] |= (1 << (*ctrl1 & 7));     } while (*ctrl1++);     do {         map2[*ctrl2 >> 3] |= (1 << (*ctrl2 & 7));     } while (*ctrl2++);      if (string) {         if (control2[0]) {             L=strlen(string);             while (1) {                 c=string[L-1];                 if (map2[c >> 3] & (1 << (c & 7))) {                     L--;                     string[L]=0;                 } else break;             }         }         if (control1[0]) {             L=strlen(string);             c=string[L-1];             if (map1[c >> 3] & (1 << (c & 7))) {                 string[L]=control1[0];                 string[L+1]=0;             }         }         str=(unsigned char *)string;     }     else str=(unsigned char *)nextoken;      string=(char *)str;     while (1) {         if (0==flag) {             if (!*str) break;             if (map1[*str >> 3] & (1 << (*str & 7))) {                 *str=0;                 str++;                 break;             } else if (map2[*str >> 3] & (1 << (*str & 7))) {                 string++;                 str++;             } else {                 flag=1;                 str++;             }         } else if (1==flag) {             if (!*str) break;             if (map1[*str >> 3] & (1 << (*str & 7))) {                 *str=0;                 str++;                 flag=0;                 break;             } else if (map2[*str >> 3] & (1 << (*str & 7))) {                 *str=0;                 str++;                 flag=2;                 break;             } else str++;         } else {//2==flag             if (!*str) return NULL;             if (map1[*str >> 3] & (1 << (*str & 7))) {                 str++;                 string=(char *)str;                 flag=0;             } else if (map2[*str >> 3] & (1 << (*str & 7))) {                 str++;                 string=(char *)str;             } else {                 string=(char *)str;                 str++;                 flag=1;             }         }     }     nextoken=(char *)str;      if (string==(char *)str) return NULL;     else                     return string; } void main() {     strcpy(string,"A \tstring\t\tof ,,tokens\n\nand some  more tokens, ");     strcpy(seps1,",\n");strcpy(seps2," \t");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,"1234| LIYI|China | 010 |201110260000|OK");     strcpy(seps1,"|");strcpy(seps2," ");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,"1234|LIYI||010|201110260000|OK");     strcpy(seps1,"");strcpy(seps2,"|");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,"1234|LIYI||010|201110260000|OK");     strcpy(seps1,"|");strcpy(seps2,"");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,"a");     strcpy(seps1,",");strcpy(seps2,"");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,"a,b");     strcpy(seps1,",");strcpy(seps2,"");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,"a,,b");     strcpy(seps1,",");strcpy(seps2,"");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,",a");     strcpy(seps1,",");strcpy(seps2,"");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,"a,");     strcpy(seps1,",");strcpy(seps2,"");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,",a,,b");     strcpy(seps1,",");strcpy(seps2,"");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,",,a,,b,,");     strcpy(seps1,",");strcpy(seps2,"");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,",");     strcpy(seps1,",");strcpy(seps2,"");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,",,");     strcpy(seps1,",");strcpy(seps2,"");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,",,,");     strcpy(seps1,",");strcpy(seps2," ");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     } } // //[A      string          of ,,tokens // //and some  more tokens, ] //Tokens: // <A> <string> <of> <> <tokens> <> <and> <some> <more> <tokens> <> //[1234| LIYI|China | 010 |201110260000|OK] //Tokens: // <1234> <LIYI> <China> <010> <201110260000> <OK> //[1234|LIYI||010|201110260000|OK] //Tokens: // <1234> <LIYI> <010> <201110260000> <OK> //[1234|LIYI||010|201110260000|OK] //Tokens: // <1234> <LIYI> <> <010> <201110260000> <OK> //[a] //Tokens: // <a> //[a,b] //Tokens: // <a> <b> //[a,,b] //Tokens: // <a> <> <b> //[,a] //Tokens: // <> <a> //[a,] //Tokens: // <a> <> //[,a,,b] //Tokens: // <> <a> <> <b> //[,,a,,b,,] //Tokens: // <> <> <a> <> <b> <> <> //[,] //Tokens: // <> <> //[,,] //Tokens: // <> <> <> //[,,,] //Tokens: // <> <> <> <>

单次分割会啊，但多次就不知道怎么写了，C语言学的不是太好哎，还请赐教！！！

多次调用分割函数即可.

有个strtok函数了解下

另供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

大佬我来了！ //有效信息格式为：<013|B2|C3|D4|E5|F6C><A1B2C3D4> //其中013|B2|C3|D4|E5| 使用 符号分割出来的前两位字母或数字及其组合构成密钥如下 //（ 0x01,0xB2,0xC3,0xD4,0xE5,0xF6 ），<A1B2C3D4>截取待用！！！！用C语言该怎么实现， //有没有大佬帮忙解决一下！！！小弟，跪谢！！！ #include <stdio.h> unsigned char key[6]; int buf[6]; char tail[11]; char *s="<013|B2|C3|D4|E5|F6C><A1B2C3D4>"; int i; int main() {     sscanf(s,"<%2X%*c|%2X|%2X|%2X|%2X|%2X%*c%*c%10s",         &buf[0],         &buf[1],         &buf[2],         &buf[3],         &buf[4],         &buf[5],         tail);     for (i=0;i<6;i++) key[i]=(unsigned char)buf[i];     for (i=0;i<6;i++) printf("0x%02X ",key[i]);     printf("\n%s\n",tail);     return 0; } //0x01 0xB2 0xC3 0xD4 0xE5 0xF6 //<A1B2C3D4> //


Question: 求助

严格说p=a[0]是语法错误的，如果严格进行语法检查的话: 赋值语句两边的类型表达式应相等或相容。p=a是可证相等的：a的类型=int [m][n]=int([m])[n]，由于一维数组[m]可视为单重指针*，故上式=int(*)[n]=p的类型。而p=a[0]的正当写法应为p=&a[0]，两边的类型才是等价的，关于类型解析和等价性证明参见《C++程序设计精要教程》。要入C语言之门，必须掌握类型表达式的解析、运算和等价性证明，80%的错误都与此有关。此外，大部分编译器不支持多维动态数组： 直接用m，n二维动态是不允许的，只允许第一维动态。

坚持你的理解，不能那样赋值。

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

理解和讨论之前，请先学会如何观察！ 仅供参考：//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]


Question: 请问如何把上次生成发生错误

下方有很多连接，其中有很多说这个的，你这么久都不去发现？


Question: c语言初学者有个关于地址的小小疑问

说不能的，你们得好好思考一下了。 int a = 0x65666768, b, c; b = * (char *) & a; c = *( (char *) & a + 1); printf ("%c,%c\n", b, c);

不行，程序语法不正确。语法正确与否，重点在于类型解析，参见类型解析大法《C++程序设计精要教程》。先看int *p=2001; *p=2; 这是语法正确的。从类型运算的角度看，*p相当于*(int*)因p的类型为int*，而*2001相当于*（int）故是错的。解决办法是引入强制类型转换: *(int *)2001=2; 这样就无语法错误了，但运行不一定成功，要看地址是否在你的程序内存范围内，否则就可能被操作系统的页面保护机制干掉了。如果不会类型解析，永远难入C语言之门。

引用 楼主 TOTOBEFREE的回复:假如一个int型的变量占四个字节，比如首地址是2000，那下一个变量的首地址就是2004了，而对它取地址取到的是首地址也就是2000，如果我把一个整数型变量赋值为2001，或者2002反正就是还是在第一个变量的储存单元，这样能不能访问到那个变量呢？ 就是*2001能不能访问的首地址是2000的变量 这样的语句肯定不行，int *p=2001; *p=2; 这样的赋值是可以的。让我们从类型表达式的角度看：*p的类型运算就是*（int *），其中int * 就是p的类型。而*2001从类型表达式的角度看为*(int)，如此你便知道为何不可以了。强制类型转换可以达到这一目的: *(int *)2001=2; 这样的语句就没有语法错误了，但执行时可能有问题，关键在于这个地址是否在你的程序内存范围之内。对于你的运行环境如unix和windows来说，操作系统是有内存页面保护功能的，如地址在另一个程序内存范围之内，你的程序进程就可能被杀死。一个程序语法正确与否关键在于类型解析，如何分析类型参考类型解析大法巜C++程序设计精要教程》。

其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

应该和硬件有关系。貌似有点硬件必须要求字节对齐，也就是说不能给不对齐的地址赋值，如：2000可以，但2001非法。

不能 说了首地址就要首地址，而且另外还有对齐问题。


Question: 有大佬能分行解释一下这个单词统计的代码吗？for循环里看不懂呜呜

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。

楼主的标注修改如下：#include<stdio.h> #include<string.h>  int main(int argc, char* argv[]) {     char m[100],word[9];     int i,j,ans,counts=0,flag;      gets(m);      //字符串     gets(word);   //需查找的单词      for(i=0;i<strlen(m);i++){  //循环的范围是一个字符串的长度          for(j=i;j<strlen(m);j++){             flag=j;              //单词位置下标             if(m[j]==' ') break;//遇到空格，一个单词的结束位置                                 //跳出for(j=i;j<strlen(m);j++）循环             //if(flag<j)             //    flag=strlen(m);         }         ans=1;                   //单词对比置位         for(j=i;j<flag;j++){     //i是单词开始位置，flag为单词结束位置             if(m[j]!=word[j-i]){ //将m[j]开始的单词与word[j-i]的单词作比较，j++ <->j-i                ans=0;            //如果不同，则ans置0                break;            //跳出循环             }         }         if(strlen(word) != flag-i) ans=0;//判断m[]字符串中出现如 abc ，而word[]=abcd，上一步判断是能通过的。         if(ans==1) counts++;  //以上条件满足，计数加1         i=flag;            //将一个单词的结尾位置给i，直接进入下一个单词的分析。     }     printf("%s %d",word,counts);      return 0; }  指针的写法，按题目用函数，如下供参考：#include <stdio.h>  int count_SubStr(char *src,char *sub);  int main(int argc, char* argv[]) {     char *src = new char[100],*sub = new char[10];     int c;      gets(src);     gets(sub);      c = count_SubStr(src,sub);      printf("%s  %d\n",sub,c);      return 0; }  int count_SubStr(char *src,char *sub) {     char *p,*pos,*t;     int  c=0,flag,charlen=strlen(sub);      p=src;     while(*p != '\0')     {          flag=0;          while(*p != ' ' && *p != '\0'){               p++;               flag++;          }          if(charlen == flag){               t = p;               while(flag--) t--;               flag = 0;               pos = sub;               while(*t == *pos  && *pos != '\0'){t++;pos++;flag++;}               if(charlen == flag) c++;          }          p++;     }     return c; }

引用 1 楼 ⌬⌬⌬⌬⌬的回复:标题 单词统计  描述 输入字符串string[N]（N≤100），各个单词以空格隔开，单词长度小于等于8，输入单词word[M]（M≤8），在string中查找出相同的单词并统计该单词出现的次数信息，输出单词和出现次数的信息， 数据之间空一格空格。主函数输入字符串和待统计单词，编写函数count()实现统计和信息输出。  时间限制 1	 内存限制 10000	 类别 1  输入说明 输入一行字符以空格隔开各个单词，输入要统计的单词。  输出说明 格式输出：输出单词及其出现的次数信息，数据之间空一格。  输入样例 dog cat dog dog the abc dog hahe dog  输出样例 dog 4  提示 采用重循环结构实现计算过程，输出数据之间空一格。 这是题目以及测试数据，拜托了谢谢大佬！


Question: 有无符号强转换问题

dev 也是0

引用 16 楼 真相重于对错的回复:jsrun.net 两边输出不一样，这应该是编译器问题吧

引用 14 楼 我曾是最年轻的男孩 的回复:[quote=引用 10 楼 真相重于对错的回复:] 你这个网址发我看看[/quote] 不仅是那个网站，你用vs也一样是0

jsrun.net

依我看，不看对应汇编指令，永远无法彻底弄懂。

引用 10 楼 真相重于对错的回复: 你这个网址发我看看

这是编译环境问题吗

就算编译器马马虎虎不提这个，运算符运算之前强行提升级别较低的运算数不也是常规操作么？

这句话在我的VS2017上产生一个error

printf("%u\n",(  char )~5==4294967290) 这句话明明输出0，不是1 (char)~5==4294967290 这是一个比较表达式，结果是false ，打印出来时0

引用 5 楼 forever74的回复:对头，我就是这个意思。 printf("%u\n",(  char )~5==4294967290);//这里输出1，不是已经强转换为char了吗，为什么还相等，这里已经发生了扩展了？

引用 5 楼 forever74的回复:对头，我就是这个意思。 不是强转换为char类型了吗

引用 5 楼 forever74的回复:对头，我就是这个意思。 可是，这里为什么就已经相等了 printf("%u\n",(  char )~5==4294967290);//输出1

对头，我就是这个意思。

引用 3 楼 forever74的回复:所以， 第一步求值，像楼主注释里写的那样。 第二步入栈扩展（到32位的整数倍），无符号的前面加0，有符号的前面加的所有位都复制符号位。 第三步按照格式符的要求对接收到的扩展后内容进行解释，输出。 所以第二步如果是个有符号的负数，前面扩展的位置全部位都是1？

是printf里面的格式字符惹得祸。第一个250好理解。用unsigned char 强制类型转换后11111010就是250，不需要再看补码，因为就是无符号类型。 第二个是%u的原因，换成%d就是-6了。同二楼。

这个问题不是强制转换出了问题，而是当你把那些单字节当作实参送给printf的时候，编译器对它进行了扩展（变得更长），理由很多，我没细看过。

楼主你关注的点已经歪了，你企图用一个错误的方式验证一开始的问题，然后在错误本身的引领下越走越远。 回来吧，不要忘了初心。


Question: c语言编程新手问题，第七章”基本类型“习题，麻烦各位大佬看看

%.1d ?? 马虎


Question: 各位大佬请问:之前不小心把vs2019的发生生成错误...

重新开个项目呗

引用 6 楼 赵4老师 的回复:感谢大佬

引用 1 楼 自信男孩 的回复:vs不支持scanf吧，是不是应该用scanf_s呢？！另外去掉scanf中的\n是支持的,只要在文件开头加上一个 #define _CRT_SECURE_NO_DEPRECATE

我比较好奇为啥要把这个东西找回来？

vs2019号称“宇宙第一IDE”，但编写纯C不一定是最合适的。还不如用gcc，tiny-c。


Question: c语言编程新手问题，第七章”基本类型“习题，麻烦各位大佬看看

嗯，你把非法输入引起的异常拿来说事儿那就过分了。 请输入正常数据。

引用 2 楼 user-2 的回复:供参考：int main() {     long long m=1,n=1,product;      for(;m>0;){             //需另设一变量，退出循环的条件         printf("Enter a positive integer:");         scanf("%11d",&m);          product=1;          //这个值在这里初始化         for(n=m;n>=1;n--){             product *= n;         }         printf("Factorial:%11d\n",product);     }      return 0; } 我用你的程序试了一下，循环的次数多了之后，会出现正文中图四的情况。而且还会出现下图，23可以算阶乘，22却不可以。  我把程序改成下图，循环的次数多了之后，也是会出现图四的情况。  请问怎么回事呢？

重新算之前你的product没有重新赋值啊。


Question: 关于c语言的结构体问题。

#include<stdio.h> //结构体要在int main之前定义 struct student { 	int num; 	char name[20]; 	int score; }a[2]; int main() { 	printf("Please input the students infornation:\n"); 	for (int i = 0; i < 2; i++) 		scanf("%d%s%d", &a[i].num, a[i].name, &a[i].score);//字符串不用地址,""内的，去掉 	printf("The higher student score is:"); 	if (a[0].score > a[1].score) 		printf("%d %s %d", a[0].num, a[0].name, a[0].score); 	else 		if (a[0].score < a[1].score) 			printf("%d %s %d", a[1].num, a[1].name, a[1].score); 	//else printf("They get the same score"); 	return 0;  }

引用 7 楼 forever74的回复:[quote=引用 2 楼 m0_54393423 的回复:]请问为什么我在scanf_s那里用逗号格式（就是scanf_s（"%d,%s,%d"）这里）的运行结果在监控时输入后会把所有的if条件给跳过，直接进行最后的printf而在scanf不用逗号时没有出现这种情况 这跟带不带_s没关系， 关键在于里面的%s格式符会从缓冲区当前位置一直get到白空格为止，它可不理你的逗号，也不认为逗号是分隔符。 这样一来排在它后面的%d也就是score就没捞着东西吃，饿着肚子委委屈屈地“编造”一个离谱的数据给你。[/quote] 理解了，谢谢大佬

引用 7 楼 forever74的回复:[quote=引用 2 楼 m0_54393423 的回复:]请问为什么我在scanf_s那里用逗号格式（就是scanf_s（"%d,%s,%d"）这里）的运行结果在监控时输入后会把所有的if条件给跳过，直接进行最后的printf而在scanf不用逗号时没有出现这种情况 这跟带不带_s没关系， 关键在于里面的%s格式符会从缓冲区当前位置一直get到白空格为止，它可不理你的逗号，也不认为逗号是分隔符。 这样一来排在它后面的%d也就是score就没捞着东西吃，饿着肚子委委屈屈地“编造”一个离谱的数据给你。[/quote] 👍👍👍

引用 2 楼 m0_54393423 的回复:请问为什么我在scanf_s那里用逗号格式（就是scanf_s（"%d,%s,%d"）这里）的运行结果在监控时输入后会把所有的if条件给跳过，直接进行最后的printf而在scanf不用逗号时没有出现这种情况 这跟带不带_s没关系， 关键在于里面的%s格式符会从缓冲区当前位置一直get到白空格为止，它可不理你的逗号，也不认为逗号是分隔符。 这样一来排在它后面的%d也就是score就没捞着东西吃，饿着肚子委委屈屈地“编造”一个离谱的数据给你。

把scanf_s()输入的顺序改一下 scanf_s("%d,%d,%s", &a[i].num, &a[i].score,&a[i].name, 20); VS2015 C++环境调试  或者干脆不用scanf_s()改用scanf()，请参考 《VS2015中使用scanf()不报错的设置方法》 希望能够帮到您！

请问为什么我在scanf_s这里用逗号格式（就是scanf_s（"%d,%s,%d"））在运行时它会直接忽略所有的if条件然后执行最后的printf（"They get the same score"）（如我发的图所示）；在监视时它a数组的score成员都有问题，而其它成员没有问题，为什么会这样啊请问，有劳了谢谢谢谢

引用 1 楼 user-4的回复:修改如下，供参考：#include<stdio.h>   int main() {    struct student    {      int  num;      char name[20];      int  score;    }a[2];     printf("Please input the students infornation:\n");    for(int i=0;i<2;i++)        scanf_s("%d %s %d", &a[i].num, a[i].name,19, &a[i].score);    //"%d,%s,%d" 输入格式空格更方便//&a[i].name,20这个&可以不用     printf("The higher student score is:");    if (a[0].score > a[1].score)        printf("%d %s %d\n", a[0].num, a[0].name, a[0].score);    else       //if (a[0].score < a[1].score)//这里if多用了          printf("%d %s %d\n",a[1].num, a[1].name, a[1].score);    //else printf("They get the same score");     return 0; } 监视时scanf进行后a［0］.score,a［1］.score都不是正常值


Question: 求解一直在线，如果对秒给解决

要么网上搜一下，然后改一改，要么自己先试试写写

定义一个结构体，用结构体数组解决。


Question: 救救孩子吧，这c语言题目，使用vs2013

引用 1 楼 user-1 的回复：太简单了+0结帖率 = 懒得答[face]monkey2:019.png[/face]

太简单了+0结帖率 = 懒得答


Question: C语言   成绩录入

已经写完了，谢谢大家

这样的题用结构体数组或链表都可以做，最好自己按模块写，出错的地方再让大家纠错。

用结构体方便点吧


Question: c中指向指针的指针的问题

引用 1 楼 user-1 的回复:把 printf(“%c”, *p); 改成 printf(“%c”, (*p==0?c:*p)); 因为*p=0不是一个可以显示的字符，所以当*p==0是就打印c变量，因为c变量的值就是‘!’ 不是这个问题，是代码的逻辑上有问题，已经自己解决了，不过还是多谢了


Question: 为什么文件里的内容没有改变？

#include<stdio.h> #include<string.h>  //#include<windows.h> #include<stdlib.h> //#include<conio.h>  struct yonghu//用户信息 {     int zhanghao;//账号     char name[7];//用户名     char id[20];//用户身份证     char password[10];//用户密码 }users[500];  void revise();//修改信息  int main() {      revise();      return 0; }  void revise() {     int i;     int zhanghao2, ret;     char name2[7],password2[10],id2[20];     char name3[7];     printf("请输入要修改的用户名：\n");     scanf("%s",name3);     printf("请输入修改的账号：\n");     scanf("%d",&zhanghao2);     printf("请输入修改的用户名：\n");     scanf("%s",name2);     printf("请输入修改的身份证：\n");     scanf("%s",id2);     printf("请输入修改的密码：\n");     scanf("%s",password2);      FILE *fp;     fp=fopen("用户信息.txt","r+");     if(fp==NULL)     {         printf("error file can't be open!\n");         exit(0);     }       for(i=0;;i++)     {         ret = fscanf(fp,"%d %s %s %s",&users[i].zhanghao,users[i].name,users[i].id,users[i].password);         if (ret < 4)             break;         //if(strcmp(users[i].name,name3[7])==0)         if(strcmp(users[i].name,name3)==0)         {             //         printf("2");             users[i].zhanghao=zhanghao2;             //strcpy(users[i].name,name2[7]);             strcpy(users[i].name,name2);             //strcpy(users[i].id,id2[20]);             strcpy(users[i].id,id2);             //strcpy(users[i].password,password2[10]);             strcpy(users[i].password,password2);              //break;    //跳出循环，否则死循环了（如果不加ret和判断） 这句不用了             //fprintf(fp,"%d %s %s %s",users[i].zhanghao,users[i].name,users[i].id,users[i].password);         }     }      //rewind(fp);    //用这句或者下句都可以     fseek(fp, 0, SEEK_SET);     for (i = i -1; i >= 0; i--)             fprintf(fp,"%d %s %s %s",users[i].zhanghao,users[i].name,users[i].id,users[i].password);      fclose(fp);     printf("修改成功！"); } 供参考～


Question: 想输出直接排序，选择排序，堆排序，快速排序的前五行排序结果，选择和直接插入可以了，剩下两个有大神帮忙么？

网上先搜一下吧，代码和说明（算法介绍）都有了。

参考这个？ 各种排序算法动画演示http://www.webhek.com/misc/comparison-sort/


Question: c语言程序设计

出差不方便，大概写了下，你参考参考。  struct stu {     char name[10];     char id[20];     float zhengzhi;     float shuxue;     float zongfen;     int tongguo; };  typedef struct stu Stu;  void input(Stu *stu,size_t n) {          for(size_t i=0;i<n;i++)     {         scanf("%s\n",stu->name);         scanf("%f%f",&stu->zhengzhi,&stu->shuxue);                  stu->zongfen=stu->zhengzhi+stu->shuxue;         stu->tongguo=stu->zongfen > 310 && (stu->zhengzhi >=40 && stu->shuxue>=40);         stu++;     }      }  void print(Stu *stu,size_t n) {     for(size_t i=0;i<n;i++)     {         printf("%s %s %.1f %.1f %.1f %s\n",stu->name,stu->id,stu->zhengzhi,stu->shuxue,stu->zongfen,(stu->tongguo)?"通过":"不通过");         stu++;     }      }  int main() {          Stu stu[3]={0};     input(stu,3);     print(stu,3);  	 	return 0; }

引用 1 楼 一颗白面馒头的回复:看你id是个楚夏党？所以课程设计还是自己做好一点网上这种系统设计的也很多，大体都是差不多的 帮帮我吧

引用 4 楼 浪客的回复:struct 里放一个总分和合格的成员，输入的时候一并算出来保存上，统计和排序的时候就参照这2个的值。 具体怎么弄，搞不来

引用 2 楼 浪客的回复:一个struct数组搞定 那个统计的怎么弄？

一个struct数组搞定


Question: c语言不解

引用 9 楼 向阳森 的回复:[quote=引用 8 楼 赵4老师的回复:]可惜我原来发在#4楼的重复踩过无数次同一个坑的宝贵经验，被版主认为是灌水删掉了。 好在#7识货，实际试用效果展示了一小下。  emmm，我是新手，我也是刚弄CSDN，还不懂[/quote] 楼主的代码之所以出现问题，是因为在几个连续的输入输出间对缓冲区多余字符没处理好，建议去搜下scanf()printf()的详细用法，再结合上面的代码去感觉下。

引用 8 楼 赵4老师的回复:可惜我原来发在#4楼的重复踩过无数次同一个坑的宝贵经验，被版主认为是灌水删掉了。 好在#7识货，实际试用效果展示了一小下。  emmm，我是新手，我也是刚弄CSDN，还不懂

引用 4 楼 赵4老师 的回复:在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。 按赵老师的经验修改如下，供参考：#include <stdio.h> #define beet 2.05 #define artichokes 1.15 #define carrot   1.09   int main() { 	int i,k=0;         char s[2]; 	double total_price_goods, discount=0, freight_packingExpense, total_order_cost, beet_pound=0, artichokes_pound=0, carrot_pound=0; 	double total_price_beet, total_price_artichokes, total_price_carrots, a, b, c,total_pound; 	char ch; 	printf("ABC邮购杂货店订货系统\n"); 	printf("a)洋蓟        b）甜菜          c）胡萝卜       q)退出\n");  	while (1) 	{ 		if (k != 1) 			{printf("请输入你要购买货物的编号:");                         fflush(stdout);} 		else 			k = 0;                         rewind(stdin); 			scanf("%1s",s);//scanf_s("%c",&ch,1);                         ch = s[0]; 			switch (ch) 			{ 			case 'a': 				printf("请输入购买洋蓟的磅数：");                                 fflush(stdout);                                 rewind(stdin); 				scanf("%lf", &a);//scanf_s("%lf", &a); 				artichokes_pound += a; 				break; 			case 'b': 				printf("请输入购买甜菜的磅数：");                                 fflush(stdout);                                 rewind(stdin); 				scanf("%lf", &b);//scanf_s("%lf", &b); 				beet_pound += b; 				break; 			case 'c': 				printf("请输入购买胡萝卜的磅数：");                                 fflush(stdout);                                 rewind(stdin); 				scanf("%lf", &c);//scanf_s("%lf", &c); 				carrot_pound += c; 				break; 			case  'q': 				break; 			default : 				printf("请输入正确的编号：\n"); 				k = 1; 				//continue; 			} 			if (ch == 'q')  				break; 	    } 		total_price_artichokes = artichokes_pound * artichokes; 		total_price_beet = beet * beet_pound; 		total_price_carrots = carrot_pound * carrot; 		total_price_goods = total_price_artichokes + total_price_beet + total_price_carrots; 		if (total_price_goods >= 100) 			discount = total_price_goods * 0.05; 		total_pound = beet_pound + artichokes_pound + carrot_pound; 		if (total_pound ==0) 			freight_packingExpense = 0; 		else 		  if (total_pound <= 5) 			freight_packingExpense = 6.5; 		  else if (total_pound <= 20) 			freight_packingExpense = 14; 		  else 			freight_packingExpense = 14 + (total_pound - 20) * 0.5; 		total_order_cost = total_price_goods + freight_packingExpense - discount; 		for (i = 1;i <= 37;i++) 			printf("*"); 		printf("订单"); 		for (i = 1;i < 37;i++) 			printf("*"); 		printf("\n"); 		printf("物品种类     物品售价     订购重量（单位：磅）     物品费用\n"); 		printf(" a洋蓟        %.2f         %.2f                     %.2f            \n ",artichokes,artichokes_pound,total_price_artichokes); 		printf(" b甜菜        %.2f         %.2f                     %.2f             \n", beet, beet_pound, total_price_beet); 		printf(" c胡萝卜      %.2f         %.2f                     %.2f             \n", carrot, carrot_pound, total_price_carrots); 		printf("订单总费用：%.2f     折扣%.2f       运费和包装费%.2f       费用总额：%.2f        \n ",total_price_goods,discount,freight_packingExpense,total_order_cost);  			for (i = 1;i < 80;i++) 			printf("*"); 		printf("\n");  		return 0; } 运行效果：

引用 5 楼 向阳森 的回复:[quote=引用 2 楼 一颗白面馒头的回复:]没有手动调试，scanf_s("%c",&ch,1);这句话第二次获取的输入应该是你输入时候的回车。建议打断点调试一下 还没学到打断点[/quote] 可以学着调试代码。因为你输入一个字符过后，你还敲了一个回车。这也是一个字符。所以第二次scanf_s的时候可能就是读取了回车这个字符。具体没调试也不敢肯定，但是既然又scanf_s了一次，你ch的值肯定是变了的

引用 2 楼 一颗白面馒头的回复:没有手动调试，scanf_s("%c",&ch,1);这句话第二次获取的输入应该是你输入时候的回车。建议打断点调试一下 还没学到打断点

引用 1 楼 一颗白面馒头的回复:其实这个问题理一下逻辑就出来了。从你输入10开始吧。 这时候的switch结构已经退出，然后if (ch == 'q')这句话不成立，所以while循环没有退出。又开始循环。因为你的k的值没有变过，所以执行了printf("请输入你要购买货物的编号:");这句话。scanf_s("%c",&ch,1);接下来这句话又获取了一个输入，此时ch的值肯定不是a, b, c了，所以进入了default：执行了printf("请输入正确的编号：\n");这句话。最后你输入了d，又是default的情况。 为什么此时的值肯定不是a.b.c

在用%c获取有效输入之前，需要先仔细地把输入缓冲区打扫干净。一般用 while(getchar()!='\n'); 就行。


Question: 为什么文件里的内容没有修改

fp=fopen("用户信息.txt","a");这 是读文件，写文件要用fp=fopen("用户信息.txt","w");

既然楼主急于落实文件访问，那其他错误就不提了。 文件打开必须要检测是否失败，另外 文件是不能读了就写的 即使你的打开方式带加号 读操作写操作之间也必须有定位操作，对于文本，就rewind吧 也就是说，如果你不想两次打开 那就得带加号打开 全读完 rewind 全写完 关闭 综上，酱紫。

引用 1 楼 浪客的回复:for只运行1次后break出来了。 fprintf里name2[7]和后面的几个数组不对，应该用数组名。把[7]删了。 谢谢，可是改了之后文件里的内容还是没改


Question: C语言进行遥感图像分类

参考本页下面红色字体链接。


Question: 求帮助！！利用C语言实现   商店销售管理系统

引用 楼主 风吹南边来 的回复:求帮助  可私信详聊 感谢大佬们救救孩子 功能： （1）屏幕上出现一个界面，让售货员输入商品编号或者商品名称，可 以进货，进货后商品库存同时增加。顾客买走商品后，售货员输入商品 编号或者商品名称，可以生成销售清单，统计本次销售总的价钱，同时 库存数量相应减少。完成前面的基本功能后，还可以完成增加新的商品 或删除不需要的商品的功能，以及每天销售统计功能等。 （2）保存：将相关数据写入磁盘文件，便于存、取操作。 要求： （1）用 C 语言实现程序设计； （2）利用结构体和链表进行相关信息处理； （3）系统的各个功能模块要求用函数的形式实现； （4）界面友好（良好的人机交互），程序要有注释。 代码呢

引用 3 楼 user-2 的回复:[quote=引用 2 楼 qq_1457346882 的回复:][quote=引用 楼主 风吹南边来 的回复:]求帮助  可私信详聊 感谢大佬们救救孩子 功能： （1）屏幕上出现一个界面，让售货员输入商品编号或者商品名称，可 以进货，进货后商品库存同时增加。顾客买走商品后，售货员输入商品 编号或者商品名称，可以生成销售清单，统计本次销售总的价钱，同时 库存数量相应减少。完成前面的基本功能后，还可以完成增加新的商品 或删除不需要的商品的功能，以及每天销售统计功能等。 （2）保存：将相关数据写入磁盘文件，便于存、取操作。 要求： （1）用 C 语言实现程序设计； （2）利用结构体和链表进行相关信息处理； （3）系统的各个功能模块要求用函数的形式实现； （4）界面友好（良好的人机交互），程序要有注释。 代码呢[/quote]  代码要你写啊，哈哈哈[/quote] 那怕是疯了

引用 2 楼 qq_1457346882 的回复:[quote=引用 楼主 风吹南边来 的回复:]求帮助  可私信详聊 感谢大佬们救救孩子 功能： （1）屏幕上出现一个界面，让售货员输入商品编号或者商品名称，可 以进货，进货后商品库存同时增加。顾客买走商品后，售货员输入商品 编号或者商品名称，可以生成销售清单，统计本次销售总的价钱，同时 库存数量相应减少。完成前面的基本功能后，还可以完成增加新的商品 或删除不需要的商品的功能，以及每天销售统计功能等。 （2）保存：将相关数据写入磁盘文件，便于存、取操作。 要求： （1）用 C 语言实现程序设计； （2）利用结构体和链表进行相关信息处理； （3）系统的各个功能模块要求用函数的形式实现； （4）界面友好（良好的人机交互），程序要有注释。 代码呢[/quote]  代码要你写啊，哈哈哈


Question: 这个填空怎么做啊 我老是运行不出来

引用 10 楼 早打大打打核战争 的回复:老赵的经典台词，老师也不能代替啥啥的那句还不上来~  老师头疼的不是学生不知道，而是他们不知道自己不知道。

老赵的经典台词，老师也不能代替啥啥的那句还不上来~

不急，慢慢来。

引用 1 楼 赵4老师的回复:①=0 ②count++ ③count 我早就试过了 运行不出来

引用 2 楼 m0_53759618 的回复:[quote=引用 1 楼 赵4老师的回复:]①=0 ②count++ ③count 不是这个 试过了[/quote] 眼睛瞪大一点，就对了。。

楼上正解。。。

引用 1 楼 赵4老师的回复:①=0 ②count++ ③count 不是这个 试过了

①=0 ②count++ ③count

引用 7 楼 立 夏的回复:[quote=引用 6 楼 赵4老师 的回复:]#include <stdio.h> int PositiveNum(int a[], int n) {     int i,count=0;     for (i=0;i<n;i++)     {         if (a[i]>0) count++;     }     return count; } int main() {     int b[10]={1,0,2,3,4,-1,-2,-3,-4,0};     printf("%d\n",PositiveNum(b,10)); //4     return 0; }  大饼中间挖个洞，套脖子上，还不行；还得帮转，帮嚼，帮咽，帮消化，帮拉，帮活，…… 可太C了，赵四老师都把答案说了，可这个提问者，给了答案都不会有用，诶....编程水平不是一般的低[/quote] 我才开始学啊....

引用 6 楼 赵4老师 的回复:#include <stdio.h> int PositiveNum(int a[], int n) {     int i,count=0;     for (i=0;i<n;i++)     {         if (a[i]>0) count++;     }     return count; } int main() {     int b[10]={1,0,2,3,4,-1,-2,-3,-4,0};     printf("%d\n",PositiveNum(b,10)); //4     return 0; }  大饼中间挖个洞，套脖子上，还不行；还得帮转，帮嚼，帮咽，帮消化，帮拉，帮活，…… 可太C了，赵四老师都把答案说了，可这个提问者，给了答案都不会有用，诶....编程水平不是一般的低


Question: 求大佬帮忙指点一二

第9、13、36行，定义的数组student[]大小不一样？

内层for循环变量是j却写了i++