Question: 我又来问问题了

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

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

好的

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

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

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

为什么要在输入n后  来个n++

#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; }  这个通过了   有什么区别....

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

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

#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语言不支持不定长度的数组，所以建议先定义一个自己能接受的长度，最好定义成宏，这样如果改长度还好改。

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

这是你的作业吧


Question: 如何判断键盘箭头上下左右的值

引用 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] 好的，可以了，谢谢！

引用 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] 你输入上，下，左，右；然后验证一下它们的值就可以，这个还需要你做些工作，验证一下值。实际上就是写个程序亲自操作一下。

引用 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个字节，那第二个字节是纯数字么？

引用 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 方向键的值可能不对，可以确定的是方向键不是一个字节表示


Question: 怎样使用sscanf函数连续截取字符串

sscanf_s("abc,1 2 3", "%*%d  %d", &a, &b);

仅供参考：#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.


Question: linux下如何取出tcp头部的标志位

非常感谢两位老师！ 明白了！

再供参考：#include <stdio.h> #include <stdlib.h> char buf[17]; union U {   unsigned short int aa;   struct {     unsigned int bb:7;//(bit 0-6)     unsigned int cc:6;//(bit 7-12)     unsigned int dd:3;//(bit 13-15)   }; } u; void main() {                 //bbbbbbbbbbbbbbbb                 //iiiiiiiiiiiiiiii                 //tttttttttttttttt                 //111111                 //5432109876543210                 //::::::::::::::::     u.aa=0xE07F;//1110000001111111     printf("bb==%d,cc==%d,dd==%d\n",u.bb,u.cc,u.dd);     u.bb=0x41;     u.cc=0x21;//dddccccccbbbbbbb     u.dd=5;   //1011000011000001     printf("aa==0x%04X==%016s(2)\n",u.aa,itoa(u.aa,buf,2)); } //bb==127,cc==0,dd==7 //aa==0xB0C1==1011000011000001(2)

这叫结构体的位字段   struct A { 	unsigned int a : 1; 	unsigned int b : 1; 	unsigned int c : 1; 	unsigned int d : 1; 	unsigned int e : 28; };  int main(int argc, char* argv[]) { 	A a; 	a.a = 1; 	a.b = 1; 	a.c = 1; 	a.d = 1; 	a.e = 0;  	return 0; }  这个结构体只有4字节，低4位分别是1，高28位全为0

仅供参考：#include <stdio.h>  #define WIRTE_UINT(des ,x ,pos ,len)  (                                   \     (des)                                                                 \     &                                                                     \        ~(                                /* 除要修改的位为0，其余都为1 */ \             (                                                             \                 (1<<(len))-1             /* 长度为len位的1             */ \             )                                                             \             <<(32-(pos)-(len))           /* 左移32-(pos)-(len)位       */ \         )                                                                 \     |                                                                     \         (                                                                 \             (x)                                                           \             <<(32-(pos)-(len))                                            \         )                                                                 \ ) #define READ_UINT(src ,pos ,len)      (                                   \     (                                                                     \         (                                                                 \             (unsigned)(src)                                               \         )                                                                 \         >>(32-(pos)-(len))               /* 逻辑右移32-(pos)-(len)位   */ \     )                                                                     \     &                                                                     \     (                                                                     \         (1<<(len))-1                     /* 长度为len位的1             */ \     )                                                                     \ )  int main()                              //                1111111111222222222233 {                                       //bit   01234567890123456789012345678901     unsigned int des = 0x661;           //      00000000000000000000011001100001     unsigned int r;      des = WIRTE_UINT(des ,3 ,28 ,2);    //      00000000000000000000011001101101     printf("des==0x%08X\n",des); 	r =	READ_UINT(des ,28 ,2);     printf("r==%d\n",r);     return 0; } //des==0x0000066D //r==3


Question: c语言中同工程不同路径下的c文件函数调用的问题

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

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

把B.h, B.c 加到 A.c所在的那个项目里面去

你返回的这个 bSingleMode 是定义在哪里的？

不好意思忘了  两个c文件分别属于不同的project

好赖也截个FileView图贴上来吧：

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

6.0么  应该是  Project Setting > C/C++ （Category：Preprocessor）> Additional include directories

指的是哪一个？

你项目的附加包含目录里面，需要包含 ../

将extern删掉 将B.c和A.c都添加到项目中


Question: 建立单链表时关于指针在函数间传递的问题。

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

理解和讨论之前请先学会如何观察！  计算机组成原理→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

谢谢大家的回答，我明白了！

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

建议你在草稿纸上画画指针指向的逻辑。

如果传递一重指针，那么修改的指针是形参的，没有修改实参的数据。传递二重指针，就可以修改实参的指针的地址，这样调用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; }


Question: 基础问题两个

(y * 5)不能作为左值

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

2、y*5是右值，不参将x+z的值赋值给y*5

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

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

#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的值。 这些都是基本语法问题，建议你多写多练吧


Question: C语言字符串反转

b数组后没有结束符'/0'

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

#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’符时结尾。

因为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; }


Question: 调试时 提示acess violation

#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函数是应该最后调用的。

main里指针没初始化就拿来用了


Question: 究竟是什么致使我的单片机一直发数据给上位机？程序哪里出错了吗？

偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。


Question: Beginner的C语言问题

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

#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; }

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

仅供参考：#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(); } //                          啊 //    啊  啊啊啊啊  啊啊啊啊啊啊 //啊啊啊啊啊    啊          啊 //啊  啊  啊    啊          啊 //啊  啊  啊  啊        啊  啊 //啊  啊  啊  啊    啊啊啊啊啊 //啊  啊  啊啊      啊  啊  啊 //啊  啊  啊  啊    啊  啊  啊 //啊  啊  啊  啊    啊  啊  啊 //啊  啊  啊    啊  啊  啊  啊 //啊啊啊  啊    啊  啊啊啊  啊 //啊  啊  啊啊  啊  啊  啊  啊 //        啊  啊            啊 //        啊                啊 //        啊            啊  啊 //        啊              啊啊


Question: 结构体数组中字符串赋值

引用 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应该会更安全

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


Question: C语言中typedef 读取问题

后续再来一个十字路口带红绿灯版？！

闲来无事来一个动画版：//三种车 轿车 校车 卡车 速度分别3 2 1 //..........    <- row 0, 最左边进入 //.......... //.......... //^ //| //column 0,  最左边 // //第一排 输入 行 列 时间 //第二排 输入 进入时间 进入的行 车速 优先级 //优先级大的可以超车 // //例子： // //输入 //1 50 100 //2 0 1 26 //5 0 3 26 //9 0 3 26 //11 0 1 34 // //输出 // //t=0 //.................................................. //t=1 //.................................................. //t=2 //.................................................. //t=3 //1................................................. //t=4 //.1................................................ //t=5 //..1............................................... //t=6 //..31.............................................. //t=7 //...31............................................. //t=8 //....31............................................ //t=9 //.....31........................................... //t=10 //..3...31.......................................... //t=11 //.....3.31......................................... //t=12 //1......331........................................ //t=13 //.1......331....................................... //此处省略 //t=100 //.................................................. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> #include <windows.h> #include <time.h> #include <conio.h> char *M=NULL; int *M2I=NULL; char *A=NULL; int R,C,T;//行 列 时间 char ln[40]; int t,r,v,l;//进入时间 进入的行 车速 优先级 int n,i,c,p,tt,j;  void ClearConsole() {     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     COORD coord = {0, 0};     DWORD count;     CONSOLE_SCREEN_BUFFER_INFO csbi;      if (GetConsoleScreenBufferInfo(hStdOut, &csbi)) {         FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);         FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);         SetConsoleCursorPosition(hStdOut, coord);     } } void ConPrintAt(int x, int y, char *CharBuffer, int len) {     DWORD count;     COORD coord = {x, y};     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      SetConsoleCursorPosition(hStdOut, coord);     WriteConsole(hStdOut, CharBuffer, len, &count, NULL); } 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(int argc,char **argv) {     if (argc==1) {         fgets(ln,40,stdin);         if (3!=sscanf(ln,"%d%d%d",&R,&C,&T)) return 1;         if (!(R>0 && C>0 && T>0)) return 1;     } else {         ClearConsole();         HideTheCursor();         srand(time(NULL));         R=1+rand()%6;         C=20+rand()%10*10;         T=C+20;     }     n=0;     while (1) {         if (argc==1) {             fgets(ln,40,stdin);             if (ln[0]=='\n') break;         } else {             if (0==rand()%(R*5) && n>R*3) {                 break;             } else {                 sprintf(ln,"%d %d %d %d\n",rand()%20,rand()%R,1+rand()%3,rand()%(R*3));             }         }         if (4!=sscanf(ln,"%d%d%d%d",&t,&r,&v,&l)) return 1;         if (!(0<=t && t<=T && r<R && 1<=v && v<=3 && 0<=l)) return 1;         A=(char *)realloc(A,(n+1)*5*sizeof(int));         A[n*5+0]=t;         A[n*5+1]=r;         A[n*5+2]=v;         A[n*5+3]=l;         A[n*5+4]=-2;//第n辆车的初始位置         n++;     }     M=(char *)malloc(R*C*sizeof(char));     M2I=(int *)malloc(R*(C+3)*sizeof(int));     for (tt=0;tt<=T;tt++) {         memset(M,'.',R*C*sizeof(char));         for (i=0;i<R*(C+3);i++) M2I[i]=n;//标记所有位置无车         if (argc==1) printf("t=%d\n",tt);         for (i=0;i<n;i++) {//第i辆车             t=A[i*5+0];             r=A[i*5+1];             v=A[i*5+2];             l=A[i*5+3];             p=A[i*5+4];             if (p==-2) {                 if (tt==t) p=-1;//到进入时间了             } else if (-1<=p && p<C) {                 for (c=0;c<v;c++) {                     if (M2I[r*(C+3)+p+1+c]<n) {//前面有别的车                         j=M2I[r*(C+3)+p+1+c];                         if (l<=A[j*5+3]) break; //前车的优先级≥我的优先级                     }                 }                 p+=c;                 if (0<=p && p<C+3) M2I[r*(C+3)+p]=i;             }             A[i*5+4]=p;             if (0<=p && p<C) M[r*C+p]='0'+v;         }         if (argc==1) {             for (r=0;r<R;r++) {                 printf("%.*s\n",C,M+r*C);             }         } else {             for (r=0;r<R;r++) {                 ConPrintAt(0,r,M+r*C,C);             }             Sleep(200);             if (kbhit()) {getch();break;}         }     }     free(M2I);     free(M);     free(A);      if (argc!=1) ShowTheCursor();     return 0; } //输入： //1 50 100 //2 0 1 26 //5 0 3 26 //9 0 3 26 //11 0 1 34 // //输出： //t=0 //.................................................. //t=1 //.................................................. //t=2 //.................................................. //t=3 //1................................................. //t=4 //.1................................................ //t=5 //..1............................................... //t=6 //..31.............................................. //t=7 //...31............................................. //t=8 //....31............................................ //t=9 //.....31........................................... //t=10 //..3...31.......................................... //t=11 //.....3.31......................................... //t=12 //1......331........................................ //t=13 //.1......331....................................... //t=14 //..1......331...................................... //t=15 //...1......331..................................... //t=16 //....1......331.................................... //t=17 //.....1......331................................... //t=18 //......1......331.................................. //t=19 //.......1......331................................. //t=20 //........1......331................................ //t=21 //.........1......331............................... //t=22 //..........1......331.............................. //t=23 //...........1......331............................. //t=24 //............1......331............................ //t=25 //.............1......331........................... //t=26 //..............1......331.......................... //t=27 //...............1......331......................... //t=28 //................1......331........................ //t=29 //.................1......331....................... //t=30 //..................1......331...................... //t=31 //...................1......331..................... //t=32 //....................1......331.................... //t=33 //.....................1......331................... //t=34 //......................1......331.................. //t=35 //.......................1......331................. //t=36 //........................1......331................ //t=37 //.........................1......331............... //t=38 //..........................1......331.............. //t=39 //...........................1......331............. //t=40 //............................1......331............ //t=41 //.............................1......331........... //t=42 //..............................1......331.......... //t=43 //...............................1......331......... //t=44 //................................1......331........ //t=45 //.................................1......331....... //t=46 //..................................1......331...... //t=47 //...................................1......331..... //t=48 //....................................1......331.... //t=49 //.....................................1......331... //t=50 //......................................1......331.. //t=51 //.......................................1......331. //t=52 //........................................1......331 //t=53 //.........................................1......33 //t=54 //..........................................1....... //t=55 //...........................................1...... //t=56 //............................................1..... //t=57 //.............................................1.... //t=58 //..............................................1... //t=59 //...............................................1.. //t=60 //................................................1. //t=61 //.................................................1 //t=62 …… //t=100 //.................................................. // //★运行时随便带一个命令行参数可动画演示！★

来学习学习

顶一一一一一一下

给出的例子的输出都无法自圆其说。

跟year、mon、day没半毛钱关系。

main函数里定义重名变量，这是不可以的，自己看着都糊涂了

不是。。。是我的锅 没有表达清楚 大神你先看看题  一楼只是举例 创建行列式 各种车进入的时间 都是键盘输入读取的 而且各种车速也不一样 还有超车和优先级问题

这根typedef 有半毛钱关系。。。   	char buff[20]; 	memset(buff, '.', sizeof(buff));  	char str[21] = { 0 };  	for (int i = 0; i < 30; i++) 	{ 		if (i == 3 || 			i == 4 || 			i == 5 || 			i == 10 || 			i == 11 || 			i == 12) 		{ 			buff[0] = '1'; 		} 		else 		{ 			buff[0] = '.'; 		}  		memcpy(str, buff, sizeof(buff));  		printf("t = %2d : %s\n", i, str);  		memcpy(buff + 1, str, sizeof(buff)-sizeof(char)); 	}

