Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 我又来问问题了

回复:
user: user-0
content: 引用 10 楼 zhao4zhong1 的回复:[quote=引用 9 楼 jack960330 的回复:] [quote=引用 8 楼 zhao4zhong1 的回复:] 将100看走眼或敲错成1000的人，个人建议最好趁早改行别干编程了。   能不能别这样说话，对初学者来说不太好。。。[/quote] 推荐楼主勇敢地投身金融银行投资领域。 隔壁还有一家洗脚城，你去害他嘛！[/quote] 朋友，题目说的是最大有100个字符串，不是说字符串里面最多有100个字符，这个提出题人出的时候忘记标注每条字符串里面最多有100个字符了，另外，注意下你的言辞，我虽然是个初学者，但是我才初一，还有大把时间，说不定以后会变成什么样呢

user: user-1
content: 将100看走眼或敲错成1000的人，个人建议最好趁早改行别干编程了。

user: user-2
content: 好的

user: user-3
content: 引用 10 楼 zhao4zhong1 的回复:[quote=引用 9 楼 jack960330 的回复:] [quote=引用 8 楼 zhao4zhong1 的回复:] 将100看走眼或敲错成1000的人，个人建议最好趁早改行别干编程了。   能不能别这样说话，对初学者来说不太好。。。[/quote] 推荐楼主勇敢地投身金融银行投资领域。 隔壁还有一家洗脚城，你去害他嘛！[/quote] 你就不怕伤害了人家初学者的自尊？而且，这只是粗心了一点，也没什么大问题。。。更何况，100也好1000也好，都是可以的，只要别来个10就行，能多不能少

user: user-1
content: 引用 9 楼 jack960330 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] 将100看走眼或敲错成1000的人，个人建议最好趁早改行别干编程了。   能不能别这样说话，对初学者来说不太好。。。[/quote] 推荐楼主勇敢地投身金融银行投资领域。 隔壁还有一家洗脚城，你去害他嘛！

user: user-3
content: 引用 8 楼 zhao4zhong1 的回复:将100看走眼或敲错成1000的人，个人建议最好趁早改行别干编程了。   能不能别这样说话，对初学者来说不太好。。。

user: user-0
content: 为什么要在输入n后  来个n++

user: user-0
content: #include<stdio.h> #include<string.h> int main() { 	int m; 	int i,n; 	char str[100][100]; 	scanf("%d",&m); 	while(m--) 	{ 		scanf("%d",&n); 		n++; 		for(i=0;i<n;i++) 			gets(str[i]); 		for(i=0;i<n;i++) 		{ 			if(strcmp(str[i],str[i+1])>0) 				strcpy(str[i+1],str[i]); 		} 		printf("%s\n",str[n-1]); 	} return 0; }  这个通过了   有什么区别....

user: user-4
content: 而且题目说的N是小于100的，你分配了1000个单位大小。

user: user-4
content: 如果你是想动态分配数组，你可以用malloc（最后再free掉）  你这样定义，就不能保证你定义的数组大小不是一个常量。

user: user-5
content: #include<stdio.h> #include<string.h> #include<stdlib.h>  #define  MAX_STR_LEN    32 #define  MAX_ARR_LEN    10 int main() {     int T, n, i;     int max_i;     char str[MAX_ARR_LEN][MAX_STR_LEN];      scanf("%d", &T);      while (T--) {         printf("Please input a number: ");         scanf("%d", &n);         if (n >= MAX_ARR_LEN) {             printf("Input a small number.\n");             continue;         }         for(i = 0; i < n; i++)             scanf("%s", str[i]);          max_i = 0;         for (i = 0; i < n; i++)             if (strcmp(str[max_i], str[i]) < 0)                 max_i = i;         //strncpy(Mstr, str[max_i],  strlen(str[max_i]) + 1);         printf("Max string is %s.\n", str[max_i]);     }       return 0; } 上面是我的实现方法，作为一个参考吧； 我很奇怪，为啥要定义1000个字符空间呢，能一次输入999个？如果只是用来测试，又没有要求字符串长度，那么建议定义自己的手输入多少个就感觉酸痛的时候就结束吧；况且你要输入n个字符串呢； 开个玩笑，只是没必要那么“浪费”； C语言不支持不定长度的数组，所以建议先定义一个自己能接受的长度，最好定义成宏，这样如果改长度还好改。

user: user-6
content: char str[n][1000],Mstr[1000]; 不能用变量（n）定义数组吧。

user: user-6
content: 这是你的作业吧
user-0 提问: 如何判断键盘箭头上下左右的值

回复:
user: user-0
content: 引用 4 楼 cfjtaishan 的回复:[quote=引用 3 楼 qq_27966563 的回复:] [quote=引用 2 楼 cfjtaishan 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] #include <stdio.h> #include <stdlib.h>  void main() {     int key, key2;      key = getch();     printf("\nkey value = 0x%02x -- %d\n",key,key);     key = getch();     printf("\nkey value = 0x%02x -- %d\n",key,key); } 键盘的方向键不是一个字节表示的。  方向键(←)： 0xe04b 方向键(↑)： 0xe048 方向键(→)： 0xe04d 方向键(↓)： 0xe050 方向键的值可能不对，可以确定的是方向键不是一个字节表示[/quote]  那有什么办法去判断到底输入的是“上、下、左、右”中的哪个么？如果是2个字节，那第二个字节是纯数字么？[/quote] 你输入上，下，左，右；然后验证一下它们的值就可以，这个还需要你做些工作，验证一下值。实际上就是写个程序亲自操作一下。[/quote] 好的，可以了，谢谢！

user: user-1
content: 引用 3 楼 qq_27966563 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] #include <stdio.h> #include <stdlib.h>  void main() {     int key, key2;      key = getch();     printf("\nkey value = 0x%02x -- %d\n",key,key);     key = getch();     printf("\nkey value = 0x%02x -- %d\n",key,key); } 键盘的方向键不是一个字节表示的。  方向键(←)： 0xe04b 方向键(↑)： 0xe048 方向键(→)： 0xe04d 方向键(↓)： 0xe050 方向键的值可能不对，可以确定的是方向键不是一个字节表示[/quote]  那有什么办法去判断到底输入的是“上、下、左、右”中的哪个么？如果是2个字节，那第二个字节是纯数字么？[/quote] 你输入上，下，左，右；然后验证一下它们的值就可以，这个还需要你做些工作，验证一下值。实际上就是写个程序亲自操作一下。

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] #include <stdio.h> #include <stdlib.h>  void main() {     int key, key2;      key = getch();     printf("\nkey value = 0x%02x -- %d\n",key,key);     key = getch();     printf("\nkey value = 0x%02x -- %d\n",key,key); } 键盘的方向键不是一个字节表示的。  方向键(←)： 0xe04b 方向键(↑)： 0xe048 方向键(→)： 0xe04d 方向键(↓)： 0xe050 方向键的值可能不对，可以确定的是方向键不是一个字节表示[/quote]  那有什么办法去判断到底输入的是“上、下、左、右”中的哪个么？如果是2个字节，那第二个字节是纯数字么？

user: user-1
content: 引用 1 楼 cfjtaishan 的回复:#include <stdio.h> #include <stdlib.h>  void main() {     int key, key2;      key = getch();     printf("\nkey value = 0x%02x -- %d\n",key,key);     key = getch();     printf("\nkey value = 0x%02x -- %d\n",key,key); } 键盘的方向键不是一个字节表示的。  方向键(←)： 0xe04b 方向键(↑)： 0xe048 方向键(→)： 0xe04d 方向键(↓)： 0xe050 方向键的值可能不对，可以确定的是方向键不是一个字节表示

user: user-1
content: #include <stdio.h> #include <stdlib.h>  void main() {     int key, key2;      key = getch();     printf("\nkey value = 0x%02x -- %d\n",key,key);     key = getch();     printf("\nkey value = 0x%02x -- %d\n",key,key); } 键盘的方向键不是一个字节表示的。  方向键(←)： 0xe04b 方向键(↑)： 0xe048 方向键(→)： 0xe04d 方向键(↓)： 0xe050
user-0 提问: 怎样使用sscanf函数连续截取字符串

