c语言猴子吃桃问题问题,

已解决问题
提问时间: 18:27:25
刚开始做个开头就遇到了几个错误。求高手告知如何修改。、 #include
#define bool int #define true 1 #define false 0 bool str_i(char **); void str_sort(const char *[], int); void swap( v...@_@刚始做遇几错误求高手告知何修改、 #include
#define bool int #define true 1 #define false 0 bool str_i(char **); void str_sort(const char *[], int); void swap( void **p1, void **p2); void str_out(char *[], int); const size_t BUFFER_LEN = 256; const size_t NUM_P = 50; int main(void) { char *pS[NUM_P]; int count = 0; printf(&\nEnter successive lines, pressing Enter at the end of& & each line.\njust enter to end.\n&); for(count = 0; count & NUM_P ; count++) if(!str_in(&pS[count])) str_sort( pS, count); str_out( pS, count); return 0; } (18) : error C2057: expected constant expression (18) : error C2466: cannot allocate an array of constant size 0 (18) : error C2133: 'pS' : unknown size (24) : warning C4018: '&' : signed/unsigned mismatch (25) : warning C4013: 'str_in' assuming extern returning int
浏览次数:1484
b[i][b[j][i]]; 步步拆理解 b[j][i&br/&&br/&
代表某int类型元素假设 b[j][i]=&br/&&br/&
b[i][ b[j][i] ] = b[i][1&br/&&br/&
代码二维数组某元素啊。楼主程序属于垃圾程序典型代表第输结1a[0][0]+t结;第二结2t+a[0][0]+a[1][1]结;第三4t+a[0][0]+a[1][1]+a[2][2]结经鉴定程序估计程序渣卖弄自编程技巧故意简单矩阵程序弄2B(意思 骂)@_@b[i]b[i][j] 这是你打的,代码里面是b[i][b[j][i]],看到没,多个中括号的 这样能看懂了吧?
答案创立者
以企业身份回答&
快速解决你的电商难题
店铺优化排查提升2倍流量
擅长&nbsp 店铺优化
您可能有同感的问题c语言问题,求高手解答-土地公问答
c语言问题,求高手解答
c语言问题,求高手解答
1根据注释填写程序所缺代码,然后运行程序,并回答相关问题:#include &int main(){char ch1='I',ch2='Q';int n1=1, n2=6;double d1=//定义两个指针变量pch_1、pch_2分别指向ch1、ch2___________(1)____________//定义两个指针变量pn_1、pn_2分别指向n1、n2___________(2)____________//定义两个指针变量pd_1、pd_2分别指向d1、d2___________(3)____________ //分别输出上述ch1、ch2、n1、n2、d1、d2六个变量的地址(即六个指针变量的值)___________(4)______________________(5)______________________(6)___________ //用间接存取方式输出ch1、ch2、n1、n2、d1、d2六个变量的值___________(7)______________________(8)______________________(9)___________ //用间接存取方式修改六个变量的值:char型大写变小写,int型减5,double型加10.0___________(10)______________________(11)______________________(12)___________ //再次用间接存取方式输出ch1、ch2、n1、n2、d1、d2六个变量的新值___________(13)______________________(14)______________________(15)___________ return 0;} 问题:(1)如何定义指针变量?怎样得到一个变量的地址并赋给指针变量?(2)连续定义的变量是连续存放吗?如何输出变量的地址(用十六进制数表示)?(3)怎样用间接方式存取变量?
(1)char *pch_1=&ch1, *pch_2=&ch2;(2)int *pn_1=&n1, *pn_2=&n2;(3)double *pd_1=&d1, pd_2=&d2;(4)printf(&%ld %ld\n&, pch_1, pch_2);(5)printf(&%ld %ld\n&, pn_1, pn_2);(6)printf(&%ld %ld\n&, pd_1, pd_2);(7)printf(&%c %c\n&, *pch_1, *pch_2);(8)printf(&%d %d\n&, *pn_1, *pn_2);(9)printf(&%f %f\n&, *pd_1, *pd_2);(10)*pch_1 += 32; *pch_2 += 32;(11)*pn_1 -= 5; *pn_2 -= 5;(12)*pd_1 += (13)printf(&%c %c\n&, *pch_1, *pch_2);(14)printf(&%d %d\n&, *pn_1, *pn_2);(15)printf(&%f %f\n&, *pd_1, *pd_2);提问者评价谢谢!
这是基本的语法啊,先翻书看看吧~不懂的再问。
其它类似问题
其它人正在问的问题已解决问题
c语言问题,%f的使用
%f%f有什么区别
浏览次数:877
用手机阿里扫一扫
最满意答案
如果出现在printf(&%f,%f&,a,b);输出语句中,输出时有&,&号。如:1.2,3.7如果在scanf(&%f,%f&,&a,&b)输入语句中,说明两个数以&,&号分隔。输入格式为:1.2,3.7&&&如果是%f%f,那么输入时以空格为分隔。
答案创立者
以企业身份回答&
正在进行的活动
生意经不允许发广告,违者直接删除
复制问题或回答,一经发现,拉黑7天
快速解决你的电商难题
店铺优化排查提升2倍流量
擅长&nbsp 店铺优化
您可能有同感的问题
扫一扫用手机阿里看生意经
问题排行榜
当前问题的答案已经被保护,只有知县(三级)以上的用户可以编辑!写下您的建议,管理员会及时与您联络!
server is ok你必须知道的495个C语言问题,学习体会四 - Stultz_Lee - 博客园
随笔 - 26, 文章 - 0, 评论 - 0, 引用 - 0
本文,我们来学习下指针,这是个梦魇啊。无数次折磨着C语言学习者,无数次的内存泄露,无数次的访问失败,无数次的越界溢出,
这些错误造就的仅仅是一个 跟随者,真正的优秀者必须要正视语言的局限,同时在最大限度的发挥它的优势,而发挥C语言优势的正是指针
造物者的错
int i =<span style="color: #;
int*p =&i;
*p =<span style="color: #;
以上简单的代码,很不幸的混乱了指针与指针的解引用,但是 ,这是最正宗的C语言语法,我初学C指针的时候,经常把* 当作指针的代名词,所以很当然的把*出现的地方当作 指针,所以我分不清上面代码的差异,所以我可能会写出像
*p = malloc(<span style="color: #);
这样的代码,因此,请记住,指针变量在这里就是p,而不是*p,当需要操作指针指向的内存时,才需要使用*来作为间接操作符。
这样的误导其实是C语言语法的眼球错误,因为,我们经常把以上代码写成这样:
char*p =(char*)malloc(<span style="color: #);
而这样写是完全正确的。
字符串?指针?数组?
char*p1 ="hello world";
char*p2 ="hello world";
char p3[]="hello world";
char p4[]={'h','e','l','l','o',' ','w','o','r','l','d'};
额,少有人 弄懂了 以上三者的差异:怪只怪老是有人告诉我们 数组和指针没多大区别,怪只怪C语言里字符串这个东西 太难弄清晰,怪只怪我们大多数时候都不知道字符串到底是怎么结束的,'\0'是个什么东西,怪只怪,C语言里很多字符串操作api都是不安全的。这样一来,我们估计要一辈子和C字符串打仗了,标准的C字符串实在不是个东西啊。
发了一顿牢骚,我们还是回到代码本身,
printf("p1 %s p2\n",p1 == p2 ?"equal":"not equal");
printf("p1 %s p3\n",p1 == p3 ?"equal":"not equal");
输出什么呢?
p1 equal p2
p1 not equal p3
这说明 p1 与p2 相等,p1与p3不等,这是为什么?
我们知道,"hello world"作为字符串是一个字面值常量,其存储在常量区,只有一份实体,所以凡是指向其位置的指针都是固定的值。而p3指代的是一个局部的字符数组,p3作为数组名称,其表示的是一个数组的首地址,而p1或者p2实际上是指针变量,这个指针变量就是字符常量的地址,所以p1和p2的值是一样的,而p3与二者不同就不足为怪了。
而p4就不值得一提了,它很明确的告诉你,这是一个数组,但是和p3比起来,它又少了 一个'\0',所以,通过sizeof计算,p3 为12,而p4仅仅是11,这是p3与p4的最大不同,但是最大的相同是,他们都是数组(首地址)。
最后,来总结下,指针和数组的区别:
数组是一个由(同一类型)连续元素组成的预先分配的内存块,指针是一个对任何位置的(特定类型的)数据元素的引用。
数组自动分配空间,但是不能重分配或者改变大小,指针必须被赋值以指向分配的空间(可能使用malloc),但是可以随意重新赋值(即指向不同的对象)。同时除了表示一个内存块的基地址外,还有许多其他用途。比如,可以作为动态分配的数组的首地址,对多个相似变量的一般访问,函数传参,遍历数组等。
话分两头,指针与数组所谓的等价,使用malloc分配的内存块的指针通常可以被当作一个数组,也可以使用[ ]来引用。但是 你懂的,当使用sizeof时,二者还是有差别的,不然,怎么说C语言让人烦呢,什么话都是 编剧说好的。
以上,看完 如果 你更糊涂了,请出门左转 ,把数组和指针当 不同的东西吧。
指针作为参数参数 ,本质上是在(模拟)引用传参,这在C++中发扬光大了,现在在C中,我们姑且这么认为,比如当我们需要一个数组作为函数参数时,传它的首地址,需要传一个结构体时,传它的地址,如此,都可以当作传的数组或者结构体的引用。因此,可以说,引入引用这个思想概念,我们可以很好的清楚函数参数的 指针命题:
数组指针参数
事实上 不需要数组指针这么个东西,我们直接将一维数组的首地址传给函数,就可以了
#include&stdio.h&
#include&stdlib.h&
void printTest(int a[],int lenght)
for(int i =<span style="color: #; i&++i)
printf("%d ",a[i]);
printf("\n");
int main()
int a[<span style="color: #]={<span style="color: #,<span style="color: #};
printTest(a,<span style="color: #);
可以这么说,作为函数参数,a就是a[2]数组的 引用名,所以,操作的就是a[2]数组本身。换用常规的理解,一个数组的数组名是该数组的地址,所以在函数参数中,直接退化为指针了,虽然,我的函数参数就是a[] ,但是其本质应该是int *a。
再看一段:
二维数组的例子,希望你不要骂娘,或者觉得我有病
#include&stdio.h&
#include&stdlib.h&
void printTest1(char(*a)[<span style="color: #],int lenght)
int i =<span style="color: #;
for(;i &++i)
printf("%s\n",*(a+i));
printf("\n");
void printTest2(char*a[],int lenght)
int i =<span style="color: #;
for(;i&i++)
printf("%s\n",*(a+i));
printf("\n");
int main(int argc,char* argv[])
char a1[<span style="color: #][<span style="color: #]={"hello","world"};
char*a2[<span style="color: #]={"hello2","world2"};
char(*p1)[<span style="color: #]= a1;
char** p2 = a2;
printTest1(p1,<span style="color: #);
printTest2(p2,<span style="color: #);
试试使用printTest2 打印p1或者相反,你就应该明白为何我这么多次一举了。
代码中a1与a2的区别,如果你懂了,那本文就达到它的目的了。这正说明了数组与指针的天囊之别。
未完待续..C语言中基础小问题详细介绍
转载 &更新时间:日 16:13:10 & 作者:
这篇文章详细介绍了C语言中基础小问题,有需要的朋友可以参考一下
1、printf格式输出函数 如果格式控制说明项数多于输出表列个数,则会输出错误数据;如果输出表列个数多于格式控制说明数,则多出数不被输出。%md,m指的是输出字段的宽度。如果输出字段位数小于m,则左端以空格补齐,若大于m,则按照实际位数输出。%-md,基本同上,只不过不同之处在于,空格在右端补齐printf参数可以是常量,变量或表达式,VC++ 6.0中采用从右向左顺序求值,从左向右输出如 代码如下:int x = 5;&printf("%4d%4d%4d", x, ++x, ++x);输出的是7,7,6. 而不是5,6,7注意,不同的编译器可能输出不同结果,直接用gcc编译结果为7,7,72、0-9数字转为字符数字为m,则m+‘0'即为m的字符形式‘m'3、小写字母变为大写字母 c为小写字母,则c-'a'+'A'即为对应的大写字母4、switch如果找到匹配的case入口,则执行后面的语句,执行完语句之后,并不像if语句那样退出,如果没有遇到break语句,将逐条执行后面所有的case语句,不再进行条件判断。case入口后面的语句可以是一句,也可以是多句,并且不需要大括号。5、字符数组存储字符串当char str[5]=new {"china"};时,程序会出问题,输出的时候会在china后带乱码,这是因为china字符串后还有一位'\0',因此应该给str数组多一位。即char str[6]=new {"china"};且'\0'只表示字符串的结束,并不会输出。scanf("%s",str);不能存入空格,因为认为空格代表字符串的结束。gets(str);可以在字符串中间加入空格。puts(str);在输出字符串后自动加入换行6、字符串操作函数字符串拷贝函数:strcy(str1,str2); 将字符串str2拷贝到str1中。字符串连接函数:strcat(str1,str2); 将str2连同'\0'一起连接到str1的最后一个字符(非'\0')后面,结果放在str1中。字符串比较函数:strcmp(str1,str2); 比较str1和str2的大小,如果str1==str2,则返回0;如果str1&str2,则返回正整数;如果str1&str2,则返回负整数。字符串长度函数:strlen(str); 返回字符串str的实际长度,不包括末尾的'\0'。7、函数的参数和单向值传递函数的参数分为实参和形参。形参出现在函数定义中,在整个函数体中使用,离开函数体则不能使用。实参出现在主调函数中,进入被调函数后,实参不能被使用。形参只有被调用时才被编译系统分配内存单元,在调用结束时候,编译系统即刻释放所分配的内存单元,因此形参只在函数内部有效,函数调用结束返回主调函数后则不能再使用;单向传值:只能把实参的值传递给形参,不能把形参的值反向传递给实参,叫做单向值传递。因此,函数调用过程中,形参的值发生改变,实参的值不会改变8、数组作为参数数组名可以作为函数实参,这时候形参可以是数组或者指针。且形参是一维数组时候可以不指定长度。形参是二维数组时候,第一维大小可以省略,要指定第二维的大小。9、变量的存储方式(1)局部变量局部变量在每次函数调用时,系统会在内存的动态存储区为他们重新分配内存单元,随着函数的频繁调用,某个变量的存储位置会随着程序的运行不断变化,所以未赋值的局部变量的值是不确定的。函数中的局部变量不能作为返回值,因为函数结束后,局部变量要被回收。(2)static类型静态变量在编译的时候被分配内存、赋初值,并且只会被赋初值一次。未赋初值的静态变量,系统自动赋初值0(或'0')。静态变量在内存静态存储区占用固定的内存单元。即使它所在的函数调用结束,也不会释放存储单元,其值也会继续保留,下次调用,会继续使用该值。静态变量分为静态局部变量和静态全局变量,静态全局变量就是定义在函数体外的静态变量,静态局部变量就是定义在函数体内的静态变量。如下: 代码如下:#include&stdio.h&void f(){&&& static int a=0; //编译时被赋初值,且整个过程只被赋初值一次&&& ++a;&&& printf("%-2d",a);}main(){&&& f();&&& f();&&& f();}以上程序的输出结果为1 2 3因为对static变量赋初值是在编译时完成,而且只赋值一次,之后在调用函数不会执行赋初值操作,因此输出1 2 3 ;若去掉static关键字,那么结果就会变为1 1 1 ;由此看出,函数反复调用多次,局部变量每次都会被赋初值,而静态变量只是在第一次被调用的时候赋初值。此处特变注意:java中是没有静态局部变量的,只会有针对类的静态全局变量。(3)寄存器类型定义形式: register 数据类型 变量名;寄存器类型局部变量的作用域、生存期与局部变量相同。寄存器的个数有限,寄存器的存储数据位数有限,所以寄存器类型的变量不能太多,而且有整型变量和字符型变量才能被定义为寄存器类型的局部变量。现在的优化系统可以自动的判断把相关变量存到寄存器中。(4)外部变量10、编译预处理#include&文件名&和#include"文件名"的区别是:使用尖括号时,编译预处理程序只在系统指定的文件夹中寻找;而使用双引号,编译预处理程序首先在当前文件所在的文件夹中寻找,如果找不到,则在系统指定的文件夹中再寻找。11、&和*优先级都属于第二级,从右向左运算12、*与++、--运算符都属于第二级,从右向左计算*p++& 等价于& *(p++)*++p& 等价于& *(++p)13、[& ]和*[& ]优先级高于*13、二维数组的行地址和列地址int a[2][2]={1,2,3,4};则a为首地址,第一行首地址;*a和a[0]都是第一行第一个元素的地址a+1为第二行行地址*(a+1)为第二行第一个元素地址,a[1]也为第二行第一个元素地址14、指向数组的指针变量(数组指针)int *(p) [4];表示一个指向含有4个int元素的数组的指针。(1)p指向一维数组的首行地址 代码如下:main(){&&& int a[2]={1,2};&&& int (*p)[2];&&& p=&a;//p是指向数组的指针,即行指针,因此要用&a给其赋值,&a为数组地址&&& printf("%d\n",**p);//取第一个元素,其中p为行地址,*p为元素地址,**p为元素值&&& printf("%d\n",*(*p+1));//取第二个元素&&& //也可以如下取值&&& printf("%d\n",(*p)[0]);//(*p)可以取代a&&& printf("%d\n",(*p)[1]);}(2)p指向二维数组的首行地址 代码如下:main(){&&& int a[2][2]={1,2,3,4};&&& int (*p)[2];&&& p=a;//p指向二维数组的首行地址&&& printf("%d\n",**p);//*p是元素的地址,**p则为元素内容&&& printf("%d\n",*(*(p+1)+1));}15、指针数组int *p[4];表示一个数组中含有4个int型指针。char *p[4];表示一个数组中含有4个char型数组,或则4个字符串16、二维数组中的各个地址int a[2][3];则a为首行地址,*a为首行第一个元素地址,**a为首行第一个元素的值a+1为第二行地址,*(a+1)为第二行第一个元素的地址,**(a+1)为第二行第一个元素的值*(a+1)与a[1]等价:都代表第二行第一个元素的地址例子: 代码如下:main(){&&& int a[2][2]={1,2,3,4};&&& printf("a=%d\n",a);&&& printf("*a=%d\n",*a);&&& printf("**a=%d\n",**a);&&& printf("*a+1=%d\n",*a+1);&&& printf("a+1=%d\n",a+1);&&& printf("a[1]=%d\n",a[1]);&&& printf("a[1]+1=%d\n",a[1]+1);&&& printf("*a[1]=%d\n",*a[1]);}17、字符指针变量在接受输入字符串时,必须先开辟存储空间char *scanf("%s",cp);以上是错误的。可以改为:char cp[20];scanf("%s",cp);或者char *cp,str[20];cp=scanf("%s",cp);总之,一定要先开辟空间,再接受字符串18、c和c++中的返回值不能是数组,java返回值可以是数组19、指针函数和函数指针指针函数:int * function();函数指针: 代码如下:int (*p) ();int max(int a,int b);p=int a=(*p)(2,3);20、关于变量的生命周期函数中定义的局部变量是不能作为返回值的,因为函数结束后,局部变量就被回收了。21、结构体结构体中可以嵌套结构体,但不能是其本身。且成员结构体的定义必须在主结构体之前。22、mallocmalloc函数位于stdlib.h中,函数原型为void * malloc(unsigned size);eg: struct student *p=(struct student *)malloc(sizeof(struct student));因为malloc返回的是一个void类型的指针,所以要强制转换。23、free该函数原型为void& free(void * ptr)释放有指针ptr指向的动态分配的内存空间。为保证动态存储区的有效利用,当某个存储空间不再使用时,就应该及时释放它。24、结构体和共用体(1)结构体结构体可以作为函数的参数和返回值。结构体只有在初始化的时候才能直接用大括号{}形式赋值;当先声明,后赋值时候,就只能单个元素赋值,不能再用大括号形式了。这个跟数组的赋值类似。举例如下 代码如下:struct student{&&&&&& char *};struct student stu={1,'typ'};//是正确的但是下面的是错误的 代码如下:struct student stu;stu={1,"typ"};//是错误的此时这能stu.bh=1;stu.name="typ"(2)共用体共用体不能作为函数的参数和返回值共用体不能同时存放,每一时刻只能存放一个成员,以最后一次存放的成员为有效成员。共用体的大小是最大元素所占用的大小;共用体可以出现在结构体类型中,反之,结构体也可以出现在共用体的类型中25、枚举类型 代码如下:enum color {red,green,blue};enum color c=int i=//值为026、类型标识符的重定义c语言中用关键字typedef来声明新的类型名typedef int INTEGER;INTEGER x,y;等价于int x ,又比如结构体定义: 代码如下:typedef struct{&&&&&& char name[10];&&&}student& stu1, stu2, *s;另外,typedef只是进行类型重定义,只是为该类型命名一个别名,并不产生新的数据类型27、位运算包括(与、或、异或、取反)。其中,位运算符进行运算时,数都是以补码形式参加运算,且符号位参与运算。异或:相同为0,不同为1a^a=0;a^0=a;a^~a=1;此处可以用异或来实现两数的交换a=a^b;b=b^a;a=a^b;这样避免引入临时变量28、移位运算(1)a&&b,表示a的二进制值左移b位(2)a&&b,表示a的二进制值右移b位移位运算具体实现有3种形式:(1)循环移位:移入的位等于移出的位(2)逻辑移位:移出的位丢失,移入的位取0(3)算术移位:移出的位丢失,左移入的位取0,右移入的位取符号位,符号位保持不变C语言的移位运算与具体的C编译系统有关,如VC++6.0采用的是算术移位注意:移位操作并不会改变原操作数的值。例如a&&2运算后,a的值保持不变,除非通过赋值a=a&&2来改变a的值。29、文件(1)C语言中文件是字节流文件.(2)C中为用户定义的文件类型是FILE,FILE文件类型是结构体类型,FILE结构是用关键字typedef定义出的一种结构。 代码如下:struct& _iobuf{char * _int _char *int _int _.........};typedef struct& _iobuf& FILE;(3)文件打开与关闭文件指针 = fopen("文件路径\\文件名", "文件操作方式");操作方式分为r,w,a,r+,w+,a+如果fopen打开失败,则返回NULL如果缓冲区未满512B,那么不会写到磁盘中,万一程序异常终止,则缓冲区中数据丢失,导致文件不完整。只有对打开文件执行关闭操作时,才能强制把缓冲区中不足512B的数据写到磁盘文件中,保证文件的完整性。fclose函数用来关闭文件fclose(文件指针);返回值是一个整数值,若为0,表示正常关闭,否则表示无法正常关闭文件。(4)文件的输入和输出读写一个字符:char fgetc(文件指针);EOF fputc(字符,文件指针)读写一个字符串:fgets(字符串s,读入字符个数n,文件指针)---&在中途遇到\n或者EOF停止,读n-1个字符,在末尾加'\0';fputs(字符串,文件指针)---&字符串的结束标记不会写入文件格式化读写:fscanf(fp, "%d%s", &i, s)---&从文件中读取数据保存到变量;fprintf(fp, "%d%c", j, c)---&按指定格式向文件写入数据成块读写:fread(buffer,size,count,fp)和fwrite(buffer,size,count,fp)buffer是一个指针,fread()中表示存放“输入数据”的变量首地址,fwrite()中表示存放“输出数据”的变量首地址size表示数据块的字节数count表示数据块个数fp文件指针返回值都是count值(4)其他文件操作的函数feof(fp)判断文件的末尾标志,到达末尾返回1,否则返回0rewind(fp)用于定位,是文件的位置指针返回文件开头。fseek(fp, offset, base)用来控制文件内部位置指针移动。base是位置移动的基准点。offset是偏移量ftell(fp)用于获取位置指针的位置,相对于文件开头。
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 c语言编译器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信