三种车 轿车 校车 卡车 速度分别3 2 1 ..........    <- row 0, 最左边进入 .......... .......... ^ | column 0,  最左边  第一排 输入 行 列 时间 第二排 输入 进入时间 进入的行 车速 优先级 优先级大的可以超车  例子： 输入 1 50 100  2 0 1 26 5 0 3 26 9 0 3 26 11 0 1 34 14 0 1 17 30 0 2 26 45 0 3 27 50 0 1 28 60 0 2 28 75 0 3 27 80 0 1 26  输出  t=0 .................................................. t=1 .................................................. t=2 .................................................. t=3 1................................................. t=4 ...1.............................................. t=5 ......1........................................... t=6 3........1........................................ t=7 ..3.........1..................................... t=8 ....3..........1.................................. t=9 ......3...........1............................... t=10 3.......3............1............................ t=11 ..3.......3.............1......................... t=12 1...3.......3..............1...................... t=13 ...1..3.......3...............1................... t=14 .....1..3.......3................1................ t=15 1......1..3.......3.................1............. t=16 ...1.....1..3.......3..................1.......... t=17 ......1....1..3.......3...................1....... t=18 .........1...1..3.......3....................1.... t=19 ............1..1..3.......3.....................1. t=20 ...............1.1..3.......3..................... t=21 ..................11..3.......3................... t=22 ....................11..3.......3................. t=23 ......................11..3.......3............... t=24 ........................11..3.......3............. t=25 ..........................11..3.......3........... t=26 ............................11..3.......3......... t=27 ..............................11..3.......3....... t=28 ................................11..3.......3..... t=29 ..................................11..3.......3... t=30 ....................................11..3.......3. t=31 2.....................................11..3....... t=32 .2......................................11..3..... t=33 ..2.......................................11..3... t=34 ...2........................................11..3. t=35 ....2.........................................11.. t=36 .....2...........................................1 t=37 ......2........................................... t=38 .......2.......................................... t=39 ........2......................................... t=40 .........2........................................ t=41 ..........2....................................... t=42 ...........2...................................... t=43 ............2..................................... t=44 .............2.................................... t=45 ..............2................................... t=46 3..............2.................................. t=47 ..3.............2................................. t=48 ....3............2................................ t=49 ......3...........2............................... t=50 ........3..........2.............................. t=51 1.........3.........2............................. t=52 ...1........3........2............................ t=53 ......1.......3.......2........................... t=54 .........1......3......2.......................... t=55 ............1.....3.....2......................... t=56 ...............1....3....2........................ t=57 ..................1...3...2....................... t=58 .....................1..3..2...................... t=59 .......................1..3.2..................... t=60 .........................1.3.2.................... t=61 2.........................1.3.2................... t=62 .2.........................1.3.2.................. t=63 ..2.........................1.3.2................. t=64 ...2.........................1.3.2................ t=65 ....2.........................1.3.2............... t=66 .....2.........................1.3.2.............. t=67 ......2.........................1.3.2............. t=68 .......2.........................1.3.2............ t=69 ........2.........................1.3.2........... t=70 .........2.........................1.3.2.......... t=71 ..........2.........................1.3.2......... t=72 ...........2.........................1.3.2........ t=73 ............2.........................1.3.2....... t=74 .............2.........................1.3.2...... t=75 ..............2.........................1.3.2..... t=76 3..............2.........................1.3.2.... t=77 ..3.............2.........................1.3.2... t=78 ....3............2.........................1.3.2.. t=79 ......3...........2.........................1.3.2. t=80 ........3..........2.........................1.3.2 t=81 1.........3.........2.........................1.3. t=82 ...1........3........2.........................1.. t=83 ......1.......3.......2........................... t=84 .........1......3......2.......................... t=85 ............1.....3.....2......................... t=86 ...............1....3....2........................ t=87 ..................1...3...2....................... t=88 .....................1..3..2...................... t=89 ........................1.3.2..................... t=90 ...........................132.................... t=91 ............................132................... t=92 .............................132.................. t=93 ..............................132................. t=94 ...............................132................ t=95 ................................132............... t=96 .................................132.............. t=97 ..................................132............. t=98 ...................................132............ t=99 ....................................132........... t=100 .....................................132..........   例子 输入 5 10 20 0 1 2 15  0 3 2 14  0 4 1 34 2 4 1 7  4 3 2 18  4 4 2 24  6 3 1 11  6 4  1 8  10 0 2 40  10 1 1 23  12 2 3 11  12 4 2 34  18 1 1 3   输出 .........2 ...1...... .......... .......... .......2..

楼主给的代码太少，图片表示啥意思描述也太少。

求大腿告知 用C语言写结构体typedef 怎么输出打印下面那张图片

楼主语文稍差，不知所云。 仅供参考：//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

#include <stdio.h> #include <stdlib.h> #include <string.h>   struct highWay {     int nrow;     int ncol;     char** stateSim; };  //不会写 void movement(struct highWay *simHW, int speed,int priority) {     int i, j;     for (i = 0;i < simHW->nrow;i++)     {         for (j = 0; j < simHW->ncol - 1;j--)         {             if (simHW->stateSim[i][j] == 1)             {                 simHW->stateSim[i][j] = 0;                 if (j != simHW->ncol - 1)                 {                     simHW->stateSim[i][j + 1] = 1;                 }             }         }     }      }  void arrival(int arriveRow, struct highWay *simHW) {     simHW->stateSim[arriveRow][0] = 1; }  void showHighWay(struct highWay* simHW) {     int i, j;     for (i = 0;i < simHW->nrow;i++)     {         for (j = 0; j < simHW->ncol; j++)         {             if (simHW->stateSim[i][j] == 0)             {                 printf(".");             }         }     } }  void highwaySimulate(int nstep, int arriveRow, struct highWay* simHW,int speed,int priority) {     int i;     for (i = 0; i < nstep; i++)     {         movement(simHW,speed,priority);     }     arrival(arriveRow, simHW); }  int main() {     struct highWay simHighWay;     int nrow, ncol, time;     int i, inTime, lastTime,speed,priority;     int arriveRow;          while (scanf("%d %d %d",&simHighWay.nrow, &simHighWay.ncol, &time)!=EOF)     {         getchar();         nrow = simHighWay.nrow;         ncol = simHighWay.ncol;                  simHighWay.stateSim = (char**)malloc(sizeof(char*)*nrow);         for (i = 0; i < nrow; i++)         {             simHighWay.stateSim[i] = (char*)malloc(sizeof(char)*ncol);             memset(simHighWay.stateSim[i], 0, sizeof(char)*ncol);         }                  lastTime = 0;         scanf("%d %d %d %d", &inTime, &arriveRow,&speed,&priority);                      getchar();             if (inTime < time && inTime >= lastTime)             {             highwaySimulate(inTime - lastTime, arriveRow, &simHighWay,speed,priority);             }                           for (i = lastTime; i < time - 1; i++)         {             movement(&simHighWay,speed,priority);         }                  showHighWay(&simHighWay);                 printf("\n");                  for (i = 0;i < nrow;i++)         {             free(simHighWay.stateSim[i]);         }         free(simHighWay.stateSim);     }     return 0; }   请问哪里写错了