回复:
user: user-1
content: sscanf_s("abc,1 2 3", "%*%d  %d", &a, &b);

user: user-2
content: 仅供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.
user-0 提问: c语言中同工程不同路径下的c文件函数调用的问题

回复:
user: user-1
content: 源/头文件保存在哪个文件夹下 和 源/头文件被添加到哪个项目的源文件下 不是一回事！

user: user-2
content: 引用 10 楼 davidfun1990 的回复:源文件的位置是不能动的，找到一些资料 反过来用可以吗？即库项目中的源文件想要调用可执行文件项目中的源文件中的函数  1、没有让你改源文件的位置  也就是说， A.c那个项目，引用B.h和 B.c。 B.c那个项目，也引用B.h和 B.c，这两个项目用的是同一个路径下的文件  2、反过来可以，方法见1

user: user-0
content: 源文件的位置是不能动的，找到一些资料 反过来用可以吗？即库项目中的源文件想要调用可执行文件项目中的源文件中的函数

user: user-2
content: 把B.h, B.c 加到 A.c所在的那个项目里面去

user: user-2
content: 你返回的这个 bSingleMode 是定义在哪里的？

user: user-0
content: 不好意思忘了  两个c文件分别属于不同的project

user: user-1
content: 好赖也截个FileView图贴上来吧：

user: user-0
content: 试过了，添加了..\一样的问题，其实文件里面已经由同样的案例，只不过调用的是宏定义的参数，没有问题，但是想要调用函数和变量的时候有问题，难道真的是像我同事说的那样，有先后顺序之说么？

user: user-2
content: 6.0么  应该是  Project Setting > C/C++ （Category：Preprocessor）> Additional include directories

user: user-0
content: 指的是哪一个？

user: user-2
content: 你项目的附加包含目录里面，需要包含 ../

user: user-1
content: 将extern删掉 将B.c和A.c都添加到项目中
user-0 提问: 建立单链表时关于指针在函数间传递的问题。

回复:
user: user-1
content: 引用 4 楼 paschen 的回复:因为你在函数中要修改的是指针本身，而不是指针指向的内存  否则传进来的指针是按值传递，形参只是实参的复制品，函数中修改并不会影响到实参讲到精髓了

user: user-2
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-0
content: 谢谢大家的回答，我明白了！

user: user-3

user: user-4
content: 因为你在函数中要修改的是指针本身，而不是指针指向的内存  否则传进来的指针是按值传递，形参只是实参的复制品，函数中修改并不会影响到实参

user: user-5
content: 建议看看linux内核里的list.h，优雅简洁的链表，易学易用，从此不需再写链表~

user: user-3
content: 建议你在草稿纸上画画指针指向的逻辑。

user: user-3
content: 如果传递一重指针，那么修改的指针是形参的，没有修改实参的数据。传递二重指针，就可以修改实参的指针的地址，这样调用Create函数后才能将头节点的地址带出来。  类似，如下：#include <stdio.h>   void get_val(int *a) {     *a = 10; }  int main(void) {     int a = 0;      get_val(&a);     printf("a = %d\n", a);     return 0; }
user-0 提问: 基础问题两个

回复:
user: user-1
content: (y * 5)不能作为左值

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

user: user-3
content: 2、y*5是右值，不参将x+z的值赋值给y*5

user: user-3
content: 1、y没有定义，可以改成这样：int x=1,y,z=y=3;

user: user-4
content: 关于第二个问题，=不能给表达式（y*5）赋值。

user: user-1
content: #include<stdio.h>  int main() {     int x = 1, z, y;     z = y = 3;      x = y * 5;     y = x + z;     printf("%d %d\n",x,y);     return 0; } 第一个，是不支持。因为y还未定义，所以无法给z赋值； y * 5不能做左值，无法接收x + z的值。 这些都是基本语法问题，建议你多写多练吧
user-0 提问: C语言字符串反转

回复:
user: user-1
content: b数组后没有结束符'/0'

user: user-2
content: 反转不就是第一个与最后一个对调，第二个与倒数第二个对调，以此类推么。。 完全没有必要重新构造一个数组吧

user: user-3
content: #include<stdio.h> #include<string.h> char *change(char []); int main() { 	char a[10],*str; 	int i=0;  	printf("enter your char:"); 	while((a[i++]=getchar())!='\n') 		continue; 	a[i]='\0'; 	puts(a); 	str=change(a); 	for(i=0;i<strlen(a);i++) 		printf("%c",a[i]); 	return 0; } char *change(char a[]){ 	int c,i; 	char b[10]; 	c=strlen(a)-1; 	for(i=0;c>=0;c--,i++) 		b[i]=a[c]; 	b[i]='\0'; 		strcpy(a,b); 	return a; } 你的函数在赋值转换完之后没有在数组的最后加上‘\0’；输出的时候字符串找不到结尾，程序会在第一次遇到内存里的‘\0’符时结尾。

user: user-4
content: 因为strcpy时，没有找到b的\0， char *change(char a[]){     int c, i;     char b[1000];     c = strlen(a)-1;     for(i=0;c>=0;c--,i++)         b[i]=a[c];     b[i] = 0;     strcpy(a,b);     return a; } 个人建议，b数组太大，测试用例用不到这么多，建议使用malloc char *change(char a[]) {     int c, i;     char *b;      c = strlen(a);     b = (char *)malloc(c * sizeof(char) + 1);      for(c = c - 1, i = 0; c >= 0; c--, i++)             b[i] = a[c];     b[i] = 0;     strcpy(a, b);     free(b);     return a; }
user-0 提问: 调试时 提示acess violation

回复:
user: user-1
content: #include <stdio.h> #include <string.h>  int st[100]; int top=-1; int sum=0;  int op() {     int a=0,i=0;      while(top!=-1)     {         a = st[top--] /* * i * 10 */ + a;         ++i;      }     return a;  } void print(char *s) {     int len,i;      len = strlen(s);     for(i = 0; i < len; ++i)     {         if (s[i] >= '0' && s[i] <= '9') {             st[++top] = s[i] - '0';         }     }             sum += op();   } int main() {     char s[32];     puts("input strings:");     gets(s);     print(s);     printf("%d\n",sum);     return 0; } 使用野指针s,要么定义成数组（栈上申请空间），要么malloc(堆上申请空间）； 另外，print函数里，op函数是应该最后调用的。

user: user-2
content: main里指针没初始化就拿来用了
user-0 提问: 究竟是什么致使我的单片机一直发数据给上位机？程序哪里出错了吗？

回复:
user: user-1
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。
user-0 提问: Beginner的C语言问题

回复:
user: user-1
content: printf("   *******           *                    *                   *\n"); 所有打印语句都加上换行符 \n

user: user-2
content: printf();函数不自动添加换行符，这样打印出来会是一行。 另外puts();函数在输出的时候自动添加换行符。不需要自己添加，否则会隔两行。

user: user-3
content: #include <stdio.h>  int main() {     printf("     *******         *                    *                   *\n");     printf("        *            *                    *                   *\n");     printf("        *            *                    *                   *\n");     printf("        *            *                    *                   *\n");     printf("        *            *                    *                   *\n");     printf("        *            *                    *                   *\n");     printf("        *            *                    *                   *\n");     printf("        *            *                    *                   *\n");     printf("        *            *                    *                   *\n");     printf("     *******         ************         *********************\n");     return 0; } #include <stdio.h> #include <math.h>  int main(void) {     float y, x, a;      for (y = 1.5f; y > -1.5f; y -= 0.1f) {         for (x = -1.5f; x < 1.5f; x += 0.05f) {             a = x*x + y*y - 1;             putchar(a*a*a - x*x*y*y*y <= 0.0f ? '*' : ' ');         }         putchar('\n');     }      return 0; }

user: user-0
content: 引用 1楼幻夢之葉 的回复:printf("   *******           *                    *                   *\n"); 所有打印语句都加上换行符 \n我一会儿回去试试！

