13 thg 4, 2010

C và C++. All about string.

String (or array of character) dùng để lưu trữ ký tự. Các hàm của nó được khai báo trong hay (trong C++). Nó kết thúc bằng ký tự NULL ('\0') .


1. String length
Ta cần phân biệt "allocation size" : vùng bộ nhớ được cấp phát cho xâu đó, và "length" : chiều dài của xâu,( ko kể ký tự null ).
size_t strlen ( const char *s);
VD: char string[32] = "hello !";
strlen(string) = 7 ;
sizeof(string) = 32 ; // Ta cần phân biệt 2 hàm này.
2. Hàm sao chép
Có nhiều hàm thực hiện công việc này, nhưng điển hình ta có thể xét chúng thành 2 loại là sao chép một số hữu hạn, biết trước các ký tự( một số đếm count được đưa vào trong đối số của hàm ), hoặc sao chép cho tới khi gặp ký tự Null.
Cụ thể các hàm đó như sau:
- void * memcpy( void *to, const void *from, size_t count)
copy count ký tự từ 'from' sag 'to'. Nó sẽ ko định dạng được khi mà 'to' và 'from' overlap (chồng chéo nhau)
- void * movecpy( void *to, const void *from, size_t count)
giống trên, nhưng giai quyết dc vấn đề overlap.

- void *memccpy( void *to, const void *from, int c, size_t size);
copy đến khi gặp 'c' ( copy cả 'c') hoặc hết 'size' ký tự, nếu độ dài 'from' cho phép.
- memset()..., Nhiều quá nản. :((
http://www.cppreference.com/wiki/c/string/memset

- Strcpy(...) cái này chắc biết rôi.
Strncpy(..., size_t size) bị hạn chế bởi 'size', copy ko quá 'size' ký tự.
- Char *strdup(const char*s);
Dùng trong trường hợp, s được cấp phát bộ nhớ bới hàm 'malloc' và hàm này sẽ copy xâu "động" này vào một vùng nhớ hẳn hoi( nôm na là thế ). Nếu ko dc trả về con trỏ null, đươc thì trả về con trỏ trỏ vào xâu mới đó.
- Hehe, cái này hay đây, nhưng có lẽ ko dùng đến mấy.
char *stpcpy( char *to, const char*from);
ko khác gì 'strcpy' nhưng nó lại trả về con trỏ trỏ đến cuối của 'to'. Bó tay :D.

- char *strcat( char *to, const char*from);
ghép xâu 'from' vào sao'to', và trả về 'to'.
- char *strncat( char *to, const char*from, size_t size)
cũng thế nhưng 'to' ko vượt quá 'size+1' ký tự.

còn hàm 'bcopy' và 'bzero' ko hiểu :
Function: void * bcopy (void *from, const void *to, size_t size)
This is a partially obsolete alternative for memmove, derived from BSD. Note that it is not quite equivalent to memmove, because the arguments are not in the same order.
Function: void * bzero (void *block, size_t size)
This is a partially obsolete alternative for memset, derived from BSD. Note that it is not as general as memset, because the only value it can store is zero.



3. So sánh (dùng strcmp)....
4. Tìm kiếm
- void *memchr( const void*block, int c , size_t size);

Tìm kiếm trong 'size' ký tự đầu cho đến khi gặp ký tự c
- char *strchr( const char*string, int c);
Vd: strchr("helllo ,world",' l ') => "lllo ,world"
strchr(" hello",'k') => NULL
- char *strstr( const char *s1, const char *s2);
giống strchr, nhưng mạnh hơn vì nó có khả năng nhận dạng nhiều ký tự, Vd : "hello world" , "wo" =>> "world". :)
5. Find Tokens in a string
Dây là phần quan trọng nhất( đói với tôi) nó dùng để cắt xâu.

#include 
#include 

...

char string[] = "words separated by spaces -- and, punctuation!";
const char delimiters[] = " .,;:!-";
char *token;

...

token = strtok (string, delimiters);  /* token => "words" */
token = strtok (NULL, delimiters);    /* token => "separated" */
token = strtok (NULL, delimiters);    /* token => "by" */
token = strtok (NULL, delimiters);    /* token => "spaces" */
token = strtok (NULL, delimiters);    /* token => "and" */
token = strtok (NULL, delimiters);    /* token => "punctuation" */
token = strtok (NULL, delimiters);    /* token => NULL */


Một đoạn morse code sử dụng nó :




int main()
{
char s[50];
int i =0;
char *token;
cout << " OK! Begin convert Morsecode.\n";
cout << " morse ";
cin.getline(s,sizeof(s));
token = strtok(s," ");

while(token != NULL){
FileName[i] = token; i++;
token = strtok(NULL," ");
}

if(checkFile(FileName[0],pfileInput))
Code();
else
Decode();



return 1;
}

0 nhận xét: