字元串處理函數
1.簡介
- 在c語言的學習過程中,我們會學習很多字元串處理函數,入strlen,strcpy,strcmp等等,使用也特别簡單,隻需要調用庫函數就行。
- 但是對于c語言初學者來說,作為一個面向過程的語言,了解其函數内的實作過程還非常用必要的。
2.字元串實作函數
strcpy(字元串拷貝函數)
#include <stdio.h>
#define M 50
//指針函數 傳回值為指向字元串str1的指針
char *strcpy(char * str1, const char * str2 )
{
//判斷 是否為空指針
if(str1 == NULL || str2 == NULL)
{
return NULL;
}
char *p = str1;
while((* str1++ = * str2++) != '\0');
return p;
}
int main()
{
char str1[M]={0};
char str2[M]={0};
printf("please input str1\r\n");
fgets(str1,50,stdin);
char *p = strcpy(str2,str1);
puts(str2);
return 0;
}
運作結果
注意:fgets輸入的時候會将緩存區裡面的回車換行
作為筆試題考察點有四處
- 異常處理 str1,str2 是否為NULL
- const 的修飾,str2不能被修改需要const來修飾
- 字元串會拷貝 ‘\0’
- 傳回值(指向str2的指針),可以友善調用者調用
strcmp(字元串比較大小)
**#include <stdio.h>
#define M 50
#define N 50
int Strcmp(const char *str1,const char *str2);
int main()
{
//輸入兩個字元串
char str1[M]={0};
char str2[N]={0};
printf("please input str1\r\n");
scanf("%s",str1);
printf("please input str2\r\n");
scanf("%s",str2);
//比較兩字元串的大小
Strcmp(str1,str2);
return 0;
}
int Strcmp(const char *str1,const char *str2)
{
//判斷 是否為空指針
if(str1 == NULL || str2 == NULL)
{
return;
}
int i=0;
while(*(str1+i)==*(str2+i) && *(str1+i)!='\0')
{
i++;
}
if( *(str1+i)>*(str2+i) )
{
printf("str1>str2\r\n");
return 1;
}
else if( *(str1+i) < *(str2+i) )
{
printf("str1<str2\r\n");
return -1;
}
else
{
printf("str1=str2\r\n");
return 0;
}
}
運作結果
作為筆試題考點同上
strcat (字元串拼接函數)
#include <stdio.h>
#include <string.h>
#define M 50
#define N 50
char *str_cat(char*,char*);
int main()
{
char str1[M]={0};
char str2[N]={0};
//輸入兩個字元串
printf("please input str1\r\n");
scanf("%s",str1);
printf("please input str2\r\n");
scanf("%s",str2);
char *p=str_cat(str1,str2);
puts(p);
return 0;
}
//字元串拼接
char *str_cat(char *str1,char *str2)
{
//判斷 是否為空指針
if(str1 == NULL || str2 == NULL)
{
return;
}
//字元串str1的長度
int j=strlen(str1);
//字元串str2的長度
int k=strlen(str2);
if( M < (j+k) )
{
return ;
}
//定義兩個指針
char *pp=str1;
char *p=str1+j;
char *q=str2;
int i=0;
for(i=0;i<k;i++)
{
*(p+i) = *(q+i);
}
return pp;
}
運作結果
strlen(求字元串的長度)
#include <stdio.h>
int mystrlen(char *pStr);
int main()
{
char str[100] ={0};
printf("please input str\r\n");
scanf("%s",str);
//用變量a來接受函數的傳回值
int a=mystrlen(str);
printf("%d\r\n",a);
return 0;
}
//求字元串的長度
int mystrlen(char *pStr)
{
if(NULL==pStr)
{
return -1;
}
int i=0;
while(pStr[i] !='\0')
{
i++;
}
return i;
}
注意:strlen 和 sizeof的差別
- strlen 計算字元串的長度,不計算字元串的結束辨別符 ‘\0’
- sizeof 計算的是占空間的大小會計算進去
字元串的翻轉
**方法一 **
#include <stdio.h>
#include <string.h>
#define n 50
int main()
{
//輸入字元
char arr[n]={0};
scanf("%s",arr);
char *p=arr;
char *q=&arr[strlen(arr)-1];
int i=0;
//用指針p指向首位址,q指向字元的尾位址
for(i=0;i<strlen(arr)/2;i++)
{
char tmp= *(p+i);
*(p+i)=*(q-i);
*(q-i)=tmp;
}
puts(arr);
return 0;
}
方法二
#include <stdio.h>
#include <string.h>
int main()
{
char str[100]={0};
gets(str);
char *p=str;
char *q=str+strlen(str)-1;
while(p<q)
{
int tmp=*p;
*p=*q;
*q=tmp;
p++;
q--;
}
puts(str);
return 0;
}
字元串的查找
編寫一個字元串查找函數,函數原型為:
char *str_search(const char *str1, const char *str2),
該函數實作在字元串str1中找出字元串str2第一次出現的位置。
如果str2出現在str1中,則傳回str2在str1中出現的首位址,
如果在str1中沒有與str2比對的字元串則傳回NULL
#include <stdio.h>
#include <string.h>
char *str_search( char *str1, char *str2 );
int main()
{
//定義兩個字元串
char str1[20] = {0};
char str2[20] = {0};
//指派
scanf("%s",str1);
scanf("%s",str2);
char *q = str_search(str1,str2);
printf("%s\r\n",q);
return 0;
}
char *str_search( char *str1, char *str2 )
{
//定義一個指針指向 str1
char *p = str1;
//逐個移動比較
int i = 0;
for( i=0; i < strlen(str1); i++ )
{
char tmp = *( p+strlen(str2)+i );
*( p+strlen(str2)+i ) = '\0';
//比較兩個字元串
if( 0 == strcmp( str1+i, str2 ) )
{
return p+i;
}
*( p+strlen(str2)+i ) = tmp;
}
return NULL;
}