熟悉c语言(简单入门)

一、简单介绍

  C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。它有以下特点:简洁紧凑、灵活方便、运算符丰富、数据类型丰富、表达方式灵活实用、允许直接访问物理地址,对硬件进行操作、生成目标代码质量高,程序执行效率高、可移植性好、表达力强;但同时封装性及语法严格限制的情况不如其他语言好。 个人认为,在进行算法的练习和设计时,c语言是一个不错的选择,占用内存少,更接近于底层,也很容易实现各种数据结构。

二、基础知识

1.基本输入输出

scanf函数

  定义在头文件stdio.h中,它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。

函数原型:

int scanf(const char *format,...);

其调用形式为: scanf("<格式说明字符串>",<变量地址>);变量地址要求有效,并且与格式说明的次序一致。

scanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF。

如:

scanf("%d %d",&a,&b);

如果a和b都被成功读入,那么scanf的返回值就是2。

格式说明符
转换字符(就是%后跟的部分)
c 读单字符
d 读十进制整数
i 读十进制、八进制、十六进制整数
e 读浮点数
E 读浮点数
f 读浮点数
g 读浮点数
G 读浮点数
o 读八进制数
s 读字符串
x 读十六进制数
X 读十六进制数
p 读指针值
n 至此已读入值的等价字符数
u 读无符号十进制整数
[ ] 扫描字符集合
% 读 % 符号(百分号)
附加格式说明字符表修饰符说明
L/l 长度修饰符 输入"长"数据
h 长度修饰符 输入"短"数据
W 整型常数 指定输入数据所占宽度
* 表示本输入项在读入后不赋值给相应的变量

选择性的扫描输入例子:

#include<stdlib.h>
#include<stdio.h>

int main(){
   int a,b,c;
   scanf("%d,%d,%d",a,b,c);         //输入格式为a,b,c
   printf("%d %d %d",a,b,c);         //输出格式为a b c(中间有空格)
   return 0;
}

printf函数

printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。

printf()函数的调用格式为: printf("<格式化字符串>", <参量表>)。

参数使用方法与scanf函数类似

2.for循环

编写for循环时,需要注意先声明初始变量,再在括号内使用(与c++中不同),可采用以下形式

int i;

for(i=0;i<size;i++){

  // TO DO

}

使用下面这种形式会出错:

3.常用头文件

#include<stdlib.h>      //stdlib 头文件即standard library标准库头文件。

  stdlib.h里面定义了五种类型、一些宏和通用工具函数。 类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t; 宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等等; 常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。 具体的内容你自己可以打开编译器的include目录里面的stdlib.h头文件看看。

#include<stdio.h>      // 包含了一些输入输出函数,如scanf,printf等

4.字符串

可以用字符数组来表示字符串,如

#include<stdlib.h>
#include<stdio.h>

int main(){
    char str[30]="Hello World";  // 仅在初始化时使用
    printf(str);
    return 0;
}

可以用strcp函数来复制获取输入的字符串

#include <stdio.h>
#include <string.h>

int main ()
{
   char str1[12] = "Hello";
   char str2[12] = "World";
   char str3[12];
   int  len ;

   /* copy str1 into str3 */
   strcpy(str3, str1);
   printf("strcpy( str3, str1) :  %s\n", str3 );

   /* concatenates str1 and str2 */
   strcat( str1, str2);
   printf("strcat( str1, str2):   %s\n", str1 );

   /* total lenghth of str1 after concatenation */
   len = strlen(str1);
   printf("strlen(str1) :  %d\n", len );

   return 0;
}

输出

strcpy( str3, str1) :  Hello
strcat( str1, str2):   HelloWorld
strlen(str1) :  10

  

将数字转化为字符串

a.能将整数转换为字符串而且与ANSI标准兼容的方法是使用sprintf()函数

#include<stdio.h>
# include <stdlib. h>

void main (void);
void main (void)
{
    int num = 100;
    char str[25];
    sprintf(str, " %d" , num);
   printf ("The number ‘num‘ is %d and the string ‘str‘ is %s. \n" ,
                          num, str);
}

b.用fcvt()函数将浮点型值转换为字符串的一个例子:

