字符串
1.什么是字符串
“abc”
‘a’ :一个字符
“a”:是一个字符串,由若干个字符构成的串。
字符串常量:“abc” ‘a’,‘b’,‘c’,’\0’
字符串变量:没有字符串变量,用字符数组来表示字符串变量。
字符串在存储上的特点?
字符串的最后一个字符是一个特殊字符,表示字符串的结束。特殊字符 就是 ‘\0’ ‘\n’
2.字符串的输出和输入
1)输出字符串
printf("%s", “abc”);
printf(“abc”)
char str[4] = {‘a’,‘b’,‘c’,’\0’};
printf("%s\n", str);
输出结果 abc
int main()
{
char str[4] = {'a', '\0', 'c', '\0'};
printf("%s\n", str);
return 0;
}
输出结果 a
char str[4] = “abc”; // yes
puts(“abc”)
puts(str)
输出abc
2) 字符串的输入
输入只能保存到变量中,对字符串来说,是保存到字符数组中。
char str[4];
scanf("%s", str); // 注意不需要对字符串数组名取地址
int a;
scanf("%d", &a);
遇到空格就认为字符串输入结束了,用scanf不能接收含有空格的字符串.
gets(str)
可以接收含有空格的字符串
注意如果输入缓冲区中有\n, gets会接收一个空串,下面代码
int main()
{
int n;
char s[50];
scanf("%d", &n);
getchar();
gets(s);
puts(s);
return 0;
}
3) 输入中的安全性问题
gets 存在不安全
新标准建议使用fgets
fgets(s1, 1004, stdin);
3.字符串的应用
1)遍历字符串中的每个字符
// 没有到达字符串结尾的时候进入循环,到达结尾 s[i]==’\0’
for(int i=0; s[i]!='\0'; i++)
{
if (s[i]>='0' && s[i]<='9')
{
ans++;
}
}
4.字符串处理函数
strlen(s)
求字符串的长度, 返回的是出去’\0’的其他字符的数量
strcmp(s1, s2) strncmp
字符串比较的规则是按照字符的大小(ASC码的大小)进行比较的。
返回值,s1<s2 --> -1 s1==s2 --> 0 s1>s2 -->1
对字符串大小的比较不能直接用比较运算符
strcpy(s1,s2) strncpy
把s2的内容复制到s1字符串中。
字符串复制不能直接用=的赋值来完成
函数
1,函数定义的语法
函数名 函数的返回值 参数列表 函数体
return xxx;
2,函数调用
通过函数名去调用已经写好的函数,语句有跳转。
3,函数的声明
告诉编译器函数的样子。注意是语句,不写函数体。当函数定义在后,调用在前的时候,需要先声明函数。
4,函数的参数
注意函数调用的时候的参数传递数量要一致,实参和形参的类型也要一致。
形参:函数的参数列表中定义的参数。
实参:调用函数的时候给出的参数。
向函数传递参数是采用的传值调用方法,把实参的值复制给函数的形式参数。(实参变量和形参变量是不同的变量)
在这种情况下,修改函数内的形式参数不会影响实际参数。
/* 函数定义 */
void swap(int x, int y)
{
int temp;
temp = x; /* 保存 x 的值 */
x = y; /* 把 y 赋值给 x */
y = temp; /* 把 temp 赋值给 y */
return;
}
/* 函数声明 */
void swap(int x, int y);
int main ()
{
/* 局部变量定义 */
int a = 100;
int b = 200;
printf("交换前,a 的值: %d\n", a );
printf("交换前,b 的值: %d\n", b );
/* 调用函数来交换值 */
swap(a, b);
printf("交换后,a 的值: %d\n", a );
printf("交换后,b 的值: %d\n", b );
return 0;
}
5,变量的作用域
变量可以起作用的范围。
局部变量:只能作用在它所定义的局部。
全局变量:定义在所有函数外部的变量,可以作用在整个程序中。
形参变量 :被看作是函数内部的局部变量。
当局部变量和全局变量同名的时候,在局部,只能访问到局部变量(强龙难压地头蛇)
6,变量的生存期
变量是有生命的
1)静态生存期 :生命时间就是整个程序的时间。全局变量。
2)动态生存期 :当语句运行到定义变量的语句的时候诞生,作用域结束处消亡。普通的局部变量。
特殊情况
1)用static修饰局部变量 :会将局部变量的生存期改为静态生存期
2)用static修饰全局变量 :限制全局变量只能在它所在的源代码文件中使用
#include <stdio.h>
void f()
{
static int a = 0;
a++;
printf("%d\n", a);
}
int main()
{
f();
f();
return 0;
}// 第二次输出结果是2
静态局部变量是在编译时赋初值的,且只赋初值一次,在程序运行时它已有初值。以后在每次调用函数时就不再重新赋初值,而是保留上次函数调用结束时的值。