改正一处bug第106行：//三种车 轿车 校车 卡车 速度分别3 2 1 //..........    <- row 0, 最左边进入 //.......... //.......... //^ //| //column 0,  最左边 // //第一排 输入 行 列 时间 //第二排 输入 进入时间 进入的行 车速 优先级 //优先级大的可以超车 // //例子： // //输入 //1 50 100 //2 0 1 26 //5 0 3 26 //9 0 3 26 //11 0 1 34 // //输出 // //t=0 //.................................................. //t=1 //.................................................. //t=2 //.................................................. //t=3 //1................................................. //t=4 //.1................................................ //t=5 //..1............................................... //t=6 //..31.............................................. //t=7 //...31............................................. //t=8 //....31............................................ //t=9 //.....31........................................... //t=10 //..3...31.......................................... //t=11 //.....3.31......................................... //t=12 //1......331........................................ //t=13 //.1......331....................................... //此处省略 //t=100 //.................................................. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> char *M=NULL; int *M2I=NULL; char *A=NULL; int R,C,T;//行 列 时间 char ln[40]; int t,r,v,l;//进入时间 进入的行 车速 优先级 int n,i,c,p,tt,j; int main() {     fgets(ln,40,stdin);     if (3!=sscanf(ln,"%d%d%d",&R,&C,&T)) return 1;     if (!(R>0 && C>0 && T>0)) return 1;     n=0;     while (1) {         fgets(ln,40,stdin);         if (ln[0]=='\n') break;         if (4!=sscanf(ln,"%d%d%d%d",&t,&r,&v,&l)) return 1;         if (!(0<=t && t<=T && r<R && 1<=v && v<=3 && 0<=l)) return 1;         A=(char *)realloc(A,(n+1)*5*sizeof(int));         A[n*5+0]=t;         A[n*5+1]=r;         A[n*5+2]=v;         A[n*5+3]=l;         A[n*5+4]=-2;//第n辆车的初始位置         n++;     }     M=(char *)malloc(R*C*sizeof(char));     M2I=(int *)malloc(R*(C+3)*sizeof(int));     for (tt=0;tt<=T;tt++) {         memset(M,'.',R*C*sizeof(char));         for (i=0;i<R*(C+3);i++) M2I[i]=n;//标记所有位置无车         printf("t=%d\n",tt);         for (i=0;i<n;i++) {//第i辆车             t=A[i*5+0];             r=A[i*5+1];             v=A[i*5+2];             l=A[i*5+3];             p=A[i*5+4];             if (p==-2) {                 if (tt==t) p=-1;//到进入时间了             } else if (-1<=p && p<C) {                 for (c=0;c<v;c++) {                     if (M2I[r*(C+3)+p+1+c]<n) {//前面有别的车                         j=M2I[r*(C+3)+p+1+c];                         if (l<=A[j*5+3]) break; //前车的优先级≥我的优先级                     }                 }                 p+=c;                 if (0<=p && p<C+3) M2I[r*(C+3)+p]=i;             }             A[i*5+4]=p;             if (0<=p && p<C) M[r*C+p]='0'+v;         }         for (r=0;r<R;r++) {             printf("%.*s\n",C,M+r*C);         }     }     free(M2I);     free(M);     free(A);     return 0; } //输入： //1 50 100 //2 0 1 26 //5 0 3 26 //9 0 3 26 //11 0 1 34 // //输出： //t=0 //.................................................. //t=1 //.................................................. //t=2 //.................................................. //t=3 //1................................................. //t=4 //.1................................................ //t=5 //..1............................................... //t=6 //..31.............................................. //t=7 //...31............................................. //t=8 //....31............................................ //t=9 //.....31........................................... //t=10 //..3...31.......................................... //t=11 //.....3.31......................................... //t=12 //1......331........................................ //t=13 //.1......331....................................... //t=14 //..1......331...................................... //t=15 //...1......331..................................... //t=16 //....1......331.................................... //t=17 //.....1......331................................... //t=18 //......1......331.................................. //t=19 //.......1......331................................. //t=20 //........1......331................................ //t=21 //.........1......331............................... //t=22 //..........1......331.............................. //t=23 //...........1......331............................. //t=24 //............1......331............................ //t=25 //.............1......331........................... //t=26 //..............1......331.......................... //t=27 //...............1......331......................... //t=28 //................1......331........................ //t=29 //.................1......331....................... //t=30 //..................1......331...................... //t=31 //...................1......331..................... //t=32 //....................1......331.................... //t=33 //.....................1......331................... //t=34 //......................1......331.................. //t=35 //.......................1......331................. //t=36 //........................1......331................ //t=37 //.........................1......331............... //t=38 //..........................1......331.............. //t=39 //...........................1......331............. //t=40 //............................1......331............ //t=41 //.............................1......331........... //t=42 //..............................1......331.......... //t=43 //...............................1......331......... //t=44 //................................1......331........ //t=45 //.................................1......331....... //t=46 //..................................1......331...... //t=47 //...................................1......331..... //t=48 //....................................1......331.... //t=49 //.....................................1......331... //t=50 //......................................1......331.. //t=51 //.......................................1......331. //t=52 //........................................1......331 //t=53 //.........................................1......33 //t=54 //..........................................1....... //t=55 //...........................................1...... //t=56 //............................................1..... //t=57 //.............................................1.... //t=58 //..............................................1... //t=59 //...............................................1.. //t=60 //................................................1. //t=61 //.................................................1 //t=62 //.................................................. //t=63 //.................................................. //t=64 //.................................................. //t=65 //.................................................. //t=66 //.................................................. //t=67 //.................................................. //t=68 //.................................................. //t=69 //.................................................. //t=70 //.................................................. //t=71 //.................................................. //t=72 //.................................................. //t=73 //.................................................. //t=74 //.................................................. //t=75 //.................................................. //t=76 //.................................................. //t=77 //.................................................. //t=78 //.................................................. //t=79 //.................................................. //t=80 //.................................................. //t=81 //.................................................. //t=82 //.................................................. //t=83 //.................................................. //t=84 //.................................................. //t=85 //.................................................. //t=86 //.................................................. //t=87 //.................................................. //t=88 //.................................................. //t=89 //.................................................. //t=90 //.................................................. //t=91 //.................................................. //t=92 //.................................................. //t=93 //.................................................. //t=94 //.................................................. //t=95 //.................................................. //t=96 //.................................................. //t=97 //.................................................. //t=98 //.................................................. //t=99 //.................................................. //t=100 //.................................................. //

感谢老师耐心回复

不知所淫