user: user-4
content: 仅供参考：#include <stdio.h> #include <conio.h> const unsigned char bit[8]={128,64,32,16,8,4,2,1}; unsigned char buffer[32]; FILE *hzk; unsigned long offset; unsigned int q,w; int x,y,qw; //-------------------------------------------------------- void display(char *hz) {      qw=*((int *)hz);     q=(qw&0x00FF)-0xA1;     w=((qw>>8)&0x00FF)-0xA1;     offset=q*0x5E+w;     offset*=32;     if ((hzk=fopen("HZK16","rb"))==NULL) {         printf("Can not open file HZK16!\n");         return;     }     fseek(hzk,offset,SEEK_SET);     fread(buffer,1,32,hzk);     fclose(hzk);     for (y=0;y<16;y++) {         for (x=0;x<16;x++) {             if (buffer[y*2+x/8] & bit[x%8]) {                 printf("%s",hz);             } else {                 printf("  ");             }         }         printf("\n");     } } void main() {     display("啊");     getch(); } //                          啊 //    啊  啊啊啊啊  啊啊啊啊啊啊 //啊啊啊啊啊    啊          啊 //啊  啊  啊    啊          啊 //啊  啊  啊  啊        啊  啊 //啊  啊  啊  啊    啊啊啊啊啊 //啊  啊  啊啊      啊  啊  啊 //啊  啊  啊  啊    啊  啊  啊 //啊  啊  啊  啊    啊  啊  啊 //啊  啊  啊    啊  啊  啊  啊 //啊啊啊  啊    啊  啊啊啊  啊 //啊  啊  啊啊  啊  啊  啊  啊 //        啊  啊            啊 //        啊                啊 //        啊            啊  啊 //        啊              啊啊
user-0 提问: 结构体数组中字符串赋值

