Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C语言程序 关于ABRACADABRA language 麻烦大家帮忙写一写！！！谢谢

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  int encrypt_word(char* in, char* out, char* key) { 	int i = 0, j = 0;  	for (j = 0; j < strlen(in); j++) { 		switch (in[j]) { 		case 'a': 			out[i++] = key[0]; 			break; 		case 'b': 			out[i++] = key[1]; 			break; 		case 'c': 			out[i++] = key[2]; 			break; 		case 'd': 			out[i++] = key[3]; 			break; 		case 'r': 			out[i++] = key[4]; 			break; 		default: 			return -1; 		} 	}  	return 0; }  int main(int argc, char *argv[]) { 	 	char key[8]; 	char word[8] = {0}; 	char encrpt_word[8] = {0}; 	 	printf("Enter key: "); 	scanf("%s", key); 	//verfiy key 	 	printf("Enter word: "); 	scanf("%s", word); 	if (strlen(word) != 7) {//The word should consist of seven letters 		printf("You did not speak in ABRACADABRA to me!\n"); 		return 127; 	}		 	if (encrypt_word(word, encrpt_word, key) != 0) { 		printf("You did not speak in ABRACADABRA to me!\n"); 		return 127; 	} 	else { 		printf("Encrypted word: %s\n", encrpt_word); 	} 	return 0;
user-0 提问: C语言程序设计

回复:
user: user-1
content: 所有的条件都要成立才行啊，又不是一个满足就行了，多交流，我也是学C的。http://m.blog.csdn.net/article/details?id=55061737

user: user-2
content: 条件用的不对，应该是没弄清楚逻辑符号。

user: user-3
content: if(x%5==1 && x%6==5 && x%7==4 &&x%11==10)判断条件是否为真，&&若x%5==1为真，还需要判断后面的表达式是否为真，很明显x%6==5为假，所以不会输出1； 若改成||，则输出1，  if(x%5==1 || x%6==5 || x%7==4 || x%11==10)

user: user-4
content: 不知道楼主为什么觉得会输出1 第一个满足x % 5 == 1 && x % 6 == 5 && x % 7 == 4 && x % 11 == 10的数是2111 因为还会在进行一次++，所以输出的是2112 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: syntax error : identifier 'income'

回复:
user: user-1
content: 编译错误，查阅源代码

user: user-2
content: #include "wallet.h"  检查下看你这个文件在那放着

user: user-3
content: wallet income(wallet w) {     int i, year;    /*少个逗号*/     wallet salary=0;      printf("choose type of job\n1.easy \2.nnormal\n3.advance\n");     scanf("%d",&i);     printf("how many years do you want stay?");     scanf("%d", &year);    /*少个分号*/     while(salary==0){         switch(i){             case 1:salary=100;break;             case 2:salary=200;break;             case 3:salary=300;break;             default:printf("you idiot!there are only 3 kinds of job ,choose again!");         }     }     w=w+salary*year;     return w; }  另外，应该在头文件里有一个typedef int wallet;的语句； 基本C语言语法还需要加强一下；

user: user-4
content: 你这个根本不是个程序

user: user-5
content: wallet是什么？前面有typedef walley xxx; 吗？应该有才对

user: user-0
content: e:\课程资料\2015年春大一下\c语言程序设计\题目\4  关于头文件的使用\money\earnmoney.h(3) : error C2061: syntax error : identifier 'income' e:\课程资料\2015年春大一下\c语言程序设计\题目\4  关于头文件的使用\money\earnmoney.h(3) : error C2059: syntax error : ';' e:\课程资料\2015年春大一下\c语言程序设计\题目\4  关于头文件的使用\money\earnmoney.h(3) : error C2146: syntax error : missing ')' before identifier 'w' e:\课程资料\2015年春大一下\c语言程序设计\题目\4  关于头文件的使用\money\earnmoney.h(3) : error C2061: syntax error : identifier 'w' e:\课程资料\2015年春大一下\c语言程序设计\题目\4  关于头文件的使用\money\earnmoney.h(3) : error C2059: syntax error : ')' E:\课程资料\2015年春大一下\C语言程序设计\题目\4  关于头文件的使用\money\earnMoney.c(3) : error C2061: syntax error : identifier 'income' E:\课程资料\2015年春大一下\C语言程序设计\题目\4  关于头文件的使用\money\earnMoney.c(3) : error C2059: syntax error : ';' E:\课程资料\2015年春大一下\C语言程序设计\题目\4  关于头文件的使用\money\earnMoney.c(3) : error C2146: syntax error : missing ')' before identifier 'w' E:\课程资料\2015年春大一下\C语言程序设计\题目\4  关于头文件的使用\money\earnMoney.c(3) : error C2061: syntax error : identifier 'w' E:\课程资料\2015年春大一下\C语言程序设计\题目\4  关于头文件的使用\money\earnMoney.c(3) : error C2059: syntax error : ')' E:\课程资料\2015年春大一下\C语言程序设计\题目\4  关于头文件的使用\money\earnMoney.c(4) : error C2449: found '{' at file scope (missing function header?) E:\课程资料\2015年春大一下\C语言程序设计\题目\4  关于头文件的使用\money\earnMoney.c(18) : error C2059: syntax error : '}' 执行 cl.exe 时出错.
user-0 提问: 矩阵转置出现的问题

回复:
user: user-0
content: 非常感谢两位,问题已解决!

user: user-1
content: #include<stdio.h> #include<malloc.h>  int * tranverse(int * p,int row,int col) {     int i, j;      int *s=(int *)malloc(row*col*sizeof(int));      for(i=0;i<col;i++)         for(j=0;j<row;j++)             *(s+i*row+j)=*(p+j*col+i);     return s;  }  void print_matrix(int *arr, int row, int col) {     int i, j;      for(i = 0; i < row; i++) {         for(j = 0; j < col; j++)             printf("%d ", *(arr+i*col+j));         printf("\n");     }     printf("\n"); }  int main(void) {     int i,j;     int row = 2, col = 3;      int *p = (int *)malloc(row*col*sizeof(int));     if (!p) {         fprintf(stderr, "malloc error!\n");         return -1;     }     printf("请输入矩阵数据\n");     for(i = 0; i < row; i++)         for(j = 0; j < col; j++)             scanf("%d", p+i*col+j);      printf("输入的矩阵为:\n");     print_matrix(p, row, col);      int *s;     s = tranverse(p,row,col);     printf("转置后的矩阵为:\n");     print_matrix(s, col, row);      printf("\n");     free(p);     free(s);     return 0; }  显示输入的矩阵时，打印的是错误的。因为换行的条件出错了；你输入的是2行3列，所以输出的也应该是2行3列。 转置没有问题，输出时也是需要注意，行和列对换；申请的空间记着释放。 最后，建议注意一下代码风格。

user: user-2
content: 1.转置后输出的应该是printf("%d ", *(s + i*row + j)); 2.你的tranverse或者是你输出的循环有问题，自己再看看 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: c 结构体中包含同类结构体

回复:
user: user-0
content: 感谢回复！

user: user-1
content: 因为第一种的声明实际上是一个无限循环，分配内存的时候会无限嵌套，无法确定大小，所以是错的，但可以包含指向这种类型结构体的指针

user: user-2
content: 引用 1 楼 qq423399099 的回复:sss属于不完整的类型。 定义对象之前，编译器必须看到完整的类定义  （1）使用不完整类型的话，我们也就只能使用指向该不完整类型的指针了，因为指针类型是平台相关的，即在特定的平台上指针变量的大小是已知的。 （2）在不完整类型还没有完整之前，sizeof操作符是获取不了该类型的大小的。 （3）头文件中我们也是不可以使用inline函数的，因为类型是不完整的，在inline函数中如果访问成员的话，编译器会报错。 赞成楼主，第一种写法属于自己不知道自己长什么样子

user: user-3
content: 结构体内不能包含自己本身，如果包含的话编译器不知道变量体的变量，可以包含自身的指针，指针占4个字节。

user: user-4
content: 指针类型在声明变量时，不会为变量对象分配空间，只会检查类型  实体类型，分配空间，所以出错

user: user-5
content: struct sss {     int key;     sss LLLL;     sss RRRR; };这种声明是错误的，因为这种声明实际上是一个无限循环，成员A是一个结构体，A的内部还会有成员是结构体，依次下去，无线循环。在分配内存的时候，由于无限嵌套，也无法确定这个结构体的长度，所以这种方式是非法的。 struct sss {     int key;     sss* LLLL;     sss* RRRR; }; 由于指针的长度是确定的（在32位机器上指针长度为4），所以编译器能够确定该结构体的长度。

user: user-6
content: sss属于不完整的类型。 定义对象之前，编译器必须看到完整的类定义  （1）使用不完整类型的话，我们也就只能使用指向该不完整类型的指针了，因为指针类型是平台相关的，即在特定的平台上指针变量的大小是已知的。 （2）在不完整类型还没有完整之前，sizeof操作符是获取不了该类型的大小的。 （3）头文件中我们也是不可以使用inline函数的，因为类型是不完整的，在inline函数中如果访问成员的话，编译器会报错。
user-0 提问: 打开文件并输出数据出现乱码怎么破

回复:
user: user-1
content: 楼主对文件的概念还要加强。用文本编辑器编写的是ascii文件，比如看到的是数字1001，实际存放的是ascii码值，0x31 0x30 0x30 0x31。 而用fread往buf里读的话是按数据文件方式读的。 楼主试下把fread改成fscanf，类似：  fscanf(fp, "%s%d%d%s",  stud[i].name, &stud[i].nun, &stud[i].age, stud[i].addr  另外stud结构中的num和age为什么是数组？一个学生难道有5个年龄？name也短了点吧。地址也太短了。

user: user-2
content: 楼上说的有道理，你的num和age不需要定义成数组形式，name和addr又定义的太小，越界可能覆盖到一些别的信息，导致输出结果不对

user: user-3
content: 楼上说的都对，我也是学C的，多交流。http://m.blog.csdn.net/article/details?id=55061737

user: user-4
content: 数据结构中name和addr定义的长度太小；文件中的name和addr已经越界；另外，文件中age和num都是一个值； 建议使用fscanf和fprintf对文件进行读写；fread和fwrite是二进制形式的读写   #define    MAX_NAME_LEN    32 #define    MAX_ADDR_LEN    32  struct student_type {     char name[MAX_NAME_LEN];     int num;     int age;     char addr[MAX_ADDR_LEN]; };

user: user-5
content: 引用 楼主 baidu_37516993 的回复:我想打开一个文件，输出其中的数据  这是我要打开的文件  运行之后出现乱码  请问要怎么修改      问题不在于乱码,而是你那个结构体的定义,你每次对文件进行seek操作,但是你内容的实际大小并没有那么大,或者加上空格之后已经远超这个限制,导致内存错乱,字符就乱了,你可以先实现readline功能,给你一个demo    #include <stdlib.h> #include <stdio.h>  char* readline(FILE* f) {     char* line = (char*) calloc(1, sizeof(char) );;     char c;     int len = 0;          while ( (c = fgetc(f) ) != EOF && c != '/n')     {         line = (char*) realloc(line, sizeof(char) * (len + 2) );         line[len++] = c;         line[len] = '/0';     }       return line; }
user-0 提问: 求助：两个一样的上锁函数会存在什么问题？

回复:
user: user-1
content: 按不同顺序加锁有导致死锁的风险..

user: user-2
content: 锁这个名字没觉得起的很好么，  你给你自行车上了两把锁，有什么毛病么

user: user-3
content: 注意上锁和开锁的顺序，尤其是在锁嵌套的时候； 你的两个函数里只写的加锁，没有释放锁的操作呢

user: user-4
content: 引用 楼主 l00110228 的回复:void lock_1(char * A, char * B) { mutux_lock(A); mutux_lock(B); }  void lock_2(char * A, char * B) { mutux_lock(B); mutux_lock(A); }  这两个函数在锁顺序上有不同，这两个函数如果调用不当，会有影响吗？  多谢。  没有影响,两个锁相互独立,没有依赖关系
user-0 提问: 找不到错误啊syntax error : missing ';' before 'type'

回复:
user: user-1
content: 注意括号匹配，可以找个自动对齐的ide

user: user-2
content: #include <stdio.h>  int my_factorial(int i); double my_power(double x, int y);  int my_factorial(int i) {     int ans = 1, k;      if(i == 0) {         ans = 1;     } else {         for(k=1;k<=i;k++)             ans=ans*k;     }//阶乘      return ans; } double my_power(double x, int y) {     int i, ans = 1;      for(i = 1; i <= y; i++)         ans=ans*x;      return(ans); }  double my_expTaylor(double x, unsigned int n) {     double ans = 0,i;      for(i = 0; i <= n; i++)         ans = ans + my_power(x,i) / my_factorial(i);      return(ans); } int main() {     float x = 2.0, n;      for(n = 0; n <= 9; n++) {         printf("%lf\n", my_expTaylor(x,n));     }     return 0; }  少一个}，在第一个函数里对应else； 出现这样的错误跟代码风格我感觉有一定的关系；所以建议养成一个良好的代码风格，不要把代码写的太紧凑，改换行的还是要换行。代码写出来更多是让自己和别人读的。 另外，main函数里的回车符是\n，不是/n，也一并改了。

user: user-3
content: 括号在使用的时候最好{ } 一起打出来。。。然后再在中间编写代码～ 而且注意换行，，

user: user-4
content: #include <stdio.h> int my_factorial(int i) { int ans=1,k; if(i==0){ans=1;} else {for(k=1;k<=i;k++) {ans=ans*k;} return(ans); }//阶乘 少了一个}   所以要注意代码格式  #include <stdio.h> int my_factorial(int i) { int ans=1,k; if(i==0) {     ans=1; } else  {     for(k=1;k<=i;k++)     {         ans=ans*k;     } }//这里少了 return(ans); }//阶乘

user: user-5
content: int my_factorial(int i) {   int ans=1,k;   if(i==0)   {     ans=1;   }   else {     for(k=1;k<=i;k++)       {       ans=ans*k;        }       return(ans);       }//阶乘  看吧，函数结尾是不是少了}  编码习惯要好好培养一下啊

user: user-6
content: #include <stdio.h>  int my_factorial(int i) {     int ans=1,k;     if(i==0){         ans=1;     }     else {         for(k=1;k<=i;k++){             ans=ans*k;         }     }     return(ans); }//阶乘 double my_power(double x,int y) {     int i,ans=1;     for(i=1;i<=y;i++){         ans=ans*x;     }     return(ans); }  double my_expTaylor(double x,unsigned int n) {     int my_factorial(int i);     double my_power(double x,int y);     double ans=0,i;     for(i=0;i<=n;i++){         ans=ans+my_power(x,i)/my_factorial(i);     }     return(ans); } int main() {     float x=2.0,n;     for(n=0;n<=9;n++){         printf("%f/n",my_expTaylor(x,n));     }     return 0; }
user-0 提问: 用c语言操作文件，损坏了文件，是什么原因？

回复:
user: user-1
content: 感觉这个文档格式就不对吧。

user: user-2
content: 读WORD不能用fopen http://msdn.microsoft.com/en-us/library/Aa155776 http://book.51cto.com/art/200806/76629.htm

user: user-3
content: 在Linux下运行你的程序没有问题，输出123 456，这跟系统还是有关系的。因为Windwos和Linux的回车格式不同。 建议你先创建好文件，然后去读试试。

user: user-4
content: 直接用C语言操作word文档可能不行，你换成txt试一试

user: user-5
content: 首先，doc是微软的一种文档格式，里面存储的格式并不是简单的TXT格式  如果你需要读写doc，那你需要使用专门的接口或者组件

user: user-6
content: 你这样创建的 啦啦.docx 并不是一个WORD格式文档，用WORD打开肯定提示格式不对或文件损坏。
user-0 提问: 关于c语言auto求简单的能理解的代码

回复:
user: user-1
content: C++ 98标准/C++03标准： 同C语言的意思完全一样：auto被解释为一个自动存储变量的关键字，也就是申明一块临时的变量内存。  C++ 11标准： 在C++11标准的语法中，auto被定义为自动推断变量的类型。例如： auto x=5.2;//这里的x被auto推断为double类型 map<int,int>m; for(auto it=m.begin();//这里it被auto推断为map<int,int>::iterator类型 it!=m.end();++it) { //.... } 不过C++11的auto关键字时有一个限定条件，那就是必须给申明的变量赋予一个初始值，否则编译器在编译阶段将会报错。

user: user-2
content: 看看这个的讲解吧http://www.jb51.net/article/37689.htm

user: user-3
content: 不知道你问的是哪个auto 在以前的标准中，auto关键字是为了编译器方便给出的，它告诉编译器将其作为自动存储的变量，在实际使用中没啥用，基本可以忽略，这在C和C++中都是一样的 C++新标准（C++11）将其作为自动推断变量类型，即编译器根据初始值决定auto后面的变量是什么类型

user: user-4
content: 由编译器自动推导类型 在定义变量的时候，必须指明数据类型，那么此时此刻就可以使用auto替代 不过有一个前提是：必须初始化，因为只有初始化编译器才能推导出类型
user-0 提问: c语言语法问题

回复:
user: user-1
content: end是什么鬼？自己定义的宏吗？

user: user-2
content: ! = 改成 !=  不能有空格

user: user-3
content: !=是一体的，中间不能有空格； 另外，不清楚你的End是指什么？或者是否是一个宏？ 如果要和EOF，文件结束标志比较，一定要把c变量定义为int类型。因为EOF是int类型的。char类型不能接收EOF。另外，不论是否和EOF比较，都要把getchar()的返回值赋值给一个int类型的变量。

user: user-4
content: END是什么？？？

user: user-5
content: 第一个程序定义了End = ‘！’ 所以直接直接比较，你的第二个程序并没有类似的定义

user: user-5
content: EOF 不是End
user-0 提问: 是否所有球余数都可以使用移位方法来呢？？？？？

回复:
user: user-1
content: 6%4   ->   6&3

user: user-2
content: 对于移位，注意被移位的是有符号数还是无符号数，有无符号，对于移位是不一样的。

user: user-3
content: http://codepad.org/E9vl7wdM  #include <stdio.h> int main() { 	int a = -2; unsigned b = 0xfffffffe; 	printf ("before: \n"); 	printf ("a = %d,%#x\n", a, a); 	printf ("b = %d,%#x\n", b, b); 	a >>= 1; b >>= 1; 	printf ("after shift: \n"); 	printf ("a = %d,%#x\n", a, a); 	printf ("b = %d,%#x\n", b, b); 	  	return 0; }  输出：  before:  a = -2,0xfffffffe b = -2,0xfffffffe after shift:  a = -1,0xffffffff b = 2147483647,0x7fffffff

user: user-3
content: 只有2的N次方的才可以。 有符号数为算术右移，无符号数为逻辑右移
user-0 提问: c语言中的小小问题

回复:
user: user-1
content: 楼上说的都对，0为假，非0为真，余数就算是2,3,4之类的，也当做真处理

user: user-2
content: 0和非0，一起交流吧，我也是学C的。关注我。http://m.blog.csdn.net/article/details?id=55061737

user: user-3
content: http://blog.sina.com.cn/s/blog_4fcd1ea301016890.html

user: user-4
content: 0就是false，非0即true.非0，不论正负，即为true.

user: user-5
content: if判断的机制是判断条件是否为真，为真则执行，否则的话就执行else中的语句（如果没有else则直接跳过了）

user: user-6
content: 非0为真，0为假

user: user-7
content: 不为0都当做真处理，对于if的条件，只区分0和非0，0为假，非0为真
user-0 提问: Windows编程，按老师一步一步写的运行的窗口不能关闭，不能移动，不能拉大拉小

回复:
user: user-1
content: 我也是这个问题，多了个；号

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

user: user-0
content: 引用 2 楼 phelps_pass的回复:消息循环有问题，陷入了死循环，去掉后面分号即可 while(GetMessage(&msg,NULL,0,0)); //分号！！！！！！ { TranslateMessage(&msg);//翻译消息 DispatchMessage(&msg);//转发消息到窗口过程WndProc  } 谢谢！就是这个问题！

user: user-3
content: 消息循环有问题，陷入了死循环，去掉后面分号即可 while(GetMessage(&msg,NULL,0,0)); //分号！！！！！！ { TranslateMessage(&msg);//翻译消息 DispatchMessage(&msg);//转发消息到窗口过程WndProc  }

user: user-4
content: 没处理WM_PAINT
user-0 提问: 从键盘上输入数组，再输出就不一样了，为什么

回复:
user: user-0
content: 谢谢大家了，是我zz了

user: user-1
content: int b[col][row]; ==>  int b[row][col];  C99开始，允许VLA（变长数组）。标准已经多少年了

user: user-2
content: 引用 2 楼 cyfcsd 的回复:这个程序能编译通过了？！你用的什么编译器啊 int row,col,i,j,m,n;  scanf("%d%d",&row,&col);  int b[col][row]; 这几句不能通过吧 C语言键盘输入的时候确实是这样的

user: user-3
content: 这个程序能编译通过了？！你用的什么编译器啊 int row,col,i,j,m,n;  scanf("%d%d",&row,&col);  int b[col][row]; 这几句不能通过吧

user: user-4
content: int b[col][row]; 写反了，就这么简单。。。。 int b[row][col];

user: user-3
content: 引用 4 楼 wang0635 的回复:int b[col][row]; ==>  int b[row][col];  C99开始，允许VLA（变长数组）。标准已经多少年了 奥奥 是我错了，一直在用C++，不知道C语言已经支持这种语法了
user-0 提问: c语言指针初始化问题，自己检查不出错误，求教大家。

回复:
user: user-0
content: 哦哦 知道了 谢谢大佬们

user: user-0
content: 引用 12 楼 m0_37482591 的回复:自己顶一个，前几天的帖子了，大佬速来帮忙啊。已经要被折磨死了。 select 不会生成0，只会生成（j+1）-（n）的整数，而且这个错误不是每次都出现，运行很多很多次才会出现一次

user: user-1
content: 简单来讲就是你的rand函数可能返回0.

user: user-0
content: 快点顶上去让大佬看见。。。我中午再过来看下，去看论文了要，，

user: user-1
content: j=0且select在rand到0的时候，数组下标越界了，所以你的alloc[0]得到了一个很大的值。

user: user-0
content: 自己顶一个，前几天的帖子了，大佬速来帮忙啊。已经要被折磨死了。

user: user-0
content: 自己顶一个，前几天的帖子了，大佬速来帮忙啊。

user: user-0
content: 我已经知道哪里出问题了，现在上代码描述问题。 自己写了3个随机函数 如下两图所示；最终目标是Randperm函数，也就是第二张图。   现在问题就是Randperm函数每运行很多很多次才会出现一次错误，比如生成一组1-7的随机数（也就是将1-7打乱）。出错误时的情况如下图所示，注意，永远是数组中的第0个元素出问题，但是检查了代码感觉没有问题啊。再次求助各位。

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

user: user-0
content: 突然发现只有一步步调试的时候才会出现这个问题，直接运行倒没有这个问题，，，，

user: user-0
content: 问题还没解决，打算一步步调试下看看，关键是时好时不好。检查了每个指针都赋值了。

user: user-3
content: 检查方法： 1、指针是否存在多次释放 2、释放之后的指针是否再次被使用 3、如果是多线程，指针是否为全局变量  可以使用ibm purify，可以检查内存泄漏和变量初始化等

user: user-4
content: 空说没用，直接上代码。

user: user-5
content: 0xcccccccc代表的是你调用了未初始化的的指针。vs debug模式下为初始化的指针就是0xCCCCCCCC。

user: user-6
content: 是不是用到了free函数。如果在malloc之后没有初始化，则free的时候很容易出错，free函数释放的区间必须以\0结束

user: user-7
content: 断点调试  注释法调试

user: user-0
content: 自己顶一个。
user-0 提问: 想学习：C语言在不同指令集构架下的实现  推荐书籍

回复:
user: user-1
content: 参考 Tiny C Compiler 或 gcc 源代码相关片断。

user: user-2
content: 建议看一些嵌入式方面的书籍，因为嵌入式会涉及到各种平台，尤其是在ARM平台上使用是比较广的～

user: user-1
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 http://edu.csdn.net/course/detail/2455 C语言指针与汇编内存地址-二.函数 http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组 http://edu.csdn.net/course/detail/2517 C语言指针与汇编内存地址-四.三维数组
user-0 提问: 【求救】一个编程题求解答

回复:
user: user-0
content: #include <stdio.h>  int main() { 	char a,b,c; 	printf("Enter a first and last name:"); 	a=getchar(); 	while((b=getchar())>='A'&&(b=getchar())<='Z') 	{ 		putchar(b); 		break; 	}  	while((c=getchar())!='\n') 		putchar(c); 	printf(",%c.",a); 	return 0; 	 } 输出是vd Fosdick,L. 想知道是哪里错了- -

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

user: user-2
content: #include<stdio.h>  main(){     char first_name[10];//名     char last_name[10];//姓     int i = 0;     printf("Enter a first and last name :");     for(i=0; i<9; i++){         scanf("%c",&last_name[i]);         if(last_name[i] == '\n')             break;     }        for(i=0; i<9; i++){         scanf("%c",&first_name[i]);         if(last_name[i] == '\n')             break;     }      i=0;     while(last_name[i] != '\n'){         printf("%c",last_name[i]);         i++;     }        printf(",%c.",first_name[0]); }  测试用例: lon boo  测试结果: lon,b.  我也是初学者，希望能够互相交流,共同进步!

user: user-3
content: #include <stdio.h>  int main()  {     char firstname[32], lastname[32], fullname[64];      printf("Please input name:");     if (scanf("%s %s", firstname, lastname) != 2)     {         printf("Input name error.\n");         return 0;     }      sprintf(fullname, "%s.%c\n", lastname, firstname[0]);     printf(fullname);      return 0; }
user-0 提问: C语言输出语句可不可以放在子函数中，而不用放在主函数

回复:
user: user-1
content: #include<stdio.h>   double sphere(double r,double*v)  {  double area;  area=3.14*4*r*r;  *v=4.0/3*3.14*r*r*r;  printf("表面积=%lf",area);  printf("体积=%lf",*v);  return area;  }   int main()  {  double r,m;  printf("r=",r);  scanf("%lf",&r);  sphere(r,&m);  return 0;  }
user-0 提问: c语言，int 按位转字符型，加上打印信息就能正确输出，否则出错

回复:
user: user-0
content: @幻夢之葉    答的太好了，非常感谢！

user: user-1
content: 未定义行为  你返回局部变量，返回之后就被系统回收了。你打印语句，恰好导致那块内存没有被重写！ 请使用参数返回char数组，或者动态内存返回  还有一个问题就是赋值的问题，你把一个unsigned int的值强制转为unsigned char，会导致数据的损失  abyte[2] = (unsigned char)(0xff00 & i); 改为 abyte[2] = (unsigned char)((0xff00 & i) >> 8);  后面两个赋值分别左移 16，24
user-0 提问: 请大家帮我看看这个错误，新手

回复:
user: user-0
content: 引用 3 楼 cfjtaishan 的回复: printf("line: %d, function: %s\n", __LINE__, __func__);  __func__宏是前后两个下划线哦 谢谢了，编译通过了

user: user-0
content: 引用 2 楼 jianwen0529 的回复:错误说了 _func_ 这个变量或者宏找不到它的声明 知道错误，不知道怎么修改！ 新手，请谅解

user: user-0
content: 引用 1 楼 user-3 的回复:_func_ 没有定义  你要写的是不是 f 不是，是输出当前函数的名字 3楼帮我找出错误了，是两个下划线

user: user-1
content: printf("line: %d, function: %s\n", __LINE__, __func__);  __func__宏是前后两个下划线哦

user: user-2
content: 错误说了 _func_ 这个变量或者宏找不到它的声明

user: user-3
content: _func_ 没有定义  你要写的是不是 f
user-0 提问: 用筛法求第N个素数，注意是第N个素数，求帮助  看看哪里出错了

回复:
user: user-1
content: 不清楚筛选法 但是你int a[N];最开始没有设置为0吧，后面你判断 == 0基本是错的

user: user-2
content: 那个for(j=2*i;...;...)?

user: user-3
content: 两点小问题： 1）数组空间过大，如果仅仅是为了测试和练习用没必要使用那么大的空间，栈上的空间是有限的，不建议你使用这么大的内存； 2）你的求第N个素数的方法不像是筛选法求素数的，另外，栈上的数组不会自动初始化为0的，除非你把a定义为全局的数组（初始化为0）。 以下是我的demo:  #include<stdio.h>  #define MAX_LEN 1001  void print_all_prime(int *array, int len); void print_number_prime(int *prime_list, int len, int idx);  int main(void) {     int i;     int N, count;     int arr[MAX_LEN];    //限制数据量大小为1000      printf("你想求多少以内的素数:");     scanf("%d", &N);      for(i = 1; i <= N; i++) //为方便计，从1起         arr[i] = 1;      count = 2;  //筛选起点为2     while(count <= N/2) //显然：count不会超过N/2,必能使留下的数全为素数。     {         for(i = count+1; i <= N; i++) {             if(arr[i] == 1 && i % count == 0)                 arr[i] = 0;         }         for(i = count+1; i <= N; i++) {             if(arr[i] == 1) {                 count = i;                 break;             }         }     }     print_all_prime(arr, N);     print_number_prime(arr, N, 5);      return 0; }  void print_all_prime(int *array, int len) {     int i, cnt = 0;      printf("%d以内的素数为:\n", len);     for(i = 2; i <= len;i++)         if(array[i]) {             cnt++;             printf("%d ", i);             if(!(cnt % 10)) //增设cnt为输出换行                 printf("\n");         }     printf("\n"); }  void print_number_prime(int *array, int len, int idx) {     int i, cnt = 0;      for (i = 2; i < len; i++) {         if (array[i] == 1) {             cnt++;             if (cnt == idx) {                 printf("NO.%d prime is %d\n", idx, i);                 break;             }         }      }     if (i >= len) {         printf("不存在第%d 素数\n", idx);     } }

user: user-0
content: 另外我想问一下  你们怎么发的代码（我还是复制粘贴，看着好不爽）；

user: user-0
content: //这是我做的时候遇到的一些问题向大家说明一下 并阐述一下观点    1.数组没有初始化 （全局变量定义后没有给出值的情况下全为0，而局部变量给出的是不确定的值）      2.开辟空间（全局变量与局部变量定义的范围是不同的，区别在与栈区，堆区和静态存储区）详情可以去看//我遇到的一些问题向大家说明一下 并阐述一下观点 //1.数组没有初始化 （全局变量定义后没有给出值的情况下全为0，而局部变量给出的是不确定的值）  //2.开辟空间（全局变量与局部变量定义的范围是不同的，区别在与栈区，堆区和静态存储区）详情可以去看http://blog.csdn.net/ccccdddxxx/article/details/7085165 以下是我根据大家给我指出的错误修改好的代码，有什么建议还请多多指教（本人英语较差，所以定义函数名实在不知道怎么写，也懒得去查，我感觉汉语拼音就挺好，都能看懂） //运用筛法  #include<stdio.h> # define N 1000*1000//很多人可能有异议，为什么要开那么大的空间？原题是求第100001个素数。    int a[N];	//对数组初始化 void shai_fa(int n){  	int i,k; 	// 将所有和数置1  	for(i=2;i<N/2;i++){       		if(a[i]==1) continue;//和数不参加筛法；  			for(k=2;k<=N/i;k++){ 				if(i*k<N) 				a[i*k]=1;  //将i的倍数全置1  			} 	} 	//找出第n个素数      int m=0; 	for(i=2;i<N;i++){ 		if(a[i]==0){ 			m++; 	        if(m==n) 	            printf("%d\n",i); 		}  	} }   int main(){ 	shai_fa(2); 	return 0; }

user: user-0
content: 对于初始化那个问题已经解决了，但是关于数组的开辟空间问题还希望能指点一下，如果我要开辟一个1000*1000*10的空间怎么弄？

user: user-4
content: int a[N];你在栈上申请那么大的空间？ 栈一般只有1~2M的大小
user-0 提问: 结构体的声明在主函数内还是外？为什么有的在内有的在外？

回复:
user: user-1
content: 区别就在于作用域不同。声明的位置不同，有效的区间也就不一样。

user: user-2
content: 引用 2 楼 qq_37268797 的回复:内外有什么区别在函数内部声明的结构类型只能在函数内部使用 在函数外部声明的结构类型可以被多个函数使用

user: user-3
content: 引用 2 楼 qq_37268797 的回复:内外有什么区别  可用范围。。

user: user-0
content: 内外有什么区别

user: user-4
content: 都可以，看你的需求了
user-0 提问: 求例程：设置计算机RS232串口RTS的电平

回复:
user: user-1
content: 引用 楼主 oHanTangDuHeYing1 的回复:看到论坛里有说用EscapeCommFunction（）这个函数设置的，CLRRTS或SETRTS之类的。 我想知道仅仅完成这一个功能，需要对串口进行哪些配置。谢谢。 用C语言或C++实现。 不知道你想实现什么,给你个demo http://download.csdn.net/detail/u010095741/7251843

user: user-0
content: 查了很多，内容太杂没有什么参考价值

user: user-2
content: 百度搜相关关键字。
user-0 提问: codeblocks 添加头文件

回复:
user: user-1
content: 从你贴出的头文件和其中一个的源文件看不出问题所在，能否继续贴出一些源码。

user: user-0
content: #include "onPaint.h" void onPaint(HDC hdc) {     Rectangle(hdc,0,0,50,100); } 源文件的代码

user: user-0
content: #ifndef ONPAINT_H_INCLUDED #define ONPAINT_H_INCLUDED  #include <windows.h> void onPaint(HDC hdc);   #endif // ONPAINT_H_INCLUDED 添加的头文件的代码

user: user-0
content: ||=== Build: Debug in fangkuai (compiler: GNU GCC Compiler) ===| ||error: ld returned 1 exit status| ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===| 图片一直上传不上去

user: user-2
content: 截个图看看
user-0 提问: fgets()读取文件问题

回复:
user: user-0
content: 引用 1 楼 cfjtaishan 的回复: fgets (sendBuf, strlen(sendBuf), p_source); //改成 fgets (sendBuf, 20, p_source);  fgets第二个参数是指要读取的最大长度；第一次sendBuf中没有数据，那么strlen()得到是0； fgets的功能如下： char *fgets(char *s, int size, FILE *stream); fgets()  reads  in  at  most  one  less than size characters from stream and stores them into the buffer pointed to by s.  Reading stops after an EOF or a newline.  If a newline is read, it is        stored into the buffer.  A terminating null byte ('\0') is stored after the last character in the buffer.  多谢

user: user-1
content: fgets (sendBuf, strlen(sendBuf), p_source); //改成 fgets (sendBuf, 20, p_source);  fgets第二个参数是指要读取的最大长度；第一次sendBuf中没有数据，那么strlen()得到是0； fgets的功能如下： char *fgets(char *s, int size, FILE *stream); fgets()  reads  in  at  most  one  less than size characters from stream and stores them into the buffer pointed to by s.  Reading stops after an EOF or a newline.  If a newline is read, it is        stored into the buffer.  A terminating null byte ('\0') is stored after the last character in the buffer.
user-0 提问: 为什么了？

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

user: user-2
content: 只能说明运气好，没崩，仅此

user: user-3
content: 未定义行为，如果你越界访问的内存刚好没有被别的变量使用或占用，那么没事。否则就会崩溃

user: user-4
content: #include<stdio.h> #include<stdlib.h>  #define MAX_SIZE    3 int main() {     int *p, i,t,j;      p = (int*)malloc(sizeof(int)*MAX_SIZE); /* malloc MAX_SIZE * sizeof(int) Bytes*/     if (!p) {         fprintf(stderr, "malloc error!\n");         return -1; /*exit*/     }      for(i = 0; i < MAX_SIZE; i++)         scanf("%d",p+i);      for(i = 0; i < MAX_SIZE; i++)         for(j = 0; j < MAX_SIZE-i-1; j++)             if(*(p+j) > *(p+j+1)) {                 t = *(p+j);                 *(p+j) = *(p+j+1);                 *(p+j+1) = t;             }      for(i = 0; i < MAX_SIZE; i++)         printf("%d ", *(p+i));      return 0; }  malloc申请的字节数不对呢，应该是申请3 * sizeof(int)个字节。而不是3个字节，因为p的类型是int（占4个字节）

user: user-5
content: 访问内存越界了，其行为是未知的，也可能对，也可能崩溃，即使对了，这种写法也是不应该的
user-0 提问: c语言结构体变量问题，谢谢。

回复:
user: user-1
content: 放到主函数里面去啊，就行了。一起学习交流，关注一下嘛。http://m.blog.csdn.net/article/details?id=55061737

user: user-0
content: 哦哦 明白了谢谢大家

user: user-2
content: a.x = 1;放到函数里去，函数外只有变量的声明和初始化。不能对其赋值和修改操作。放到函数里去做这些。

user: user-3
content: a.x=1;这样的赋值语句需要放在函数中执行

user: user-4
content: 要写在函数里，不能写在全局范围内

user: user-5
content: 主函数(main)外只能进行定义或声明，不可以有执行语句。

user: user-6
content: 引用 2 楼 jianwen0529 的回复:不能这么用的 =。= 你得在函数中写赋值语句。  或者在定义的时候初始化 如 coor a = {1, 10};

user: user-6
content: 不能这么用的 =。= 你得在函数中写赋值语句。

user: user-0
content: 自己顶一下，小白一个。
user-0 提问: C语言关于结构体定义使用的错误

回复:
user: user-1
content: 引用 5 楼 elflun 的回复:知道了，我傻了 都傻过

user: user-1
content: “变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。

user: user-2
content: struct student stu_1; struct student *p = &stu_1;

user: user-3
content: 变量声明和定义可以放在函数外面，作为全局或者静态的变量； 但是p=&stu_1;运算语句需要放在函数体内才可以。

user: user-4
content: struct student stu_1;    //1 struct student *p;        //2 这2条语句放在main函数外是可以的，声明成全局变量。  p=&stu_1;   执行语句要放在函数内才能执行

user: user-0
content: 知道了，我傻了
user-0 提问: c语言如何实现web socket

回复:
user: user-1
content: 搜“CGI C源代码”

user: user-2
content: https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=monline_4_dg&wd=c%20web%20socket&oq=web%2520socket&rsv_pq=9014672800004db8&rsv_t=d1e7heMxf2EgchQWFXDI8Uw6mAb%2FHN83A2%2FiXfv02d5B%2BsyDoPEh1%2FtKOn2CM1t87hJg&rqlang=cn&rsv_enter=1&rsv_sug3=3&rsv_sug1=2&rsv_sug7=100&rsv_sug2=0&inputT=1172&rsv_sug4=2475 百度上这么多

user: user-3
content: tinyhttp一个轻量级的webServer，可以参考
user-0 提问: PAT 乙级 1030. 完美数列(25)

回复:
user: user-1
content: 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

user: user-2
content: #include<stdio.h> #include<stdlib.h>   int sort_function(const void *a,const void *b) {     return *((double *)a)-*((double *)b); } int main() {     int N, i, j, sum = 0;     double p, *a;      scanf("%d%lf", &N, &p);      a = (double *)malloc(sizeof(double) * N);     if (!a) {         fprintf(stderr, "malloc error!\n");         return -1;     }     for(i = 0; i < N; i++)         scanf("%lf", &a[i]);      qsort(a, N, sizeof(double), sort_function);      for(i = 0; i < N; i++){         for(j = N-1; j > 0; j--){             if(a[j] <= a[i] * p) {                 if(sum < j - i)                     sum = j - i;                 else                     break;             }         }     }     printf("%d\n",sum+1);     free(a);     return 0; }  栈上的空间是有限的，不建议你在栈上申请太大的空间。需要多少就申请过少，但是C语言不支持可变数组，所以在栈上申请了空间。 对于缩小运行时间，从你这个程序里来讲，从减少循环次数开始吧，若想减少循环次数，那么就要从算法上考虑了。

user: user-0
content: 还是有一组运行超时
user-0 提问: 求指教指针问题，字符串的插入

回复:
user: user-1
content: 栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……

user: user-2
content: strcp是局部变量，在函数myInsert调用结束后，该数组就会自动释放。在main函数栈里没有意义了。 把strcp定义成static则该变量的生命周期就发生了变化因为其存放在数据段（生命周期是整个程序），不是随着myInsert函数栈的结束而释放，而是等待程序运行结束而释放。 也可以把strcp定义成全局的变量，原理是类似的，主要是变量的生命周期变成了整个程序。

user: user-3
content: 引用 2 楼 JianDan808 的回复:[quote=引用 1 楼 ipqtjmqj 的回复:] strcp改成static 十分感谢，运行成功，是因为局部变量执行结束后被内存空间被释放的原因吗[/quote] 对的。默认都是在栈上，函数返回就自动释放了。

user: user-4
content: 改成static ，难道那个局部变量还要保存状态吗？   引用 1 楼 ipqtjmqj 的回复:strcp改成static 程序改成如下，试一下？  #include <stdio.h> #include <stdlib.h> #include <string.h>   char *myInsert(char *s,char *q, int n){     int i = 0;     char *str2;    static char strcp[50];     str2 = strcp;     for(i = 0; *s != '\0';i++){         if(i == n-1){             for( ; *q!='\0';){                 str2[i] = *q;                 i++;                 q++;             }         }         str2[i] = *s;         s++;     }     str2[i+1] = '\0';     return str2;   } //字符串插入 int main() {     char *strin, *str, *st,*st1;      int i;     str = "Hello,world!";     strin = "pig";            st = myInsert(str, strin, 3);    puts(st);     st = myInsert(str,strin,3);     puts(st1);       return 0; }

user: user-0
content: 引用 1 楼 ipqtjmqj 的回复:strcp改成static 十分感谢，运行成功，是因为局部变量执行结束后被内存空间被释放的原因吗

user: user-3
content: strcp改成static
user-0 提问: c tcp server端怎么解析发来的结构体数据

回复:
user: user-1
content: 服务器接收的信息是字节流，而字节流!=结构体， 因为不同操作系统和不同编译器对数据类型占用字节是不同的，所以直接转入结构体是不正确的， 需要做判断长度等等工作，如果字节流长度都是固定的还好办，如果是不定长的就还有其他问题。  5楼的链接看了一下，竟是些鸡同鸭讲的东西，其实简单讲就是以下几点：  1、文本型的数据传输协议，适合结尾符分割，你如HTTP协议。 2、字节流数据传输协议，适合定长包头+长度+不定长内容+校验码这样处理。 3、网络问题不可能全都靠协议解决，需要客户端+服务器端程序处理各种意外情况。  以上三点可以概括那个帖子中的正确内容，其他的都是胡搅蛮缠。

user: user-2
content: 按占用字节数解析的，跟结构体无关

user: user-3
content: 引用 6 楼 zfh19921230 的回复:一个server 绑定两个端口怎么写啊,求大神回复啊 使用两个exe

user: user-3
content: 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545

user: user-4
content: 如果是运输层以上的数据，或者通过recv得到数据。直接用类型强制转换即可。比如你的接收缓冲区是char buf[1024];那么，你直接用struct s param = *(struct s *)buf;即可，或者struct s *pparam = (struct s *)buf; 需要有一个前提，即client端也需要发送的是一个struct s的结构体；即send的buf为，struct s param, memcpy(buf, param, sizeof(param));  主要是一点：client端发的是什么，server就反过来解析即可。

user: user-0
content: 一个server 绑定两个端口怎么写啊,求大神回复啊

user: user-5
content: 接收到的是一串二进制，假设指针p指向这串二进制，直接用（struct s *）p取出结构体，然后访问结构体成员不就行了吗。

user: user-6
content: 简单的可直接转换二进制，但是要求struct必须是pod类型，并且需要注意大小端问题。

user: user-6
content: 一般在实际项目中，都要做消息序列化与反序列化
user-0 提问: 热烈庆祝本人受关注人数即将突破12000大关！散分！！

回复:
user: user-1
content: 大佬。。。。。。。。

user: user-2
content: 我刚接触这个，还有很多不懂，希望能有人指点我。我可能问题比较多，因为菜了点，希望能加我微信，嘻嘻

user: user-3
content: 第一次进CSDN 默默试试

user: user-4

user: user-5
content: 这真的是新手乐园吗到处都是大佬

user: user-6
content: 大神牛逼~已关注！！！

user: user-7

user: user-8
content: 赵老师，程序出现问题了，可以请教您吗？

user: user-9
content: 去年的了？

user: user-10
content: 膜拜大神……………………

user: user-11
content: 赵4老师，能否帮忙看下C++托管类的问题？  谢谢！  C#调用C++托管类出现not supported by the language的错误。 问题链接https://bbs.csdn.net/topics/392487346

user: user-12
content: 分数有点少了

user: user-13

user: user-14

user: user-15
content: 关注赵四老师

user: user-16

user: user-17
content: ~   ~ ~~~~~~~~~~~~~！！

user: user-18

user: user-19
content: 在网上回答问题的，是赵老师的AI机器人吧！

user: user-20
content: 才开始学c，希望给力，啦啦啦
user-0 提问: 看了好久，代码运行结果还是不对，请问有人知道为什么吗？

回复:
user: user-1
content: #include <stdio.h>  #include <stdlib.h>    int main()  {      int number,i;      float *score,*p;      float total_score=0,average;      printf("How many students?");      scanf_s("%d",&number);      score=(float *)malloc(number*sizeof(float));      p = score;      //或者score=(float *)calloc(number,sizeof(float));      if(score==NULL)      {          printf("Not enough memory.");          exit(1);      }      for(i=0;i<number;i++)      {          scanf_s("%f",score);//scanf_s("%f",score[i]);经测试不能这样输入          total_score+=*score;          score++;//改变指向的地址      }      average=total_score/number;      printf("Average score=%.2f\n",average);      free(p);//释放不能是score 因为score地址已经变了      return 0;  }

user: user-2
content: for(i=0;i<number;i++)    {                 scanf("%f",score);                 total_score+=score[i];          score++;                         } //score是一个float指针变量，指向malloc分配的一块内存的首地址。你的整个程序没有指针++的操作，score一直指向首地址 //输入的值不断的覆盖之前的数值

user: user-3
content: scanf("%f",score); 这句话，你赋值的时候一直都是在给首地址赋值，而没有使用后面的空间啊
user-0 提问: 数组下标的最大值

回复:
user: user-1
content: 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 容量大小从小到大：栈≤全局数据≤堆≤文件≤硬盘≤磁盘阵列≤云存储 当程序需要使用比如2GB～1TB左右的存储时，最简单的办法恐怕得是用文件读写模拟内存读写了吧。windows参考_fseeki64函数，linux参考fseeko64函数。 FILE *fA;fA=fopen("A","rb+");_fseeki64(fA,10000000000i64*sizeof(int),SEEK_SET);fputc(fA,0);//int A[10000000000]; int B; _fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fread(&B,1,sizeof(int),fA);//B=A[9999999999]; _fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fwrite(&B,1,sizeof(int),fA);//A[9999999999]=B; fclose(fA);  在现实世界中，除时间和空间可能是无限的以外，其它任何事物都是有限的。

user: user-2
content: 每个函数调用都有一个栈帧，里面存储局部变量和返回地址，栈帧大小可以由编译器设定，但不能超过系统的最大值，一般1M。要使用大的内存空间，就要用new或malloc申请堆内存。

user: user-3
content: 你这样定义数组，建议不要在嵌入式设备上运行你的程序。

user: user-0
content: 引用 2 楼 taodm 的回复:你开这么大的数组得到是学编程呢还学折腾？ 只是觉得对栈，堆，32，,64程序的一些东西还不了解，感觉和那些有关

user: user-0
content: 引用 1 楼 user-6 的回复:栈空间太小了。 通过编译器设置了栈空间为536870912*4*8+了已经，不管设置多大都会有这个问题

user: user-0
content: 引用 3 楼 u013069997 的回复:因为栈空间是有限的，并不是无限大。如果你是用new  malloc 申请的空间就可以这么大的  但是通过编译器设置了栈保留大小为536870912*4*8+了啊？

user: user-4
content: 因为栈空间是有限的，并不是无限大。如果你是用new  malloc 申请的空间就可以这么大的

user: user-5
content: 你开这么大的数组得到是学编程呢还学折腾？

user: user-6
content: 栈空间太小了。
user-0 提问: 求教大神这个为什么答案错误

回复:
user: user-1
content: 首先，你问的问题都没有表达清楚，你应该是自己写的一个代码，实际输出结果错误，想要知道错误原因吧？  下面我自己写的代码，经检验无问题，你参考一下看看你自己错哪里了 #include <stdio.h>  int main(){        float  p,q,temp;       int i, j;             //i表示班级最少人数，j表示及格人数       int k = 0;        for(i=1; ;i++){             for(j=1; j<i ; j++){                  temp = (float) j  / (float) i ;     //这里是关键，不能使用整型数据直接进行除法                  if(  temp*100 >p  && temp*100<q )  {k=1;  break;}             }             if( k==1) break;         }       printf("%d %d\n",i,j);        return 0; }

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

user: user-3
content: #include<stdio.h>  int main() {     float p,q;     int i;      scanf("%f%f", &p, &q);     for(i = 1; ; i++) {         if((int)(i*q/100.0)-(int)(i*p/100.0) == 1) {             printf("%d\n",i);             break;         }      }      return 0; }  代码通过了你的测试用例，能够获得想要的结果。有些地方做了微调，参考一下吧

user: user-4
content: 什么意思呢，看不到题目
user-0 提问: 大家好，请问指针的p+i和p[i]有什么区别

回复:
user: user-1
content: p+i表示指针p向“后”偏移i后的指针 p[i]一般表示数组的第i个元素

user: user-2
content: A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价

user: user-3
content: p+i表示指针偏移一定的单位，偏移的单位=sizeof(*p) * i

user: user-4
content: 引用 2 楼 coverlo 的回复:我懂了 p[i]中存放的是变量， p+i 是一个指针， 所以p[i] ==*(p+i)      p+i中存放的是p[i]的地址 +++ 就是这样的理解～

user: user-5
content: p+i是一个指针 p[i]是一个数组的元素，和*（p+i）是一样的，只是写法不同，这里的一样是完全一样，即产生的机器码相同

user: user-6
content: 引用 2 楼 coverlo 的回复:我懂了 p[i]中存放的是变量， p+i 是一个指针， 所以p[i] ==*(p+i)      p+i中存放的是p[i]的地址  p + i 的结果代表p指针先前移动多少位置，所以得到的依旧是指针 p[i] 是取从p开始的内存，第 i 个位置的值

user: user-0
content: 我懂了 p[i]中存放的是变量， p+i 是一个指针， 所以p[i] ==*(p+i)      p+i中存放的是p[i]的地址

user: user-7
content: p[i]  => *(p+i)
user-0 提问: c语言 如何让数在一行中不断变化

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

user: user-2
content: 在linux终端下控制光标位置： http://blog.csdn.net/kevinshq/article/details/8179252 在windows命令行下控制光标位置： http://blog.sina.com.cn/s/blog_5059be880100xmpn.html

user: user-3
content: printf("Hello world!"  ); printf("\r你好世界!"  ); printf("\b你好世界!"  ); 试试这个代码

user: user-4
content: 没看懂楼主的问题，若楼主需要不用其他变量来覆盖原先固定的数值，可以用到ASCII码的自加。 你说的用这个思路写贪吃蛇是什么意思，用数组来代替蛇的长度？

user: user-5
content: 在控制台让后面的数据覆盖前面的，系统默认貌似实现不了吧，用界面做会简单很多，比如MFC QT

user: user-6
content: 这就是一个控制台版本的贪吃蛇

user: user-7
content: 你得在变换之间加 pause (sleep 比如），要不太快了你看不到变化过程。
user-0 提问: C语言求助

回复:
user: user-0
content: 谢谢了，是return ret；

user: user-1
content: char* ret = dst;  assert(dst && source);  while((*dst++ = *source++) != '\0');  return dst;  作为返回值，这样子就可以使用链式表达式了  因为复制dst的时候自增，导致最后dst的指向不是原来的地址，所以需要一个临时的变量记录首地址以作返回
user-0 提问: 初学者关于数据结构中的插入算法

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <stdbool.h>  #define MAX_SIZE 100  typedef int Data;  //顺序表的数据类型 typedef struct {     Data data[MAX_SIZE];     int last; }Seqlist,*pSeqlist;  //创建空的顺序表 Seqlist* creat(void) {     pSeqlist L = (pSeqlist)malloc(sizeof(Seqlist));      //分配空间失败     if(!L) {         printf("malloc fail\n");         return NULL;     }      //分配空间成功，初始化为空表     L->last = 0;      return L; }  /*  功能：插入数据     参数：L  待插入的顺序表     ipos  插入位置，从0开始     e  待插入的数据     返回值：true  插入成功     false  插入失败     */ bool insert(pSeqlist L, int ipos, Data e) {     int i;     //ipos无效     if(ipos < 0 || ipos > L->last+1) {         printf("ipos无效\n");         return false;     }      //顺序表满     if(L->last >= MAX_SIZE-1) {         printf("顺序表满，无法插入\n");         return false;     }      //为待插入数据e腾出ipos的位置并插入     for(i = L->last; i >= ipos; i--) {         L->data[i+1] = L->data[i];     }      //将数据e存储在ipos位置     L->data[ipos] = e;     (L->last)++;     return true; }  int main() {     int i, j;      pSeqlist ph = creat();     for(i = 0; i < 10; i++) {         insert(ph, i, i);     }     insert(ph, 5, 128);     for(j = 0; j < 11; j++) {         printf("%d\n", ph->data[j]);     }     return 0; }  /* 这一段代码觉得从没执行过，last的初始值为-1，有些不太理解 for(int i=L->last;i>=ipos;i--) {     L->data[i+1]=L->data[i]; } */  程序没问题，我将maxsize改成了MAX_SIZE，建议宏使用大写。

user: user-2
content: for(int i=L->last;i>=ipos;i--) { L->data[i+1]=L->data[i]; } 这段代码执行了一次，应该是对第一个数据赋值吧

user: user-0
content: 谢谢，问题已经解决了

user: user-3
content: Rebuild之后再试试，我这里测试没有出现这个问题
user-0 提问: linux   C语言   函数返回值

回复:
user: user-1
content: 一样的，如果你不需要返回值，可以用while( fgetc(fp) != EOF)，如果需要，那么就用上一个形式

user: user-2
content: 判断的结果是一样的  while（（ch = fgetc(fp)）  != EOF） 的含义是先把fgetc(fp) 赋值给 ch，保持 ch 是最新读入的字符 那么在while {} 中你就可以用 ch 这个变量去知道刚读入的字符是什么
user-0 提问: 关于toupper函数的一个疑问

回复:
user: user-1
content: 原型：     extern int toupper(int c); 用法：     #include <ctype.h> 功能：     将字符c转换为大写英文字母 说明：     如果c为小写英文字母，则返回对应的大写字母；否则返回原来的值。

user: user-2
content: toupper的返回值才是变成大写后的值  而参数是通过值传递的，函数中使用的都是一个复制后的值，ch又怎么可能变化

user: user-3
content: 返回值才是返回大写字母，参数本身是不会改变的

user: user-4
content: 仅仅 toupper(ch) 只是得到一个值，后面如果是 switch(ch)，则比较的依据如果是 ch，前面应该把大写的字母存回到 ch，即把 toupper(ch); 改成 ch = toupper(ch); 就行了
user-0 提问: 求素数问题。

回复:
user: user-1
content: for( x=n; n <= m; x++ )             {                 int i, isprime = 1;                 for(i=2;i<x;i++)  直接从n开始，加个calculate纯属多余

user: user-2
content: #include <stdio.h>  int main(void) {      int i, j;     int m,n,sum;     int isprime = 1;      sum = 0;     scanf("%d%d", &n, &m);      for(i = n; i <= m; i++) {         isprime = 1;         for(j = 2; j < i; j++) {             if(!(i % j)) {                 isprime = 0;                 break;             }         }         if(isprime) {             if(j >= i){                 sum++;                 printf("%d is prime!\n", i);             }         }     }       printf("total number = %d\n", sum);      return 0; }  代码变量有点乱～ 这是我的一个demo，你可以参考一下

user: user-0
content: n和m是表示第n个素数，i是第n个数，x是数，x和n以及m并没有直接的联系

user: user-3
content: 首先你这程序的意思是找到2到n之间所有的素数和，和你给的题意不符。你可以先建一个表，列出足够数量的所有素数
user-0 提问: 帮我纠正一下我哪里做的不完善。

回复:
user: user-1
content: Finding prime numbers - Kenneth Haugland  Different schemas for finding prime numbers explained with code http://www.codeproject.com/Articles/429694/Finding-prime-numbers

user: user-2
content: 用打表法，先直接算出200个素数，然后累加就行了

user: user-3
content: 将第13行去掉。不然当n==1的时候，会算多一个2.

user: user-4
content: 你试试1   2就知道了。  边界问题

user: user-5
content: 我提两点： 1.使用自定义函数，能使代码阅读起来更清晰，都放在main函数里，还不加一些注释，读起来稍微费劲（再加上格式不整齐）；如果代码复杂一些，读起来更是不舒服； 2. 判断素数的效率，主要看一下循环次数，明显下一个程序的循环次数小于上一个程序的循环次数。循环次数差距至少是2备以上。

user: user-6
content: 好像是n=1的时候有问题吧，是不是把2算了两次啊？手头没有编译器，你自己确定一下

user: user-0
content: 引用 1 楼 qq423399099 的回复:多测试一些极端，边界情况  条件范围内，正确啊

user: user-7
content: 多测试一些极端，边界情况
user-0 提问: 用memset初始化二维数组

回复:
user: user-1
content: 代码如下：  #include <iostream> #include <stdlib.h>  using namespace std;  void  test_memset_for_c() { #define nrows 100 #define ncolumns 100 	int** array1 = (int**)malloc(nrows * sizeof(int *)); 	for (int i = 0; i < nrows; i++) 	{ 		array1[i] = (int*)malloc(ncolumns * sizeof(int)); 		memset(array1[i], 0, ncolumns * sizeof(int)); 	}  }  void  test_memset_for_cpp() { #define LEN 100 	int arr[LEN][LEN]; 	for (int i = 0; i < LEN; i++) 	{ 		memset(arr[i], 0, LEN * sizeof(int)); 	} }  int main() { 	cout << "Hello World!" << endl; 	test_memset_for_c(); 	test_memset_for_cpp(); 	return 0; }

user: user-2
content: 引用 5 楼 love_QJP 的回复:[quote=引用 4 楼 paschen 的回复:] memset(a, 1, sizeof(a)) 这样我试了  不对[/quote]  你别对参数这样子用，别对退化为指针的数组用。

user: user-1
content: 要for循环来memset二维数组,目前手机打字，后天上班了给你弄。

user: user-3
content: for (){  for() {   a[i][j]=1;  } }

user: user-4
content: 只有char型才可以，可以用fill

user: user-0
content: 引用 4 楼 paschen 的回复:memset(a, 1, sizeof(a)) 这样我试了  不对

user: user-5
content: memset(a, 1, sizeof(a))

user: user-6
content: memset 是按字节来操作的, 如果 a 的类型是 char 就可以, memset(a, 1, 100 * 100) 就行了

user: user-0
content: 能不能用memset把二维数组初始化为1

user: user-7
content: 解释的清楚一点
user-0 提问: 借用缓冲区溢出重写返回地址，跳到编写的shellcode却提示no line number infomation?

回复:
user: user-1
content: 调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx

user: user-2
content: 这里什么功能

user: user-3
content: no line number information倒是没什么好奇怪的，毕竟这个地址的code是你填充的，不是由源文件编译得到的； 问题在于下面的SIGSEGV，个人的第一反应是这shellcode能正确工作？
user-0 提问: 求大哥们教教小弟二级C遇到的问题，不耽误大哥多少时间的。

回复:
user: user-0
content: 引用 4 楼 user-1 的回复:啊呀，不好意思 循环条件while(tmp!=end)改成while(tmp<=end),用你的数据试试吧，应该没错了。  谢谢前辈指导，感激不尽。没什么可以回报的，唯有祝福前辈新的一年里平平安安，心想事成！

user: user-1
content: 啊呀，不好意思 循环条件while(tmp!=end)改成while(tmp<=end),用你的数据试试吧，应该没错了。

user: user-0
content: 引用 1 楼 user-1 的回复:#include<stdio.h> #include<string.h> void test(char* s) { 	char* tmp=s; 	char *end=tmp; 	while(*end!='\0') 	end++; 	 	end--; 	 	while(tmp!=end) 	{ 		char t=*tmp; 		*tmp=*end; 		*end=t; 		 		tmp++; 		end--; 	} } int main(void) { 	char s[]="hello world"; 	test(s); 	printf("%s",s);  }   希望对你有帮助，代码写得挺简陋的。   没有没有，前辈百忙中能帮小弟的忙，就是对小弟最大的帮助了，更别谈代码的问题了。只是小弟斟酌再三，进行了调试后，还是有些微的不足之处。不知是不是小弟的电脑出现了问题，运行后的程序答案是对的，但似乎进入了循环，报错了。不知前辈运行的时候有没有出现类似的问题。小弟能力有限，调试后发现的问题，地址的问题。因为水平问题，就不说愚见了。如果前辈看到小弟的回复，百忙中能帮小弟再看看问题，小弟实感荣幸之至。谢谢！

user: user-0
content: 没有没有，前辈百忙中能帮小弟的忙，就是对小弟最大的帮助了，更别谈代码的问题了。只是小弟斟酌再三，进行了调试后，还是有些微的不足之处。不知是不是小弟的电脑出现了问题，运行后的程序答案是对的，但似乎进入了循环，报错了。不知前辈运行的时候有没有出现类似的问题。小弟能力有限，调试后发现的问题，地址的问题。因为水平问题，就不说愚见了。如果前辈看到小弟的回复，百忙中能帮小弟再看看问题，小弟实感荣幸之至。谢谢！

user: user-1
content: #include<stdio.h> #include<string.h> void test(char* s) { 	char* tmp=s; 	char *end=tmp; 	while(*end!='\0') 	end++; 	 	end--; 	 	while(tmp!=end) 	{ 		char t=*tmp; 		*tmp=*end; 		*end=t; 		 		tmp++; 		end--; 	} } int main(void) { 	char s[]="hello world"; 	test(s); 	printf("%s",s);  }   希望对你有帮助，代码写得挺简陋的。
user-0 提问: substr(s,7,8)

回复:
user: user-0
content: 非常感谢楼上两位,问题解决了,原来是语法错误哈哈

user: user-1
content: 虽然不是很懂你想说什么。帮你改了两个错误。加黑的地方。 #include<stdio.h>  char * substr(char *s,int pos,int len)  {   int i;   char *start,*mid,*end;   for(i=0;i<pos-1;i++)   {     s++;   }   start=s;              //找到子串的首地址   for(i=0;i<len+1;i++)   {     s++;   }   mid=s;               //找到子串的末尾字符的下一个地址，在这里打算插入'\0' while(*s!='\0')    s++;   end=s;               //找到整个字符串末尾+1的地址    for(s=end-1;s>=mid;--s)   *(s+1)=*(s);   *s='\0';    return start;  }  int main(void)  {   int pos=10,len=11;   char *p;   char s[50]="shanghai a beautiful city";   p=substr(s,pos,len);   while(*p!='\0')   {     printf("%c",*p); p++;    }   printf("\n");   } 运行结果：

user: user-2
content: 里面破坏了源字符串 main 用的时候源字符串是一个常量字符串, 不可写的, 里面进行写操作就会出错
user-0 提问: 想列出从2开始的一共200个素数，x未知。自己写的程序运行没有输出，麻烦请指教下。

回复:
user: user-0
content: 谢谢，你真利害

user: user-1
content: #include <stdio.h>  int main(void) {       int calculate=1, x;       //200？应该从1开始      //while(calculate<=200)    //外层while不需要      //{             for( x = 2; calculate <= 200; x++ )    //把200作为结束条件             {                 int i, isprime = 1;   //isprime放在for里面，每次开始判断前都要重置这个数                  for(i=2;i<x;i++)   //不要等于，不然x%i最终都会等于0                  {                     if(x%i==0)                     {                         isprime=0;                         break;                     }                 }                 if(isprime==1)      //if也要放在for里                  {                     printf("%d,%d\n",calculate,x);                     calculate++;                 }             }     //}     return 0; }
user-0 提问: 请教一个问题大神们

回复:
user: user-1
content: 你一旦调用了int b()函数就执行了这个函数所有的语句不论调用的是不是赋值语句。当然也执行puts("ppp");这个语句。

user: user-2
content: 只要你调用了函数,那么这个函数就会执行它自己函数内部的指令,包括在返回之前的输出.你可以理解这个函数返回VOID 那么是不是要输出PPP

user: user-3
content: 楼主，程序不是只在主程序里跑的，choice=menu();这句会调用menu()这个函数的，也就是会执行里面的代码，所以里面的输出语句就都输出了啊

user: user-4
content: 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-5
content: choice=menu(); 会执行menu()这个函数，最后menu()函数的返回值会赋值给choice。

user: user-6
content: puts("ppp"); 输出了ppp这几个字符

user: user-0
content: 大神们 能理解我的意思么？？choice=menu（）这是一个赋值语句啊，只是赋一个结果给choice。 往下这句choice==2  report（），这句话我就理解

user: user-0
content: 你们好像没太理解我意思，这是书上一个例题。打印一个菜单 #include<stdio.h> #define QUIT 3 /*函数原型*/ int menu(void); void report(void); int main(void)/*主函数开始*/ { 	int choice=0; 	printf("\"We\'d like to  you to the meun\"\n"); 	printf("Are you ready to make a choice \?\n"); 	while(choice!=QUIT) 	{ 		choice=menu(); 		if(choice==1)  			printf("\nBeeping"); 		else 		{ 			if(choice==2) 				report(); 	}} 		printf("you chose to quit\n"); 		return 0; 	} 	int menu(void) 	{ 		int a=0; 		do 		{ 			printf("\n"); 			printf("\n1-BEEP"); 			printf("\n2-display"); 			printf("\n3-quite"); 			printf("\n"); 			printf("\nentr a selectin:"); 			scanf("%d",&a); 		}while(a<1||a>3); 		return a; 	} 	void report(void) 	{ 		printf("\nsample report"); 		printf("\n\nseq"); 	}/*结束*/ choice=menu()是不是把menu函数的返回值赋给choice，应该返回的是1或者2，但是程序会把menu函数里的菜单打印出来，我不理解为啥会打印菜单，主程序也没有这个功能啊。

user: user-7
content: return的返回是不会打印在屏幕上的，不知题主怎么确定它的返回值是ppp的，puts语句就是类似printf打印语句一样的。所以楼主看到的ppp是puts语句打印在屏幕上的。楼主理解不？

user: user-8
content: 楼上正解， 代码可以这样修改：  int b(); main {int a; a=b(); } int b() {int c; puts("input:"); scanf("%d",&c); return c;}

user: user-9
content: 什么叫“还带着ppp”？ ppp 是输出到屏幕的一个字符串，跟返回值没关系。 如果把“ppp”换成“请输入一个数字：”是不是容易理解一些？
user-0 提问: 请问为什么会有这个警告？见图，谢谢

回复:
user: user-1
content: 因为你第6个参数是int*类型的，如果要输出指针的地址，可以用%p，如果要以十进制方式输出，可以输出时强制转换成int，这样就不会有警告了

user: user-2
content: j本来就是数组的首地址，取地址+1然后解引用

user: user-3
content: j 是 int * 型 &j 是 int ** 型 &j + 1 是 int ** 型 *(&j + 1)  是 int * 型

user: user-0
content: 为什么警告说*(&j + 1)是int *类型的？明明是int类型啊
user-0 提问: C语言问题

回复:
user: user-1
content: 你的程序思路不对  仅用不超过10个的变量  我来说下思路吧 首先,因为是从高位算起,所以你需要一个变量H来存储上次高位的数之和,还需要一个变量C存储本次输入的2个数字之和 首先H置0  H=0 1 录入本次2个数字,并且计算出和C 2 如果本次之和C大于10,那么上次2个数之和H需要++ ,并且本次数C-=10 3 输出上次高位计算的和H,并且将本次的和存入H   H=C 3 如果数字全部输入完成就输出H,否则继续1

user: user-0
content: 谢谢zzzz

user: user-2
content: 当N是123456时，k多大？s可能有多大？你程序中的变量存不下这么大的数