不一定对，仅供参考： //三种车 轿车 校车 卡车 速度分别3 2 1 //..........    <- row 0, 最左边进入 //.......... //.......... //^ //| //column 0,  最左边 // //第一排 输入 行 列 时间 //第二排 输入 进入时间 进入的行 车速 优先级 //优先级大的可以超车 // //例子： // //输入 //1 50 100 //2 0 1 26 //5 0 3 26 //9 0 3 26 //11 0 1 34 // //输出 // //t=0 //.................................................. //t=1 //.................................................. //t=2 //.................................................. //t=3 //1................................................. //t=4 //.1................................................ //t=5 //..1............................................... //t=6 //..31.............................................. //t=7 //...31............................................. //t=8 //....31............................................ //t=9 //.....31........................................... //t=10 //..3...31.......................................... //t=11 //.......31......................................... //t=12 //1.......31........................................ //此处省略 //t=100 //.................................................. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> char *M=NULL; int *M2I=NULL; char *A=NULL; int R,C,T;//行 列 时间 char ln[40]; int t,r,v,l;//进入时间 进入的行 车速 优先级 int n,i,c,p,tt,j; int main() {     fgets(ln,40,stdin);     if (3!=sscanf(ln,"%d%d%d",&R,&C,&T)) return 1;     if (!(R>0 && C>0 && T>0)) return 1;     n=0;     while (1) {         fgets(ln,40,stdin);         if (ln[0]=='\n') break;         if (4!=sscanf(ln,"%d%d%d%d",&t,&r,&v,&l)) return 1;         if (!(0<=t && t<=T && r<R && 1<=v && v<=3 && 0<=l)) return 1;         A=(char *)realloc(A,(n+1)*5*sizeof(int));         A[n*5+0]=t;         A[n*5+1]=r;         A[n*5+2]=v;         A[n*5+3]=l;         A[n*5+4]=-2;//第n辆车的初始位置         n++;     }     M=(char *)malloc(R*C*sizeof(char));     M2I=(int *)malloc(R*(C+3)*sizeof(int));     for (tt=0;tt<=T;tt++) {         memset(M,'.',R*C*sizeof(char));         for (i=0;i<R*(C+3);i++) M2I[i]=n;//标记所有位置无车         printf("t=%d\n",tt);         for (i=0;i<n;i++) {//第i辆车             t=A[i*5+0];             r=A[i*5+1];             v=A[i*5+2];             l=A[i*5+3];             p=A[i*5+4];             if (p==-2) {                 if (tt==t) p=-1;//到进入时间了             } else if (-1<=p && p<C) {                 for (c=0;c<v;c++) {                     if (M2I[r*(C+3)+p+1+c]<n) {//前面有别的车                         j=M2I[r*(C+3)+p+1+c];                         if (l<=A[j*5+3]) break; //前车的优先级≥我的优先级                     }                 }                 p+=c;                 M2I[r*(C+3)+p]=i;             }             A[i*5+4]=p;             if (0<=p && p<C) M[r*C+p]='0'+v;         }         for (r=0;r<R;r++) {             printf("%.*s\n",C,M+r*C);         }     }     free(M2I);     free(M);     free(A);     return 0; } //输入： //1 50 100 //2 0 1 26 //5 0 3 26 //9 0 3 26 //11 0 1 34 // //输出： //t=0 //.................................................. //t=1 //.................................................. //t=2 //.................................................. //t=3 //1................................................. //t=4 //.1................................................ //t=5 //..1............................................... //t=6 //..31.............................................. //t=7 //...31............................................. //t=8 //....31............................................ //t=9 //.....31........................................... //t=10 //..3...31.......................................... //t=11 //.....3.31......................................... //t=12 //1......331........................................ //t=13 //.1......331....................................... //t=14 //..1......331...................................... //t=15 //...1......331..................................... //t=16 //....1......331.................................... //t=17 //.....1......331................................... //t=18 //......1......331.................................. //t=19 //.......1......331................................. //t=20 //........1......331................................ //t=21 //.........1......331............................... //t=22 //..........1......331.............................. //t=23 //...........1......331............................. //t=24 //............1......331............................ //t=25 //.............1......331........................... //t=26 //..............1......331.......................... //t=27 //...............1......331......................... //t=28 //................1......331........................ //t=29 //.................1......331....................... //t=30 //..................1......331...................... //t=31 //...................1......331..................... //t=32 //....................1......331.................... //t=33 //.....................1......331................... //t=34 //......................1......331.................. //t=35 //.......................1......331................. //t=36 //........................1......331................ //t=37 //.........................1......331............... //t=38 //..........................1......331.............. //t=39 //...........................1......331............. //t=40 //............................1......331............ //t=41 //.............................1......331........... //t=42 //..............................1......331.......... //t=43 //...............................1......331......... //t=44 //................................1......331........ //t=45 //.................................1......331....... //t=46 //..................................1......331...... //t=47 //...................................1......331..... //t=48 //....................................1......331.... //t=49 //.....................................1......331... //t=50 //......................................1......331.. //t=51 //.......................................1......331. //t=52 //........................................1......331 //t=53 //.........................................1......33 //t=54 //..........................................1....... //t=55 //...........................................1...... //t=56 //............................................1..... //t=57 //.............................................1.... //t=58 //..............................................1... //t=59 //...............................................1.. //t=60 //................................................1. //t=61 //.................................................1 //t=62 //.................................................. //t=63 //.................................................. //t=64 //.................................................. //t=65 //.................................................. //t=66 //.................................................. //t=67 //.................................................. //t=68 //.................................................. //t=69 //.................................................. //t=70 //.................................................. //t=71 //.................................................. //t=72 //.................................................. //t=73 //.................................................. //t=74 //.................................................. //t=75 //.................................................. //t=76 //.................................................. //t=77 //.................................................. //t=78 //.................................................. //t=79 //.................................................. //t=80 //.................................................. //t=81 //.................................................. //t=82 //.................................................. //t=83 //.................................................. //t=84 //.................................................. //t=85 //.................................................. //t=86 //.................................................. //t=87 //.................................................. //t=88 //.................................................. //t=89 //.................................................. //t=90 //.................................................. //t=91 //.................................................. //t=92 //.................................................. //t=93 //.................................................. //t=94 //.................................................. //t=95 //.................................................. //t=96 //.................................................. //t=97 //.................................................. //t=98 //.................................................. //t=99 //.................................................. //t=100 //.................................................. //

求大神们给个思路

这个是两个问题  第一个是想弄清楚指针问题 是怎么传递的  第二个是关于C语言的程序 希望可以给一个借鉴的代码 以便更好理解指针


Question: 求助一道OJ题

各位大大的代码都通不过

#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; } 没进行大量测试，你可以用你的用例试试～

引用 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; }  这个移位用的好

已解决   谢谢各位了

#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; }

#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); }

运算过程中遇到奇数都加1吗


Question: 为什么运行后程序停止

数组下标越界。。。。。

a[9]这个数组是0～8

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

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

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"); }

你需要去补数组的基础知识

上面字打错，是坐标，不是左边

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

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


Question: 结构内储存的类型如何改变

你可能说的是模板

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

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

element应该是elemtype 。写错了

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

引用 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]);

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

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

比如说从int改成char


