- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章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,7 2、0-9数字转为字符 数字为m,则m+‘0'即为m的字符形式‘m' 3、小写字母变为大写字母 char c; 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 *cp; scanf("%s",cp); 以上是错误的。 可以改为: char cp[20]; scanf("%s",cp); 或者 char *cp,str[20]; cp=str; scanf("%s",cp); 总之,一定要先开辟空间,再接受字符串 18、c和c++中的返回值不能是数组,java返回值可以是数组 19、指针函数和函数指针 指针函数:int * function(); 函数指针:
复制代码 代码如下
int (*p) (); int max(int a,int b); p=max; int a=(*p)(2,3),
20、关于变量的生命周期 函数中定义的局部变量是不能作为返回值的,因为函数结束后,局部变量就被回收了。 21、结构体 结构体中可以嵌套结构体,但不能是其本身。且成员结构体的定义必须在主结构体之前。 22、malloc malloc函数位于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 { int bh; char *name; }; 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=red; int i=red;//值为0 。
26、类型标识符的重定义 c语言中用关键字typedef来声明新的类型名 typedef int INTEGER; INTEGER x,y; 等价于 int x , y; 又比如结构体定义:
复制代码 代码如下
typedef struct { int num; char name[10]; float score; }student; student stu1, stu2, *s,
另外,typedef只是进行类型重定义,只是为该类型命名一个别名,并不产生新的数据类型 27、位运算 包括(与、或、异或、取反)。 其中,位运算符进行运算时,数都是以补码形式参加运算,且符号位参与运算。 异或:相同为0,不同为1 a^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 * _ptr; int _cnt; char *base; int _flag; int _file; ......... }; 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,否则返回0 rewind(fp)用于定位,是文件的位置指针返回文件开头。 fseek(fp, offset, base)用来控制文件内部位置指针移动。base是位置移动的基准点。offset是偏移量 ftell(fp)用于获取位置指针的位置,相对于文件开头.
最后此篇关于C语言中基础小问题详细介绍的文章就讲到这里了,如果你想了解更多关于C语言中基础小问题详细介绍的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
至少在某些 ML 系列语言中,您可以定义可以执行模式匹配的记录,例如http://learnyouahaskell.com/making-our-own-types-and-typeclasses -
这可能是其他人已经看到的一个问题,但我正在尝试寻找一种专为(或支持)并发编程而设计的语言,该语言可以在 .net 平台上运行。 我一直在 erlang 中进行辅助开发,以了解该语言,并且喜欢建立一个稳
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
我正在寻找一种进程间通信工具,可以在相同或不同系统上运行的语言和/或环境之间使用。例如,它应该允许在 Java、C# 和/或 C++ 组件之间发送信号,并且还应该支持某种排队机制。唯一明显与环境和语言
我有一些以不同语言返回的文本。现在,客户端返回的文本格式为(en-us,又名美国英语): Stuff here to keep. -- Delete Here -- all of this below
问题:我希望在 R 中找到类似 findInterval 的函数,它为输入提供一个标量和一个表示区间起点的向量,并返回标量落入的区间的索引。例如在 R 中: findInterval(x = 2.6,
我是安卓新手。我正在尝试进行简单的登录 Activity ,但当我单击“登录”按钮时出现运行时错误。我认为我没有正确获取数据。我已经检查过,SQLite 中有一个与该 PK 相对应的数据。 日志猫。
大家好,感谢您帮助我。 我用 C# 制作了这个计算器,但遇到了一个问题。 当我添加像 5+5+5 这样的东西时,它给了我正确的结果,但是当我想减去两个以上的数字并且还想除或乘以两个以上的数字时,我没有
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 4 年前。 Improve th
这就是我所拥有的 #include #include void print(int a[], int size); void sort (int a[], int size); v
你好,我正在寻找我哪里做错了? #include #include int main(int argc, char *argv[]) { int account_on_the_ban
嘿,当我开始向数组输入数据时,我的代码崩溃了。该程序应该将数字读入数组,然后将新数字插入数组中,最后按升序排列所有内容。我不确定它出了什么问题。有人有建议吗? 这是我的代码 #include #in
我已经盯着这个问题好几个星期了,但我一无所获!它不起作用,我知道那么多,但我不知道为什么或出了什么问题。我确实知道开发人员针对我突出显示的行吐出了“错误:预期表达式”,但这实际上只是冰山一角。如果有人
我正在编写一个点对点聊天程序。在此程序中,客户端和服务器功能写入一个唯一的文件中。首先我想问一下我程序中的机制是否正确? I fork() two processes, one for client
基本上我需要找到一种方法来发现段落是否以句点 (.) 结束。 此时我已经可以计算给定文本的段落数,但我没有想出任何东西来检查它是否在句点内结束。 任何帮助都会帮助我,谢谢 char ch; FI
我的函数 save_words 接收 Armazena 和大小。 Armazena 是一个包含段落的动态数组,size 是数组的大小。在这个函数中,我想将单词放入其他称为单词的动态数组中。当我运行它时
我有一个结构 struct Human { char *name; struct location *location; int
我正在尝试缩进以下代码的字符串输出,但由于某种原因,我的变量不断从文件中提取,并且具有不同长度的噪声或空间(我不确定)。 这是我的代码: #include #include int main (v
我想让用户选择一个选项。所以我声明了一个名为 Choice 的变量,我希望它输入一个只能是 'M' 的 char 、'C'、'O' 或 'P'。 这是我的代码: char Choice; printf
我正在寻找一种解决方案,将定义和变量的值连接到数组中。我已经尝试过像这样使用 memcpy 但它不起作用: #define ADDRESS {0x00, 0x00, 0x00, 0x00, 0x0
我是一名优秀的程序员,十分优秀!