回复:
user: user-1
content: 引用 1 楼 zhao4zhong1 的回复: for(i=0;i<SIZE;i++){         seats[i].flag=0;         sprintf(seats[i].num,"%03d",i+1);//赋值成001,002一直到012. } 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。 snprintf(seats[i].num, 10, "%03d", i+1); 使用snprintf应该会更安全

user: user-2
content: for(i=0;i<SIZE;i++){         seats[i].flag=0;         sprintf(seats[i].num,"%03d",i+1);//赋值成001,002一直到012. } 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

user: user-3
content: 1.赋值方式上面赵老师已经说了，说一下你的问题吧，strcmp是字符串比较函数，不是复制函数啊，复制的是strcpy. 2.可以，return后这个函数后面的语句就不会再执行了。
user-0 提问: 求助一道OJ题

回复:
user: user-0
content: 各位大大的代码都通不过

user: user-1
content: #include <stdio.h>  int main() {     int cnt = 0;     unsigned int num;      while (scanf("%u", &num))     {         if (num > 0)             break;          printf("input error!\n");     }      if (num % 2)         cnt++;     for (; num != 1; cnt++)         num /= 2;      printf("cnt = %d\n", cnt);      return 0; } 没进行大量测试，你可以用你的用例试试～

user: user-2
content: 引用 1 楼 jianwen0529 的回复: #include <stdio.h>  int main() {     int count = 0;     unsigned int num;      while (scanf("%u", &num))     {         if (num > 0)             break;          printf("输出错误，请输入正整数\n");         fflush(stdin);     }     if (num % 2 == 1)     {         num -= 1;         ++count;     }     while (num >>= 1)         ++count;      printf("Count = %d\n", count);      return 0; }  这个移位用的好

user: user-0
content: 已解决   谢谢各位了

user: user-0
content: #include<stdio.h> int main() { 	int i,j; 	scanf("%d",&i); 	for(j=0;i!=1;j++) 	{ 		if(i%2==1) 	    i++; 	    i=i/2; 	} 	printf("%d\n",j); return 0; }

user: user-3
content: #include<stdio.h>   int main() { 	int N, n = 0; 	for ( ; ; ) { 		printf ("请输入一个正整数(0<N<1000)：\n"); 		scanf ("%d", &N); 		if ( N < 1000 && N > 0) 			break; 		else 			printf ("输入错误，"); 	} 	for ( ;N != 1; ) { 		if ( N % 2 == 1) 			N = N + 1; 		N = N / 2; 		n = n + 1; 	} 	printf ("%d\n", n); }

user: user-3
content: 运算过程中遇到奇数都加1吗

user: user-4
content: #include <stdio.h>  int main() {     int count = 0;     unsigned int num;      while (scanf("%u", &num))     {         if (num > 0)             break;          printf("输出错误，请输入正整数\n");         fflush(stdin);     }     if (num % 2 == 1)     {         num -= 1;         ++count;     }     while (num >>= 1)         ++count;      printf("Count = %d\n", count);      return 0; }
user-0 提问: 为什么运行后程序停止

回复:
user: user-1
content: 数组下标越界。。。。。

user: user-2
content: a[9]这个数组是0～8

user: user-3
content: for(int i=1;i<=9;i++)这一句错误,9应该改为8

user: user-4
content: 数组a[9]的下应该是从0-8；如果你使用过界的数组值，轻则输出无意义的数值，重则导致程序崩溃，很显然你的崩溃了吧。。

user: user-5
content: for(int j=1;j<=9;j++)    /*数组越界，下标从0开始， 0～8*/ { printf("%d\t",a[j]); if(j%3==0) printf("\n"); } for(int j=0;j<9;j++) { printf("%d\t",a[j]); if(j%3==0) printf("\n"); }

user: user-6
content: 数组下标越界了，执行scanf("%d",&a[9]);这一句有问题

user: user-7
content: 你需要去补数组的基础知识

user: user-7
content: 上面字打错，是坐标，不是左边

user: user-7
content: 数组的左边是从0开始的，你数组a只有9个元素，也就是说你要输出的话 循环要这么写for(int i=0;i<9;i++)

user: user-8
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？
user-0 提问: 结构内储存的类型如何改变

回复:
user: user-1
content: 你可能说的是模板

user: user-2
content: 可以说的再详细一些，改变elemtype成为什么类型？

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

user: user-0
content: element应该是elemtype 。写错了

user: user-0
content: 引用 5楼我是你的主体 的回复:引用 2楼vnvlyp 的回复:你可能说的是模板啊哈？那是什么噢。谢谢

user: user-2
content: 引用 3 楼 a90434957 的回复:比如说从int改成char 可以通过强制转换， 或者memcpy比如  int a = 0x12345678; unsigned char *p = (unsigned char *)&a; printf("%x, %x, %x, %x\n", p[0], p[1], p[2]. p[3]);  或者   int a = 0x12345678; char buf[4]; memcpy(buf, &a, 4);  printf("%x, %x, %x, %x\n", buf[0], buf[1], buf[2], buf[3]);

user: user-0
content: 引用 2楼vnvlyp 的回复:你可能说的是模板啊哈？那是什么

user: user-0
content: 引用 1楼自信男孩 的回复:可以说的再详细一些，改变elemtype成为什么类型？比如说从int改成char

user: user-0
content: 比如说从int改成char
user-0 提问: 小白求助，c语言问题

回复:
user: user-1
content: phone的类型是什么，要根据你的需求。如果这个phone是代表手机名（厂商），建议定成char phone[PHONE]类型； #include <stdio.h> #include <string.h>   #define MAXTITL 40 #define PHONE   20 #define NUM     50  struct people {     char name[MAXTITL];     char phone[PHONE]; };  char * s_gets(char * st, int n);  int main() {     struct people list[NUM];     int count = 0;     int index;      printf("please enter the name:");     while (count < MAXTITL && s_gets(list[count].name , MAXTITL) != NULL && list[count].name[0] != '\0')     {             printf("now please enter the phone number:");             s_gets(list[count].phone  , PHONE);             while (getchar() != '\n')                 continue;             if (count < NUM)                 printf("enter the next title.\n");         }     if (count < 0)     {             printf("here is the list of yours:\n");             for (index = 0; index < count; index++)                 printf("%s    :  %s", list[index].name, list[index].phone);         }     else         printf("no man, no number!");      return 0;  }   char *s_gets(char * st, int n)      {           char * ret_val;           char * find;            ret_val = fgets(st, n, stdin);           if (ret_val)           {                    find = strchr(st, '\n');                    if (find)                       *find = '\0';                    else                       while (getchar() != '\n')                           continue;                }           return ret_val;       }

user: user-2
content: phone是int类型，s_gets的参数要求的是char*类型

user: user-3
content: phone是int类型，你s_gets的第一个参数要求的是char*类型  解决方式： 1：把phone修改为char[]类型 2：定义一个临时字符数组，读取char*的数据，然后再转化为你的phone

user: user-4
content: 问题出在 s_gets(list[count].phone  , PHONE); 中list[count].phone的定义是int的指针，而s_gets函数的第一个参数需要的是char的指针，所以会报错
user-0 提问: C语言中局部变量的值如何在另一个循环中使用

回复:
user: user-1
content: 引用 6 楼 qq_37904780 的回复:一楼给的答案跟我老师说的另一种方法一样，这个好像叫做递代吧，只需要定义两个变量即可。很好的解决了问题。  只是我不明白为什么定义数组超过100000时会出现三楼那种情况。还是说定义数组有一个范围，不可超过。 如果这样的话可以定义一个比较小的数组循环使用，也就是我最开始提出的问题。     C语言萌新，求大佬解惑。 定义局部数组是从栈中分配内存，栈大小有限，定义太大数组堆栈溢出了，程序肯定死掉。一般需要用到这么大内存时，都用malloc分配（从堆上分配），用完再free。恶补C语言基础知识。

user: user-2
content: 最好是用一个数组，改变数组的值传递给下循环，用值得话要多声明两个值，赋值传递，值多了看着会乱

user: user-0
content: 一楼给的答案跟我老师说的另一种方法一样，这个好像叫做递代吧，只需要定义两个变量即可。很好的解决了问题。  只是我不明白为什么定义数组超过100000时会出现三楼那种情况。还是说定义数组有一个范围，不可超过。 如果这样的话可以定义一个比较小的数组循环使用，也就是我最开始提出的问题。     C语言萌新，求大佬解惑。

user: user-3
content: 只是这种量级的话，直接定义成全局变量就好，再多就要用指针new空间了。

user: user-0
content: 所以一个老师建议我用两个数组来解决这个问题。

user: user-0
content: 定义数组下标大于100000时就会出现以下的错误。

user: user-4
content: 定义一个长度为2的数组，用于保存你需要的两个值，如果只是两个值，也可以定义两个变量；  这个程序的问题：1）数组太大，在栈上申请的空间都快400K，不见得都能用的上，所以不建议这样定义数组； 2）数组长度是100000，所以下标只能是0~99999；下标若为100000，会造成越界。 https://code.csdn.net/snippets/2251661 这个是否符合你的要求
user-0 提问: 求大神帮忙看看，为什么这里需要输入EOF来结束程序？

回复:
user: user-0
content: 引用 1 楼 自信男孩的回复:int digits(int n) {     int i=0;     //scanf("%d",&n);    /*delete this */     i++;     n/=10;     while(n>0)     {         i++;         n/=10;     }      return i; } 去掉digit中的输入，这个输入没必要，n是main传进来的。 另外，函数声明时，至少要带上参数类型 哦哦，成功了，谢谢 不过我还想请教下，多了这一句，程序不是有问题了吗？那为什么只要按了ctrl＋Z就能输出对的结果了？这个操作起了什么样的作用呢？还望不吝赐教，谢谢

user: user-1
content: 目测是scanf的问题

user: user-2
content: int digits(int n) {     int i=0;     //scanf("%d",&n);    /*delete this */     i++;     n/=10;     while(n>0)     {         i++;         n/=10;     }      return i; } 去掉digit中的输入，这个输入没必要，n是main传进来的。 另外，函数声明时，至少要带上参数类型

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

回复:
user: user-1
content: 有没越界并不会影响编译  越界可能导致程序运行时崩溃  就算没崩，也只能说明运气好，仅此

user: user-2
content: 编译没问题，不等于执行没问题；执行没问题，不等于一直没问题； 越界是潜在的bug，一次执行没问题，不等于一直没问题； 另外，calloc申请的空间不需要显示的初始化为0，因为调用该函数后会隐式初始化为0。

user: user-3
content: 你写一百一千一万都不报错，编译不会检查你的边界的  再说你哪里有写int了？
user-0 提问: 字符串指针

回复:
user: user-1
content: 我和楼主想的一样，还有很多要学习啊。

user: user-0
content: 谢谢各位的帮助！

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  const char *stringstr (const char *string,const char *strCharSet) {     const char *p = string , *r=strCharSet;     while(*p != '\0')     {         while (*p++ == *r++)             ;         if(*r == '\0')             return p;         r = strCharSet;         printf("r = %s\n", r);         p = ++string;         printf("p = %s\n", p);     }     return NULL; } int main() {     char s1[80]="a*ab*abc*abcd", s2[80]="abc";     const char *ptr;      ptr = (char*)stringstr(s1,s2);     if(ptr != NULL)         printf("%s\n",ptr);     return 0; } 加了2条输入信息，这样可以帮助你理解p执行到那里。

user: user-3
content: a*ab*abc*abcd  红色部分比较时，前两个都一样，最后一个不一样退出while(*p++==*r++)循环，此时r仍会递增1，*r为0，函数返回的就是abc*abcd

user: user-4
content: 参考标准库strstr函数源代码
user-0 提问: sizeof()函数

回复:
user: user-1
content: sizeof(a)是一个指针大小。

user: user-2
content: 数组作为函数参数时会退化为指针  sizeof（指针）  得到的只是指针的大小（32位程序为4）

user: user-3
content: int do_max(int a[]) 实际上是 int do_max(int *a)  所以sizeof一个指针，要么是4要么是8  所以一般情况下参数是数组的会多传入一个指明大小的参数

user: user-4
content: do_max函数的参数是一个指针，实参传进来的是一个地址。所以sizeof(a)是等同于sizeof(int *); 另外，sizeof不是函数，而是一个宏。

user: user-5
content: 因为：数组退化为指针  sizeof(a) 此时相当于 sizeof(int *)
user-0 提问: short*  char*区别

回复:
user: user-1
content: 都可以，fread第一个参数实际要求的类型是void*  所以无论char*还是short*都会隐式转换为void*  http://en.cppreference.com/w/c/io/fread

user: user-2
content: 可以，可以读到shbuf中，也可以将数据从shbuf拷贝到cbuf中。 一般大家都是定义char类型的buf，以便于解析； 通过fread都能读到数据至buf里，实际读到了多少数据，可以通过fread的返回值查看

user: user-3
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 提问: fwrite()和fread()

回复:
user: user-0
content: 谢谢各位老师，我明白了已经，因为中我在写入文件之后位置指针到了文件结尾，要使用rewind(fp);返回文件头，再使用fread();这样就可以正常读入了。

user: user-1
content: void write(SEAT *pst) {     FILE *fp;      if (!(fp=fopen("seats.txt","wb+"))) {         printf("cannot open.\n");         return;     }     fwrite(pst, sizeof(SEAT), SIZE, fp);     printf("we have make a txt.\n");     fread(pst, sizeof(SEAT), SIZE, fp);     fclose(fp); }

user: user-2
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了
user-0 提问: 关于RGB颜色的排列

回复:
user: user-1
content: 1600w色，你要全部存储，而且严格的渐进  再来颜色的渐进也不是线性的 这是非常人所能做的啊，再说有什么实际的应用吗 像一般的都是给出一个颜色选择器或者几十几百种颜色表，而且也不一定是精确的。  我只是来打酱油的

user: user-2
content: 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
user-0 提问: 求助！！！最近在做毕设，大家帮我看看我的下位机程序错误出现在哪

回复:
user: user-1
content: 前面我说过了。要么用状态机，最好用modbus协议。你现在的通讯连个超时，校验都没有，不可靠。

user: user-0
content: 引用 4 楼 u014444402 的回复:单片机位于中断程序的时候要短，你看看你的程序？除了显示１６０２其它都是在中断里面做。 delay(1000)这个延时可以考虑去掉了，实际项目在大while中阻塞延时不会这么长的浪费CPU。 一般来说这种通讯可以用状态机来做，简单可靠。 但我建议上modbus协议。后期会把从机的超声波检测部分放在while（1）里面一直检测，并把结果保存在一个变量中，我是这样想当上位机发来一串地址和指令，接收完然后分析，最后把检测的车位信息返回给主机，因为主机采用轮询模式，如果从机不直接在中断里把变量中的数据返回给主机，那该怎么办？有没有其他方法？

user: user-1
content: 单片机位于中断程序的时候要短，你看看你的程序？除了显示１６０２其它都是在中断里面做。 delay(1000)这个延时可以考虑去掉了，实际项目在大while中阻塞延时不会这么长的浪费CPU。 一般来说这种通讯可以用状态机来做，简单可靠。 但我建议上modbus协议。

user: user-2
content: 引用 2 楼 qq_36524366 的回复:引用 1 楼 jack960330 的回复:既然下位机接受数据要正常在，考虑数据传输无错误，推测发生问题可能性最高的地方是数据处理部分和数据回传部分，既然发送数据和串口通讯正常，串口的实际回传部分也应正常，因此，在数据回传部分和数据处理部分做检查的同时，重点检查数据处理逻辑。。。。还有是否有正常调用数据回传处理。。单独处理数据回传时，上位机也可以收到，现在就是连起来有问题，相当于上位机给一个提醒，然后下位机就把数据发回去 重点检查程序数据处理逻辑。。。你可以设置个心跳包检测串口通讯是否正常。。。。以免意外断开物理链路可以提醒。。。

user: user-0
content: 引用 1 楼 jack960330 的回复:既然下位机接受数据要正常在，考虑数据传输无错误，推测发生问题可能性最高的地方是数据处理部分和数据回传部分，既然发送数据和串口通讯正常，串口的实际回传部分也应正常，因此，在数据回传部分和数据处理部分做检查的同时，重点检查数据处理逻辑。。。。还有是否有正常调用数据回传处理。。单独处理数据回传时，上位机也可以收到，现在就是连起来有问题，相当于上位机给一个提醒，然后下位机就把数据发回去

user: user-2
content: 既然下位机接受数据要正常在，考虑数据传输无错误，推测发生问题可能性最高的地方是数据处理部分和数据回传部分，既然发送数据和串口通讯正常，串口的实际回传部分也应正常，因此，在数据回传部分和数据处理部分做检查的同时，重点检查数据处理逻辑。。。。还有是否有正常调用数据回传处理。。
user-0 提问: 判断httpd.conf里是否有字符串Indexes

回复:
user: user-1
content: 费那事儿！if (0==system("grep 'Indexes' httpd.conf")) ...

user: user-2
content: int main() { 	char buf[46]; 	char str[13]; 	int i,j=0,k;  	memset(str,0,sizeof(str)); 	memset(buf,0,sizeof(buf));  	FILE *fp=fopen("d://data.txt","r"); 	if(fp == NULL) 	{ 		printf("file open error/n"); 		return -1; 	}  	while(!feof(fp)) 	{ 		fgets(buf,sizeof(buf),fp); 		for(i=0; buf[i]; i++) 		{ 			if(buf[i] != ',') 			{ 				str[j] = buf[i];//这里的str就是你要的数据， 				j++; 			} 			else if(buf[i] == ',') 			{ 				printf("%s/n",str); 				memset(str,0,sizeof(str)); 				j=0; 			} 		} 		memset(buf,0,sizeof(buf)); 	} 	fclose(fp); 	return 0; }

user: user-3
content: 遇到了什么问题？或者举几个例子
user-0 提问: 一个c语言小问题求助

回复:
user: user-1
content: 你定义的指针没有地址，除了楼上的方法，也可以定义为 char ptr_string[SIZEZ]; 定义一个字符数组，要知道字符串其实就是字符数组，不过是以‘\0’结尾而已，所以ptr_string一样是地址

user: user-2
content: 引用 4 楼 qq_37837743 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] ptr_string = (char *)malloc(32 * sizeof(char));    /*or char ptr_string[32];*/ printf("请输入要转换的数字字符串："); scanf("%s",ptr_string); 你定义了野指针，所以运行时可能会导致段错误；  谢谢！我如果用初始化的方式先定义指针 char * ptr_string = "1234";后面不变，也不行，这个是什么原因？[/quote]  "1234"是常量区的字符串，不能被修改  char aaa[100]; ptr_string = aaa;

user: user-3
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-4
content: 引用 4 楼 qq_37837743 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] ptr_string = (char *)malloc(32 * sizeof(char));    /*or char ptr_string[32];*/ printf("请输入要转换的数字字符串："); scanf("%s",ptr_string); 你定义了野指针，所以运行时可能会导致段错误；  谢谢！我如果用初始化的方式先定义指针 char * ptr_string = "1234";后面不变，也不行，这个是什么原因？[/quote] 因为ptr_string指向了常量“1234”，常量区域只能读，不能写，操作scanf其实就是终端输入数据，并将数据写入ptr_string 指向的区域的。 最终，不论是在栈上（数组）还是在堆上（malloc)申请空间，这些地方的内存空间都是可读可写的。

user: user-0
content: 引用 楼主 qq_37837743 的回复:将字符串转换为数字的小程序，编译没问题，一执行就报错，不知道问题在哪  #include "stdafx.h" #include<string.h> #include<stdio.h>  int StrToInt(char *);  int _tmain(int argc, _TCHAR* argv[]) { 	 	char * ptr_string; 	int digit; 	ptr_string = NULL; 	printf("请输入要转换的数字字符串："); 	scanf("%s",ptr_string); 	digit = StrToInt(ptr_string); 	printf("%d",digit);  	return 0; }  int StrToInt(char *ptr_string) { 	int number =0; 	while(*ptr_string != '\0') 	{ 		number = 10*number + *ptr_string - '0'; 		ptr_string++; 	} 	return number; } 引用 1 楼 paschen 的回复:ptr_string没有分配内存就去接收字符串  scanf("%s",ptr_string); //此时ptr_string没有分配内存，值为NULL 你好，我如果用初始始化的方式先定义指针 char * ptr_string = "1234"，这样算分配内存了么，程序也会报错，是什么原因？

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:ptr_string = (char *)malloc(32 * sizeof(char));    /*or char ptr_string[32];*/ printf("请输入要转换的数字字符串："); scanf("%s",ptr_string); 你定义了野指针，所以运行时可能会导致段错误；  谢谢！我如果用初始化的方式先定义指针 char * ptr_string = "1234";后面不变，也不行，这个是什么原因？

user: user-4
content: ptr_string = (char *)malloc(32 * sizeof(char));    /*or char ptr_string[32];*/ printf("请输入要转换的数字字符串："); scanf("%s",ptr_string); 你定义了野指针，所以运行时可能会导致段错误；

user: user-2
content: ptr_string没有分配内存就去接收字符串  scanf("%s",ptr_string); //此时ptr_string没有分配内存，值为NULL
user-0 提问: 求大神帮助解答函数的使用问题

回复:
user: user-1
content: 后者你没指定celsius变量类型，同时这个变量名和函数名重了  函数中可这样改：  float ans = 5.0 * (fahr-32) / 9.0; return ans;

user: user-2
content: 在函数celsius里变量celsius未定义；函数名就是一个地址，不能充当变量； float celsius(float fahr) {     float val; val = 5.0 * (fahr-32) / 9.0; return val;  }另外，建议函数名和变量名不要重复。
user-0 提问: 小百求助，关于简单链表的建立与使用，求大神帮助，谢谢

回复:
user: user-1
content: 注意边界条件

user: user-2
content: 确实很奇怪，不好解释。 确实是Union返回了P的链表头，如何验证呢，那就在Union中什么都不做，直接返回NULL，即return NULL;这样就unions就是NULL了。 Union函数有返回值，但是你什么都不返回，它就将第一个参数作为返回值了。你将实参调换一下位置，就会发现它返回的是第二个链表头即L； 这个确实不好解释；   个人建议，若有返回值，但是又什么又不操作的情况下，也要写一个返回值。
user-0 提问: c语言下标运算符是怎么运算的

回复:
user: user-1
content: 引用 5 楼 zhao4zhong1 的回复:[quote=引用 4 楼 jack960330 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价  你讲的太复杂了，好久没上论坛了，不知道您是否还记得我。？？？[/quote] “不要向复杂低头！”[/quote] 那您觉得我写的是不是简单许多？？

user: user-2
content: 引用 4 楼 jack960330 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价  你讲的太复杂了，好久没上论坛了，不知道您是否还记得我。？？？[/quote] “不要向复杂低头！”

user: user-1
content: 引用 2 楼 zhao4zhong1 的回复:A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价  你讲的太复杂了，好久没上论坛了，不知道您是否还记得我。？？？

user: user-1
content: 数组下标运算符可以如此转换 a[b] == (*(a+b)) 为等价表达式，即a[b] == b[a]可以互换。

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: 数组下标？！  int array[16]; for (i = 0; i < 16; i++) ｛     array[i] = i+1; /* is equal *(array+i), offset = i * sizeof(int); */     printf("%d\n", array[i]); /*即相对于array, 向后偏移offset个字节，然后取4个字节里存放的值。*/ ｝
user-0 提问: 如何用C语言画椭圆

回复:
user: user-1
content: 大神们学C语言用的什么编译工具？

user: user-2
content: 如果不用系统函数自己画的话,你应该复习一下椭圆的定义:到两个焦点的距离和为定值. 假设焦点为(-F, 0), (F, 0), 定值为S, 则最左边的点为-S/2, 所以x的坐标可以从-S/2循环到S/2, y的坐标列方程求比较麻烦,可以采用穷举代入的方法求解. 另外上面的坐标是假设原点在中间,y轴向上,所以实际使用还要自己转化一下

user: user-3
content: #pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <stdio.h> #include <stdlib.h> #include <windows.h> extern "C" HWND WINAPI GetConsoleWindow(); void HideTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = FALSE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } void ShowTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = TRUE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } int main() {     HWND  hwnd;     HDC   hdc;      system("color F0");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     Ellipse(hdc,50,50,450,250);     ReleaseDC(hwnd,hdc);     getchar();     system("color 07");     system("cls");     ShowTheCursor();     return 0; }

user: user-4
content: HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);  	CONSOLE_SCREEN_BUFFER_INFO bInfo; 	GetConsoleScreenBufferInfo(hOut, &bInfo);  	// 椭圆半径 	float a = 35.0f; 	float b = 25.0f;  	COORD pos = { 0, 0 }; 	WCHAR ch = L'*'; 	DWORD out = 0; 	for (int x = -a; x <= a; x++) 	{ 		int y = sqrt((1 - (x * x) / (a * a)) * (b * b)); 		pos.X = x + a; 		pos.Y = y + b; 		FillConsoleOutputCharacter(hOut, ch, 1, pos, &out); 		pos.X = x + a; 		pos.Y = -y + b; 		FillConsoleOutputCharacter(hOut, ch, 1, pos, &out); 	}

user: user-5
content: 楼主如果想用C玩玩图形、小游戏编程，可以了解一下EasyX，EasyX是Windows平台最简单的绘图函数库（名副其实），兼容BC和TC的绘图函数，在VC下用EasyX来编程跟在TC下编程绘图差不多是完全一样的。EasyX既可以绘图，也支持图像显示和处理。  下载一个EasyX包，里面有完整的函数手册EasyX_Help.chm，有示例。EasyX官网有很多网友上传的实例，包括游戏。  仅供参考： 用绘图语句画机器猫（初学C语言的同学必看） http://blog.163.com/tab_98/blog/static/1192409720150316223680/
user-0 提问: C语言【一维数组】数列有序!  为什么在ACM上是%50的错误？

回复:
user: user-1
content: 引用 3 楼 bravery36 的回复:a[100]改为a[101] 感觉这位说的对，你没考虑到原始有序数组为100个的情况，按你的代码，如果原始数组有100个，你再拆入后移的时候就越界了

user: user-2
content: 各种排序算法动画演示http://www.webhek.com/misc/comparison-sort/

user: user-0
content: 还是不行，哎，搞了好几天了

user: user-3
content: a[100]改为a[101]

user: user-0
content: 楼上谢谢帮我解决一部分问题，不过还是50%错误，好奇怪，都感觉没啥问题 求各路大神解决 #include <stdio.h> int main() {     int n,x,i,j,a[100];     while(EOF!=scanf(" %d %d",&n,&x)&&(n!=0&&x!=0))     {         for(i=0;i<n;i++)         {             scanf("%d",&a[i]);         }         for(i=0;i<n;i++)         {             if(a[i]>x)             {              for(j=n-1;j>=i;j--)                 a[j+1]=a[j];                 a[i]=x;               break;             }         }         for(i=0;i<n+1;i++)         {             printf("%d ",a[i]);         }         printf("\n");     }     return 0; }

user: user-4
content: #include <stdio.h> int main() {     int n, x, i, j, a[100];     while(EOF!=scanf(" %d %d", &n, &x) && (n != 0 && x != 0))     {         for (i = 0; i < n; i++)         {             scanf("%d", &a[i]);         }         for (i = 0; i < n; i++)         {             if (a[i] > x) {                 for (j = n - 1; j >= i; j--)                     a[j+1] = a[j];                 a[i] = x;                 break;             }         }         for (i = 0; i < n + 1; i++) {             printf("%d ", a[i]);         }         printf("\n");     }     return 0; } 找到比x大的数据，然后将比x大的数据以及后面数据都向后移动，这样就在中间的某个位置给x留下，将x赋值到该位置，最后退出循环； 逻辑比较简单，就是向后移动一个位置，并且是整体移动
user-0 提问: 大神帮看看

回复:
user: user-0
content: 我懂了，谢谢！

user: user-1
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-2
content: ++p或p++都会导致越界。因为最后一个不论那个运算，都会将指针p向后移动4个字节。

user: user-3
content: printf("%3d",*p); 的时候，p已经指向了后一个元素了  所以第一个不会被输出，最后一个输出时越界了

user: user-4
content: 应该是取决于编译器吧，建议分两行写： p=i; p++;
user-0 提问: 小白求解 scanf无法读入数据以及得出答案是随机数问题

回复:
user: user-1
content: scanf("%4d%2d%2d",&y1,&m1,&d1)

user: user-2
content: 引用 3 楼 xhongking 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] while (scanf("%d%d%d",&y1,&m1,&d1) != EOF) {         scanf("%d%d%d", &y2, &m2, &d2);         cha = abs(datacha[y1][m1][d1] - datacha[d2][m2][d2]) + 1;         printf("中间相差%d  \n",cha); }  不要对scanf输入时设置宽度，一般是在输出是才会设置。直接使用%d格式输入即可；不好意思忘记说了题目要求输入时的日期格式是    eg：20111111                              20111122          这样输入的2011与11和11没有间隔 所以如果这样改能获取我想要的吗[/quote]应该 不可以，你这让输入应该无法识别那个是year, month，day; 对于输入的是否正确，可以将输入后的数据先打印出来，这样对后面的功能也有一定的指导意义。

user: user-3

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:while (scanf("%d%d%d",&y1,&m1,&d1) != EOF) {         scanf("%d%d%d", &y2, &m2, &d2);         cha = abs(datacha[y1][m1][d1] - datacha[d2][m2][d2]) + 1;         printf("中间相差%d  \n",cha); }  不要对scanf输入时设置宽度，一般是在输出是才会设置。直接使用%d格式输入即可；不好意思忘记说了题目要求输入时的日期格式是    eg：20111111                              20111122          这样输入的2011与11和11没有间隔 所以如果这样改能获取我想要的吗

user: user-2
content: while (scanf("%d%d%d",&y1,&m1,&d1) != EOF) {         scanf("%d%d%d", &y2, &m2, &d2);         cha = abs(datacha[y1][m1][d1] - datacha[d2][m2][d2]) + 1;         printf("中间相差%d  \n",cha); }  不要对scanf输入时设置宽度，一般是在输出是才会设置。直接使用%d格式输入即可；

user: user-0
content: 本人将nextday函数中的  day  year month 都分别改成buf.day   buf.year   buf.month 后便可以读入数据  但是不知道原因   而且得出的答案莫名的大     才学c语言  求教知识点
user-0 提问: 请教一个BCD码(8421码)的问题

回复:
user: user-1
content: BCD难道不是0 ~ 9么。。0xA或者10是什么鬼

user: user-2
content: 目测第一种是对的｛0X0A,0X00,0X00,0X08，0X09｝

user: user-0
content: 解决了.来人接分.

user: user-0
content: {0x00, 0x00, 0x10, 0x00,0x89}  不知道这种对不对.....明天去单位试试  引用 1 楼 user-4 的回复:哪两种？    ？  {0x0A, 0x00, 0x00, 0x08, 0x09} {0x00, 0x00, 0x0A, 0x00,0x89}  这两种

user: user-3
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <conio.h> unsigned int iv,i; unsigned char BCD[5];//定长10位BCD码 unsigned char sv[11]; void main() {     iv=123456789;//最大10位无符号正整数     //INT2BCD     sprintf(sv,"%010u",iv);     for (i=0;i<10;i+=2) {         BCD[i/2]=(sv[i]<<4)|(sv[i+1]&0x0F);     }     printf("BCD=%02x%02x%02x%02x%02x\n",BCD[0],BCD[1],BCD[2],BCD[3],BCD[4]);     //BCD2INT     for (i=0;i<10;i+=2) {         sv[i]='0'|(BCD[i/2]>>4);         sv[i+1]='0'|(BCD[i/2]&0x0F);     }     sscanf(sv,"%010u",&iv);     printf("iv=%010u\n",iv);     getch(); }

user: user-4
content: 哪两种？    ？
user-0 提问: linux c语言编程提示：段错误 核心已转储   编译没有问题 在运行时会提示段错误  请教各位大神！

回复:
user: user-1
content: 引用 7 楼 m0_37789286 的回复:[quote=引用 3 楼 cfjtaishan 的回复:] [quote=引用 2 楼 m0_37789286 的回复:] 感谢你的回复！恩是数组越界了，我想问一下你那个参考程序reshape函数里行参int (*dst)[COL]是什么意思啊，看不懂。。。还望解答 感谢！ 这个是一个数组指针，很容易和它混淆的是一个指针数组：int *array[10];这个就是指针数组； 数组指针，是指向数组的指针，并且指向的数组是列数为COL长度的数组。[/quote]  您好  我在问一下  回去我仔细看了一下这种数组指针  又称行指针   但是不明白它相对于列指针的好处在哪里   我们为什么要用它呢？就像这个程序里   难道必须要用它吗  不能用别的吗    还请你帮我解答一下   谢谢！[/quote] 这个是传递一个二维数组到一个函数里用到的，你可以用int dst[][COL]，但是这种形式编译器也是以指针形式处理的。与其让编译器“翻译”不如一步到位。

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:[quote=引用 2 楼 m0_37789286 的回复:] 感谢你的回复！恩是数组越界了，我想问一下你那个参考程序reshape函数里行参int (*dst)[COL]是什么意思啊，看不懂。。。还望解答 感谢！ 这个是一个数组指针，很容易和它混淆的是一个指针数组：int *array[10];这个就是指针数组； 数组指针，是指向数组的指针，并且指向的数组是列数为COL长度的数组。[/quote]  您好  我在问一下  回去我仔细看了一下这种数组指针  又称行指针   但是不明白它相对于列指针的好处在哪里   我们为什么要用它呢？就像这个程序里   难道必须要用它吗  不能用别的吗    还请你帮我解答一下   谢谢！

user: user-0
content: 谢谢你的回答，成功解决！感谢感谢，

user: user-2
content: 最后提醒一个事情，楼主用的是C语言不是Java语言，main函数的返回类型不能是void，必须是int。

user: user-1
content: 引用 2 楼 m0_37789286 的回复:感谢你的回复！恩是数组越界了，我想问一下你那个参考程序reshape函数里行参int (*dst)[COL]是什么意思啊，看不懂。。。还望解答 感谢！ 这个是一个数组指针，很容易和它混淆的是一个指针数组：int *array[10];这个就是指针数组； 数组指针，是指向数组的指针，并且指向的数组是列数为COL长度的数组。

user: user-0
content: 感谢你的回复！恩是数组越界了，我想问一下你那个参考程序reshape函数里行参int (*dst)[COL]是什么意思啊，看不懂。。。还望解答 感谢！

user: user-3
content: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令  以下内容摘自gdb常用命令： watch 表达式：设置一个监视点，一旦被监视的“表达式”的值改变，gdb将强行终止正在被调试的程序。如： watch a 2. 设置观察点(WatchPoint) 观察点一般用来观察某个表达式(变量也是一种表达式)的值是否变化了。如果有变化，马上停住程序。有下面的几种方法来设置观察点： watch <expr> 为表达式(变量)expr设置一个观察点。一旦表达式值有变化时，马上停住程序。 rwatch <expr> 当表达式(变量)expr被读时，停住程序。 awatch <expr> 当表达式(变量)的值被读或被写时，停住程序。 info watchpoints 列出当前设置的所有观察点。

user: user-1
content: 问题： 1. main 函数里，new1数据长度是2行5列，用数组new1接收存在数组越界，即new1下标是行0，1；列0~4； 2. reshape返回局部变量，当函数结束时局部变量就会自动释放，所以不能返回局部数组。 3. 段错误应该是数组越界导致的。两个函数都存在数组越界。  #include<stdio.h>  #define ROW     2 #define COL     5  int reshape (int *src, int len, int (*dst)[COL], int row, int col) {       int i, j, k = 0;      for (i = 0; i < row; i++)         for (j = 0; j < col; j++)             if (k < len)                 dst[i][j] = src[k++]; }  int  main ()   {    int i,j;    int pai[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};    int dst[2][5];        reshape(pai, 10, dst, ROW, COL);     for(i = 0; i < ROW; i++)         for(j = 0; j < COL; j++)             printf("%4d ", dst[i][j]);     printf("\n");   } 这是我改的版本，参考一下吧
user-0 提问: 关于pow函数的一系列疑问

回复:
user: user-1
content: #include <stdio.h> #include <math.h>  unsigned int get_index_val(unsigned int n, int len);  int main() {     unsigned int n, m, sum;     int i;     scanf("%u%u", &n, &m);     sum = 0;     for (i = 1; i <= m; i++) {         sum += get_index_val(n, i);     }     printf("\n%u\n", sum);     return 0; } unsigned int get_index_val(unsigned int n, int len) {     int i;     unsigned int sum = 0;      for (i = 0; i < len; i++) {         sum += n * (unsigned int)pow(10, i);     }     printf("+++sum = %u\n", sum);     return sum; } 说好的整型数，怎么变成double的呢； 以上是我的demo，作为一个参考吧
user-0 提问: 求大佬们看看吧，设置断点我也没找出错误啊啊啊，水仙花题

回复:
user: user-1
content: 不知道你说的错误是什么，程序代码没有错误。 可能你说i的是功能错误，看看你测试的结果是什么

user: user-2
content: 引用 3 楼 qq_37120435 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] #include <stdio.h>  int main() {     int m, n, digit;     int i, j, sum = 0, c, count = 0;          while (scanf("%d%d", &m, &n) != EOF) {         for (i = m; i <= n; i++) {             sum = 0;             for (c = i; c;) {                 digit = c % 10;                 sum = sum * 10 + digit;                 c /= 10;             }             //printf("sum = %d\n", sum);             if (sum == i) {                 count++;                 printf("%4d ",i);             }         }         if(count < 1)             printf("no\n");         else             printf("\n-->total numbers: %d\n", count);         count = 0;     }     return 0; } for循环体有问题； 写的demo程序，可以不止对3位数有效；可以对多位数有效； 大哥，题目只让输入三位数啊啊啊[/quote] 额？你输入了吗？demo输入3位数也不行吗？

user: user-0
content: 引用 2 楼 user-3 的回复:sum+=a*a*a;   这里的a没有定义过 嗯嗯，这个错误也有。但是改了还是不对……

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:#include <stdio.h>  int main() {     int m, n, digit;     int i, j, sum = 0, c, count = 0;          while (scanf("%d%d", &m, &n) != EOF) {         for (i = m; i <= n; i++) {             sum = 0;             for (c = i; c;) {                 digit = c % 10;                 sum = sum * 10 + digit;                 c /= 10;             }             //printf("sum = %d\n", sum);             if (sum == i) {                 count++;                 printf("%4d ",i);             }         }         if(count < 1)             printf("no\n");         else             printf("\n-->total numbers: %d\n", count);         count = 0;     }     return 0; } for循环体有问题； 写的demo程序，可以不止对3位数有效；可以对多位数有效； 大哥，题目只让输入三位数啊啊啊

user: user-3
content: sum+=a*a*a;   这里的a没有定义过

user: user-2
content: #include <stdio.h>  int main() {     int m, n, digit;     int i, j, sum = 0, c, count = 0;          while (scanf("%d%d", &m, &n) != EOF) {         for (i = m; i <= n; i++) {             sum = 0;             for (c = i; c;) {                 digit = c % 10;                 sum = sum * 10 + digit;                 c /= 10;             }             //printf("sum = %d\n", sum);             if (sum == i) {                 count++;                 printf("%4d ",i);             }         }         if(count < 1)             printf("no\n");         else             printf("\n-->total numbers: %d\n", count);         count = 0;     }     return 0; } for循环体有问题； 写的demo程序，可以不止对3位数有效；可以对多位数有效；
user-0 提问: 结构体输入出错

回复:
user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0];

user: user-2
content: scanf("%f %f %f",pst[i].grade[0],pst[i].grade[1],pst[i].grade[2]);  改成：  scanf("%f %f %f",&pst[i].grade[0],&pst[i].grade[1],&pst[i].grade[2]);

user: user-3

user: user-4
content: #include<stdio.h>  #define CSIZE 4  struct name{     char name1[10];     char lastn[10]; }; struct student{     struct name name2;     float grade[3];     float ave; }; void get_s(struct student *pst); void do_ave(struct student *pst); void out_list(struct student *pst); void out(struct student *pst); int main() {     struct student std[CSIZE];     get_s(std);     //get_(&std[0]);     do_ave(&std[0]);     out_list(std);     out(std);     return 0; } void get_s(struct student *pst) {     int i;     for(i=0;i<CSIZE;i++){         printf("enter 第%d个 name:",i+1);         gets(pst[i].name2.name1);         printf("his grade:");         scanf("%f %f %f", &pst[i].grade[0], &pst[i].grade[1], &pst[i].grade[2]); /* address, add &*/         getchar();     } } void do_ave(struct student *pst) {     int i;     for(i=0;i<CSIZE;i++){         (pst+i)->ave=((pst+i)->grade[0]+(pst+i)->grade[1]+(pst+i)->grade[2])/3;     } } void out_list(struct student *pst) {     int i;      for(i=0;i<CSIZE;i++){     /*    printf("name:%s grade:%f %f %f ave:%f",(*(pst+i)).name2.name1,(*(pst+i)).grade[0]             (*(pst+i)).grade[1],(*(pst+i)).grade[2],(*(pst+i)).ave);  */         printf("name: %s grade:%f %f %f ave: %f \n",(pst+i)->name2.name1,(pst+i)->grade[0],             (pst+i)->grade[1],(pst+i)->grade[2],(pst+i)->ave);     } } void out(struct student *pst) {     int i;     float ave;     for(i=0;i<CSIZE;i++){         ave=pst[i].grade[0]+pst[i].grade[1]+pst[i].grade[2];     }         printf("班级平均分为%f:\n",ave/CSIZE);  } scanf里要加&；
user-0 提问: 有了解Chirp Z的编程算法的不？帮我看看下面这个程序？？

回复:
user: user-1
content: 百度搜相关关键字。

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

回复:
user: user-1
content: s[i]就是*(s+i) 数组名s就是指向第一个数据的指针。

user: user-2
content: s[i] 等价于 *(s + i)

user: user-3
content: 引用 1 楼 zhao4zhong1 的回复:A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价   补充：二者区别在于是否分配了内存。

user: user-4
content: 一个是通过下标取值，一个是通过偏移和引用取值。这两种形式功能是一样的。 s[i] 等价于 *(s+i);

user: user-5
content: 因为s+i=&s[i]，两边同时进行*运算，所以*（s+i）=s[i]

user: user-6
content: s[i] 是 *(s + i) *s 是 s[0]

user: user-7
content: A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价
user-0 提问: 用串口助手向STC89C52发送字符串时，为什么第一个字符显示不了？？？

回复:
user: user-1
content: 引用 6 楼 qq_36524366 的回复:[quote=引用 3 楼 Janxionwang 的回复:]  bit ReceiveString()     {     char * RecStr=buf_string;     char num=0;     unsigned char count=0;     loop:         *RecStr=SBUF;     count=0;     RI=0;         if(num < 11)  //数据包长度为11个字符,尝试连续接收11个字符-----你这里第10次跑完时候num = 10就进不来了，少了一次     {         num++;         RecStr++;             while(!RI)         {             count++;             if(count>130)return 0;          }         goto loop;     }        return 1; } 今天我的思想被误导了  我以为还会有一次num=10，因为当它等于9时，还不知道是不是小于10，所以会进行一次num=10的操作[/quote]  要习惯多方面看问题啊，可能你觉得组容易的地方就是最容易出错的，还有，给你一个建议，写代码一定要养成好习惯，比如buf_string这种宏，一般都写成大写，还有一般来说goto语句容易出问题，因为你goto的点可能变量没有初始化等等问题，早就不 提倡使用了，当然，只是各个意见

user: user-0
content: 引用 3 楼 Janxionwang 的回复: bit ReceiveString()     {     char * RecStr=buf_string;     char num=0;     unsigned char count=0;     loop:         *RecStr=SBUF;     count=0;     RI=0;         if(num < 11)  //数据包长度为11个字符,尝试连续接收11个字符-----你这里第10次跑完时候num = 10就进不来了，少了一次     {         num++;         RecStr++;             while(!RI)         {             count++;             if(count>130)return 0;          }         goto loop;     }        return 1; } 今天我的思想被误导了  我以为还会有一次num=10，因为当它等于9时，还不知道是不是小于10，所以会进行一次num=10的操作

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:“多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？哎呀  竟然犯这么低级的错误  瞬间无地自容

user: user-2
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-1
content: bit ReceiveString()     {     char * RecStr=buf_string;     char num=0;     unsigned char count=0;     loop:         *RecStr=SBUF;     count=0;     RI=0;         if(num < 11)  //数据包长度为11个字符,尝试连续接收11个字符-----你这里第10次跑完时候num = 10就进不来了，少了一次     {         num++;         RecStr++;             while(!RI)         {             count++;             if(count>130)return 0;          }         goto loop;     }        return 1; }

user: user-2
content: 推荐使用portmon软件辅助调试串口通信程序。

user: user-0
content: 每次发11个字符，通过STC的串口助手，到单片机显示时，可以正常显示后面10位数据，第一位在1602上显示乱码