Question: 小白求助，c语言问题

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;       }

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

问题出在 s_gets(list[count].phone  , PHONE); 中list[count].phone的定义是int的指针，而s_gets函数的第一个参数需要的是char的指针，所以会报错


Question: 请问如何用C语言输入自然数n的值。这里保证n小于10的100次方

嫌楼上是C++不是C？ 参考：#include <stdio.h> #include <string.h> #define MAXLEN 1000 char a1[MAXLEN]; char a2[MAXLEN]; static int v1[MAXLEN]; static int v2[MAXLEN]; static int v3[MAXLEN]; int i,j,n,L,z; void main(void) {     scanf("%d",&n);     for (j=0;j<n;j++) {         scanf("%s%s",a1,a2);          L=strlen(a1);         for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';          L=strlen(a2);         for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';          for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];          for (i=0;i<MAXLEN;i++) {             if (v3[i]>=10) {                 v3[i+1]+=v3[i]/10;                 v3[i]=v3[i]%10;             }         }          printf("Case %d:\n", j+1);         printf("%s + %s = ", a1, a2);          z=0;         for (i=MAXLEN-1;i>=0;i--) {             if (z==0) {                 if (v3[i]!=0) {                     printf("%d",v3[i]);                     z=1;                 }             } else {                 printf("%d",v3[i]);             }         }         if (z==0) printf("0");          printf("\n");     } } //Sample Input //3 //0 0 //1 2 //112233445566778899 998877665544332211 // //Sample Output //Case 1: //0 + 0 = 0 //Case 2: //1 + 2 = 3 //Case 3: //112233445566778899 + 998877665544332211 = 1111111111111111110

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

内置数字类型表示不过来。只能考虑其他方式存储，比如字符串或者用两个数值指明底数和指数的方式

超出int范围了 直接就用字符数组存储表示


Question: C语言feof问题？

引用 8 楼 赵4老师的回复:推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了 谢谢!

为什么不判断fread的返回值呢？  fread Reads data from a stream.  size_t fread( void *buffer, size_t size, size_t count, FILE *stream );  Function Required Header Compatibility  fread <stdio.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  fread returns the number of full items actually read, which may be less than count if an error occurs or if the end of the file is encountered before reaching count. Use the feof or ferror function to distinguish a read error from an end-of-file condition. If size or count is 0, fread returns 0 and the buffer contents are unchanged.  Parameters  buffer  Storage location for data  size  Item size in bytes  count  Maximum number of items to be read  stream  Pointer to FILE structure  Remarks  The fread function reads up to count items of size bytes from the input stream and stores them in buffer. The file pointer associated with stream (if there is one) is increased by the number of bytes actually read. If the given stream is opened in text mode, carriage return–linefeed pairs are replaced with single linefeed characters. The replacement has no effect on the file pointer or the return value. The file-pointer position is indeterminate if an error occurs. The value of a partially read item cannot be determined.  Example  /* FREAD.C: This program opens a file named FREAD.OUT and  * writes 25 characters to the file. It then tries to open  * FREAD.OUT and read in 25 characters. If the attempt succeeds,  * the program displays the number of actual items read.  */  #include <stdio.h>  void main( void ) {    FILE *stream;    char list[30];    int  i, numread, numwritten;     /* Open file in text mode: */    if( (stream = fopen( "fread.out", "w+t" )) != NULL )    {       for ( i = 0; i < 25; i++ )          list[i] = (char)('z' - i);       /* Write 25 characters to stream */       numwritten = fwrite( list, sizeof( char ), 25, stream );       printf( "Wrote %d items\n", numwritten );       fclose( stream );     }    else       printf( "Problem opening the file\n" );     if( (stream = fopen( "fread.out", "r+t" )) != NULL )    {       /* Attempt to read in 25 characters */       numread = fread( list, sizeof( char ), 25, stream );       printf( "Number of items read = %d\n", numread );       printf( "Contents of buffer = %.25s\n", list );       fclose( stream );    }    else       printf( "File could not be opened\n" ); }   Output  Wrote 25 items Number of items read = 25 Contents of buffer = zyxwvutsrqponmlkjihgfedcb   Stream I/O Routines  See Also   fwrite, _read

引用 4 楼 desertion76的回复:[quote=引用 3 楼 自信男孩的回复:][quote=引用 2 楼 desertion76 的回复:] [quote=引用 1 楼 自信男孩的回复:]我的建议是用feof 判断的同时也要判断fread的返回值，如果读到EOF，feof还没有为0，那么fread读到的数据长度也不会正确。这样就可以认为其读到的文件末尾 额额 不是读到EOF的时候feof不返回非零 是因为要读一次eof 所以多malloc了一块内存 在别的地方把链表打出来的时候就多了一块乱码。。。 之前试了在if判断之后把list free掉 但是好像还是有乱码。。。[/quote] 最后一个node,如果fread返回的值和预想的值小，那么就不要把该node加到链表里了。 如果还有乱码，应该是文件问题，跟读应该没关系了。[/quote] 刚刚洗了个脸。。。也不算是乱码吧 容我来个图[/quote] 额额 刚刚的图被吞了

存的时候是有4组数据 读的时候打出来了五行aaa

引用 3 楼 自信男孩的回复:[quote=引用 2 楼 desertion76 的回复:] [quote=引用 1 楼 自信男孩的回复:]我的建议是用feof 判断的同时也要判断fread的返回值，如果读到EOF，feof还没有为0，那么fread读到的数据长度也不会正确。这样就可以认为其读到的文件末尾 额额 不是读到EOF的时候feof不返回非零 是因为要读一次eof 所以多malloc了一块内存 在别的地方把链表打出来的时候就多了一块乱码。。。 之前试了在if判断之后把list free掉 但是好像还是有乱码。。。[/quote] 最后一个node,如果fread返回的值和预想的值小，那么就不要把该node加到链表里了。 如果还有乱码，应该是文件问题，跟读应该没关系了。[/quote] 刚刚洗了个脸。。。也不算是乱码吧 容我来个图

引用 2 楼 desertion76 的回复:[quote=引用 1 楼 自信男孩的回复:]我的建议是用feof 判断的同时也要判断fread的返回值，如果读到EOF，feof还没有为0，那么fread读到的数据长度也不会正确。这样就可以认为其读到的文件末尾 额额 不是读到EOF的时候feof不返回非零 是因为要读一次eof 所以多malloc了一块内存 在别的地方把链表打出来的时候就多了一块乱码。。。 之前试了在if判断之后把list free掉 但是好像还是有乱码。。。[/quote] 最后一个node,如果fread返回的值和预想的值小，那么就不要把该node加到链表里了。 如果还有乱码，应该是文件问题，跟读应该没关系了。

引用 1 楼 自信男孩的回复:我的建议是用feof 判断的同时也要判断fread的返回值，如果读到EOF，feof还没有为0，那么fread读到的数据长度也不会正确。这样就可以认为其读到的文件末尾 额额 不是读到EOF的时候feof不返回非零 是因为要读一次eof 所以多malloc了一块内存 在别的地方把链表打出来的时候就多了一块乱码。。。 之前试了在if判断之后把list free掉 但是好像还是有乱码。。。


