Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 关于C++使用指针函数转置二维数组的问题

回复:
user: user-0
content: 麻烦看一下还是不对

user: user-1
content: 挖空题。楼上正确。

user: user-2
content: j<n   *(*(p + i) + j)=*(*(p +j) +i);             *(*(p + j) +i)=t;  p,3,4

user: user-3
content: http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组
user-0 提问: C Primer Plus 里的char * s_gets(char * st, int n)函数

回复:
user: user-1
content: 问题1-char * st  表示这个函数的第一个参数是一个指针，并且是一个指向字符变量的指针。表示用来存储一个字符的地址。 问题2-continue是跳到哪一行？ 这里的continue确实没有啥意义

user: user-2
content: 第一个问题，st是字符串数组的地址，是形参，用于接收一个字符串的地址；  第二个问题，continue不跳转，是继续执行while (getchar() != '\n')，continue是继续执行循环，那么这个循环是距离它最近的循环； 这儿的continue无意义，可以直接去掉，直接用;即      while (getchar() != '\n')         ;   第一个while判断表达式里多了一个逗号，我想编译器应该会给予提示，不论是warning还是error。
user-0 提问: 请教c语言相关

回复:
user: user-1
content: 你是要排序，还是找最值（最大或最小），前者有各种排序算法，效率不等；后者没啥特别的办法，扫描一遍逐个比较呗，效率o(N)

user: user-2
content: 同时比较，那么可以考虑使用||或者&&将比较表达式串起来。  也可以用函数吧，即函数里可以考虑用循环比较；
user-0 提问: 如何将字符串输入到字符数组中？

回复:
user: user-0
content: 在学习的现阶段看来（仅限C语言），使用stdlib.h中的void *__cdecl calloc(size_t _Count, size_t _Size)与void *__cdecl malloc(size_t _Size)是最好的。 谢谢大佬们

user: user-1
content: #include <stdio.h> #include <string.h> #include <stdlib.h> void sort(char *name [], int n) { 	char * temp; 	int i, j, k; 	for (i = 0; i < (n - 1); i++) 	{ 		k = i; 		for (j = (i + 1); j < n; j++) 			if (strcmp(name[k], name[j]) > 0) 				k = j; 		if (k != i) 		{ 			temp = name[i]; 			name[i] = name[k]; 			name[k] = temp; 		} 	} } void print(char * name[], int n) { 	int i; 	for (i = 0; i < n; i++) 		printf("%s\n", name[i]); }  void main() { 	char *name[3]; 	int i= 0; 	for (i = 0; i < 3; i++) { 		name[i] = (char *)malloc(sizeof(char) * 32); 		if (!name[i]) 			return; 		scanf("%s", name[i]); 	} 	int n = 3; 	sort(name, n); 	print(name, n); 	for (i = 0; i<3; i++) 	{ 		free (name[i]); 		name[i] = NULL; 	}	 	system("pause"); }

user: user-2
content: 变长字符串用数组就不太合适了，标准C++库提供了std::string可以解决您的需求。 具体用法可以百度查询。

