C 語言字符串處理的一些問題

C 語言沒有字符串的數據類型,處理起來不那麼簡單,容易發生越界錯誤。例子如下:

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

void main()
{
	const char *a="a";
	const char *b="ab";
	char d[10];
//	strcpy(d,a);
	strcat(d,a);
	strcat(d,b);
	printf("%s\n",d);
}

這個例子運行結果是出錯,單步跟蹤調試,發現 strcpy() 語句前後:

變量
+ d 0x0012ff6c "燙燙燙燙燙燙 B"
+ b 0x00422020 "ab"
+ a 0x00422024 "a"

+ d 0x0012ff6c "燙燙燙燙燙燙 Ba"
+ b 0x61422020 ""
+ a 0x00422000 ""

 

內存
0012FF6C CC CC CC CC CC CC CC CC CC CC CC CC 20 20 42 00 24 20 燙燙燙燙燙燙 B.$
0012FF7E 42 00 C0 FF 12 00

0012FF6C CC CC CC CC CC CC CC CC CC CC CC CC 20 20 42 61 00 20 燙燙燙燙燙燙 Ba.
0012FF7E 42 00 C0 FF 12 00

 

  •  其中:
    • 紅色部分,變量 d 的地址,本來定義了 10 個字節的長度,實際分配時,按照 4 的倍數分配,所以是 12 字節
    • 20 20 42 00 爲變量 b 的地址,低位在前
    • 24 20 42 00 爲變量 a 的地址,低位在前
    • 因爲都是局部變量,所以在上分配臨時存儲空間
    • 加上 strcpy() 後運行正常
    • 對局部變量的操作,實際上是對棧進行操作

strcpy() 源代碼

char* strcpy(char * dst, const char * src)
{
	char * cp = dst;
	while( *cp++ = *src++ )
	return( dst );
}

strcat() 源代碼

char* strcat ( char * dst , const char * src )
{
	char * cp = dst;
	while( *cp ) cp++;
	while( *cp++ = *src++ ) ; 
	return( dst );
}

 strcmp() 源代碼

int strcmp ( const char* src, const char* dst )
{
	int ret = 0 ;
	while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)	++src, ++dst;
	if ( ret < 0 )	ret = -1 ;
	else if ( ret > 0 )	ret = 1 ;
	return( ret );
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章