# include <stdio. h>
# include <stdlib. h>
void main (void);
void main (void)
{
    double num = 12345.678;
    char * sir;
    int dec_pl, sign, ndigits = 3; /* Keep 3 digits of precision. * /
    str = fcvt(num, ndigits, &dec-pl, &sign); /* Convert the float
                                                 to a string. * /
    printf("Original number; %f\n" , num) ;  /* Print the original
                                                 floating-point
                                                    value. * /
    printf ("Converted string; %s\n",str);    /* Print the converted
                                                string‘s value. * /
    printf ("Decimal place: %d\n" , dec-pi) ; /* Print the location of
                                                 the decimal point. * /
    printf ("Sign: %d\n" , sign) ;            /* Print the sign.
                                                 0 = positive,
                                                 1 = negative. * /
}

fcvt()函数和itoa()函数有数大的差别。fcvt()函数有4个参数:第一个参数是要转换的浮点型值;第二个参数是转换结果中十进制小数点右侧的位数;第三个参数是指向一个整数的指针,该整数用来返回转换结果中十进制小数点的位置;第四个参数也是指向一个整数的指针,该整数用来返回转换结果的符号(0对应于正值,1对应于负值)。

5.数组,如何使用二维或高维数组,如何用它来表示矩阵,如何用它来表示图

1、二维数组的概念

  在C语言中,二维数组实际上是一种特殊的一维数组,它的每个元素也是一个一维数组。因此,二维数组下标形式正确写法如下:int arrays[i][j]。数组元素是按照行顺序存储的,因此当按存储顺序访问树时,最右边的数组下标(列)变化的最快。

2、二维数组作为函数参数

  规定:如果将二维数组作为参数传递给函数,那么在函数的参数声明中必须指明数组的列数,数组的行数没有太大关系,可以指定也可以不指定。因为函数调用时传递的是一个指针,它指向由行向量够成的一维数组。因此二维数组作为函数参数正确写法如下所示:

void Func(int array[3][10]); 

void Func(int array[ ][10]);

因为数组的行数无关紧要,所以还可以写成如下形式:

void Func(int (*array)[10]);  注意*array需要用括号括起来。

这种形式的声明参数是一个指针,它指向具有10个元素的一维数组。因为[]的优先级比*的优先级高,故*array必须用括号括起来,否则变成了

void Func(int *array[10]);

这时候参数相当于是声明了一个数组,该数组有10个元素,其中每个元素都是一个指向整型对象的指针。

但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的:

 void Func(int array[ ][ ]);

  因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多 少列,不能只指定一维而不指定第二维,下面写法是错误的:

void Func(int array[3][ ]);

  实参数组维数可以大于形参数组,例如形参数组定义为:

void Func(int array[3][10]);

代码示例:

容易出现的错误写法:

#include <cstdio>
void print(int *arr[3])
{
    printf("%d\n",arr[0][0]);
}

int main()
{
    int arr[2][3] = {1,2,3,4,5,6};
    print(arr);
    return 0;
}

正确写法:

 1 #include <cstdio>
 2 void print(int (*arr)[3])     //用括号将指针括起来
 3 {
 4     printf("%d\n",arr[0][0]);
 5 }
 6
 7 int main()
 8 {
 9     int arr[2][3] = {1,2,3,4,5,6};
10     print(arr);
11     return 0;
12 }

6.动态分配空间问题,如何分配,是否需要指定大小

动态数组:

int *arr=(int *)malloc(size*sizeof(int)) ;                      //其中size是一个数值大小,你可以根据实际需要的大小而定

7.应注意与c++有哪些不同

不能在c++中编译的c程序

7.1 在c++中,在函数声明前调用该函数会产生编译错误。但在c中,可能会正常编译。

#include<stdio.h>
int main()
{
   foo(); // foo() is called before its declaration/definition
} 

int foo()
{
   printf("Hello");
   return 0;
}

7.2 在c++中,将常指针指向一个常量会产生编译错误,但在c中是允许的。

#include <stdio.h>

int main(void)
{
    int const j = 20;

    /* The below assignment is invalid in C++, results in error
       In C, the compiler *may* throw a warning, but casting is
       implicitly allowed */
    int *ptr = &j;  // A normal pointer points to const

    printf("*ptr: %d\n", *ptr);

    return 0;
}

7.3 在c中,void 指针可以直接赋值给其他类型指针,如int *, char *;但在c++中是不允许的。

#include <stdio.h>
int main()
{
   void *vptr;
   int *iptr = vptr; //In C++, it must be replaced with int *iptr=(int *)vptr;
   return 0;
}

7.4 在c++中常量必须要被初始化,但在c中是可选的。

#include <stdio.h>
int main()
{
    const int a;   // LINE 4
    return 0;
}

7.5 c++特定的关键字在c中是允许的。虽然这样,但实际编程过程中,应尽量避免这些问题。

#include <stdio.h>
int main(void)
{
    int new = 5;  // new is a keyword in C++, but not in C
    printf("%d", new);
}

7.6 c++有更严格的类型检查。例如,下面的程序在c中可以通过,但不能在c++中编译。

#include <stdio.h>
int main()
{
    char *c = 333;
    printf("c = %u", c);
    return 0;
}
时间: 2024-11-05 02:37:44

熟悉c语言(简单入门)的相关文章

R语言简单入门

运行R语言可以做哪些事? 1.探索性数据分析(将数据绘制图表) 2.统计推断(根据数据进行预测) 3.回归分析(对数据进行拟合分析) 4.机器学习(对数据集进行训练和预测) 5.数据产品开发 R语言包的使用 1.安装包 install.packages()//安装https://cran.r-project.org/ install_github()//从github安装 2.使用包 加载包library(caret)//括号为包的名字 data()//R自带的数据集(针对导入的包) ?func