user: user-0
content: 但不论是malloc(32 * sizeof(char))还是calloc(32, sizeof(char))，长度都是固定的。当字符串输入过长时，程序依然会崩溃。 以下的赋值是合法的：  void main() { 　　char *name[3] = { "Hello world!", "Welcome to this application!", "Do you accept the rules?" }; 　　// 第一个引号的类型为(const char [12])， 　　// 第二个引号的类型为(const char [28])， 　　// 第三个引号的类型为(const char [25])， }  系统对于"……"中的内容会自动识别，不同长度会自动定义为不同长度的字符数组。 要是输入字符串的比分配的动态内存长怎么办？不能变为动态字符串吗？

user: user-3
content: 因为用于存放字符串的缓存不存在，name[3]是3个指针，这三个指针只想的内存位置是随机，即我们经常提到的野指针。 另外，对字符串，3个字符串赋值也需要循环。   void main() {     char * name[3];     for (i = 0; i < 3; i++) {         name[i] = (char *)malloc(sizeof(char) * 32);         if (!name[i])             return -1;         scanf("%s", name[i]);     }     int n = 3;     sort(name, n);     print(name, n); }  参考一下吧
user-0 提问: 怎么样将结果去重（子集和问题的结果）

回复:
user: user-1
content: void back_subset(int i) {     if(c_sum+num[i]==c)     {         result[count]=num[i]; 		for(int i=1 ;i<count;i++ ) 		{ 			if(result[i]>result[i+1]) 				return; 		} 加个这样的判断？

user: user-2
content: http://blog.sina.com.cn/s/blog_7865b083010100dd.html

user: user-1
content: 输出的时候加一个判断~后面的元素大于前面的元素才进行输出虽然对效率无提升。

user: user-3
content: 引用 3 楼 lsdlzhvoa0PVTNWey 的回复:另外，在我运行时还发现了同一个元素可能被使用两次甚至三次，怎么修改使其只被使用一次 计算最擅长做重复的事，重复不影像速度的

user: user-0
content: 另外，在我运行时还发现了同一个元素可能被使用两次甚至三次，怎么修改使其只被使用一次

user: user-3
content: 代码太长，就没兴趣看 说下我的思路，可以把生成的数组，排序。然后把数组生成MD5。以MD5放入 MAP容器就可以了 然后获取MAP容器里数量

user: user-4
content: 我的思路是每生成一个数组时做个排序，这样排除重复就很简单，从头到尾比较，一出现不同即认为没有重复。
user-0 提问: 【新手】我的这个程序想要输入9733个数（即数据总数为9733个），但是并没有完全输入进去，程序就停住不动了，为什么呢？

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  struct nut {     long nlow;     long nmid;     long nhig; };  void find_cnt(struct nut *pcnt, int *arr, long size); int main(void) {     struct nut cnt = { 0 };      int *p = NULL;     long m, i;      scanf("%ld", &m);      p = (int *)malloc(m * sizeof(int));     if (!p)         return -1;      for (i = 0; i < m; i++)         scanf("%d", p+i);      find_cnt(&cnt, p, m);     printf("%ld %ld %ld\n", cnt.nlow, cnt.nmid, cnt.nhig);      return 0; }  void find_cnt(struct nut *pcnt, int *arr, long size) {     long i;      for (i = 0; i < size; i++) {         switch (arr[i]/10) {             case 0 ... 5:                 pcnt->nlow++;                 break;              case 6 ... 7:                 pcnt->nmid++;                 break;              case 8 ... 10:                 pcnt->nhig++;                 break;         }     } }  /* struct nut *find(struct num *p,long long int m)//定义函数，用于 统计个数； {     struct nut *q;     long long int i;     struct nut a={.i=0,.j=0,.k=0     };     q=&a;     for(i=0;i<m;i++)//主要部分，在某一区间内，相应的参数+1；      {         if(p[i].n<60)         {             q->i++;             //printf("k1=%d",q->i);         }         else if(p[i].n>59&&p[i].n<80)         {//printf("k2=%d",q->j);             q->j++; }         else if(p[i].n>79&&p[i].n<101)         {//printf("k3=%d",q->k);             q->k++;}     }      return (q); //返回指针； } int main() {     struct num *p;     struct nut *q;     long long int m,i;      scanf("%lld",&m);//输入数据个数；     p=(struct num*)malloc(m*sizeof(int));     for(i=0;i<m;i++)//输入数据；     {         scanf("%d",&p[i].n);         fflush(stdin);         //p->i++;     }     q=find(p,m);     printf("%lld %lld %lld",q->i,q->j,q->k);//输出个数；     //printf("%lld",m);     free(p);     return 0;   } */  参考一下吧

user: user-2
content: p=(struct num*)malloc(m*sizeof(int));  应该是 p = (struct num *)malloc(m * sizeof(struct num));  吧
user-0 提问: 求最大值和最小值

回复:
user: user-0
content: 程序改成这样已经对了，但是我不懂为啥

user: user-0
content: 引用 2 楼 das白的回复:越界  应该输出a[n-1] 循环条件 j<n-i-1 还是错的，应该不止越界的问题

user: user-1
content: 二层循环应该是 for (j = 0; j < n - i - 1; j++) 不然会越界；比如当i = 0，j = n - i 即j = n -1时，那么j+1就是n，下表只能从0~n-1,所以越界；

user: user-2
content: printf("%d %d\n", a[0],a[n-1]);

user: user-3
content: 越界  应该输出a[n-1] 循环条件 j<n-i-1

user: user-0

user: user-4
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？
user-0 提问: 求教关于上位机编写程序发送给下位机的串口通信的小程序

回复:
user: user-1
content: createfile writefile readfile closehandle

user: user-2
content: 程序启动时 1 打开指定串口; 2 向串口中写入数据; 3 线程或定时器判断串口中是否有数据可读; 4 如果有数据可读，读出数据并且分析，判断下位机是否已经收到数据;
user-0 提问: 请问，如何把内存中的数据转成mat

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:你需要按mat文件的格式的要求用二进制方式将数据写到里面 是要用imdecode 感谢

user: user-0
content: 引用 1 楼 user-1 的回复:你需要按mat文件的格式的要求用二进制方式将数据写到里面 请问具体应该怎么做呢，是利用mat的构造函数么 ， 我用 Mat  mat(480, 480, CV_8UC1, data);出来保存的图片是乱的，  之前 忘记说了 这个char的数据是python 解析base64得到的

user: user-0
content: 这个char数据，是python 解析base64编码得出来的

user: user-1
content: 你需要按mat文件的格式的要求用二进制方式将数据写到里面
user-0 提问: 我是小白，请路过的大神门进来看看

回复:
user: user-1
content: 谭浩强《C程序设计》 　　看书 　　/  \    /    \ 练习——理解

user: user-2
content: C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817  Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

user: user-3
content: 不清楚你是学生还是已经工作，如果不是考试或者工作要求必须学，那么不学也罢。  如果因为什么原因非要学C语言，那么不要纠结逻辑数学基础是否好，因为好不好也得学^_^ 找一本入门书，准备好一台电脑，配置好编程环境，遇到具体问题过不去，再上论坛求助。

user: user-4
content: 主要靠练习和反思，你会理解到的

user: user-5
content: 如果两者都不具备，真的不建议你入坑，当然，你觉得这行工资高，可你曾看到过凌晨四点的太阳？当然，我也没见过。 逻辑思维差会受到同行的鄙视和排挤，当然你可以不要脸，但老板用个两个月就不会让你待下去。

user: user-0
content: 好的，多谢各位的指引

user: user-6
content: 数学差无所谓，逻辑思维能力的话还是有点影响的~ 不过都是可以学习的，不是吗~    端正态度，比如找个最近自己想开发的软件，动手去写，不会的就去网上查或者论坛里来问，等你完成开发的时候你就懂了一切~

user: user-7
content: 如果这两项都很差，不建议进入IT行业了。或许你说的太严重了，数学差，傅里叶变换，只要不是专门做算法的，对它都不了解；所以术业有专攻，即使是编程；如果做算法的，那么数学要求就很高； 目前，你的状态应该是初学者的心理，不自信；其实也没办法，基础不牢固嘛，都是过来人，没必要太大惊小怪； 你现在的基础薄弱，那么就先去抓基础，比如看书和“抄”代码，看书是熟悉概念，语法和用法；“抄”代码是加深对看到的知识点进行巩固和加深理解；这两者必不可少； 另外，多看代码，尤其是书本上的代码，因为书本上的代码一般都有讲解，自己在抄到编译环境里，调试运行几遍，最后再改改，调试运行； 技术的学习需要多总结的，不能过急，也不要灰心。先会走，在学着跑吧。
user-0 提问: 小白求助，，，为啥一到给结构数组赋值的时候就报错了。。。

回复:
user: user-1
content: char * i_o=new char[1024]; char * start_time=new char[1024]; char * over_time=new char[1024]; char * number=new char[1024];

user: user-2
content: char * i_o; char * start_time; char * over_time; char * number;   需要申请空间

user: user-0
content: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h>  struct information           //声明结构体 { 	char  i_o[10]; 	char  start_time[30]; 	char  over_time[30]; 	char  number[30]; }person[20]; FILE *fp;  int main() { 	fp=fopen("d:\\1.txt","r");     char line[120];     int i = 0;     while (fgets(line, 120, fp)) {           char* pch = strtok(line, " ");             strncpy(person[i].i_o, pch, 10 - 1);               pch = strtok(NULL, " ");             strncpy(person[i].start_time, pch, 30 - 1);               pch = strtok(NULL, " ");             strncpy(person[i].over_time, pch, 30 - 1);               pch = strtok(NULL, "\n");             strncpy(person[i].number, pch, 30 - 1);         i++;     }     fclose(fp);     for(int j=0;j<i;j++)      printf("%6s%6s%6s%6s",person[i].i_o,person[i].start_time,person[i].over_time,person[i].number);     return 0; }             大神，，，我这个怎么没有输出结果。。。

user: user-3
content: 楼上两位已经说出了答案。

user: user-4
content: struct information           //声明结构体 {     char i_o[32];     char start_time[32];     char over_time[32];     char number[32]; }person[max1]; person结构体数组里成员都是指针（野指针），这些指针没有指向有效的空间，所以会出现段错误； 简单的办法就是每个成员都定义成数组；

user: user-5
content: 结构体里面的char*分配内存了吗？ new/malloc

user: user-3
content: 这里有个人问的问题和你类似，已经解决可以参考。 http://bbs.csdn.net/topics/392288195

user: user-0
content: 大神，，，改了之后程序有输出了。。。结果不对啊，，，能不能，，，帮我改一下
user-0 提问: 用链表结构实现约瑟夫环

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h> #include<string.h>  struct node {     int num;     char name[20];     struct node *next; };  struct node *create_singly_link(int num) {     struct node*head, *prev, *cur;     int i;      head = NULL;     for(i = 0; i < num; i++) {         cur = (struct node *)malloc(sizeof(struct node));         if (!cur) {             printf("Malloc error!");             return NULL;         }         cur->next = NULL;         cur->num = i+1;         snprintf(cur->name, 20-1, "%c", 'A'+i);         if (!head) {             head = cur;             prev = cur;         } else {             prev->next = cur;             prev = prev->next;         }     }     prev->next = head;     return head; }  static void test_print(struct node *phead) {     struct node *pcur = phead->next;      printf("num = %d\t name = %s\n", phead->num, phead->name);     while (pcur != phead) {         printf("num = %2d\t name = %s\n", pcur->num, pcur->name);         pcur = pcur->next;     } }  int output( struct node *head, int start, int step, int total) {     struct node *p, *q;     int count = 0;     int num = 0, i;      q = head;      for(i = 0; i < start; i++)         q = q->next;      while(count < total-1) {         p = q->next;         num++;         if(!(num % step)) {             q->next = p->next;             printf("%s\n", p->name);             free(p);             count++;         } else {             q = p;         }     }     printf("num = %d\t, name = %s\n", q->num, q->name);     free(q);      return 0; } int main(int argc, const char *argv[]) {     int total, step, start;     struct node *head;      printf("Please input total test number: ");     scanf("%d", &total);     head = create_singly_link(total);     test_print(head);      printf("Please input start position and steps: ");     scanf("%d%d", &start, &step);      output(head, start, step, total);      return 0; } 参考一下吧
user-0 提问: 我知道这样很蠢，但是就是想实现一下

回复:
user: user-1
content: #include<stdio.h> #include <ctype.h> #include <string.h>   struct cnt_info {     int ndigit;     int nchar;     int nspace;     int nother; }; void cout(const char *str, struct cnt_info *pcnt);  /*     char zimu(char x[]);     char kongge(char x[]);     char shuzi(char x[]);     char qita(char x[]);                            // 四种函数声明 */ int main() {      /*     char x[256];     int a=0,b=0,c=0,d=0;     printf("请输入：\n");     gets(x);      a = zimu(x);     b = kongge(x);     c = shuzi(x);     d = qita(x);                                           // 带回函数值      printf(" 字母有%d个\n 空格有%d个\n 数字有%d个\n 其它字符有%d个\n",a,b,c,d); // 输出字符     */      char str[256];     struct cnt_info cnt = { 0 };      fgets(str, 256, stdin);     str[strlen(str)-1] = 0;      cout(str, &cnt);     printf(" 字母有%d个\n 空格有%d个\n 数字有%d个\n 其它字符有%d个\n",             cnt.nchar, cnt.nspace, cnt.ndigit, cnt.nother); // 输出字符      return 0; }  void cout(const char *str, struct cnt_info *pcnt) {     int i = 0;      while (str[i]) {         if (isdigit(str[i]))             pcnt->ndigit++;         else if (isalpha(str[i]))             pcnt->nchar++;         else if (isspace(str[i]))             pcnt->nspace++;         else             pcnt->nother++;         i++;     } }  /* char zimu(char x[]) {     int a1=0,i;     for(i=0;i<=x[i];i++)     {         if('A'<=x[i]&&x[i]<='z')             a1++;     }     return (a1); }  char kongge(char x[]) {     int b1=0,i;     for(i=0;i<=x[i];i++)     {         if(x[i] == ' ')             b1++;     }     return (b1); }  char shuzi(char x[]) {     int c1=0,i;     for(i=0;i<=x[i];i++)     {         if('0'<=x[i]&&x[i]<='9')             c1++;     }     return (c1); }  char qita(char x[]) {     int d1=0,i;     for(i=0;i<=x[i];i++)     {         if(x[i]<'A'&&x[i]>'z'&&x[i]>'9'&&x[i]<'0'&&x[i]!=' ')             d1++;     }     return (d1); } */ 参考一下吧  可以通过if else一次遍历字符串得到：数字，字母，空格，其他字符的总数； 另外，有专门的判断函数，可以使用；  你的空格判断，字符判断有问题；

user: user-2
content: 错误较多，往仔细检查： 1. 每个判断函数不需要传入长度吗，怎么能用数组的内容作为长度结束的标志 2. 空格函数的判断对吗 3. 按你的逻辑，其他函数只要对前面三个函数的条件与(&&)取非（！）就可以了  非常不建议这么写，效率低下，逻辑杂乱，小程序也是需要设计的

user: user-3
content: 不是这3种情况，就算是“其它”啊！
user-0 提问: 关于地址指向问题！！求教！谢谢

回复:
user: user-1
content: 字符串"world"是只读的，在只读数据段，不在栈上申请空间； str和str3都是在栈上，即"hello"和你输入的字符串，都是在栈上；  "hello"字符串也是在只读数据段，str在栈上申请了空间，所以将"hello"从只读数据段拷贝到栈上； str2只是在栈上定义的指针，没有存放"world"的空间，因此str2存放了"world"的地址；

user: user-2
content: 引用 2 楼 hu1991514 的回复:[quote=引用 1楼棉猴 的回复:]C++程序的内存中，有一块专门用来保存代码中用到的常量字符串。str2指向的应该是这个常量字符串区的地址，即内存中保存“world”字符串的地址。 图1是我的C++程序中字符串“world”在内存中的地址0x009A6B30，另一个字符串是“hello”  图1 内存地址 图2是str2的地址，可以看到其值即为0x009A6B30，是图1中字符串“world”的地址  图2 变量值但是world不是在main函数内吗，跟hello一样在栈里被分配的内存吗？既然hello指向栈内存，那么同样在main函数中定义的world就要指向代码段呢？忘指点，谢谢！[/quote] 不都告诉你了吗 char*相当于const char*， 是字符串常量。和char[]不一样。 可以自己搜一下字符串常量

user: user-0
content: 引用 1楼棉猴 的回复:C++程序的内存中，有一块专门用来保存代码中用到的常量字符串。str2指向的应该是这个常量字符串区的地址，即内存中保存“world”字符串的地址。 图1是我的C++程序中字符串“world”在内存中的地址0x009A6B30，另一个字符串是“hello”  图1 内存地址 图2是str2的地址，可以看到其值即为0x009A6B30，是图1中字符串“world”的地址  图2 变量值但是world不是在main函数内吗，跟hello一样在栈里被分配的内存吗？既然hello指向栈内存，那么同样在main函数中定义的world就要指向代码段呢？忘指点，谢谢！

user: user-3
content: C++程序的内存中，有一块专门用来保存代码中用到的常量字符串。str2指向的应该是这个常量字符串区的地址，即内存中保存“world”字符串的地址。 图1是我的C++程序中字符串“world”在内存中的地址0x009A6B30，另一个字符串是“hello”  图1 内存地址 图2是str2的地址，可以看到其值即为0x009A6B30，是图1中字符串“world”的地址  图2 变量值

user: user-4
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！
user-0 提问: 求助一个VC++6.0的问题

回复:
user: user-1
content: char c='';  //char c = ‘ ’;  红字部分是错误的修改下; 要在''中间加个空格或者其他字符 要不会提示：空字符常量

user: user-1
content: /*格式化输出日历*/ void PrintYear (int year)  {     int m,i,d;     char c='';  //char c = ‘ ’；     int MONTH[12]={31,28,31,30,31,30,31,31,30,31,30,31};     if(IsLeap(year))MONTH[1]=29;     int firstwed=FirstWeeday(year);     printf("Year:%d\n",year);     printf("========================\n");     for(m=0;m<12;m++)  {       PrintMonTitl(m);       PrintWeedTitl();   for(d=1;d<=MONTH[m];d++)  {         if(d==1)  {            for(i=0;i<firstwed;i++)             printf("%5c",c);             printf("%5d",d);         }         else {             printf("%5d",d);         }                    if((firstwed+d-1)%7==6)printf("\n");       }        firstwed=(firstwed+MONTH[m])%7;       printf("\n");    }  }

user: user-1
content: /*打印星期*/ void PrintWeedTitl()  {  int i;  for(i=0;i<7;i++) {   witch(i)  // 改成 switch(i) 你少打了一个S    {       case 0 : printf("Sun");break;       case 1 : printf("Mon");break;       case 2 : printf("Tue");break;       case 3 : printf("Wed");break;       case 4 : printf("Thu");break;       case 5 : printf("Fri");break;       case 6 : printf("Sat");break;       default : break;    }   }     printf("\n"); }

user: user-2
content: 有个switch少了个S
user-0 提问: C语言新手求助，为何输出的格式不正确

回复:
user: user-1
content: 感觉逻辑有点不对，源程序有部分分支没有算end3的值，因此会中断。 这样改了可能好点。 int main (void) {     float a0,a1,a2,a3;     float a,b,c,end1,end2,end3;     scanf("%f%f%f%f",&a0,&a1,&a2,&a3);     scanf("%f%f",&a,&b);     while(b-a>=0.001)     {         end1=a3*a*a*a+a2*a*a+a1*a+a0;         end2=a3*b*b*b+a2*b*b+a1*b+a0;         c = (a+b)/2;         end3 = a3*c*c*c+a2*c*c+a1*c+a0;             if(fabs(end3) < 1e-6)             break;          if(end1*end3 > 0)             a=c;         else if(end2*end3 > 0)             b=c; 		 else if(end1==0) 		  break; 		  else if(end2==0) 		  break;     }     printf("%.2f\n",c);     return 0; }

user: user-2
content: #include<stdio.h> #include <math.h>  int main (void) {     float a0,a1,a2,a3;     float a,b,c,end1,end2,end3;     scanf("%f%f%f%f",&a0,&a1,&a2,&a3);     scanf("%f%f",&a,&b);     while(b-a>=0.001)     {         end1=a3*a*a*a+a2*a*a+a1*a+a0;         end2=a3*b*b*b+a2*b*b+a1*b+a0;         if(end1*end2<0)         {             c = (a+b)/2;             end3 = a3*c*c*c+a2*c*c+a1*c+a0;         }         if(fabs(end3) < 1e-6)             break;         else if(end1*end3 < 0)             b=c;         else if(end2*end3 < 0)             a=c;         else if(fabs(end1) < 1e-6)             break;         else if(fabs(end2) < 1e-6)             break;     }     printf("%.2f\n",c);     return 0; } 参考一下吧；

user: user-3
content: 浮点数不要直接用==判断，一定要判断相等时，用差值小于极小数表示。

user: user-0
content: 按这个格式输入 ，输出格式还是不正确

user: user-4
content: 浮点数格式 http://bbs.csdn.net/topics/390676437
user-0 提问: C语言头文件问题

回复:
user: user-1
content: 看了一下应当是 add.h 函数声明没有以分号结束。

user: user-2
content: 头文件的函数声明最后要有分号

user: user-0
content: 已解决

user: user-0
content: 对了，我用的是codeblocks编写的，版本是13.12，编译器是自带的
user-0 提问: 这个程序为什么会跳不出循环？？

回复:
user: user-1
content: 可以自己设置断点调试一下

user: user-1
content: 在for循环中间加一个i<=m

user: user-1
content: 引用 3 楼 qq_24852439的回复:[quote=引用 1 楼 qq_38204686 的回复:] 第一个for循环没有判断条件 #include<stdio.h> int main(){     int m,n,sum=0; //sum用来记录素数 m n为用户输入     int flag=1; //flag用以标记当前是第几个素数 默认为1     do     {         scanf("%d%d",&n,&m);     }     while(n<=0||m<n||m>200); //健壮性 控制合理的用户输入       if(n==1)         sum+=2; // 第一个素数为2 sum+2；       int is = 0;     for(int i=2;;i++)     {         is = 1;         if(flag>m) // 判断加素数的次数是否等于m             break; //等于m则跳出           for(int j=2;j<i;j++)         { //判断是否为素数               if(i%j==0)             {                 is=0;                 break;             } //不是素数则跳出         }           if(is==1)         {               if(flag>=n) //flag要大于起始的n 素数才开始相加                 sum+=i; //sum为素数和                flag++; //是素数 flag++          }     }     printf("%d\n",sum);     return 0; } 这个也没有判断条件诶，这个怎么有输出呀。[/quote] 有的 if flag>m break 这个break可以跳出循环

user: user-0
content: 引用 1 楼 qq_38204686 的回复:第一个for循环没有判断条件 #include<stdio.h> int main(){     int m,n,sum=0; //sum用来记录素数 m n为用户输入     int flag=1; //flag用以标记当前是第几个素数 默认为1     do     {         scanf("%d%d",&n,&m);     }     while(n<=0||m<n||m>200); //健壮性 控制合理的用户输入       if(n==1)         sum+=2; // 第一个素数为2 sum+2；       int is = 0;     for(int i=2;;i++)     {         is = 1;         if(flag>m) // 判断加素数的次数是否等于m             break; //等于m则跳出           for(int j=2;j<i;j++)         { //判断是否为素数               if(i%j==0)             {                 is=0;                 break;             } //不是素数则跳出         }           if(is==1)         {               if(flag>=n) //flag要大于起始的n 素数才开始相加                 sum+=i; //sum为素数和                flag++; //是素数 flag++          }     }     printf("%d\n",sum);     return 0; } 这个也没有判断条件诶，这个怎么有输出呀。

user: user-0
content: #include<stdio.h> int main(){     int m,n,sum=0; //sum用来记录素数 m n为用户输入     int flag=1; //flag用以标记当前是第几个素数 默认为1     do     {         scanf("%d%d",&n,&m);     }     while(n<=0||m<n||m>200); //健壮性 控制合理的用户输入       if(n==1)         sum+=2; // 第一个素数为2 sum+2；       int is = 0;     for(int i=2;;i++)     {         is = 1;         if(flag>m) // 判断加素数的次数是否等于m             break; //等于m则跳出           for(int j=2;j<i;j++)         { //判断是否为素数               if(i%j==0)             {                 is=0;                 break;             } //不是素数则跳出         }           if(is==1)         {               if(flag>=n) //flag要大于起始的n 素数才开始相加                 sum+=i; //sum为素数和                flag++; //是素数 flag++          }     }     printf("%d\n",sum);     return 0; } 这个也没有判断条件诶，这个怎么不是死循环？

user: user-1
content: 第一个for循环没有判断条件
user-0 提问: 内存地址的问题，求教！

回复:
user: user-1
content: 不知道你的小是指什么？

user: user-2
content: 我们的系统都是有MMU的，即内存管理单元，我们打印出来的都是虚拟地址，即MMU会将物理地址和虚拟地址做一个映射；
user-0 提问: 字符数组用%s输入后，由0变为-2？

回复:
user: user-0
content: 引用 6 楼 lzb4207123 的回复:测试了一下scanf_s函数   后面的（-2）其实是scanf_s 赋值的； scanf_s("%s", s, 1000);  //读取输入缓存中1000个赋值给s 而输入缓存中没有被赋值的都是0xfe 你后面的没有赋值所有全部都是0xfe       后面是改为scanf_s("%s", s, 50);的结果 ,可以看到就前面的50个被赋值    非常感谢

user: user-1
content: 测试了一下scanf_s函数   后面的（-2）其实是scanf_s 赋值的； scanf_s("%s", s, 1000);  //读取输入缓存中1000个赋值给s 而输入缓存中没有被赋值的都是0xfe 你后面的没有赋值所有全部都是0xfe       后面是改为scanf_s("%s", s, 50);的结果 ,可以看到就前面的50个被赋值

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:在Linux下测试没发现这个问题，得到的是0； 如果你的测试每次都是这样的结果（非0），那么可能数组被优化了（编译器优化）。申请1000个字节，实际上没有1000个字节； 用sizeof测了一下，是1000呀，还是不太明白

user: user-0
content: 引用 3 楼 lzb4207123 的回复:大概因为你没有初始化 你的s char s[1000] = {0};  大概只是把你最前一个数字赋值成0；后面的还是内存之前的 你最好在后面加上 memset(s, 0, 1000); 应该不是这个的问题，把scanf删掉后是一样的，不过依旧非常感谢

user: user-1
content: 大概因为你没有初始化 你的s char s[1000] = {0};  大概只是把你最前一个数字赋值成0；后面的还是内存之前的 你最好在后面加上 memset(s, 0, 1000);

user: user-2
content: 在Linux下测试没发现这个问题，得到的是0； 如果你的测试每次都是这样的结果（非0），那么可能数组被优化了（编译器优化）。申请1000个字节，实际上没有1000个字节；

user: user-0
user-0 提问: C语言-判断二叉树是否为完全二叉树 求帮忙看下问题出在哪

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

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

回复:
user: user-1
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

user: user-0
content: 引用 8楼自信男孩 的回复:fflush(stdin);在有些系统的编译器里是将输入缓存里的数据刷到内存，即标准输入（键盘）输入先放在输入缓存里，然后再通过回车/fflush(stdin)刷到内存。 因此fflush(stdin)是将输入缓存里的数据刷到内存指定位置，而不是清除；当然，fflush在有些系统里有这个功能，就是清除缓存里残留的数据，比如换行符'\n'；  另外，注意的是fflush(stdin);清除残留在输入缓存里的数据功能并不是总是有效的，在LInux系统下fflush(stdin)是未定义的，（fflush(stdou)刷新输出缓存是可以的）我一共就发了两个帖子，能帮我看看另外一个帖子里面的问题吗？谢谢啦

user: user-2
content: fflush(stdin);在有些系统的编译器里是将输入缓存里的数据刷到内存，即标准输入（键盘）输入先放在输入缓存里，然后再通过回车/fflush(stdin)刷到内存。 因此fflush(stdin)是将输入缓存里的数据刷到内存指定位置，而不是清除；当然，fflush在有些系统里有这个功能，就是清除缓存里残留的数据，比如换行符'\n'；  另外，注意的是fflush(stdin);清除残留在输入缓存里的数据功能并不是总是有效的，在LInux系统下fflush(stdin)是未定义的，（fflush(stdou)刷新输出缓存是可以的）

user: user-0
content: 引用 3楼das白 的回复:这个函数是清理缓冲区 的引用 1楼老马何以识途 的回复: 那是清理缓冲区啊，但是你的数据已经取到a和b两个变量了，跟输入缓冲区不再有关系。 不是说先输入到缓冲区吗？什么时候写到内存呢？如果还没有写到内存，那么清理缓冲区岂不是数据就没用了吗？我还是不太明白书本上写的，等到空闲的时候再把缓冲区的数据写到内存！望指点！

user: user-0
content: 引用 3楼das白 的回复:这个函数是清理缓冲区 的我一共就两个帖子，能帮我看看另一个帖子的问题吗？谢谢啦

user: user-0
content: 引用 1楼老马何以识途 的回复:那是清理缓冲区啊，但是你的数据已经取到a和b两个变量了，跟输入缓冲区不再有关系。我一共就两个帖子，能帮我看看另一个帖子的问题吗？谢谢啦

user: user-3
content: scanf已经写把缓冲区的内容写到变量里了

user: user-3
content: 这个函数是清理缓冲区 的

user: user-0
content: 引用 1楼老马何以识途 的回复:那是清理缓冲区啊，但是你的数据已经取到a和b两个变量了，跟输入缓冲区不再有关系。不是说先输入到缓冲区吗？什么时候写到内存呢？如果还没有写到内存，那么清理缓冲区岂不是数据就没用了吗？我还是不太明白书本上写的，等到空闲的时候再把缓冲区的数据写到内存！望指点！

user: user-4
content: 那是清理缓冲区啊，但是你的数据已经取到a和b两个变量了，跟输入缓冲区不再有关系。
user-0 提问: 请问我的指向指针的指针向量为什么无法循环

回复:
user: user-1
content: PHI是野指针，因此不能直接PHI[i][j] = 0;赋值。野指针很可能会导致段错误； 解决办法，在for循环前，执行：   PHI = (double **)malloc(sizeof(double *) * (NX+1)); if (!PHI)     exit(0); for (i = 0; i < NX+1; i++) {     PHI[i] = (double *)malloc(sizeof(double) * (NY+1));     if (!PHI[i])         exit(0); }

user: user-2
content: 你的PHI并没有指向任何有效地址，怎么能直接操作呢？
user-0 提问: 这句代码用Java如何表示，求大神指导，急急急！！！

回复:
user: user-1
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，再将b.txt改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？ 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话，文本文件的格式问题可参考json或xml  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！

user: user-2
content: char* b = (char*)&n; 这个在JAVA里也能用吧，这个是强制类型转换；
user-0 提问: 对于约束优化问题，一共729个不等式条件相加，请求大神看看这个程序是不是对？

回复:
user: user-0
content: 不是，我后面用算法写出来了，程序很长，就没有全部复制过来，就让大神们看看我是不是这部分写的不合理。

user: user-1
content: 这样写的意义是啥，，，，单纯用程序模拟它的表达式么。。。

user: user-0
content: 就是看我这个约束条件写对了没有，就是为了验证程序是能全部满足约束条件和找到(5,5,5)这个最优解。

user: user-2
content: 这题要你干什么？ 如果要求解这个规划问题，不是已经告诉你答案是(5,5,5)了吗？

user: user-0
content: 通过判断每个约束条件之与0 的大小关系，将729个约束条件相加。得到一个总的约束条件。

user: user-0
user-0 提问: 赋值失败如何破解

回复:
user: user-1
content: 学会使用数据断点：#include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

user: user-2
content: 建议把代码贴出来，出现这样的问题原因可能不是简单的加减法问题，而是关于类型，逻辑等等；

user: user-3
content: 内存溢出导致的？ 我也想不到其它的了

user: user-4
content: 没有遇到过 好神奇

user: user-5
content: 类型有问题？   再想不到其他的了
user-0 提问: 求助

回复:
user: user-1
content: 关闭UAC、防火墙、杀毒软件、…… 以管理员身份运行 任务管理器中如果有和生成exe同名的进程，先结束掉 重启电脑再试试 ……

user: user-1
content: 关键是“第二个图片，看是连接错误？错误提示被挡住了看不到。”啊！

user: user-2
content: 第一个图片，看着是编译成功。 第二个图片，看是连接错误？错误提示被挡住了看不到。  第一个图片，是纯编译？ 第二个图片，是什么情况下出现的？ 看一下工程设置，编译输出的目录，和运行的程序启动目录是不是一致。

user: user-3
content: 应该是属于软件使用的问题。代码没什么问题；注意看一下这个路径下有没有这个文件（test10.exe）

user: user-0
content: 怎么修改？？请大神明示，在下刚刚学习c

user: user-4
content: 修改vs的工作目录

user: user-4
content: 找不到文件，修改工作目录，<IMG src="file:///C:\Users\Administrator\AppData\Roaming\feiq\RichOle\3856584786.bmp">

user: user-0
content: 没用 重新编译了好多次 都是这个情况  怎么回事啊？？？

user: user-5
content: clean一下，重新编译再试试

user: user-1
content: 链接失败了。
user-0 提问: c语言求解，谢谢

回复:
user: user-1
content: #include<stdio.h>  long Fact(int n);  int main(void) {     int m, n;     int i;      for(i = 100; i <= 999; i++)     {         n = i;         m = 0;         while (n) {             m += Fact(n % 10);             printf("%d = %ld\n", n % 10, Fact(n % 10));             n /= 10;         }         if (m == i)             printf("%d is special number!\n", i);     }      return 0; }  long Fact(int n) {      if(n==1 || n == 0)         return 1;      return n*Fact(n-1); }  参考一下吧；

user: user-2
content: #include<stdio.h> long Fact(int n); int main() {  	int m,a,b,c,n; 	for(m=1;m<=10000;m++) 	{ 		a=m/100; 		b=m%100/10; 		c=m%10; 		n=Fact(a)+Fact(b)+Fact(c); 		if(m==n) 			printf("%d\n",m); 	} 	getchar(); } long Fact(int n) {  	if(n==1||n==0) 		return n;  	return n*Fact(n-1); }

user: user-3
content: for(m=100;m<=999;m++) { a=m/100; b=(m-a*100)/10;
user-0 提问: 将两个程序合并到一起

回复:
user: user-0
content: 谢谢帮助，另外怎么把子集和输出的结果去重 例如，2 4 6      5 7            4 2 6      5 7 或者    5 7        4 2 6

user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <time.h>  #define MAX 1000  //global variables int n=0;//the number of numbers int c=0;//the sum of the subset int num[MAX]={0}; int count=1;//the number of the element in a subset int result[MAX]={0}; //the answer of this question int c_sum=0;//current sum  //prototypes void swap(int &a,int &b); void back_subset(int i); void get_random(int *a, int len);  int main() {     //declaration     //int i=0;     printf("Please input the number of the numbers:");     scanf("%d",&n);     printf("Please input the sum:");     scanf("%d",&c);     get_random(num, n);     /*        for(i=1;i<=n;i++)        scanf("%d",&num[i]);        */     back_subset(1);       //getch(); }  void get_random(int *a, int len) {     int i;      srand((unsigned)time(NULL));     for(i=0;i<len;i++)         a[i] = rand() % 100; }  void back_subset(int i) {     if(c_sum+num[i]==c)     {         result[count]=num[i];         for(int temp=1;temp<=count;temp++)             printf("%d ",result[temp]);         printf("\n\n\n\n----------separate line------------------\n\n\n\n");         return ;     }     if(i>n)         return ;     if(c_sum+num[i]>c)         return;      for(int j=i;j<=n;j++)     {         result[count++]=num[j];         c_sum+=num[j];         swap(num[i],num[j]);         back_subset(i+1);         swap(num[i],num[j]);         c_sum-=num[j];         count--;     } }  void swap(int &a,int &b) {     int temp=a;     a=b;     b=temp; } 参考一下吧

user: user-2
content: 用函数来表示第一个程序，第二个程序调用函数就好

user: user-3
content: 把第一部分程序变成函数，传入缓冲区，生成随机数后填入缓冲区即可。
user-0 提问: 各式错误oj有毒

回复:
user: user-0
content: ...试了不管用

user: user-1
content: 换行\r 试试\n

user: user-2
content: #include<stdio.h> #include<math.h> int main() {     int n,m,i;     scanf("%d%d",&m,&n);     for(i = m; i <= n; i++)         printf("%-4d%4.4lf\n", i, log(i));      return 0; } 试一下这种形式，格式要求对数占8列，应该是总共占8列，小数部分占4列了，那么整数部分就是4列了吧

user: user-3
content: 引用 3 楼 cfjtaishan 的回复:#include<stdio.h> #include<math.h> int main() {     int n,m,i;     scanf("%d%d",&m,&n);     for(i = m; i <= n; i++)         printf("%-4d%4.4lf\n", i, log(i));      return 0; } 试一下这种形式，格式要求对数占8列，应该是总共占8列，小数部分占4列了，那么整数部分就是4列了吧 可以试试楼上的做法
user-0 提问: 有关链表的题

回复:
user: user-1
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-0
content: 引用 5楼自信男孩 的回复:#include <stdio.h> #include <stdlib.h>  typedef struct number{     int no;     struct number*next; }num,*Linklist;  void CreateLinkR(Linklist*L,int n)   /*新建链表*/ {     Linklist p,s;     int i=0;      p = *L = (Linklist)malloc(sizeof(num));     for( ;n>0;n--){         s = (Linklist)malloc(sizeof(num));         s->no = ++i;         p->next = s;         p = s;     }     p->next = NULL; }  int ListDelete(Linklist *L, int i, int *ep)   //*删除结点*// {     Linklist p=NULL, q = *L;      while(q && i >= 1){         p = q;         q = q->next;         i--;     }     if(!p|| !q)         return 0;     p->next = q->next;      if(ep!=NULL)         *ep = q->no;     free(q);      return 1; }  int main() {     Linklist L,p;     int N,x,A[20],*a,i,k,t,ep;     scanf("%d%d",&N,&x);     for(a=A;a<A+20;a++)         scanf("%d", a);     CreateLinkR(&L,N);      for(a=A;a<A+20;a++)    //*把20个数字一个一个循环*//     {         t = *a;         for(k=1, i = N; k <= N / t; k++,i--)  //计算要删除几个数并循环删除这个结点*//         {             if(i==x)                 break;             ListDelete(&L, t*k, &ep);         }         N = i;         if(N==x)             break;     }     p = L->next;     i=0;     while(x >= ++i && p)     {         printf("%d ", p->no);         p = p->next;     }     putchar(10);     return 0; } 参考一下吧； scanf("%d%d",&N,&x); 去掉scanf中的'\n'我找到错误啦！是删除结点那一段删错结点了，虽然还是觉得很奇怪为什么显示的不是wa而是pe。 谢谢你看我的代码

user: user-0
content: 引用 1楼heronism 的回复:引用这是原题目，然后我用链表做了一下，但是却一直是PE，找了好久，把输入输出改了好几遍，换行符空格也改了好多遍，但是却一直是PE，可以告诉我哪错了吗你能先说下什么是PE吗pe是数据错误的意思

user: user-0
content: 输出结果没有问题，但是提交到网站上后一直显示数据错误

user: user-0
content: pe是指数据错误

user: user-2
content: 引用这是原题目，然后我用链表做了一下，但是却一直是PE，找了好久，把输入输出改了好几遍，换行符空格也改了好多遍，但是却一直是PE，可以告诉我哪错了吗你能先说下什么是PE吗

user: user-3
content: #include <stdio.h> #include <stdlib.h>  typedef struct number{     int no;     struct number*next; }num,*Linklist;  void CreateLinkR(Linklist*L,int n)   /*新建链表*/ {     Linklist p,s;     int i=0;      p = *L = (Linklist)malloc(sizeof(num));     for( ;n>0;n--){         s = (Linklist)malloc(sizeof(num));         s->no = ++i;         p->next = s;         p = s;     }     p->next = NULL; }  int ListDelete(Linklist *L, int i, int *ep)   //*删除结点*// {     Linklist p=NULL, q = *L;      while(q && i >= 1){         p = q;         q = q->next;         i--;     }     if(!p|| !q)         return 0;     p->next = q->next;      if(ep!=NULL)         *ep = q->no;     free(q);      return 1; }  int main() {     Linklist L,p;     int N,x,A[20],*a,i,k,t,ep;     scanf("%d%d",&N,&x);     for(a=A;a<A+20;a++)         scanf("%d", a);     CreateLinkR(&L,N);      for(a=A;a<A+20;a++)    //*把20个数字一个一个循环*//     {         t = *a;         for(k=1, i = N; k <= N / t; k++,i--)  //计算要删除几个数并循环删除这个结点*//         {             if(i==x)                 break;             ListDelete(&L, t*k, &ep);         }         N = i;         if(N==x)             break;     }     p = L->next;     i=0;     while(x >= ++i && p)     {         printf("%d ", p->no);         p = p->next;     }     putchar(10);     return 0; } 参考一下吧； scanf("%d%d",&N,&x); 去掉scanf中的'\n'
user-0 提问: 关于字符数组初始化的问题

回复:
user: user-1
content: 定义一个数组给它分配长度是个好习惯哟 而且   str[]={0}  其实是定义了数组长度为1，再往里面添加元素就是越界呢 定义二维数组的时候一维数组长度可省略，二维数组不可以哟

user: user-2
content: 他们回答都是对的，必须分配内存~

user: user-3
content: 这样定义的str初始化值只有一个“0” char str[10]//数组长度就确定了，分配10 个内存空间  char str[] = {0}//分配给str的空间就一个长度  char str[] = {0,1}//就是两个。 你试试语句改成: char str[] = {1,2,3,4,5,6,7}//运行结果看看效果

user: user-4
content: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int main() {     char str[] = {0};    /*定义的数组长度位1*/     printf("str's length is %u\n", sizeof(str));     scanf("%s", str);     printf("%s", str);     system("pause");     return 0; } 加一条这样的打印，看一下你定义的长度是多长。 printf("str's length is %u\n", sizeof(str));

user: user-4
content: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int main() {     char str[] = {0};    /*定义的数组长度位1*/     scanf("%s", str);     printf("%s", str);     system("pause");     return 0; } 数组越界了，因为这样定义的数组长度为1，那么字符串的空串也得是只有一个'\0'即0，所以只要输入一个字符就会导致越界；越界了就会出现这种情况 char str[] = {0};

user: user-5
content: char str[] = char *str

user: user-6
content: 没有给str分配空间 怎么存
user-0 提问: c语言运算符

回复:
user: user-1
content: 如果是一个&，两边都要比较，如果是两个＆＆，左边是假就不比较右边了，这是死的规定，记住就好了，没难度

user: user-2
content: 第一个是假的话不再计算第二个

user: user-3
content: 可以看看这个运算符的讲解：https://cloud.tencent.com/developer/doc/1023

user: user-4
content: &和&&都可以用作逻辑与的运算符，表示逻辑与（and），当运算符两边的表达式的结果都为true时，整个运算结果才为true，否则，只要有一方为false，则结果为false。 &&还具有短路的功能，即如果第一个表达式为false，则不再计算第二个表达式。

user: user-5
content: m=a>b后m的值为0，这个对于&&运算来说已经为0，不必要再计算后面的值，即n=a>b不再计算，n仍然为1，这个是&&运算的短路原则

user: user-6
content: (m=a>b)&&(n=a>b)   a>b  = 0  故m=0 &&  左边表达式为假  故右边不执行   n为原值1

user: user-7
content: (m=a>b)&&(n=a>b) 这个本身的结果为false

user: user-8
content: 表达式有短路

user: user-9
content: 这是一个简单的关系运算短路问题： 运算符“&&”和运算符"||”都对操作数有“短路”计算。也就是说，对于“&&”来说，只有左边表达式的值为真时，才计算右边表达式的值；而对于“||”来说，只有左边表达式的值为假时，才计算右边的值。例如，表达式“（x=0)&&(y=2)&&(z=5)"，先执行“x=0”,x的赋值为0，整个表达式的值为0，此时后面的“y=2”和“z=5”并未执行。故整型变量m,n,a,b,c,d均为1时，执行(m=a>b)&&(n=a>b)后，m,n的值为0,1。 有帮助的话请采纳谢谢。

user: user-10
content: &对每一个都判断； &&只要前面是false就输出false，而不继续判断后面了

user: user-11
content: n没有被a>b的结果赋值，即n = a>b没有执行。因为m已经位0（为假）后面就不会执行，因为不论后面的为真还是为假都不会影响整个表达式为假的结果；

user: user-12
content: 与运算当前面已经是0的时候，后面就不算了。

user: user-13
content: (m=a>b)   == 0       && 是 1 && x 才执行x表达式   所谓短路操作   ||   是 0 || x 执行表达式x

user: user-14
content: 详情百度 & 和 &&的区别

user: user-15
content: 表达式短路计算，顶

user: user-16
content: (m=a>b) && (n=a>b); 计算得出m为0后，不需要再接着计算后面的子表达式即可确定整个表达式结果为假 所以实际上 (n=a>b)未计算，所以n的值未改变，还是原来的初始值1 此所谓表达式短路计算

user: user-17
content: 谁说n的值是1？
user-0 提问: 有大神能帮忙看一下怎么改吗

回复:
user: user-1
content: #include<stdio.h> #include<time.h> #include<stdlib.h>  int shuzhi(); int weizhi(); int shuzhi(int x[0],int x[1],int x[2],int x[3],int y[0],int y[1],int y[2],int y[3]);  int main() {   int x,y,z,q,m,i,h,sum,hello;     int w[999],a[4],b[4];     srand(time(0));     printf("1.开始游戏 2.查看上次成绩 3.输出帮助信息 4.退出游戏");      x = rand() % 5;     for(q=0;q>=0;q++)     {         scanf("%d",&m);         if(x==1)         {             for (i=0;i<=3;i++)             {                 a[i]=rand()%10;                 for (h=1;h<i+1;h++)                 {                     if (a[i]==a[h-1])                     {                         a[i]=rand()%10;                         h=0;                     }                 }             }              for(x=10;x>=1;x--)             {                 scanf("%d %d %d %d",&b[0],&b[1],&b[2],&b[3]);                 sum = shuzhi(a[0],a[1],a[2],a[3],b[0],b[1],b[2],b[3]);                 hello = weizhi(a[0],a[1],a[2],a[3],b[0],b[1],b[2],b[3]);                 z=sum-hello;                 if(z==4)                 {                     printf("you are the winner");                     break;                 }                 else                 {                     printf("有%d位置和数值正确,有%d数值正确但位置不对",hello,z);                     y=x*10;                     printf("%d",y);                 }             }         }          w[q]=y;     }     if(x==3)         printf("这是你的游戏，请输入4个数字，并用空格隔开，每次输入后，我们会给你提示，直到你猜对，当然机会有限，只有十次，每猜一次你就会减10分，猜到10次，就结束了");     if(x==2)     {         if(q==1)             printf("这是你的第一次游戏，着急什么");         else             printf("这是你上次的成绩%d，哈哈哈哈",w[q]);     }     if(x==4)         exit(0); }   int shuzhi(int x[0],int x[1],int x[2],int x[3],int y[0],int y[1],int y[2],int y[3]) {     //int x[4],y[4],z,t,sum=0;     int z,t,sum=0;     scanf("%d %d %d %d", &y[0], &y[1], &y[2], &y[3]);     for(t=0;t<4;t++)     {         for(z=0;z<4;z++)         {             if(x[t]==y[z])                 sum++;         }      }     return (sum); } int weizhi() {     int x[4],y[4],t,hello=0;     for(t=0;t<0;t++)     {         if(x[t]==y[t])             hello++;      }     return (hello);  }  代码逻辑很乱呢； 问题主要是： 1. 所有if判断表达式都写成赋值表达式，“全军覆没”；建议把C语言基础知识，尤其是语法相关的学好了。 2. 函数声明，定义不匹配；函数参数出现重名现象，这是基本语法； 上面的代码是修改了一些，但是有些无法继续修改，个人建议把你的需求贴出来，直接给你写个可以运行的。
user-0 提问: 菜鸟有个弱智问题

回复:
user: user-1
content: 是这个int main(void);的原因 结果如下图：

user: user-2
content: 很多时候，使用的工具越先进，人越笨；得到得越轻松，人越懒。

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

user: user-4
content: notepad++里的文件名是new 1.c 你命令里输入的是first.c吧

user: user-5
content: http://coliru.stacked-crooked.com  把你的代码拷贝到这里，然后点运行，分分钟解决~

user: user-6
content: notepad++只可以编辑，不可以编译，可以配合gcc（百度下，个人感觉麻烦） 考级的话熟悉VC++6.0（完了结果直接在软件中出来）但是界面不好 个人推荐C_Free，代码显示风格和notepad++差不多，可以直接按F5 编译  对于敲代码出现的小错误，只能说多练习练习就好了

user: user-7
content: 我也是新手，我用的也是文本编辑器，首先你要先把代码写对吧。然后保存到比如C盘根目录下，然后再打开DOS界面，在这里面编译，好像还要配置环境吧，我同学告诉我一开始最好用DOS编译，你要不懂加我Q，376244279，一起交流，最后再说一遍，我也是菜鸟

user: user-8
content: notepad++应该不支持编译功能吧，notepad++作为一个编辑器还是比较好的。 另外，main函数和其他函数一样，定义时不能在后面加分号; 因为加了分号就相当于声明，声明的函数无函数体；

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: 对对，打错了，后面确实没有分号。。 那个。。能不能请你说的更具体一点？就是具体怎么编译。。 我刚开始学，什么都不懂。。

user: user-9
content: 再说，你怎么让它运行的？这是C程序，要编译，然后才能运行！

user: user-9
content: int main这一行最后不应该有分号
user-0 提问: debug模式下不识别汇编修改？

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

user: user-2
content: 因为debug下，还会在栈中压入一些其他信息，mov dword ptr[ebp - 4], 20h;的位置并不是你变量i的位置，改成：mov dword ptr[i], 20h;即可
user-0 提问: C语言初学者问题

回复:
user: user-1
content: 我看的书上也是这么写的，意义不大，但我觉得吧还是要写，然后吧for循环里面的第一个赋值表达式删掉好一点

user: user-2
content: 引用 8 楼 cfjtaishan 的回复:如果第一个scanf的作用，可以作为初始化用；这个是硬性说的。 因为第一个scanf后，会将一个字符赋值给ch，但是这个ch马上被覆盖了，被'$'覆盖了。所以第一个scanf的意义不大； 如果想突出的作用，建议把for循环的第一个表达式去掉： 即 for(;ch!='g';scanf("%c",&ch)) 去掉第一个表达式，这样可以选择性的进入for循环，即若第一个scanf的ch接收的是'g'，则不进入循环；

user: user-2
content: 如果第一个scanf的作用，可以作为初始化用；这个是硬性说的。 因为第一个scanf后，会将一个字符赋值给ch，但是这个ch马上被覆盖了，被'$'覆盖了。所以第一个scanf的意义不大； 如果想突出的作用，建议把for循环的第一个表达式去掉： 即 for(;ch!='g';scanf("%c",&ch))

user: user-3
content: for循环中ch的赋值会覆盖第一个scanf语句得到的值，可以认为第一个scanf语句没有实际意义。 教材(书)也不是百分之百准确，具体问题具体分析。

user: user-0
content: 引用 3 楼 qq_33462307的回复:没用，多此一举 嗯嗯，这是书本上的一道练习，应该是答案错了

user: user-4
content: 你想要实现什么功能  这才是重点

user: user-5
content: 你就当它是初始化，谁知道为初始化的内存里装着什么数据，没准就是‘g’呢

user: user-6
content: 没用，多此一举

user: user-0
content: 引用 1 楼 user-7的回复:第一个scanf逻辑上有没有用 没懂呢，请问第一个scanf不是给ch一个初值吗，然后在for中ch='$'貌似等价于ch='初值'了呢

user: user-7
content: 第一个scanf逻辑上有没有用
user-0 提问: hdu2005提交时显示Output Limit Exceeded，没找到问题

回复:
user: user-1
content: #include<stdio.h> int main() {     int year,month,day,sum=0,i;     int year1[]={31,29,31,30,31,30,31,31,30,31,30,31};     int year2[]={31,28,31,30,31,30,31,31,30,31,30,31};      while(scanf("%d/%d/%d", &year, &month, &day))     {         if(((year%4 == 0)&&(year%100!=0))||(year%400==0)) {             for(i = 0;i<month-1;i++)                 sum = sum + year1[i];         } else {             for(i = 0; i < month-1; i++)                 sum = sum+year2[i];         }         printf("%d\n",sum+day);         sum = 0;    /* reinit */     }     return 0; } 两个问题，一个是year1,year2数组是从0开始的，因此循环条件为month-1； 另一个问题是sum在计算上一个输入数据时，需要重新初始化位0；否则计算出来的天数是在上一次的基础上；

user: user-2
content: 试试 scanf("%d/%d/%d",&year,&month,&day) 改成 scanf("%d%d%d",&year,&month,&day)
user-0 提问: 看不懂这段代码是怎么运行的，请指导

回复:
user: user-1
content: 建议查一下SetWaitableTimer这个函数的定义，这个函数定义里会说明在何时调用timerun函数；  另外，对于回调函数，可以从网上详细了解一下；从定义到demo使用；

user: user-2
content: 你应该去查一下SetWaitableTimer的用法，它就是指定多长时间后（这里是5秒）开始周期性或一次性（参数2000表示每2秒执行一次）的调用一个指定的函数（即timerun），而SleepEX表示每当回调函数被执行，线程就苏醒，于是循环会把dwParam进行加1操作，接着又等待下一次timerun的执行。 5次循环之后，CancelWaitableTimer被执行，定时器取消，回调函数也就不会再执行了。

user: user-3
content: 建议仔细看下MSDN：  http://[url=https://msdn.microsoft.com/en-us/library/windows/desktop/ms682492(v=vs.85).aspx][/url]  https://msdn.microsoft.com/en-us/library/windows/desktop/ms686289(v=vs.85).aspx

user: user-3
content: 这里的回调函数是系统去调用，而不是你自己的程序调用

user: user-4
content: SetWaitableTimer 这个函数下面是我COPY的   启动一个可等待计时器。将它设为未发信号状态 返回值 Long，非零表示成功，零表示失败。会设置GetLastError 参数表 参数 类型及说明 hTimer Long，指定一个可等待计时器的句柄 lpDueTime FILETIME，指定一个包含了64位时间值的结构。如果为正，它代表计时器要触发的时间。如果为负，它代表自函数调用以来持续的时间。时间是以100ns为单位指定的 lPeriod Long，如果为零，这个计时器只会触发一次。否则，计时器会根据这里设置的持续时间自动重新启动(以毫秒为单位指定) pfnCompletionRoutine Long，指定零或者计时器触发时要调用的一个函数的地址。
user-0 提问: 大端格式和小端格式的问题

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

user: user-2
content: 对于 short、int、long、long long 以及对应的无符号类型都区分，char 或 char 数组（字符串）不区分。

user: user-3
content: 大端小端是以字节为基础的，如果是一个字节，其大端存储与小端存储结果都是一样的

user: user-4
content: 从双字节开始，以字节为单位。

user: user-5
content: 应该是一个字区分，

user: user-6
content: 引用 1 楼 cfjtaishan 的回复:一个字节不区分大小写，因为内存是以字节为单位的。 不区分大小端，手误

user: user-6
content: 一个字节不区分大小写，因为内存是以字节为单位的。
user-0 提问: 用链表作为堆栈实现10进制向8进制的转换，然而解决方案都没法生成，好多错误

回复:
user: user-1
content: 自己定义TRUE FALSE也可以吧，vs2010是可以调用<stdbool.h>

user: user-0
content: 用vs2010是不是调用不到#include<stdbool.h>头文件啊？

user: user-2
content: #include<stdio.h> #include<malloc.h> #include <stdbool.h>    /*for bool type */  typedef struct Snode *PtrToSnode;//以链表做堆栈在头节点后面Push和Pop struct Snode {     int Data;     PtrToSnode Next; }; typedef PtrToSnode stack;  stack CreateStack(); bool IsEmpty(stack); bool push(stack,int ); int Pop(stack); void conversion();  int main() {     conversion();      return 0; } stack CreateStack()//生成栈的头节点 {     stack s;     s = (stack)malloc(sizeof(struct Snode));     s->Next =NULL;     return s; } bool IsEmpty(stack s) {     return (s->Next==NULL); } bool push(stack s,int x)//在头节点后面将元素压入堆栈 {     PtrToSnode Tmpcell;     Tmpcell=(PtrToSnode)malloc(sizeof(struct Snode));     Tmpcell->Data = x;     Tmpcell->Next=s->Next;     s->Next=Tmpcell;     return true; } int Pop(stack s)//在链表的头节点后面Pop {     PtrToSnode firstCell;//将要Pop出的元素     int TopElem;//firstCell的数据域     if(IsEmpty(s))     {         printf("堆栈空");         return 0;     }     else {         firstCell = s->Next;         TopElem = firstCell->Data;         s->Next=firstCell->Next;         free(firstCell);         return TopElem;     } } void conversion(void) {     int N;     stack s;     s = CreateStack();     scanf("%d",&N);     while(N)     {         push(s,N%8);         N=N/8;     }     while(!IsEmpty(s))     {         printf("%d",Pop(s));     }     putchar(10);     free(s);   /*最后释放头节点*/ } 参考一下吧； 在main函数里调用conversion函数；添加头文件<stdbool.h>
user-0 提问: PAT 平台中乙级 1050

回复:
user: user-1
content: 对于没做过PAT平台作业的人怎么知道这个1050题是什么需求呢？所以先将需求贴出来，然后贴出代码；  你的问题可以参考一下以下的博主博客：  http://blog.csdn.net/zxyolo/article/details/52334495 http://blog.csdn.net/wanmeiwushang/article/details/51598869

user: user-2
content: 到底想问啥呢
user-0 提问: C语言进阶求帮助

回复:
user: user-1
content: 链到下一个节点，不是把下一个节点的地址复制给当前节点的指针域嘛 链表的创建过程会这样做。

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

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

user: user-3
content: http://blog.csdn.net/lpp0900320123/article/details/20356143

user: user-4
content: 推荐这篇博客，写得很不错。 https://livesun.github.io/2017/10/27/single_linked/

user: user-5
content: 新建节点的时候就把它链好。
user-0 提问: 文件包含问题

回复:
user: user-0
content: 我把p2();p3();改过来了，还是没有用，怎么办。

user: user-1
content: ppt上是p1() p2() 你输入的是p2() p3()

user: user-2
content: 如果是一个个敲出来，那么后缀名不应该敲错吧； 建议将错误信息再发出来。  include一般是用于引入头文件，不建议引入源文件；

user: user-3
content: 错误是什么额？你看的ppt应该是老古董了吧，需要老古董的编译器才支持，c语言main有返回类型的 void main() {},还有一般应该包含.h文件，而不是.c
user-0 提问: 关于结构体强制转换的问题

回复:
user: user-1
content: // dm->data一定是个指针（指向DM_Swarm型变量）或字符数组（原样存储了 DM_Swarm结构），这样才具备转换的条件  DM_Swarm *swarm = (DM_Swarm*)dm->data;

user: user-2
content: 将dm->data转换为指向DM_Swarm结构体的指针类型，通常来说dm->data也是一个指针类型，这里是在做指针类型的转换，转换为DM_Swarm*类型，而不是转换为结构体类型

user: user-3
content: 这个是强制类型转换，即将dm结构体下的data强制转换位DM_Swarm *类型； 如果data是char *类型的，那么就会将字符数组转换位DM_Swarm类型的格式；
user-0 提问: 我好像发明了一种新的排序算法,不知道前人有没有这样写过

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2

user: user-2
content: 好#。。。。。。

user: user-3
content: 交换两整数，其实可读性不好，可读性>技巧。

user: user-4
content: 还是冒泡排序，但是赋值方法很不错。

user: user-5
content: 你是把两个数交换用异或写了，数组传进来还需要返回吗？

user: user-6
content: 。。你这是复杂版的选择排序，多了很多交换操作

user: user-7
content: 排序方法没有创新吧，这就是冒泡排序。只是交换数据的方式变了； 建议试一下能够通用，比如交换两个结构体变量；我估计对于两个结构体变量的交换不好使呢。

user: user-8
content: 这不就是冒泡排序吗？

user: user-9
content: 前人这样写过

user: user-10
content: 只是交换数据上的区别，但这种也有局限，比如对于浮点数排序就不适用