Question: C语言中局部变量的值如何在另一个循环中使用

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

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

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

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

定义数组下标大于100000时就会出现以下的错误。

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


Question: 求大神帮忙看看，为什么这里需要输入EOF来结束程序？

引用 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就能输出对的结果了？这个操作起了什么样的作用呢？还望不吝赐教，谢谢

目测是scanf的问题

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


Question: 用calloc函数分配一块三字节连续内存，往内存中写一个整数占4个字节，按理会报错，为什么会编译成功？

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

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

你写一百一千一万都不报错，编译不会检查你的边界的  再说你哪里有写int了？


Question: 字符串指针

我和楼主想的一样，还有很多要学习啊。

谢谢各位的帮助！

#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执行到那里。

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

参考标准库strstr函数源代码


Question: sizeof()函数

sizeof(a)是一个指针大小。

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

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

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

因为：数组退化为指针  sizeof(a) 此时相当于 sizeof(int *)


Question: short*  char*区别

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

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

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语言指针与汇编内存地址-四.三维数组


Question: fwrite()和fread()

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

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); }

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


Question: 关于RGB颜色的排列

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

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


Question: 求助！！！最近在做毕设，大家帮我看看我的下位机程序错误出现在哪

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

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

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


Question: 判断httpd.conf里是否有字符串Indexes

费那事儿！if (0==system("grep 'Indexes' httpd.conf")) ...

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; }

遇到了什么问题？或者举几个例子


Question: 请教如何用C语言输出特殊字符

难者不会，会者不难！ #pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <conio.h> #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;     HFONT hfont;     wchar_t wc[7]={0x25a3,0x25a4,0x25a5,0x25a6,0x25a7,0x25a8,0x25a9};      system("color F0");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hfont = CreateFont(16,0,0,0,0,0,0,0,GB2312_CHARSET,0,0,0,0,"MS Mincho");     SelectObject(hdc,hfont);     TextOutW(hdc,10,10,wc,7);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     getch();     system("color 07");     system("cls");     ShowTheCursor();     return 0; }

引用 2 楼 adlay 的回复:先看你这些字符是哪个编码里面的, 然后把你的终端改成对应的编码, 再输出这些字符对应的编码值 我用的是VS2013 ，输出窗口就是控制台。请问具体怎么实现 ?

可以查找与之相对应的编码，即就是查找编码表。

应该是有对应的编码的吧，连abc这些字符都需要对应的编码才能输出，哪些特殊的符号更是需要编码

GBK 用 wchar输出 UTF8 用 char输出  这些特殊符号对应的编码 ，就只能google一下了

引用 5 楼 chey0408 的回复:[quote=引用 2 楼 adlay 的回复:] 先看你这些字符是哪个编码里面的, 然后把你的终端改成对应的编码, 再输出这些字符对应的编码值 我用的是VS2013 ，输出窗口就是控制台。请问具体怎么实现 ?[/quote]  windows控制台下基本很难实现，windows控制台对Unicode编码支持的并不好 而你的这些特殊符号可能也没有对应的GBK编码 所以要么，你可以以utf-8的编码格式，输出到文件 要么你可以在linux控制台下面输出   #include <iostream> #include <fstream> #include "StringTool.h"  using namespace std; using namespace common::tool;  int main(int argc, char* argv[]) { 	// 	部分特殊符号的Unicode编码表 	// 	2000 - 206F：常用标点(General Punctuation) 	// 	2070 - 209F：上标及下标(Superscripts and Subscripts) 	// 	20A0 - 20CF：货币符号(Currency Symbols) 	// 	20D0 - 20FF：组合用记号(Combining Diacritics Marks for Symbols) 	// 	2100 - 214F：字母式符号(Letterlike Symbols) 	// 	2150 - 218F：数字形式(Number Form) 	// 	2190 - 21FF：箭头(Arrows) 	// 	2200 - 22FF：数学运算符(Mathematical Operator) 	// 	2300 - 23FF：杂项工业符号(Miscellaneous Technical) 	// 	2400 - 243F：控制图片(Control Pictures) 	// 	2440 - 245F：光学识别符(Optical Character Recognition) 	// 	2460 - 24FF：封闭式字母数字(Enclosed Alphanumerics) 	// 	2500 - 257F：制表符(Box Drawing) 	// 	2580 - 259F：方块元素(Block Element) 	// 	25A0 - 25FF：几何图形(Geometric Shapes) 	// 	2600 - 26FF：杂项符号(Miscellaneous Symbols) 	// 	2700 - 27BF：印刷符号(Dingbats) 	// 	27C0 - 27EF：杂项数学符号 - A(Miscellaneous Mathematical Symbols - A) 	// 	27F0 - 27FF：追加箭头 - A(Supplemental Arrows - A) 	// 	2800 - 28FF：盲文点字模型(Braille Patterns) 	// 	2900 - 297F：追加箭头 - B(Supplemental Arrows - B) 	// 	2980 - 29FF：杂项数学符号 - B(Miscellaneous Mathematical Symbols - B) 	// 	2A00 - 2AFF：追加数学运算符(Supplemental Mathematical Operator) 	// 	2B00 - 2BFF：杂项符号和箭头(Miscellaneous Symbols and Arrows) 	wchar_t wsc[0xC00]; 	for (int i = 0; i < 0xC00; i++) 	{ 		wsc[i] = 0x2000 + i; 	}  	// Unicode -> Utf8 	wstring unicode(wsc); 	string utf8; 	utf8.resize(StringTool::UnicodeToUtf8Length(unicode)); 	StringTool::UnicodeToUtf8(utf8, unicode);  	// 输出到控制台 	cout << utf8 << endl;  	// 输出到文件 	ofstream file; 	file.open("1.txt", ios::out | ios::trunc); 	if (file) 	{ 		file.write(utf8.c_str(), utf8.length()); 		file.flush(); 		file.close(); 	}  	return 0; }

仅供参考：#pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <stdlib.h> #include <conio.h> #include <windows.h> 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;     HFONT hfont;     HBITMAP hbm;     HDC hdcBits;     BITMAP bm;      system("color F0");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hbm=LoadImage(0,"C:\\Windows\\Soap Bubbles.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);     if (hbm) {         hdcBits = CreateCompatibleDC(hdc);         GetObject (hbm, sizeof(BITMAP), &bm);         SelectObject(hdcBits,hbm);         BitBlt(hdc,200,10,bm.bmWidth, bm.bmHeight,hdcBits,0,0,SRCCOPY);         DeleteDC(hdcBits);         DeleteObject(hbm);     }     hfont = CreateFont(24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");     SelectObject(hdc,hfont);     SetTextColor(hdc,RGB(255,255,255));     SetBkMode(hdc,TRANSPARENT);     TextOut(hdc,210,30,"这个背景是泡泡",14);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     getch();     system("color 07");     system("cls");     ShowTheCursor();     return 0; }


