关于c语言的经典问题问题

已有天涯账号?
这里是所提的问题,您需要登录才能参与回答。
"天涯问答"是天涯社区旗下的问题分享平台。在这里您可以提问,回答感兴趣的问题,分享知识和经历,无论您在何时何地上线都可以访问,此平台完全免费,而且注册非常简单。
关于c语言开方问题
用sqrt算一个数的二次方,结果显示sqrt: DOMAIN error   Floating  point error: Domain. 什么意思?
09-08-11 & 发布
sqrt是算一个数的平方根的,怎么你用来算二次方呢?程序贴上来比较好,否则不知道哪里的问题.不知道你用的是什么编译器,我用的VC6.0,你的代码运行能得到结果.但是你的代码风格不好.这个是你的代码:#include &stdio.h& void fun(int x,int k,int *p) {
int i,j,l,m;
for(i=x+1,j=0;j&k;i++)
 m=sqrt(i);  //这句实际上是最不应该这么用的,在程序中尽量应该避免不同类型的赋值.  for(l=2;l&=m;l++)
 {   if(i%l==0)    
 }  if(l&m)  {
  *p++=i;
  j++;
} }void main() { int a,b,n[1000],i;
scanf(&%d%d&,&a,&b);
fun(a,b,n);
for(i=0;i&b;i++)
 printf(&%d &,n[i]);
printf(&\n&);} 就这个问题我写一个程序给你:#include &stdio.h& int is_pri(int n) //判断n是否是一个素数{ for(i=2;i*i&=n;i++) //从2到n的平方根判断 {  if(! (n%i)) //出现了不是素数的条件   return 0; //返回信息:非素数 } return 1; //返回信息:素数}void fun(int x,int k,int *p) {
int i,j; i=x+1; j=0; //记录个数 while(j&k) {  if(is_pri(i))  {   *p++=i;   j++;  }  i++; }}void main() { int a,b,n[1000],i;
scanf(&%d%d&,&a,&b);
fun(a,b,n);
for(i=0;i&b;i++)
 printf(&%d &,n[i]);
printf(&\n&);}
请登录后再发表评论!非常基本关于C语言的问题_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
非常基本关于C语言的问题
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩14页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢10:26 提问
关于C语言的问题字符串+1问题
//给定一个字符串,把字符串内的字母转换成该字母的下一个字母,a换成b,z换成a,Z换成A,
// 如aBf转换成bCg,字符串内的其他字符不改变,给定函数,
//编写函数 void
Stringchang(const
char*input,char*output) 其中input是输入字符串,output是输出字符串
void stringchang(const char*input,char*output)
for(int i=0;i&255;i++)
output[i]=input[i]+1;
switch(input[i])
case'z':output[i]='a';
case'Z':output[i]='A';
if(input[i]=='\0')
void main()
char input[255];
char output[255];
gets(input);
stringchang(input,output);
puts(output);
为什么输出结果总是会乱码?
按赞数排序
修改后的代码:
void stringchang(const char*input,char*output)
for(int i=0;i&255&&input[i]!='\0';i++)
output[i]=input[i]+1;
switch(input[i])
case'z':output[i]='a';
case'Z':output[i]='A';
void main()
char input[255]={'\0'};
char output[255]={'\0'};
gets(input);
stringchang(input,output);
puts(output);
当input[i] = '\0' 时, 你忘记了 output[i] ='\0'
其他字符,包括'\0‘都没有处理(原样照抄),这里只做了转换,所以就这样了
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!
你的 output 内存没有清零:你只是赋值了前三个,后面的是随机的数值,所以输出就是乱码。
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐C语言中基础小问题详细介绍
字体:[ ] 类型:转载 时间:
这篇文章详细介绍了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语言的问题_百度知道
关于C语言的问题
for(i=0;i&=strlen(&sc);i++)
{ //&888+333*777&
if (isalnum(*ps))
stemp[j]=*
//如果+,-,*,/,\0
stemp[j]='\0';
我有更好的答案
&&=strlen(&sc);i++)&&&&/*遍历运算表达式字符串*/&&&&{&/*把数字放入stemp,stemp是存放操作数的字符串数组*/&//&&&&&&&&&//指向sc数的下一字符&&&&888+333*777&&&&&&&&&&&&&&&&&if&(isalnum(*ps))&&&&/*如果是数字*/&nbsp,-;&&\0';&&\0';&&&&&&k++;&&&&&/*存放操作数的字符串增加结束字符'j++;&&}&&&&&&&&ps++;&&&&&}else&&&&/*如果不是数字*/&&&&&&&&{&stemp);&&&&/*把字符串型的操作数转成整形,保存入整形数组n中*/&&&&&&/*整形数组n的下标k指向下一个位置,准备保存下一个操作数*/&&&&&&&&&&&j=0;&//下标归零;&&&&&&&&nbspfor(i=0;i&&&&&&&&{&&&&&&&&&&&&&stemp[j]=*&&nbsp,/;&&&nbsp,\0&&&&&&&&&&&nbsp,字符串操作数数组下标归0,准备接收新的操作数字符*/&&&nbsp,代表一次操作数获取完成*/&&&&&&&&&&&n[k]=atoi(&&/*j下标指向下一个位置*/&&&stemp[j]='&//如果+,*;&&&}这段代码的功能是把运算表达式里的操作数提取出来;&&&nbsp
采纳率:71%
来自团队:
为您推荐:
其他类似问题
您可能关注的内容
c语言的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 c语言必须掌握的问题 的文章

更多推荐

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

点击添加站长微信