1.用%s输出一个字符串
从给定的地址开始,一直输出字符,直到遇到\0就停止了
printf("%s\n",str); 输出的是地址;
printf("%s\n",&str[0]);
printf("%s\n",&str[3]);
//把一个字符数组,用%s进行输出
char ch[10]={'a','b','c','d','\0'};
printf("%s\n",ch);
2、%s接收键盘上输入的一个字符串
char str3[10];
从键盘上接收一个字符串,保存在以str为首地址的字符数组中
scanf("%s",str3);
printf("%s\n",str3); //把字符数组,以%s的格式输出
注意点:
1、 如果以%s格式进行输入的话,注意空格问题
如果输入的字符串有空格,则空格之后的字符无法被接收保存
( 以%s的格式输入,scanf遇到了空格,就结束了)
2、输入的字符串的长度要小于数组的长度
定义了一个字符串 abc
char str[]="abc";
实际上存储了
str[0] a
str[1] b
str[2] c
str[3] \0
printf("%ld\n",sizeof(str));结果是4 证明有四个字符
存的是字符,可以以%s输出
char ch[]={‘a’,’c’\0};
char ch1[]={‘x’,’y’,’z’};
printf("%s\n",ch1); 这里输出的结果会是 xyzac 因为ch1字符串数组没有\0结束 而内存分配是连续的 ch1是后分配所以分配的是低地址 而ch是高地址 所以结果就是在xyz后面显示了
字符串的长度:
当没有以\0作为结束时,字符串长度==sizeof(数组名);
字符串函数的使用
使用puts和gets 必须包含头文件 stdio.h
puts() 输出一个字符串
原来输出字符串的方法
char str[]="abc";
printf("%s\n",str);
puts(字符数组名);
gets() 输入一个字符串
原来接收一个字符串
char str1[100];
scanf("%s",str1); //缺陷,输入字符串的时候不能有空格
gets(数组名);
需要包含 string.h的头文件
strcat() 连接一个字符串,把两个字符串连接成一个字符串
A B两个字符串
strcat(A,B) 把字符串B连接到A的后面去
定义一个字符数组:
char str[]="abc";
printf("%s\n",str);
puts(字符数组地址);
1)puts函数可以自动换行吗
2)也可以不是数组的首地址,可以是元素的地址
3)必须是字符数组
4) 不可以格式化输出
puts(str);表示输出str这个数组内的字符串
char str1[10];
使用gets会给出一个警告
1)warning: this program uses gets(), which is unsafe.
2)不安全:数组长度是100,但是如果你输入了120个字符,存在越界问题
3)使用gets可以接收空格
字符串的函数
strcat 函数介绍,使用该函数必须要引入头文件
1)格式:strcat(oldStr,newStr);将newStr加到oldStr后面;
2) oldStr的长度要足够大,只要能够保存下oldStr+newStr
3) newStr 把oldStr的最后一个字符\0给覆盖了
strcpy 字符串拷贝函数
strcpy(oldStr,newStr);
把newStr拷贝到oldStr中,newStr会覆盖掉oldStr中的内容
strcmp 字符串的比较函数
strcmp(str1,str2); //比较两个字符串的大小
//abc
//def 大 规则:比较字符的ascii码值 比较在字典中出现的顺序
//abc 大
//aac
//比较的过程:逐个取两个字符串的字符对应位相比较,从第一位不相同的位开始,就能确定字符串大小
strcmp(str1,str2) 函数有返回值 > 0 str1>str2
< 0 str1<str2
==0 str1 == str2
返回值的具体大小是两个数组比较相差的ASCII碼值的大小;
strlen 字符串的长度计算函数
例如 strlen (str1);
注意事项:
int main(int argc, const char * argv[]) {
char str1[100]="aaaaaa";
char str2[]="bangzhang";
puts(str1);
//字符串的拷贝
//str1要足够大,否则可能会越界
//strcpy(str1, str2);
//str2 拷贝到str1中 str2压在了str1上
puts(str1);
puts(str2);
//strcmp 比较两个字符串的大小
int s = strcmp(str1, str2);
//strlen计算字符串的长度
//strlen不含\0
s = strlen(str1);
printf("s = %d\n",s);
return 0;
}
应用:单词首字母大写&统计单词个数
#include <stdio.h>
int main(int argc, const char * argv[]) {
//定义变量
char str[100];
int isWord = 0;
int count = 0; //统计单词的个数
//提示用户输入字符串
printf("请输入一个字符串:\n");
//接收字符串,并保存到数组中
gets(str);
//循环取出每一个字符 遇到\0 循环结束
for (int i=0; str!='\0'; i++) {
//判断
if (str==' ') {
//把是否是单词标记改一下
isWord = 0; //这是一个标记,words=0表示是一个单词
}else if(isWord == 0){
// 当前循环 字符是空格 下次循环一定是一个单词
count++;
str = str-32; //减去32就大写了
isWord = 1; // 让单词标志变为不是单词
}
}
printf("单词个数:%d,字符串:%s\n",count,str);
return 0;
}
1、指针变量
用来存放地址的变量,就是指针变量
2、指针?
就是地址
3、指针变量的定义
数据类型 *指针变量名;
int *p; //定义了一个指针变量,变量名是p
//int表示,p只能存放一个int类型的变量的地址
char *p1; //定义了一个指针变量,变量名是p1
//p1只能存放一个char类型数变量的地址
int num=10;
char *p = # //警告
4、指针变量定义的注意事项
1)“*” 必须得有,如果没有就相当于定义一个普通变量
2)指针变量能用来存放数值或者字符之类的吗? 不能
3)指针变量,归根结底还是变量,也有全局和局部变量之分
//定义两个变量,并且给变量进行初始 a = 4, b = 5
int a=4,b=5;
//先定义变量,然后在初始化变量值
int a1;
a1 = 10;
指针变量也是变量
指针变量的使用: 定义指针变量 ----> 初始化指针变量 ---> 使用(使用指针变量间接的存取内存单元的值)
指针变量如果不初始化会有什么后果?
结论:如果一个指针变量定义以后,如果不进行初始化
这个指针变量存放的事一个垃圾数,这个指针变量,称之为 野指针
一定要避免操作野指针,因为可能会带来意向不到的错误
int *p10; //值是一垃圾值,有可能存放是系统程序的地址
*p10 = 438; //可能会造成系统崩溃
p10 = &a; |
|