Question: feek()函数

引用 7 楼 zhao4zhong1 的回复:fseek Moves the file pointer to a specified location.  int fseek( FILE *stream, long offset, int origin );  Function Required Header Compatibility  fseek <stdio.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  If successful, fseek returns 0. Otherwise, it returns a nonzero value. On devices incapable of seeking, the return value is undefined.  Parameters  stream  Pointer to FILE structure  offset  Number of bytes from origin  origin  Initial position  Remarks  The fseek function moves the file pointer (if any) associated with stream to a new location that is offset bytes from origin. The next operation on the stream takes place at the new location. On a stream open for update, the next operation can be either a read or a write. The argument origin must be one of the following constants, defined in STDIO.H:  SEEK_CUR  Current position of file pointer  SEEK_END  End of file  SEEK_SET  Beginning of file  You can use fseek to reposition the pointer anywhere in a file. The pointer can also be positioned beyond the end of the file. fseek clears the end-of-file indicator and negates the effect of any prior ungetc calls against stream.  When a file is opened for appending data, the current file position is determined by the last I/O operation, not by where the next write would occur. If no I/O operation has yet occurred on a file opened for appending, the file position is the start of the file.   For streams opened in text mode, fseek has limited use, because carriage return–linefeed translations can cause fseek to produce unexpected results. The only fseek operations guaranteed to work on streams opened in text mode are:   Seeking with an offset of 0 relative to any of the origin values.   Seeking from the beginning of the file with an offset value returned from a call to ftell.  Also in text mode, CTRL+Z is interpreted as an end-of-file character on input. In files opened for reading/writing, fopen and all related routines check for a CTRL+Z at the end of the file and remove it if possible. This is done because using fseek and ftell to move within a file that ends with a CTRL+Z may cause fseek to behave improperly near the end of the file.   Example  /* FSEEK.C: This program opens the file FSEEK.OUT and  * moves the pointer to the file's beginning.  */  #include <stdio.h>  void main( void ) {    FILE *stream;    char line[81];    int  result;     stream = fopen( "fseek.out", "w+" );    if( stream == NULL )       printf( "The file fseek.out was not opened\n" );    else    {       fprintf( stream, "The fseek begins here: "                        "This is the file 'fseek.out'.\n" );       result = fseek( stream, 23L, SEEK_SET);       if( result )          perror( "Fseek failed" );       else       {          printf( "File pointer is set to middle of first line.\n" );          fgets( line, 80, stream );          printf( "%s", line );        }       fclose( stream );    } }   Output  File pointer is set to middle of first line. This is the file 'fseek.out'.   Stream I/O Routines  See Also   ftell, _lseek, rewind 谢谢老鼠

到了结尾下边10个字节的地方

int fseek(FILE * stream, long offset, int whence); 1. SEEK_SET 从距文件开头offset 位移量为新的读写位置.  2. SEEK_CUR 以目前的读写位置往后增加offset 个位移量. 3. SEEK_END 将读写位置指向文件尾后再增加offset 个位移量. 当whence 值为SEEK_CUR 或 4. SEEK_END 时, 参数offset 允许负值的出现  0, 1, 2分别是SEEK_SET, SEEK_CUR, SEEK_END

引用 2 楼 adlay 的回复:如果你是写文件, 文件的长度会自动扩展, 中间的部分内容当做 0 在 UNIX 下, 利用这种方式可以制作文件空洞, 就是文件实际占用的磁盘空间比文件的大小更小. 老师您好，我已经了解了那几个词的定义。但是在文件结尾再向前移动10个字节，那个位置到哪里了呢？是到了结尾下边10个字节的地方，还是会自动回到开头在移动10个字节呢？

引用 3 楼 zhao4zhong1 的回复:VS IDE中，在不明白的符号上点鼠标右键，选转到定义。 老师您好，我已经了解了那几个词的定义。但是在文件结尾再向前移动10个字节，那个位置到哪里了呢？是到了结尾下边10个字节的地方，还是会自动回到开头在移动10个字节呢？

VS IDE中，在不明白的符号上点鼠标右键，选转到定义。


Question: 一个c语言小问题求助

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

引用 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;

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

引用 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)申请空间，这些地方的内存空间都是可读可写的。

引用 楼主 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"，这样算分配内存了么，程序也会报错，是什么原因？

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


Question: 求大神帮助解答函数的使用问题

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

在函数celsius里变量celsius未定义；函数名就是一个地址，不能充当变量； float celsius(float fahr) {     float val; val = 5.0 * (fahr-32) / 9.0; return val;  }另外，建议函数名和变量名不要重复。


Question: 小百求助，关于简单链表的建立与使用，求大神帮助，谢谢

注意边界条件

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


Question: c语言下标运算符是怎么运算的

引用 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] 那您觉得我写的是不是简单许多？？

引用 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] “不要向复杂低头！”

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

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

数组下标？！  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个字节里存放的值。*/ ｝


Question: 如何用C语言画椭圆

大神们学C语言用的什么编译工具？

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

#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; }

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); 	}

楼主如果想用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/


Question: C语言【一维数组】数列有序!  为什么在ACM上是%50的错误？

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

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

还是不行，哎，搞了好几天了

楼上谢谢帮我解决一部分问题，不过还是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; }

#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赋值到该位置，最后退出循环； 逻辑比较简单，就是向后移动一个位置，并且是整体移动


Question: 大神帮看看

我懂了，谢谢！

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

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

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

应该是取决于编译器吧，建议分两行写： p=i; p++;


Question: linux多进程和bind这个函数的问题

新的进程没有调用 bind 和 listen 。


Question: 小白求解 scanf无法读入数据以及得出答案是随机数问题

引用 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; 对于输入的是否正确，可以将输入后的数据先打印出来，这样对后面的功能也有一定的指导意义。

引用 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没有间隔 所以如果这样改能获取我想要的吗

本人将nextday函数中的  day  year month 都分别改成buf.day   buf.year   buf.month 后便可以读入数据  但是不知道原因   而且得出的答案莫名的大     才学c语言  求教知识点


Question: 请教一个BCD码(8421码)的问题

BCD难道不是0 ~ 9么。。0xA或者10是什么鬼

解决了.来人接分.

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

仅供参考：#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(); }

哪两种？    ？


Question: linux c语言编程提示：段错误 核心已转储   编译没有问题 在运行时会提示段错误  请教各位大神！

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

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

谢谢你的回答，成功解决！感谢感谢，

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

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

进程意外退出会在当前目录下产生‘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 列出当前设置的所有观察点。

问题： 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");   } 这是我改的版本，参考一下吧


Question: 关于pow函数的一系列疑问

#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，作为一个参考吧


Question: 求大佬们看看吧，设置断点我也没找出错误啊啊啊，水仙花题

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

引用 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位数也不行吗？

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

引用 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位数有效；可以对多位数有效； 大哥，题目只让输入三位数啊啊啊

sum+=a*a*a;   这里的a没有定义过


Question: 结构体输入出错

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];

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]);

#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里要加&；