Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 帮我看下问题在哪？

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 冒泡排序的时候有问题，即交换j和j+1对应的数据交换时应该是t = parr[i]; 楼主写成parr[i] = t;

user: user-0
content: 引用 2 楼 datoulaile123的回复:打个断点(代码前点鼠标或者当前行按F9)，按下F5开始调试，按F10跳转到下一行，调试看下数据，是哪步的数据开始出错的 现在弄好了，谢谢，我记住这个方法了

user: user-0
content: 引用 1 楼 寻开心的回复:parr[j] = t; parr[j] = parr[j+1] parr[j+1] = t  这个是交换数据吗？  好好想想，这个要怎么写 好了，我知道了，谢谢

user: user-3
content: 打个断点(代码前点鼠标或者当前行按F9)，按下F5开始调试，按F10跳转到下一行，调试看下数据，是哪步的数据开始出错的

user: user-4
content: parr[j] = t; parr[j] = parr[j+1] parr[j+1] = t  这个是交换数据吗？  好好想想，这个要怎么写
user-0 提问: C primer plus第三章的第一道编程题

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: #include <limits.h>  里面有int最大和最小的定义    INT_MAX和INT_MIN 对最大再加1， 最小再减1就可以看到溢出的效果  IEEE754浮点数的表示方法。      float类型数据的表示范围为-3.4*10^38～+3.4*10^38。      double为-1.7*10^-308~1.7*10^308      long double为-1.2*10^-4932~1.2*10^4932. 把他们乘以10，再输出就看到浮点溢出
user-0 提问: C语言 统计句子中元音字母的个数(PTA上的题）/ 统计单词的长度

回复:
user: user-1
content: 第二个问题 #include<stdio.h> int main() { 	char ch,count=0; 	scanf("%c",&ch); 	int bSpace=0; 	while (ch!='.') { 		if (ch != ' ') {//  			count++; 			bSpace=0; 		} else { 			if ( 0 == bSpace && count ) { // 遇到第一个空格  				printf("%d ", count); 				count = 0; 				bSpace = 1; 			} 		} 		scanf("%c",&ch); 	} 	return 0; }

user: user-2
content: #include <stdio.h> #include <string.h> int main(int argc, const char * argv[]) {     char word[100];     int  i;     int n=1;     do     {         char c='.';         scanf("%s",word);         i=(int)strlen(word);         if(word[i-1]==c)         {if(i>1)             {                printf("%d\n",i-1);             }              n=0;         }         else{             printf("%d ",i);         }     }while(n);     return 0; }
user-0 提问: 这有什么问题？用Dev没问题，用visual C就有问题了。

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  void m(int *p,int n);  int main() {     int i,x;     int *a = NULL;      printf("您需要输入数据的个数为：");     scanf("%d",&x);      //int a[x];     a = (int *)malloc(sizeof(int) * x);     if (!a) {         printf("Malloc error!\n");         return -1;     }      printf("请输入数据:");     for(i=0;i<x;i++)         scanf("%d", &a[i]);      m(a,x);      free(a);     return 0; }  void m(int *p,int n) {     int i,j,t;      printf("输入的数据为:");     for(i=0;i<n;i++)         printf("%4d",*(p+i));      printf("\n");      //for(i=1;i<n;i++)     for(i=0;i<n;i++)     {         for(j=0;j < n - 1 - i;j++)         {             if(*(p+j) > *(p+j+1))             {                 t=*(p+j);                 *(p+j)=*(p+j+1);                 *(p+j+1)=t;             }         }     }      printf("排序后的数为：");     for(i=0;i<n;i++)         printf("%4d",*(p+i));  }  供参考～

user: user-2
content: 是不是有两个文件，c1.exe这名字一看感觉是你自己编译出来的，不是编译器的

user: user-3
content: c标准的问题吧  int a[x] 这里， 有的 不支持动态的x，要求必须是静态数值

user: user-4
content: VC没有装好。请搜索那个:cl.exe什么的

user: user-2
content: 编译器不一样，有些函数的写法不一样，如果是编译报错，那很正常，如果是运行报错，那就有点麻烦了

user: user-5
content: vc不支持C99的动态数组语法。
user-0 提问: 这有问题吗？

回复:
user: user-1
content: 有什么问题，编译会有提示信息，运行输入输出，结果怎样。问问题都喜欢这么问的吗？

user: user-2
content: 关于对齐的话你第一个输出的是中文的：第二个是英文的:会出现上下两行输出没有对齐的情况

user: user-0
content: 没复制到。。重新弄一下

user: user-2
content: 最后一行加一个右花括号

user: user-0
content: asdsvfdb
user-0 提问: 程序中为什么会出现这种错误呢，好像和程序本身无关，主要因为打开两个文件的原因

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-0
content: 引用 1 楼 自信男孩的回复:printf末尾应该用分号;，楼主是不是用冒号了。 好像是这个原因，谢谢啦

user: user-2
content: printf末尾应该用分号;，楼主是不是用冒号了。
user-0 提问: x++和++x的区别和应用

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 优先级和结合性综合看，另外再研究一下未定义行为。然后就OK了  建议：首先找一本可靠的书（谭的书不可靠），按书上的来，不要自己乱总结，最后去网上找标准或对标准的分析。  补充：不要说我在XXX  IDE(编译器)下面结果是这样的，所以就XXX。必须按标准来

user: user-3
content: x++  +  ++x = ？你猜不着 x++和++x都是表达式（而x是变量），就像x+1一样，表达式有功能和值两个部分，x+1的功能是将x加1，它的值是x+1 同理x++和++x的功能都是使x自增1，不同的是前者的值为x自增前的值，后者的值为x自增后的值，你可以看做这是规定，没有什么先后顺序，当然为了记住它们的值要这么理解也无所谓 连用自增和自减是不可取的，编译器不一样结果不一样，很难说到底是怎么个运算顺序，所以有些语言干脆限制自增自减只能单用

user: user-0
content: 😨😨😨啊……全理解错了吗，那应该是怎么样的啊

user: user-4
content: 全错  x++  +  ++x .....是未定义行为  结果没意义  你的解析也是错的

user: user-5
content: 论坛是用来讨论问题的，你发帖的话最后都会被各种问题刷下去的，记笔记的话建议你写博客，手机版付费专栏那边可以写博客，博客很方便以后查看

user: user-6
content: X++ + ++X 每个编译器不同,得出的结果是不同的, 例的时候 可以用X++; ++X; 尽量不写 X++ + ++X 这样的吧
user-0 提问: C语言中不可以用scanf语句定义字符数组吗？

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 引用 2 楼 qq_45674693 的回复:[quote=引用 1 楼 自信男孩的回复:]楼主的描述本身就有问题呢，scanf怎么可以定义字符数组呢？它可以给字符数组赋值（通过接收标准输入的内容）。  楼主的scanf使用有问题，改成如下：  scanf("%c", &a[i]); //或 scanf("%c", a+i); 第一种&a[i]肯定不行的啊，a[i]本来就是数组，不用加引号的[/quote]自己试过再说话 基础差不是问题  大家都是从新手来的 基础差还听不进人话就奇葩了  另外 a[i]不是数组

user: user-0
content: 引用 1 楼 自信男孩的回复:楼主的描述本身就有问题呢，scanf怎么可以定义字符数组呢？它可以给字符数组赋值（通过接收标准输入的内容）。  楼主的scanf使用有问题，改成如下：  scanf("%c", &a[i]); //或 scanf("%c", a+i); 第一种&a[i]肯定不行的啊，a[i]本来就是数组，不用加引号的

user: user-3
content: 楼主的描述本身就有问题呢，scanf怎么可以定义字符数组呢？它可以给字符数组赋值（通过接收标准输入的内容）。  楼主的scanf使用有问题，改成如下：  scanf("%c", &a[i]); //或 scanf("%c", a+i);
user-0 提问: 顺序查找｜二分查找Day-3

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html
user-0 提问: 谁能教教我谢谢@

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: int fab(int n) {     if (n == 1)         return 0;     if (n == 2)         return 1;      return 4 * fab(n-1) - 5 * fab(n-2); } 可能越界～可以考虑用double或unsigned long long
user-0 提问: 谢谢。。。。。。

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 可以动手写写啊，这种有通项公式的用递归很容易写  int F(int n) { 	if (n == 1) 		return 0; 	else if (n == 2) 		return 1; 	return 4 * F(n - 1) - 5 * F(n - 2); }
user-0 提问: c语言输不出结果

回复:
user: user-1
content: int narcissistic(int number)//判断是否为水仙花数 {     int bit_num = 0, i, j;     int sum = 0, num[16] = {0}, tmp;      tmp = number;     i = 0;      for(;tmp > 0; tmp /= 10)     {         num[i++] = tmp % 10;         bit_num++;     }     if (bit_num <= 2)         return 0;      //printf("%d %d %d\n", num[0], num[1], num[2]);     for (i = 0; i < bit_num; i++) {         tmp = 1;         for (j = 0; j < bit_num; j++)             tmp *= num[i];         sum += tmp;     }     //printf("bit_num = %d, sum = %d\n", bit_num, sum);     if(number == sum)         return 1;      return 0; } 支持多位的水仙花数。  但是注意输入的数据不要超过int表示的最大数（正整数）。

user: user-1
content: #include <stdio.h>  int narcissistic( int number );  void PrintN( int m, int n );  int main() {     int m, n;     scanf("%d %d", &m, &n);     if ( narcissistic(m) )         printf("%d is a narcissistic number\n", m);     PrintN(m, n);     if ( narcissistic(n) )         printf("%d is a narcissistic number\n", n);     return 0; }  int narcissistic(int number)//判断是否为水仙花数 {     int i=0, j;     int a=1,b=1,c=1,d=1;     int sum,num[4] = {0}, tmp;      tmp = number;     for(;tmp>0;tmp/=10)     {         num[i] = tmp%10;         i++;     }     for(j=1;j<=i;j++)     {         a*=num[0];         b*=num[1];         c*=num[2];         d*=num[3];     }     sum=a+b+c+d;     if(number==sum)         return 1;     else         return 0; } void PrintN( int m, int n )//输出(m,n)之间的水仙花数 {     int i;     for(i=m;i<n;i++)     {         //if(narcissistic(i+1))         if(narcissistic(i))             //printf("%d\n",i+1);             printf("%d\n",i);     }     return; } 供参考～  注意number已经做计算了，最后number为0了，所以后面再与number比较已经没意义了。因此用tmp代替number做分解。  其他问题建议楼主对比代码找一下原因。

user: user-0
content: 经试验发现第47行代码 for(i=m;i<n;i++) 应改为 for(i=m;i<n-1;i++) ，因为在主函数中已经有了输出最大值的情况  if ( narcissistic(n) )         printf("%d is a narcissistic number\n", n);。非常感谢

user: user-0
content: 引用 2 楼 qq_45798109的回复:建议你把代码贴出来，这样比较方便别人调试 大佬，贴出来了，实在是想不通为什么不会有结果。

user: user-0
content: #include <stdio.h> int narcissistic( int number ); void PrintN( int m, int n ); int main() {     int m, n;     scanf("%d %d", &m, &n);     if ( narcissistic(m) )      printf("%d is a narcissistic number\n", m);     PrintN(m, n);     if ( narcissistic(n) )      printf("%d is a narcissistic number\n", n);     return 0; } int narcissistic(int number)//判断是否为水仙花数 {     int i=0,a=1,b=1,c=1,d=1,j,sum,num[4];     for(;number>0;number/=10)     {         num[i]=number%10;         i++;     }     for(j=1;j<=i;j++)     {         a*=num[0];         b*=num[1];         c*=num[2];         d*=num[3];     }     sum=a+b+c+d;     if(number==sum)         return 1;     else                                                        return 0; } void PrintN( int m, int n )//输出(m,n)之间的水仙花数 {        int i;     for(i=m;i<n;i++)     {         if(narcissistic(i+1))             printf("%d\n",i+1);     } return; }

user: user-2
content: 建议你把代码贴出来，这样比较方便别人调试

user: user-3
content: 逐步调试，从scanf的返回值开始。
user-0 提问: C语言结构体

回复:
user: user-1
content: 抱歉打错了 struct stu{     int x,y; } stu a[n]; for( int i=0;i<n;++i) if(a[i].x满足条件)     输出a[i].y;

user: user-0
content: 好的，谢谢，我知道了，

user: user-1
content: 可以的,比如 struct a{     int x,y; }  if(a.x满足条件)     输出a.y;
user-0 提问: c语言问题

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 用两个for循环和scanf与printf函数就可以

user: user-3
content: 引用 8 楼 努力升本的码畜的回复:[quote=引用 7 楼 yma16的回复:]#include<stdio.h> #define maxsize 8 int main() {     int n=-1,student[maxsize];     while(++n<maxsize)     {         printf("请输入%d号学生成绩:\n",n+1);         scanf("%d",&student[n]);     }     printf("学号\t成绩\n");     for(int i=0; i<maxsize; ++i)     {         printf("%d\t%d\n",i+1,student[i]);;     }     return 0; }//关注私信无偿解决简单问题 非常感谢，那个n＝-1改为n＝0，＋＋n改为n＋＋可以吗[/quote] 可以但是这样那样不好，数组下标是从0开始，那样改的话下标为0的就没用到会浪费内存

user: user-0
content: 引用 7 楼 yma16的回复:#include<stdio.h> #define maxsize 8 int main() {     int n=-1,student[maxsize];     while(++n<maxsize)     {         printf("请输入%d号学生成绩:\n",n+1);         scanf("%d",&student[n]);     }     printf("学号\t成绩\n");     for(int i=0; i<maxsize; ++i)     {         printf("%d\t%d\n",i+1,student[i]);;     }     return 0; }//关注私信无偿解决简单问题 非常感谢，那个n＝-1改为n＝0，＋＋n改为n＋＋可以吗

user: user-3
content: #include<stdio.h> #define maxsize 8 int main() {     int n=-1,student[maxsize];     while(++n<maxsize)     {         printf("请输入%d号学生成绩:\n",n+1);         scanf("%d",&student[n]);     }     printf("学号\t成绩\n");     for(int i=0; i<maxsize; ++i)     {         printf("%d\t%d\n",i+1,student[i]);;     }     return 0; }//关注私信无偿解决简单问题

user: user-3
content: 关注私信帮忙解决简单问题

user: user-3
content: #include<stdio.h> int main(void) {     int n=-1,student[5];     while(++n<5)     {         printf("请输入%d号学生成绩:\n",n+1);         scanf("%d",&student[n]);     }     printf("学号\t成绩\n");     for(int i=0; i<5; ++i)     {         printf("%d\t%d\n",i+1,student[i]);;     }     return 0; }

user: user-0
content: 引用 2 楼 yma16的回复:帮我点赞blink我给你参考答案 已经点赞，请讲请讲

user: user-0
content: 引用 1 楼 user-4的回复:for循环就可以。 for可以实现一个一个输入吗，能具体说说吗

user: user-3
content: 帮我点赞blink我给你参考答案

user: user-4
content: for循环就可以。
user-0 提问: 指针

回复:
user: user-1
content: 都是空指针，不过指向的类型不一样，一个是 char， 一个是 int。

user: user-2
content: 引用 6 楼 Donald_Shallwing 的回复:指针的本质都是地址，而地址都是一个整型的数，所以任何指针实际上都是只是一个整型的数； 指针的类型决定了指针所操作的那片空间的大小，而所有类型指针在运行时所占用的空间是一样的，与计算机的地址编址方式有关，与操作的变量无关。对象这种可以这样说 函数指针不是

user: user-3
content: char *p表示此时指针p操作的空间的大小是一个bytes，int *p表示此时指针p操作的空间是4个bytes的大小

user: user-3
content: 指针的本质都是地址，而地址都是一个整型的数，所以任何指针实际上都是只是一个整型的数； 指针的类型决定了指针所操作的那片空间的大小，而所有类型指针在运行时所占用的空间是一样的，与计算机的地址编址方式有关，与操作的变量无关。

user: user-4
content: 在计算p+1的时候，不一样。 printf %p p+1

user: user-5
content: char*p1=NULL int*p2=NULL //首先p1、p2是两个变量。 //因为他们都是指针类型。所以他们本身占4字节（其实与环境、编译器的设置等等相关。不过这里暂时不用多虑，没有特别强调的情况下一般你就认为是32位/4字节就够了）。也就是在内存的某一处有4个字节存放p1的值（其本体）。某一处存放有p2的值（其本体）。 这里先打个比方，我把这p1、p2比喻为目录中的某两条目录 //上面说到的值是什么？是地址（因为是指针），也就是上面的两条目录写在后面的页数（比如：p1-32页。p2-86页）。让你根据页数去找到你想要的东西。 //那么char* 和int*又有什么区别呢？ char* p1是告诉你，32页开始共1页（字节）是你需要的。int*p2是告诉你86页开始共4页（字节）是你需要的 //最后废话一句。是你定义的指针类型。意味着告诉编译器。去哪里，取多少容量的数据

user: user-5
content: char*p1=NULL int*p2=NULL //首先p1、p2是两个变量。 //因为他们都是指针类型。所以他们本身占4字节（其实与环境、编译器的设置等等相关。不过这里暂时不用多虑，没有特别强调的情况下一般你就认为是32位/4字节就够了）。也就是在内存的某一处有4个字节存放p1的值（其本体）。某一处存放有p2的值（其本体）。 这里先打个比方，我把这p1、p2比喻为目录中的某两条目录 //上面说到的值是什么？是地址（因为是指针），也就是上面的两条目录写在后面的页数（比如：p1-32页。p2-86页）。让你根据页数去找到你想要的东西。 //那么char* 和int*又有什么区别呢？ char* p1是告诉你，32页开始共1页（字节）是你需要的。int*p2是告诉你86页开始共4页（字节）是你需要的 //最后废话一句。是你定义的指针类型。意味着告诉编译器。去哪里，取多少容量的数据

user: user-6
content: 个人鄙见： 看到一个指针要想到：    1：指针指向的类型    2：指针的类型    3：指针指向的内存区域（指针的值）    4：指针本身所占据的内存区  仅供参考。

user: user-7
content: 类型不一样，指向的内容长度不一样（p+1偏移的字节数）； 最好自己写个简单程序熟悉一下，把地址和位置偏移长度打印出来，这样更好的了解他们的区别～
user-0 提问: strlen使用

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: strlen(数组名)

user: user-3
content: 输入5个单词，调用strlen获得每一个的长度，比较一下就行了啊
user-0 提问: 求解C语言

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 引用 2 楼 qq_45896193 的回复:[quote=引用 1 楼 qq_45798109的回复:]while里面其实是一个判断句true或false 但是C/C++中可以用0表示false，不是零的数都是true 那括号里的数是小数的话就是ture吗？[/quote] 对于浮点数与0的比较，建议从网上搜一下；  比如while (fabs(x) > 1e-6) //若小于1e-6则认为是0.

user: user-3
content: 当然你也要精度问题，我说的不是零是对计算机读入的值来说的，比如你设一个float f=0.000000000001对计算机来说他就是0

user: user-0
content: 引用 3 楼 qq_45798109的回复:对，只要不是零就行。。 哦哦，谢谢你啊。。。。。

user: user-3
content: 对，只要不是零就行。。

user: user-0
content: 引用 1 楼 qq_45798109的回复:while里面其实是一个判断句true或false 但是C/C++中可以用0表示false，不是零的数都是true 那括号里的数是小数的话就是ture吗？

user: user-3
content: while里面其实是一个判断句true或false 但是C/C++中可以用0表示false，不是零的数都是true
user-0 提问: 多个for循环出现结果

回复:
user: user-1
content: 第一题，完全没必要用这么多的循环去写啊，完全可以这样： #include <stdio.h>  int main(int argc, char **argv){ 	 	int total; 	int i, count = 0; 	int value[9] = {1, 10, 21, 34, 70, 100, 350, 1225, 1500}; 	 	scanf("%d", &total); 	 	for(i=8; ; i--){ 		count += total/value[i]; 		total %= value[i]; 		if(total==0) 			break; 	}   	printf("%d", count);  	return 0; }
user-0 提问: for循环问题

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 个人认为for循环是所有循环中出错率最小的，毕竟它的初始值，判断条件，还有自增或自减一开始就设置好了。只要你思路足够清晰就不会出错
user-0 提问: 初学者想要给我师傅要c语言emm

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-0
content: 引用 3 楼 Wayward：)的回复:兄弟，这应该是一个初中生就会的题吧？！ 还是自己动手写一写吧 职高学的  没怎么懂

user: user-2
content: 兄弟，这应该是一个初中生就会的题吧？！ 还是自己动手写一写吧

user: user-3
content: 写报错了再问吧，直接伸手不是好习惯

user: user-4
content: 看了下这5道题，都是非常非常基础的，如果你想学习c，个人建议你自己敲代码写写，如果只是应付，百度下这代码应该都能有
user-0 提问: 请问这题目 怎么编写英寸换厘米

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-0
content: OKKKKKKKK谢了

user: user-2
content: 不写代码 任务是：       “定义程序的目标”  和         “设计程序”

user: user-3
content: 你就当a是b的2.54倍写代码不就行了
user-0 提问: 大佬我想知道我写的小小编程到底错在哪了

回复:
user: user-0
content: 引用 8 楼 寻开心的回复:#include<stdio.h> int main() {     double e=1,item;     int i=1,n;         printf("Input n:");         scanf("%d",&n);         while(i){             item=1;             item*=i;             i--;     }  // 你这个while放到for的外面； while结束之后item就是固定值了，再放到for里面有啥用啊          for(i=1;i<=n;i++){             e=e+1.0/item;                    } // 按照公式，item是阶乘，每次要变化的啊， 这里item被你写成了固定，那怎么可能对。 必须从while里面搬家回来         printf("e=%.4f\n",e);         return 0;  } 大佬你这回答太精辟了完美的解决了我的问题，非常感谢大佬

user: user-0
content: 引用 8 楼 寻开心的回复:#include<stdio.h> int main() {     double e=1,item;     int i=1,n;         printf("Input n:");         scanf("%d",&n);         while(i){             item=1;             item*=i;             i--;     }  // 你这个while放到for的外面； while结束之后item就是固定值了，再放到for里面有啥用啊          for(i=1;i<=n;i++){             e=e+1.0/item;                    } // 按照公式，item是阶乘，每次要变化的啊， 这里item被你写成了固定，那怎么可能对。 必须从while里面搬家回来         printf("e=%.4f\n",e);         return 0;  } 大佬你这回答太精辟了完美的解决了我的问题，非常感谢大佬

user: user-1
content: #include<stdio.h> int main() {     double e=1,item;     int i=1,n;         printf("Input n:");         scanf("%d",&n);         while(i){             item=1;             item*=i;             i--;     }  // 你这个while放到for的外面； while结束之后item就是固定值了，再放到for里面有啥用啊          for(i=1;i<=n;i++){             e=e+1.0/item;                    } // 按照公式，item是阶乘，每次要变化的啊， 这里item被你写成了固定，那怎么可能对。 必须从while里面搬家回来         printf("e=%.4f\n",e);         return 0;  }

user: user-0
content: 引用 2 楼 寻开心的回复: 上个帖子都把完整的代码都给你了呀  #include<stdio.h> int main(int n, void ** argv ) {     double e=1,item=1;     int i;     printf("Input n:");     scanf("%d",&n);          for(i=1;i<=n;i++){             e=e+1.0/item;                  printf("%lf\n", e); 			item *= i+1;               }         printf("e=%.4f\n",e);//这个输入10，输出11；         return 0;  } 大佬你的代码我试过了确实对，但是博大精深我还得花半个小时了解，现在我先把我的那个改了谢谢大佬

user: user-0
content: 引用 1 楼 user-3的回复:while和for循环嵌套使用，还有你i=1，i--，那你的while循环不就只进一次了吗 大佬你说的好像很对，但是那怎么把i赋予初值让它有意义

user: user-0
content: 大佬你说的好像很对，但是那怎么把i赋予初值让它有意义

user: user-1
content: 上个帖子都把完整的代码都给你了呀  #include<stdio.h> int main(int n, void ** argv ) {     double e=1,item=1;     int i;     printf("Input n:");     scanf("%d",&n);          for(i=1;i<=n;i++){             e=e+1.0/item;                  printf("%lf\n", e); 			item *= i+1;               }         printf("e=%.4f\n",e);//这个输入10，输出11；         return 0;  }

user: user-2
content: 怎么还没搞定啊？一个循环就可以了啊

user: user-3
content: while和for循环嵌套使用，还有你i=1，i--，那你的while循环不就只进一次了吗
user-0 提问: 习题求助

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 楼上方法不错  引用 1 楼 user-3 的回复:strcpy(str1+strlen(str1), str2);

user: user-3
content: strcpy(str1+strlen(str1), str2);
user-0 提问: 求编程结果，有人会做嘛

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 引用 3 楼 寻开心 的回复:第三个图 眼花 你营养跟不上  说了要节制点

user: user-3
content: 引用 1 楼 proorck2019 的回复:第一个，i<=10，.   越界啦，不能有等号  第二个图，最少也要把自定义函数需要搬家到主函数前面去，或者提前声明   第三个图 眼花

user: user-4
content: 第二个，   sum+a[i];

user: user-5
content: 第一个，i<=10，
user-0 提问: Leetcode 085 最大矩形面积 提交时 heap buffer overflow错误

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 调试方法： 首先确定哪里没有错，然后逐步缩小范围，找出错误。
user-0 提问: 小弟求指教

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-0
content: 引用 4 楼 user-2的回复:说了不行就是不行啦，if妥妥的不写，非要给自己找麻烦。 好嘞😄😄😄😄😄😄😄😄😄

user: user-2
content: 说了不行就是不行啦，if妥妥的不写，非要给自己找麻烦。

user: user-0
content: 引用 1 楼 user-2的回复:不行的，为啥不用if啊？ 这个switch是只能一个数字和字符当开关吗

user: user-0
content: 这个switch是只能一个数字和字符当开关吗

user: user-2
content: 不行的，为啥不用if啊？
user-0 提问: 关于一重循环的编程题我想知道我错在哪了

回复:
user: user-0
content: 引用 3 楼 45045399的回复:while(i) { item*=i; i--}中i的值未初始化，这样会导致读出的数具有不确定性 嗦嘎，大佬牛逼，惭愧啊

user: user-0
content: 引用 1 楼 寻开心的回复:你的item放到for循环外面就是固定值了啊， 本来应该是i!的 大佬你太强了，膜拜

user: user-1
content: while(i) { item*=i; i--}中i的值未初始化，这样会导致读出的数具有不确定性

user: user-2
content: 一层循环，这样就好了         printf("Input n:");         scanf("%d",&n);          for(i=1;i<=n;i++){             e=e+1.0/item;                  item *= i+1;               }         printf("e=%.4f\n",e);//这个输入10，输出11；

user: user-2
content: 你的item放到for循环外面就是固定值了啊， 本来应该是i!的
user-0 提问: PTA炮弹打蚊子，测试点2和测试点4 答案错误 帮忙看看怎么回事

回复:
user: user-1
content: 你把边缘都放上蚊子看看结果，虽然定义的是二维数据，但是在分配内存时却是连续的，也就是说可以用一维来访问，当你对XY进行加1或减1时，不一定访问了数组外的内存空间，还有可能是数组内的内存空间，如果目标位置没有蚊子，不影响结果，但是目标位置有蚊子时（实际应该是打不到的），结果就错了

user: user-0
content: 引用 1 楼 user-1 的回复:scanf("%d%d",&x,&y);//炮弹坐标          if(c[x][y]==1)         {             c[x][y]=0;//命中，剩余生命值为一半的情况下，直接消灭          }         else         {             c[x][y]-=2;//命中，剩余生命值-2，如果生命值满，则消灭，若没有蚊子，对应数值-2，不影响后续判断          }         c[x][y-1]-=1;         c[x][y+1]-=1;         c[x-1][y]-=1;         c[x+1][y]-=1;//对上下左右四个方向-1生命值   1、你的整个代码没有下标越界的判断，那么假定你输入的坐标不存在下标越界问题，但是对于 c[x][y-1]-=1;         c[x][y+1]-=1;         c[x-1][y]-=1;         c[x+1][y]-=1;//对上必须判断下标是否越界，如果不判断，当你输入的坐标是二维平面的边缘时，数据就会计算错误。可以了，我知道越界编译器不会警告也不会报错，但是，为什么我实际调试的时候选择了边缘的坐标后输出结果并没有出错？我起初是判断了边缘情况的，后来发现越界后输出结果也是一致的就没有判断了，直接硬解

user: user-1
content: scanf("%d%d",&x,&y);//炮弹坐标          if(c[x][y]==1)         {             c[x][y]=0;//命中，剩余生命值为一半的情况下，直接消灭          }         else         {             c[x][y]-=2;//命中，剩余生命值-2，如果生命值满，则消灭，若没有蚊子，对应数值-2，不影响后续判断          }         c[x][y-1]-=1;         c[x][y+1]-=1;         c[x-1][y]-=1;         c[x+1][y]-=1;//对上下左右四个方向-1生命值   1、你的整个代码没有下标越界的判断，那么假定你输入的坐标不存在下标越界问题，但是对于 c[x][y-1]-=1;         c[x][y+1]-=1;         c[x-1][y]-=1;         c[x+1][y]-=1;//对上必须判断下标是否越界，如果不判断，当你输入的坐标是二维平面的边缘时，数据就会计算错误。
user-0 提问: c语言main函数问题

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 引用 6 楼 盘古大大帝 的回复:0x20个字节 0x23个字节是怎么看出来的 0x0000413433323110存储的是：0x0000413433323130相减就是0x20

user: user-0
content: 引用 1 楼 user-5 的回复：argv是char*数组 每个元素都是指针  第一个元素的地址 和 argv的地址一样是 0x0000413433323110 第一个元素存的数据是  是 30 31 32 33 34 41 00 00 小端模式 对应的地址是  0x0000413433323130 argv后面 0x20 个字节 就是 argv[0]  就是第三行的 31 43 00.... 字符串0结尾 后面的数据不用管  所以程序名是 0x31 0x43 0x00表示的字符串 1C 备注 要大写   后面的以此类推  第一个参数存的指针是 0x00413433323133 是argv后面0x23个字节 从第一行的 30 31 32.... 开始数 数到 0x23 是第三行的第四个数字30 00... 0结尾 后面不用管  第一个参数字符串数据的是 30 00 就是0  后面就不继续说了0x20个字节 0x23个字节是怎么看出来的

user: user-3
content: 首先64位系统的指针是8字节的，所以每个地址可存储8字节的数据。 argv的第一个参数为程序名，从地址上看应该是小端存储的方式，argv[0]应该是"01234A"，也就是程序名字。 argv[1]是"31234A" argv[2]是"51234A" 第二行的后8字节全是\0，说明没有参数，那么参数到此处就不传了。

user: user-2
content: 是滴哦，我搞错了。

user: user-4
content: 那个不是标识符啊， 是编译出来的执行文件名字

user: user-2
content: 标识符不是不能以数字开头吗？ 1C岂不不合法？ ......

user: user-5
content: argv是char*数组 每个元素都是指针  第一个元素的地址 和 argv的地址一样是 0x0000413433323110 第一个元素存的数据是  是 30 31 32 33 34 41 00 00 小端模式 对应的地址是  0x0000413433323130 argv后面 0x20 个字节 就是 argv[0]  就是第三行的 31 43 00.... 字符串0结尾 后面的数据不用管  所以程序名是 0x31 0x43 0x00表示的字符串 1C 备注 要大写   后面的以此类推  第一个参数存的指针是 0x00413433323133 是argv后面0x23个字节 从第一行的 30 31 32.... 开始数 数到 0x23 是第三行的第四个数字30 00... 0结尾 后面不用管  第一个参数字符串数据的是 30 00 就是0  后面就不继续说了
user-0 提问: 用C语言将个十位互换

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-0
content: 引用 8 楼 wowpH的回复:。。。题目说的是用带参的宏吧。 是啊，我用了宏参啊，只是后面执行的时候有点小问题

user: user-0
content: 引用 6 楼 SuperDay的回复:这样交换可能会有问题，可以定义一个语句块，用中间变量来交换 刚学c语言的我完全听不懂

user: user-0
content: 引用 4 楼 这是一个正经昵称的回复:%02d 凑够6个字 谢谢我照这样弄出来了

user: user-2
content: 。。。题目说的是用带参的宏吧。

user: user-0
content: 引用 5 楼 壹抹尘埃的回复:[quote=引用 2 楼 qq_45904094 的回复:] [quote=引用 1 楼 壹抹尘埃的回复:] int x,a,b,c;  scanf("%d",&x);  a=x%10; //取个位  b=x/10%10; //取十位   c=x/100; //十位以上的      x = c*100+10*a+b; //交换个/十位  printf("%d\n",x);   return 0; 谢谢你啊，不过我的作业要求不是这样的[/quote] 给你个思路，剩下的就简单了。也可以这样做 int x，y；  y= (x%10)*10 + (int)(x/10); return y；[/quote] 好的，谢谢啦！！！！！！

user: user-3
content: 这样交换可能会有问题，可以定义一个语句块，用中间变量来交换

user: user-4
content: 引用 2 楼 qq_45904094 的回复:[quote=引用 1 楼 壹抹尘埃的回复:] int x,a,b,c;  scanf("%d",&x);  a=x%10; //取个位  b=x/10%10; //取十位   c=x/100; //十位以上的      x = c*100+10*a+b; //交换个/十位  printf("%d\n",x);   return 0; 谢谢你啊，不过我的作业要求不是这样的[/quote] 给你个思路，剩下的就简单了。也可以这样做 int x，y；  y= (x%10)*10 + (int)(x/10); return y；

user: user-5
content: %02d 凑够6个字

user: user-0
content: 引用 1 楼 壹抹尘埃的回复:int x,a,b,c;  scanf("%d",&x);  a=x%10; //取个位  b=x/10%10; //取十位   c=x/100; //十位以上的      x = c*100+10*a+b; //交换个/十位  printf("%d\n",x);   return 0; 谢谢你啊，不过我的作业要求不是这样的😂

user: user-4
content: int x,a,b,c;  scanf("%d",&x);  a=x%10; //取个位  b=x/10%10; //取十位   c=x/100; //十位以上的      x = c*100+10*a+b; //交换个/十位  printf("%d\n",x);   return 0;
user-0 提问: C语言题目（关于单词统计）

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-0
content: 十分感谢！
user-0 提问: C语言编程

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: cd4017   cd4511   数码管   按键  led

user: user-3
content: 你这个问题不是更应该去电子发烧友之类的网站吗
user-0 提问: 关于PTA中的一个语法问题

回复:
user: user-0
content: 引用 2 楼 SuperDay的回复:楼主，又见到你了！你没看到main函数里面已经判断了m和n了吗？ 大佬你好啊，问了个愚蠢问题，好丢脸啊

user: user-0
content: 大佬你好啊，问了个愚蠢问题，好丢脸啊

user: user-0
content: 引用 1 楼 user-2的回复:(m,n)是开区间 [m,n]是闭区间 这是高数的内容 3、因为恰好m和n不是水仙花数 哎呀我三天前看出来了挖坟又忘了，好丢脸，多谢大佬指点

user: user-1
content: 楼主，又见到你了！你没看到main函数里面已经判断了m和n了吗？

user: user-2
content: (m,n)是开区间 [m,n]是闭区间 这是高数的内容 3、因为恰好m和n不是水仙花数
user-0 提问: 求问鸭

回复:
user: user-1
content: 参考文档： https://blog.csdn.net/Donald_Shallwing/article/details/99734501

user: user-2
content: 不建议这么提问题，你这不是提问而是求人代写～

user: user-3
content: 问啥问题咯 ，“朋友们你们觉得这个题目怎么样？简单的话要不顺便帮我做了，还要注释的那种”。
user-0 提问: 救救孩子吧

回复:
user: user-1
content: 斐波那契数列： 项：0  1  2  3  4  5  6 值：0  1  1  2  3  5  8  找规律会找吧

user: user-2
content: for循环中有个n，肯定是参数啊，填在1 2的地方肯定是填斐波那契数列的通项公式
user-0 提问: C语言void函数中的return

回复:
user: user-1
content: 佩服你的钻研精神，最后一行后，函数就结束了，当然不用写return; 中间写return , 是为了不执行后面的代码。

user: user-2
content: 刚才看了个贴，说的是xcode没return编译报错

user: user-2
content: 只能写return，后面不能写返回值？？？？？

user: user-3
content: 不论是void还是int都可以写return,根据实际情况吧。只不过void的函数里，return；后面不跟数据

user: user-4
content: return就是用来返回值的，void无返回值所以不用最后写return，其他如int，总得返回个int类型的值，不然就和函数定义不符了，所以才加return int。
user-0 提问: 万恶的vscode

回复:
user: user-0
content: markdown神器现在瘸了一条腿

user: user-1
content: 有用这么高级的东西，我只会用VS

user: user-0
content: 手动置顶

user: user-0
content: 引用 5 楼 user-2 的回复:之前用的那个markdown all in one感觉有的显示不是很好  显示用另外的插件，自带的显示令人难受

user: user-2
content: 之前用的那个markdown all in one感觉有的显示不是很好

user: user-2
content: 这个markdown很好用吗？我来下载试试
user-0 提问: switch怎么写范围判断

回复:
user: user-1
content: 没听说，写程序不要怕麻烦，怕麻烦可以去当领导，不用写程序

user: user-0
content: 引用 3 楼 SuperDay的回复:没听说，没必要，少折腾 我觉着用if判断范围太麻烦了 switch不能范围判断吗

user: user-0
content: 引用 1 楼 SuperDay的回复:最新的C++标准吗？编译器不支持吧 case 0: case 1: case 2: case 3:     ...     break; 写的是c程序 别人说...是gcc方言

user: user-1
content: 最新的C++标准吗？编译器不支持吧 case 0: case 1: case 2: case 3:     ...     break;

user: user-2
content: switch不支持这种范围的判断，乖乖的if else if ...吧

user: user-3
content: 没有哦，C有没这种方法的，只能按部就班一个一个写出来，可以使用2楼的写法

user: user-4
content: 建议这么写：  switch (i) {     case 0:     case 1:     case 2:      . . .      break; 不能用省略号，比如7~9则要：case 7: case 8: case 9:都写出来
user-0 提问: 送分儿题

回复:
user: user-1
content: 这个和精度有关系吗 不是只和while括号里是否为0有关吗

user: user-2
content: 引用 3 楼 寻开心的回复:给初学者的问题哎   目的就是要立即while里面的那个东西到底是什么  Quesstion1: float f = 1.3 while ( f-2 ) {      cout << "what?";    // 这一句会输出吗？ 为什么 }   Quession 2:   float f = 1.3;   int n = f-2;   while( n ) {        cout << "what?";  // 会运行不    ｝；  Quesstion 3：   float f = 1.3；   float d= f-2;   while ( d ) {         cout << "what?" // 这句会执行bu    }  根本问题就是， while语句括号里面的到底是什么 ？ Q1能运行，Q2不能运行，Q3能运行。 Q2之所以不能运行是因为n是整形变量，运算后的结果会舍去小数部分，最终结果为零。在循环条件中0即false，非0即true。 所以：Q1能运行，Q2不能运行，Q3能运行。

user: user-0
content: 算了。不玩了。结贴。  本来就是想说明一下while（） 括号里面的表达式是和返回的类型做同类型下0的比较的事儿  都没兴趣参与

user: user-3
content: f-2是while判断的，对于整型数据表达是f-2若为0，则不执行若非0，则执行循环体； 对于浮点数f-2就需要自己加一些条件判断了，比如  while (fabsf(f-2) > 1e-6)  所以这个问题本身可能就存在问题～

user: user-0
content: 给初学者的问题哎   目的就是要立即while里面的那个东西到底是什么  Quesstion1: float f = 1.3 while ( f-2 ) {      cout << "what?";    // 这一句会输出吗？ 为什么 }   Quession 2:   float f = 1.3;   int n = f-2;   while( n ) {        cout << "what?";  // 会运行不    ｝；  Quesstion 3：   float f = 1.3；   float d= f-2;   while ( d ) {         cout << "what?" // 这句会执行bu    }  根本问题就是， while语句括号里面的到底是什么 ？

user: user-4
content: 会运行。。。。

user: user-5
content: 肯定会运行吧（偷偷敲了，我卢本伟没有开挂），我把f-2改成f-1.3，以为是由于精度问题，所以才会输出，结果当我监视f-1.3的值，立马就懵了，修改成f-1.3f.等楼下解释

user: user-6
content: 我觉得问题本身应该是考精度问题吧，和while没关系
user-0 提问: C语言missing ; before type怎么回事？

回复:
user: user-0
content: 引用 2 楼 WQR1994的回复:return z; 好像这个z加不加括号都行

user: user-0
content: 引用 3 楼 寻开心的回复:标准c里面没有max函数， c++里面有 要使用它需要在main前面增加一个 #define max(a, b) ((a)>(b) ? (a) : (b))  此外 main() {    float max(float x,float y);    // 这里在做什么呢  没有这种定义的方法  整个代码里面 ｛｝ 也没有完全匹配，貌似最后也少了几个 } 哦哦，我再弄弄，谢谢。

user: user-1
content: 标准c里面没有max函数， c++里面有 要使用它需要在main前面增加一个 #define max(a, b) ((a)>(b) ? (a) : (b))  此外 main() {    float max(float x,float y);    // 这里在做什么呢  没有这种定义的方法  整个代码里面 ｛｝ 也没有完全匹配，貌似最后也少了几个 }

user: user-2
content: return z;

user: user-0
content: 有没有人帮忙看看      。

user: user-1
content: ------------------------------------------------ float max(float x,float y)提示错误在这一行 {float z; z=x>=y? x:y; return(z) } ------------------------------------------------  要把max变成函数是这样的： float max(float x, float y) {      return x>y ? x : y; }  按照你自己的写法，最后那一行 错不在return (z) 有没有括号，错在少分号结束。  z有没有括号都没有语法错误。 加括号是多此一举。  main里面的那句    float max（floatx, float y） 搬到main函数外面，放到#include 语句后面一行。    函数的提前声明，不能放到其他的函数体里面去
user-0 提问: C语言if语句判断问题，小白求大神解答，感激不尽

回复:
user: user-1
content: 不知道你的使用环境，一个可能的原因是启用了缓存。尝试加violate关键字，避免使用了未更新的缓存数据。 例如：violate ... macaddr;
user-0 提问: 超简单问题，大一初级

回复:
user: user-1
content: 你不要光顾着道谢，你要记得结贴

user: user-0
content: 引用 2 楼 datoulaile123的回复:第一张图，前两个循环是输入，后两个循环是输出,每三个值后换行（打印\n） 后一张图，p是指针，每次输入一个值后，p就指向下一个地址用于接收下一个数据 谢谢，我只是想道谢，，，，，，

user: user-2
content: 第一个问题的话，楼主说的scanf是哪个scanf啊？有点多 第二个问题，因为新建了指针变量p使其指向数组a[N]所以默认是指向的数组第一位，p++是为了在再输入一个数字之后把指针进行后移，让其指向刚才输入的数字在数组里的后面的位置，来存放下一个输入的数字，避免出现所有的数字都输入到第一位了产生了覆盖，最后结果只有最后一个数字的问题

user: user-3
content: 第一张图，前两个循环是输入，后两个循环是输出,每三个值后换行（打印\n） 后一张图，p是指针，每次输入一个值后，p就指向下一个地址用于接收下一个数据

user: user-4
content: 请参考《C++数组地址偏移》 希望能够帮到你！
user-0 提问: 【时间超限】c语言入门练习题，较基础，是否有人愿意帮忙优化代码

回复:
user: user-1
content: 没有考虑d<=0  a1初值<0的情况

user: user-1
content: 没有你想的那么复杂，程序员的目标就是把世界代码化，注释什么的都是历史的倒退，自己分析吧

user: user-2
content: 引用 1 楼 qq_45798109的回复:没看明白if k<2想干嘛 我觉得可能不是时间超限的问题， 没调试，但是我觉得可能是int类型不够用吧

user: user-2
content: 没看明白if k<2想干嘛 我觉得可能不是时间超限的问题，
user-0 提问: 编写一个函数，判断一个字符串是不是一个E-mail地址。输入6 个字符串，将其中是E-mail地址的输出。为啥我的程序是死循环？

回复:
user: user-1
content: 这个 break 只能跳出最内层的循环，当条件满足时输出s，跳出最内层的循环并且使 j = 0 所以会一直输出；你把最内层的 for 去掉就可以了。

user: user-2
content: for(j=0;j<len;j++)    {       printf("%s",s);       break;//？break？        }       }

user: user-3
content: 第二层循环的循环变量是j，第三层循环的循环变量还是j？想怎么搞？
user-0 提问: 数组

回复:
user: user-0
content: 好的，谢谢各位

user: user-1
content: 请参考《C++中函数的数组形参》 希望能够帮到你！

user: user-2
content: 引用 2 楼 fight_all 的回复:[quote=引用 1 楼 zjq9931 的回复:] 直接用啊，你是想知道数组的大小？  int *buf_fun(char *byte_buff,int byte_num) {     int buf[512/8] = {0};     char data = 0;     for(int i = 0;i < byte_num;i++)     {         data >>= 1;         data |= 0x80;         if ((i + 1) % 8 == 0)//7 15 23 31 39         {             buf[i / 8] = data;             data = 0;         }      }     return buf;  } 比如这个函数，我传过来一个buf，然后怎么使用[/quote]  返回局部变量是未定义性为，因为函数调用结束，这个局部变量就会被释放了。  可以考虑加static修饰这个变量（数组），或者这个数组的内存从堆上（malloc/free）申请得到～

user: user-0
content: c语言里可以这样写吗

user: user-3
content: 引用 4 楼 fight_all 的回复:那应该怎么使用传过来的数组呢  这样就可以  int *buf = new int[512/8];

user: user-0
content: 那应该怎么使用传过来的数组呢

user: user-4
content: 用不了  局部变量 函数结束就销毁  你在main里面 只拿到一个野指针

user: user-0
content: 引用 1 楼 zjq9931 的回复:直接用啊，你是想知道数组的大小？  int *buf_fun(char *byte_buff,int byte_num) {     int buf[512/8] = {0};     char data = 0;     for(int i = 0;i < byte_num;i++)     {         data >>= 1;         data |= 0x80;         if ((i + 1) % 8 == 0)//7 15 23 31 39         {             buf[i / 8] = data;             data = 0;         }      }     return buf;  } 比如这个函数，我传过来一个buf，然后怎么使用

user: user-3
content: 直接用啊，你是想知道数组的大小？
user-0 提问: c语言入门程序不知道错哪了

回复:
user: user-0
content: 蟹蟹各位，确实是那个分号的问题这个软件没有直接指错的功能，麻烦大家啦

user: user-1
content: 多一个分号；在函数定义的末尾（函数名的一行末尾）有一个分号，导致函数不被定义。我想编译器应该会给你警告， 因此警告信息也要注意下～

user: user-2
content: 1、2、3楼说的都对 但是重点在这：错误提示那里请重新抓图，看不清楚。因为上面说的那些提示不是这样的。个人推断：楼主这个汉化的VC6.0配置有问题，应该是类似error spawning cl.exe这种错。解决方法：安装原版的vc6.0或者网上搜索这串英文，进行正确的路径配置。  让重新发图就是需要确认是否上述错误

user: user-3
content: 函数实现那里多个分号

user: user-4
content: 第二int IsPrime(int x) 后面的分号需要去掉，这个函数定义已经明确了，第一个有分号是因为预置函数，就是告诉程序编译器我会有这样一个函数，第二个没有分号是因为要再花括号里写函数内容，两个含义是不一样的，所以第二个没有分号

user: user-5
content: 函数定义后面多了个分号

user: user-6
content: 你是第6个说“我的代码照书上敲的”。最后被打脸的。  虽然赵老师说过“不要迷信书，此处省略若干字”，但是大多数情况下课本还是对的。 ------------------------------------------------------------------ 1、如果问题已经得到解决，请及时结贴。结贴教程。 2、如果没有解决，可继续追问。 3、只能在电脑网页上结贴，手机不能结贴。 CSDN论坛新手指南 ------------------------------------------------------------------

user: user-7
content: 引用 6 楼 qq_45825415 的回复:蟹蟹各位，确实是那个分号的问题这个软件没有直接指错的功能，麻烦大家啦你看到 1 error 0 warning的那个子窗口 右边 有一个滑块 可以拉上去 就能看到详细错误提示信息了

user: user-8
content: 引用 6 楼 qq_45825415 的回复:蟹蟹各位，确实是那个分号的问题这个软件没有直接指错的功能，麻烦大家啦 vc6.0？没有指错的功能？你别骗我，虽然近些年都用的vs
user-0 提问: 输入8个整数，统计一第一个元素不相同的元素有几个，为什么我不管输入什么，都显示有7个不同元素？

回复:
user: user-1
content: scanf("%d",&s[8]); 你只输入1个数字 固定存在数组后面一个元素的位置  比较的都是垃圾值
user-0 提问: C语言入门小白

回复:
user: user-1
content: 一起编译的文件里存在多个main，建议楼主检查一下～

user: user-2
content: 还有可能是你建项目了，然后一个项目里包含了两个main函数

user: user-3
content: dev报这个错误好像是因为你之前的命令行窗口没关闭

user: user-0
content: 真的是这样谢谢谢谢！
user-0 提问: 为什么我写的代码不对？求解答

回复:
user: user-1
content: 不能把程序好好改改吗？好好看看书

user: user-0
content: 引用 1 楼 user-1的回复:没有派这种变量名，好好看一下书上怎么写。输入格式乱七八糟的，整数运算4/3结果是1也不对，要改成浮点数 这样还是不对，为啥？

user: user-0
content: 引用 1 楼 user-1的回复:没有派这种变量名，好好看一下书上怎么写。输入格式乱七八糟的，整数运算4/3结果是1也不对，要改成浮点数 #include<stdio.h> #define PI 3.141592 int main() {int h=3; float r=1.5,c=2πr,s1=πr*r,s2=4πr*r,v1=4/3πr*r,v2=s1*h; scanf("c=%f,s1=%f,s2=%f,v1=%f,v2=%f",&c,&s1,&s2,&v1,&v2); printf("%.2f",c,s1,s2,v1,v2); return 0;  }

user: user-1
content: 没有派这种变量名，好好看一下书上怎么写。输入格式乱七八糟的，整数运算4/3结果是1也不对，要改成浮点数
user-0 提问: 求教，这个转置矩阵的代码哪错了？为什么会出现这种情况？

回复:
user: user-1
content: b数组的列数应该是m个，不是n个吧～

user: user-0
content: 引用 5 楼 user-2 的回复：删不了（其实可以删）的话，就结贴给分好的，不过手机端好像不能结贴，我回去就结贴

user: user-2
content: 删不了（其实可以删）的话，就结贴给分

user: user-0
content: 引用 2 楼 user-2 的回复：不要重复发帖，麻烦删一个。emmm好像删不了贴?

user: user-0
content: 引用 2 楼 user-2 的回复：不要重复发帖，麻烦删一个。好的👌谢谢

user: user-2
content: 不要重复发帖，麻烦删一个。

user: user-2
content: 检查一下输出数组b的循环条件
user-0 提问: 求教，这个转置矩阵的代码哪错了？为什么会出现这种情况？

回复:
user: user-1
content: 直接i,j调换位置输出就好了呀，不需要设数组b的

user: user-1
content: 输出时候循环条件写错了一个m一个n，你写了两个n
user-0 提问: 小白求大神相助

回复:
user: user-1
content: 可以在最后return，这是对n出现负数的情况 或者把n改成无符号整数，然后最后一个if(n > 1)去掉

user: user-0
content: 引用 1 楼 user-1 的回复：有可能出现没有return的情况，严格一点的编译器不支持我需要怎么改进

user: user-1
content: 有可能出现没有return的情况，严格一点的编译器不支持
user-0 提问: 宿舍分配问题不知道问题出在哪里

回复:
user: user-1
content: scanf_s("%c", &s, 1); 如果要用%c格式输入，需要加一个参数即第三参数；  建议楼主确认一下输入的格式，另外，根据提示（第一个printf）可知，需要输入的不止一个参数值～

user: user-2
content: int型用%d格式符

user: user-3
content: 你的s是int型的，用了%c输入接收
user-0 提问: C语言新手，如何用C语言输入一组数，然后按规则一：所有的偶数排在奇数前面。 规则二：在规则一的前提下按照从大到小的顺序排序

回复:
user: user-1
content: #include<stdio.h> #include <stdlib.h> #include <time.h>  #define MAX_SIZE    128  int g_key;  void init_arr(int *arr, int len); void print_arr(int *arr, int len); void bubble_sort(int *arr, int len); void swap_odd_even(int *arr, int len); int main() {     /*     int i,j,h,m,k,n,t,a[100],b[100];     k=0;     scanf("%d",&n);     m=n-1;     for(i=0;i<n;i++)     {         scanf("%d",&a[i]);     }     for(j=0;j<n;j++)     {         if(a[j]%2==0)         {             b[k]=a[j];             k++;         }         if(a[j]%2==1)         {             b[m]=a[j];             m--;         }     }     for(i=0;i<n;i++)         printf("%d ",b[i]);     */     int arr[MAX_SIZE], n;      scanf("%d", &n);     if (n > MAX_SIZE)         n = MAX_SIZE;      init_arr(arr, n);     print_arr(arr, n);  #if 0     bubble_sort(arr, n);     printf("After sort: ");     print_arr(arr, n);     swap_odd_even(arr, n);     printf("After swap: ");     print_arr(arr, n); #endif     printf("After swap: \n");     swap_odd_even(arr, n);     print_arr(arr, n);      bubble_sort(arr, g_key);     printf("After sort: \n");     print_arr(arr, n);      bubble_sort(arr+g_key, n - g_key);     printf("After sort: \n");     print_arr(arr, n);     return 0; }  void init_arr(int *arr, int len) {     int i;      srand(time(NULL));     for (i = 0; i < len; i++) {         //scanf("%d", &arr[i]);         arr[i] = rand() % 100;     } }   void print_arr(int *arr, int len) {     int i;      for (i = 0; i < len; i++) {         printf("%d\t", arr[i]);         if ((i + 1) % 10 == 0)             printf("\n");     }     putchar(10); }  void swap_odd_even(int *arr, int len) {     int tmp;     int start, end, i;      start = 0;     end = len - 1;      while (start < end) {         while (start < len && arr[start] % 2 == 0)             start++;         while (end >= 0 && arr[end] % 2)             end--;          if (start < end) {             tmp = arr[start];             arr[start] = arr[end];             arr[end]  = tmp;         }     }     g_key = start;     printf("g_key = %d\n", g_key); }  void bubble_sort(int *arr, int len) {     int i, j;     int tmp;      for (i = 0; i < len -1; i++)         for (j = 0; j < len - 1 - i; j++)             if (arr[j] < arr[j+1]) {                 tmp = arr[j];                 arr[j] = arr[j+1];                 arr[j+1] = tmp;             } }   供参考～  逻辑就是:先swap奇数和偶数，然后分别对奇数和偶数排序。用了一个全局变量用于保存偶数和奇数的分界点 排序是普通的冒泡排序。swap算法详见代码～

user: user-2
content: 你不是实现了功能1吗，功能2的话，选择个排序方法再进行排序就行了啊，从下标0到k-1，k到n-1两次排序后输出
user-0 提问: 哥哥们，来救救我，好么@求这个数列的和，调试不行了。

回复:
user: user-0
content: 引用 2 楼 自信男孩的回复:s=s+1.0/sum; 改成这样试试。因为1和sum都是整型，所以除法运算是按照整型来算的。 把1改成1.0，那么1.0/sum就按照浮点数除法来计算了。 谢谢啦好嘞，我刚刚又想到怎么改了

user: user-0
content: 引用 3 楼 SuperDay的回复:s = ap(s); 返回值需要保存 是的，我刚刚也发现了。谢谢啦

user: user-1
content: s = ap(s); 返回值需要保存

user: user-2
content: s=s+1.0/sum; 改成这样试试。因为1和sum都是整型，所以除法运算是按照整型来算的。 把1改成1.0，那么1.0/sum就按照浮点数除法来计算了。

user: user-3
content: s=s+1/sum;  sum最好时double或者float类型
user-0 提问: 大神们帮忙看看，一直过不了，说答案错误

回复:
user: user-0
content: 引用 10 楼 wowpH的回复:B/m会取整的，建议变形为乘法 但我后面取余数了啊……

user: user-1
content: B/m会取整的，建议变形为乘法

user: user-0
content: 用long 没关系吧

user: user-2
content: 或者说你应该用int，而不是long int型？然后输入输出都用%d？可不影响功能啊。

user: user-2
content: 引用 6 楼 beishang_1 的回复:不知道，我也觉得没问题 那就可以进行怼人的行为了

user: user-0
content: 不知道，我也觉得没问题

user: user-2
content: 引用 4 楼 beishang_1 的回复:哈哈哈，这是我们学校去年的竞赛题 看代码逻辑没问题啊

user: user-0
content: 哈哈哈，这是我们学校去年的竞赛题

user: user-2
content: 引用 2 楼 beishang_1 的回复:就是要输出n把钥匙的最少钱 我以为是搞笑图片，都没注意看

user: user-0
content: 就是要输出n把钥匙的最少钱

user: user-2
content: 能运行，说说你要实现的功能
user-0 提问: 数据结构二叉排序树

回复:
user: user-1
content: 引用 1 楼 user-1 的回复:大致可以这样写：  class binTree{ public: 	int			key; 	binTree *lchild, *rchild; };  void nonRepeatPrint(binTree *t, int key){ 	 	if(t){ 		binTree(t->lchild, key); 		if(key != t->key){ 			cout << t->key << " "; 			t->key = key; 		} 		binTree(t->rchild, key); 	} }    传入的binTree *root这个参数，是一个二叉排序树的根节点的地址

user: user-1
content: 不过有个问题： 你这个序列最小或者最大的值是多少？ 必须要确定这个问题，因为，这涉及key传参时初值的选择问题

user: user-1
content: 大致可以这样写：  class binTree{ public: 	int			key; 	binTree *lchild, *rchild; };  void nonRepeatPrint(binTree *t, int key){ 	 	if(t){ 		binTree(t->lchild, key); 		if(key != t->key){ 			cout << t->key << " "; 			t->key = key; 		} 		binTree(t->rchild, key); 	} }
user-0 提问: c++,求大佬指点

回复:
user: user-0
content: 引用 2 楼 user-1 的回复:#include<math.h> #include<stdio.h>      //从键盘上输入三角形的三个边长，求三角形的面积。  int main() { 	double a, b, c, area;  	printf("请输入a,b,c的值"); 	scanf("%lf,%lf,%lf", &a, &b, &c); 	double s = (a + b + c) / 2; 	area = sqrt(s*(s - a)*(s - b)*(s - c)); 	printf("ar=%f\n", area); 	return 0; } s没定义，sqrt函数调用怎么能用[]，明显要用(),而且相乘中间要加*  引用 2 楼 user-1 的回复:#include<math.h> #include<stdio.h>      //从键盘上输入三角形的三个边长，求三角形的面积。  int main() { 	double a, b, c, area;  	printf("请输入a,b,c的值"); 	scanf("%lf,%lf,%lf", &a, &b, &c); 	double s = (a + b + c) / 2; 	area = sqrt(s*(s - a)*(s - b)*(s - c)); 	printf("ar=%f\n", area); 	return 0; } s没定义，sqrt函数调用怎么能用[]，明显要用(),而且相乘中间要加* 谢谢

user: user-1
content: #include<math.h> #include<stdio.h>      //从键盘上输入三角形的三个边长，求三角形的面积。  int main() { 	double a, b, c, area;  	printf("请输入a,b,c的值"); 	scanf("%lf,%lf,%lf", &a, &b, &c); 	double s = (a + b + c) / 2; 	area = sqrt(s*(s - a)*(s - b)*(s - c)); 	printf("ar=%f\n", area); 	return 0; } s没定义，sqrt函数调用怎么能用[]，明显要用(),而且相乘中间要加*
user-0 提问: 数据结构中seqlist 和sqlist的区别

回复:
user: user-1
content: 分别是静态分配的顺序表和动态分配的顺序表。

user: user-2
content: 建议贴代码吧～

user: user-3
content: 问题太模糊，无法回答。 再说详细点。
user-0 提问: 输入n和n个正整数，要求将该数组各元素按从小到大排序。同时如果数组元素数值在A到Z的ASCII之间，替换为对应字母。

回复:
user: user-1
content: /**  * @file    demo.c  * @brief     */  #include <stdio.h> #include <stdlib.h>  static int compint(const void *p1, const void *p2) {     const int *v1, *v2;      v1 = (const int *)p1;     v2 = (const int *)p2;     return *v1 - *v2; }  int main(void) {     int i, n, *c;      scanf("%d", &n);     c = malloc(sizeof(int) * n);      for (i = 0; i < n; i++)         scanf("%d", &c[i]);     qsort(c, n, sizeof(int), compint);     for (i = 0; i < n; i++) {         if (c[i] >= 'A' && c[i] <= 'Z')             putchar(c[i]);         else             printf("%d", c[i]);         if (i < n - 1)             putchar(' ');     }     putchar('\n');      free(c);      return 0; }  $ cat demo.txt 32 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ./demo < demo.txt 64 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 91 92 93 94 95

user: user-2
content: 数值在65('A')~90('Z')则直接用%c输出即可～

user: user-3
content: 排序的话，应该自己能实现，字打错了

user: user-3
content: 你的功能应该是int a = 65;char c = a;这样实现，当然判断下a的大小是不是在字母的ASCII之间就行了，至于排序的话，这个应该之间能实现吧
user-0 提问: 去掉字符串中元音字母  

回复:
user: user-0
content: 引用 10 楼 wowpH 的回复:[quote=引用 9 楼 江中命 的回复:] 找到问题啦（谢谢了（又及保密其实是空字符串 不是吧。。。空字符串我用你的代码测试过了，两个代码结果一样啊。。。。my god[/quote]我原来的代码没有写string[k]='\0'吧可能？所以输入空字符的话就输出\n？（憨憨瞎猜（结果应该不一样吧（可惜保密看不到我的输出答案是什么（打算下节课去问老师啦

user: user-1
content: 习惯了用fgets代替scanf  #include <stdio.h>  int iscrlf(int c) {     return ('\n' == c || '\r' == c); }  int isvowel(int c) {     return         ('a' == c || 'e' == c || 'i' == c || 'o' == c || 'u' == c       || 'A' == c || 'E' == c || 'I' == c || 'O' == c || 'U' == c); }  #define LINE_SIZE   80 int main(int argc, char *argv[]) {     int  i, j, n;     int  c;     char line[LINE_SIZE + 1];      fgets(line, sizeof(line), stdin);     n = atoi(line);     for (i = 0; i < n; i++) {         fgets(line, sizeof(line), stdin);         for (j = 0; line[j] != '\0'; j++) {             c = line[j];             if (iscrlf(c))                 break;             if (!isvowel(c))                 putc(c, stdout);         }         printf("\n");     }      return 0; }

user: user-2
content: 看不出来。但是建议遵循“单一变量原则”，一个一个对比，应该能找出来。

user: user-2
content: 引用 9 楼 江中命 的回复:找到问题啦（谢谢了（又及保密其实是空字符串 不是吧。。。空字符串我用你的代码测试过了，两个代码结果一样啊。。。。my god

user: user-0
content: 找到问题啦（谢谢了（又及保密其实是空字符串

user: user-3
content: getchar是接收输入缓存里的'\n'，而这个'\n'是上次输入留下的。

user: user-4
content: 你输入n结束的时候是不是要按一下回车，如果你不用getchar接受，这个回车仍然在缓冲区中，然后就输入到你的字符串里了

user: user-5
content: 在windows系统下getchar和scanf读到回车键时，就结束函数了，不过回车键有两个字符\r\n，scanf只读取了\r，所以缓冲区留下了\n，用getchar把这个\n给读取掉，以免影响后续的输入

user: user-0
content: again一个问题 我换了个思路编写（这个突然就通过了保密用例emmmm所以上面那个程序到底哪里错了 想问一下gets(string)这一行为什么不能写成scanf("%[^\n]",string) #include <stdio.h> int main() { int n,i,j,k;   char string[100];   scanf("%d%*c",&n);   for(i=1; i<=n; i++)   {      gets(string);     for(j=k=0; string[j]; j++)       if(string[j]!='A'&&string[j]!='E'&&string[j]!='I'&&string[j]!='O'&&string[j]!='U'&&string[j]!='a'&&string[j]!='e'&&string[j]!='i'&&string[j]!='o'&&string[j]!='u')         string[k++]=string[j];     string[k]='\0';     puts(string);   }  return 0;  }

user: user-0
content: 欸那既然Windows回车是\r\n那为什么printf只要写\n就行（明白getchar啦蟹蟹！

user: user-0
content: 准确说来还有一个问题（我通不过保密用例emmmm
user-0 提问: 求一个程序

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  #define MAX_NUM_LEN 2048  int cal_factorial(unsigned char *num_list, int num_size, int n);  int cal_val(unsigned char *num_list, int num_size, int base, int num) {     int i = 0, j;     int len = 1, tmp, carry_bit;      num_list[1] = 1;      while (i < num) {         carry_bit = 0;         for (j = 1; j <= len; j++) {             tmp = num_list[j] * base + carry_bit;             num_list[j] = tmp % 10;             carry_bit = tmp / 10;             if (j >= len && carry_bit != 0)                 len++;             if (num_size-1 < len) {/* overflow */                 printf("Overflow!\n");                 return num_size-1;             }         }         i++;     }      return len; }   int main(void) {     unsigned char num_list[MAX_NUM_LEN];     int num_len, i;     int base, power;      memset(num_list, 0, sizeof(num_list));     printf("Please input two numbers: ");     scanf("%d%d", &base, &power);      if (base < 0 && power % 2)         num_list[0] = 1; /* negative number */     else         num_list[0] = 0;     base = abs(base);      num_len = cal_val(num_list, MAX_NUM_LEN, base, power);     printf("len = %d\n", num_len);     if (num_list[0])         putchar('-');     for (i = num_len; i >= 1; i--)         printf("%d", num_list[i]);     printf("\n");     return 0; }   int cal_factorial(unsigned char *num_list, int num_size, int n) {     int carry_bit, i, j, len = 1;     int tmp;      num_list[1] = 1;     for (i = 2; i <= n; i++)     {         carry_bit = 0;         for (j = 1; j <= len; j++) {             tmp = num_list[j] * i + carry_bit;             num_list[j] = tmp % 10;             carry_bit = tmp / 10;             if (j >= len && carry_bit != 0)                 len++;             if (num_size -1 < len) { /* overflow */                 printf("Overflow!\n");                 return num_size-1;             }         }      }      /*     for (i = len; i >= 1; i--)//逆序输出数组就是结果         printf("%d", a[i]);     printf("\n");     */     return len; } 供参考～

user: user-0
content: 引用 1 楼 user-2的回复:你可以百度一下，不乏一些好的代码 百度过了，没有百度到啊

user: user-2
content: 你可以百度一下，不乏一些好的代码
user-0 提问: 求大神帮助

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 不仅仅是scanf，像sprintf，memcpy这些函数都会认为是不安全的，所以引入了sprintf_s，memcpy_s这样的函数，当然你可以选择忽略这个不安全的错误，在代码里加上#pragma warning(disable:4996)过滤掉这个错误也是一种方法

user: user-0
content: 引用 3 楼 Italink的回复:[quote=引用 2 楼 Dearliao 的回复:] [quote=引用 1 楼 自信男孩的回复:]使用scanf_s代替scanf就好了～VS2017不支持scanf，而是用安全函数scanf_s scanf在VS2017是被认为不安全的嘛？[/quote] 对，比如使用scanf输入一个“123456”到char[2]，scanf会越界覆盖。所以使用scanf_s代替，有一个长度控制参数，另外也可以将VS的SDL检查关了，就可以用scanf[/quote] 谢谢大神的帮助，我去操作一下

user: user-3
content: 引用 2 楼 Dearliao 的回复:[quote=引用 1 楼 自信男孩的回复:]使用scanf_s代替scanf就好了～VS2017不支持scanf，而是用安全函数scanf_s scanf在VS2017是被认为不安全的嘛？[/quote] 对，比如使用scanf输入一个“123456”到char[2]，scanf会越界覆盖。所以使用scanf_s代替，有一个长度控制参数，另外也可以将VS的SDL检查关了，就可以用scanf

user: user-0
content: 引用 1 楼 自信男孩的回复:使用scanf_s代替scanf就好了～VS2017不支持scanf，而是用安全函数scanf_s scanf在VS2017是被认为不安全的嘛？

user: user-4
content: 使用scanf_s代替scanf就好了～VS2017不支持scanf，而是用安全函数scanf_s