Java的多线程 简单入门

Java的多线程 简单入门 首先可以先搞清楚什么是程序.进程.线程,以及它们之间的关系: 定义: 一 程序只是一组指令的有序集合,它是静态的 二 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位: 三 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),一个线程可以创建和撤销另一个线程: 进程与线程区别与联系 (

C语言 Socket入门示例1—— 单工通信(客户端向服务器发送消息)

如果对Windows API不太熟悉.对TCP/IP通信协议不太熟悉,或者对C语言本身不太熟悉的话,学习Socket会有点难受的.以前学习操作系统的时候,被API吓怕了,很多莫名其妙的API有着多如牛毛的参数,令人费解.学习计算机网络的时候,又有那么多的协议,并且很多协议本身比较复杂,什么三次握手建立连接,什么四次握手释放链接等等,也没有学得特别透彻.更遗憾的是,以前学C的时候,误以为自己把C学会了,误以为C就那么几个头文件而已,就一个黑框子而已. 现在,经过一段时间的痛苦磨练,又有了一些新的认

IOS开发语言Swift入门连载---闭包

IOS开发语言Swift入门连载-闭包 闭包是自包含的函数代码块,可以在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的 lambdas 函数比较相似. 闭包可以捕获和存储其所在上下文中任意常量和变量的引用. 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包.Swift 会为您管理在捕获过程中涉及到的所有内存操作. 注意: 如果您不熟悉捕获(capturing)这个概念也不用担心,您可以在 值捕获 章节对其进行详细了

零基础学习C语言如何入门

C语言同C++.Python等都是通用性的编程语言,它们不针对某一个特定的方向,能做的事情很多.C语言主要用于底层开发,Windows.Linux.Unix 等操作系统的内核90%以上都使用C语言开发,开发硬件驱动,让硬件和操作系统连接起来,这样用户才能使用硬件.程序员才能控制硬件. 借用我一个朋友的名言:"现在的程序员,不掌握好几门语言都不好意思跟别人打招呼."就目前的企业的岗位设置来说,只会C语言的话(当然,能达到深究算法.操作系统.数据库.网络协议的C语言工程师除外),基本上是找

R语言(入门小练习篇)

问题: 一组学生参加了数学.科学和英语考试.为了给所有的学生确定一个单一的成绩衡量指标,需要将这些科目的成绩组合起来.另外,还想将前20%的学生评定为A,接下来20%的学生评定为B,以此类推.最后,希望按字母顺序对学生排序. Excel中的数据表(自己一个个敲的,最讨厌做的事情TT) StuId StuName Math Science English 1 John Davis 502 95 25 2 Angela Williams 465 67 12 3 Bull Jones 621 78 2

C语言快速入门系列(六)

C语言快速入门系列(五) C语言指针加强 本节引言: 上一节我们对C语言中的指针进行了初步的了解,学习了指针的定义,与普通变量 一维数组,二维数组,字符串之间的使用!在本节中我们将会学习一些新的知识点, 函数,结构体与共用体,枚举类型以及类型定义符typedef! 本节学习路线图: 本节正文 函数 ps:空函数就是什么都不做的函数,开发过程中不需要马上实现的,先写空函数!简单的空函数:void abc(){   } 结构体 共用体: 代码示例2: 建立一个共用体类型,当输入的时学生类型时,要求输

C语言快速入门教程(二)

C语言快速入门教程(二) C语言的基本语法 本节学习路线图: 引言: C语言,顾名思义就是一门语言,可以类比一下英语; 你要说出一个英语的句子需要:  单词  +  语法!  将单词按照一定的语法拼凑起来就成了一个英语句子了; C语言同样是这样,只不过单词可以理解为一些固定的知识点,而语法可以理解为算法(可以理解为解决问题的方法) 在这一节中我们就对固定知识点中的语言描述与数据存储进行解析! 1.C语言的基本元素 1.1  标识符 什么是标识符? 答:在C语言中,符号常量,变量,数组,函数等都需

delphi指针简单入门

delphi指针简单入门:         看一个指针用法的例子:     1         var     2             X,   Y:   Integer;       //   X   and   Y   整数类型     3             P:   ^Integer;           //   P   指向整数类型的指针     4         begin     5             X   :=17; //   给   X   赋值     6

C语言快速入门系列(一)

C语言快速入门系列(一)  本系列引言: 本教程的宗旨是将C语言入门的内容进行关键知识点的提纯,将一些笼统的废话去除; 再进行压缩,然后将本章的关键知识点做成路线图的,可以更加方便地掌握学习的方向; 最后提供相关的代码示例以及详细注释,可以帮助学者更快地上手C语言! 如果对本教程有什么建议和缺点纰漏的,欢迎指出,不胜感激! 本节学习路线图: 正文: 1.计算机与程序设计语言的关系: 答:计算机是由硬件与软件系统组成,硬件==>物质基础;软件==>灵魂; 如果脱离了软件,计算机就只是一台什么都做