09-字符串
五大區(qū):
棧區(qū):存儲(chǔ)局部變量
靜態(tài)區(qū)(全局區(qū)):靜態(tài)變量,全局變量
堆區(qū):存放由程序員調(diào)用malloc函數(shù)時(shí)分配的空間
文字常量區(qū):常量字符串(內(nèi)容只讀只损,不可更改)
代碼二進(jìn)制區(qū):代碼
include <stdio.h>
include <string.h>
void test1()
{
/*
字符數(shù)組:由多個(gè)字符構(gòu)成
字符串:由多個(gè)字符構(gòu)成,最后一個(gè)字符必須要是\0
*/
//1.
char string[10]={'a','b','c'};
//2.
char string1[10]={"hello"};
//3.hello存在文字常量區(qū)绪爸,但是string這個(gè)字符串存在棧區(qū)舶掖,對(duì)文字常量區(qū)的內(nèi)容進(jìn)行了一份拷貝玛臂,所以可以修改string字符串里面的變量
char string2[10]="hello";
string2[2]='m';
printf("string2=%s\\n",string2);
//4.在棧區(qū)定義了一個(gè)p指針指向了文字常量區(qū)的內(nèi)容前域,所以辕近,不可以使用p對(duì)文字常量區(qū)的內(nèi)容進(jìn)行更改
char *p="hello";
p=p+4;
printf("p=%s\\n",p);
char *q="hello";
printf("p=%p\\nq=%p\\n",p,q);
}
void test2()
{
/*
MAC:先定義變量分配大的內(nèi)存,后定義的變量分配的小的內(nèi)存
*/
char string1[3]={'o','k'};
char string[2]={'h','e'};
int i=0;
for (i=0; i<2; i++)
{
printf("string[%d]的地址=%p\\n",i,string+i);
}
for (i=0; i<3; i++)
{
printf("string1[%d]的地址=%p\\n",i,string1+i);
}
printf("string=%s\\n",string);
}
//字符串處理函數(shù)
/*字符串長度計(jì)算
strlen()函數(shù)只會(huì)計(jì)算\0,之前的字符匿垄,不包括\0
*/
void test3()
{
char str[10]="hello";
long int length=strlen(str);
printf("length=%ld\\n",length);
}
/*
字符串拷貝函數(shù)
strcpy()將右邊的字符串拷貝到左邊的字符串里移宅,而不是覆蓋原來的一小部分
注意的問題:
(1)左邊字符串的大小必須要大于右邊字符串的大小
(2)左邊的字符串不能是使用char *p定義出來的;
*/
void test4()
{
char string1[10]="hello";
char string2[10]="worlddd";
strcpy(string2, string1);
printf("string2=%s\n",string2);
}
/*
字符串比較函數(shù)
strcmp(string1,string2);
如果兩個(gè)字符串相同椿疗,結(jié)果為0
如果編譯器比較高級(jí)
如果左邊的字符串>右邊的字符串吞杭,結(jié)果是(左邊的不同的字符ASCII值-右邊對(duì)應(yīng)位上的字符ASCII值)
左邊<右邊,結(jié)果是(左邊的不同的字符ASCII值-右邊對(duì)應(yīng)位上的字符ASCII值)
如果編譯器比較落后
左邊>右邊变丧,結(jié)果是=1
左邊<右邊,結(jié)果是=-1
*/
void test5()
{
char string1[10]="hellaff";
char string2[6]="hellc";
int result=strcmp(string1, string2);
printf("result=%d\n",result);
}
/*
字符串連接函數(shù)
strcat()將右邊的字符串拼接到左邊的字符串后面
注意的問題:
(1)左邊的字符串足夠大
(2)左邊的字符串不能是使用char *p定義出來的绢掰;
*/
void test6()
{
char string1[20]="helloxx";
char string2[]="world";
strcat(string1, string2);
printf("string1=%s\n",string1);
}
/*
自己寫一個(gè)函數(shù)實(shí)現(xiàn)strlen的功能
size_t strlen(const char *__s);
*/
//"hello"
int mystrlen(const char string)
{
int length=0;
while (string!='\0')
{
length++;
string++;
}
return length;
}
/*
寫一個(gè)函數(shù)實(shí)現(xiàn)strcpy
mystrcpy()
char *strcpy(char *__dst, const char *__src);
*/
//str2[10]="hello\0"
//str1[10];
void myStrcpy(char *str1,const char *str2,int size)
{
if(size<strlen(str2))
{
printf("你越界了\\n");
return;
}
while (*str2!=0)
{
*str1=*str2;
str1++;
str2++;
}
*str1='\\0';
}
/*
strncmp()比較具體個(gè)數(shù)的字符
*/
void test7()
{
char str[20]="hellonihao";
char str1[20]="helloworld";
int result=strncmp(str1, str, 5);
printf("result=%d\\n",result);
}
/*
strncpy()替換字符串前面的具體數(shù)目的字符
*/
void test8()
{
char str[20]="hellonihao";
strncpy(str, "wang", 4);
printf("str=%s\n",str);
}
/*
strncat()
*/
void test9()
{
char str[20]="hellonihao";
char str1[10]="worldxxx";
strncat(str, str1, 5);
printf("str=%s\n",str);
}
/*
輸入字符串
*/
/*
晚上作業(yè):
寫一個(gè)函數(shù)能吸收空格的
zhang san
string=zhang san
*/
void test10()
{
char string[10];
scanf("%s",string);
printf("string=%s====\n",string);
}
int main()
{
//字符串?dāng)?shù)組
//1.
// char str[2][3]={"hello","world"};
//2.指針數(shù)組
char *p="1,2,3";
char *p1="nihao";
char *str1[2]={p,p1};
printf("p=%s\\n",str1[0]);
return 0;
}
//
// main.c
// 10-字符串?dāng)?shù)組
//
// Created by ccj on 2016/10/20.
// Copyright ? 2016年 ccj. All rights reserved.
//
include <stdio.h>
include <string.h>
int main()
{
//字符串?dāng)?shù)組
//1.
char str[2][10]={"hello","world"};
//2.指針數(shù)組
char *p="123";
char *p1="nihao";
char *str1[2]={p,p1};//char *str1[2]={"123","nihao"};
printf("p=%s\\n",str1[0]);
strcpy(str1[0], "ccj");
return 0;
}