C++ 程式設計/程式碼/標準 C 庫/字串和字元
標準 C 庫還包括處理字元和字串的例程。您必須記住,在 C 中,一個字元序列儲存在一個字元陣列的連續元素中,並以 **NULL** 字元結束。
/* "Hello" is stored in a character array */
char note[SIZE];
note[0] = 'H'; note[1] = 'e'; note[2] = 'l'; note[3] = 'l'; note[4] = 'o'; note[5] = '\0';
即使過時了,這些 C 字串和字元函式仍然出現在舊程式碼中,並且比之前的 I/O 函式更多。
| 語法 |
#include <cstdlib>
double atof( const char *str );
|
atof() 函式將 str 轉換為雙精度浮點數,然後返回該值。str 必須以有效數字開頭,但可以用任何非數字字元終止,除了“E”或“e”。例如,
x = atof( "42.0is_the_answer" );
會導致 x 被設定為 42.0。
| 語法 |
#include <cstdlib>
int atoi( const char *str );
|
atoi() 函式將 str 轉換為整數,然後返回該整數。str 應該以空格或某種數字開頭,atoi() 會在讀取到非數字字元時停止從str 讀取。例如
int i;
i = atoi( "512" );
i = atoi( "512.035" );
i = atoi( " 512.035" );
i = atoi( " 512+34" );
i = atoi( " 512 bottles on the wall" );
以上對變數i 的所有五個賦值都會導致它被設定為 512。
如果無法執行轉換,則 atoi() 將返回零
int i = atoi( " does not work: 512" ); // results in i == 0
atoi 的完整 C++ 實現。
/*
Description:
Program to convert a c-style string into decimal, octal and hex integers.
Copyright (C) <2015> <AM>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
// Standard IOSTREAM
#include "iostream"
// Convert a string of Numbers to integer
long int atoifunc(const char* str);
// Function to convert a string of Numbers into an integer
long int atoioct(const char* str);
// Function to convert a string of Numbers into a hexadecimal integer
long long int atoiHex(const char* str);
// Find length of a string
static int strlength(const char *str);
// Get digit from character in input string
static int getDecDigit(const char str);
// Get a digit from corresponding character in input string
static int getOctDigit(const char str);
// Get a hexadecimal digit from corresponding character in input string
static int getHexDigit(const char str);
using namespace std;
// Application program
int main(void)
{
char decstr[8] = "";
char octstr[8] = "";
char Hexstr[8] = "";
long int IntNumber=0;
long int OctNumber=0;
long long int HexNumber=0;
cout << "Enter a string of 8 characters in decimal digit form: ";
cin >> decstr;
cout << "Enter a string of 8 characters is octal form: ";
cin >> octstr;
IntNumber = atoifunc(decstr);
cout <<"\nYou entered decimal number: " << IntNumber;
cout << oct;
OctNumber= atoioct(octstr);
// Displaying octal number should be done in digits 0-7
cout <<"\nYou entered octal number: " << OctNumber;
cout << dec;
// Displaying octal number should be done in digits 0-7
cout <<"\nYou entered an oct which is decimal number: " << OctNumber;
cout << "\nEnter a string of 7 characters in Hex form: ";
cin >> Hexstr;
HexNumber=atoiHex(Hexstr);
cout << hex;
// Displaying octal number should be done in digits 0-9, A-F
cout <<"\nYou entered a Hexadecimal number: " << HexNumber;
cout << dec;
// Displaying octal number should be done in digits 0-9, A-F
cout <<"\nYou entered a Hexadecimal which is decimal number: " << HexNumber;
return 0;
}
/* Function to convert a string of Numbers into an integer */
/* Get the Number of digits entered as a string.
For each digit, place it in appropriate place of an integer such as digit x 1000 or digit x10000 depending on integer size and input range. The multiple of the first and subsequent digits would be selected depending on the number of digits.
For example, 123 would be calculated as an integer in the following steps:
1* 100
2* 10
3* 1
The calculated value is then returned by the function.
For example, if the digits entered are 12345
Then,the multipliers are:
str[0] * 10000
str[1] * 1000
str[2] * 100
str[3] * 10
str[4] * 1
Check your machine endianness for correct order of bytes.
*/
long int atoifunc(const char* str)
{
int declength =strlength(str);
long int Number =0;
switch(declength)
{
case 0:
Number += getDecDigit(str[0])*0;
break;
// Convert characters to digits with another function.
case 1:
Number += getDecDigit(str[0])*1;
break;
case 2:
Number+=getDecDigit(str[0])*10;
Number+=getDecDigit(str[1])*1;
break;
case 3:
Number+=getDecDigit(str[0])*100;
Number+=getDecDigit(str[1])*10;
Number+=getDecDigit(str[2])*1;
break;
case 4:
Number+=getDecDigit(str[0])*1000;
Number+=getDecDigit(str[1])*100;
Number+=getDecDigit(str[2])*10;
Number+=getDecDigit(str[3])*1;
break;
case 5:
Number+=getDecDigit(str[0])*10000;
Number+=getDecDigit(str[1])*1000;
Number+=getDecDigit(str[2])*100;
Number+=getDecDigit(str[3])*10;
Number+=getDecDigit(str[4])*1;
break;
case 6:
Number+=getDecDigit(str[0])*100000;
Number+=getDecDigit(str[1])*10000;
Number+=getDecDigit(str[2])*1000;
Number+=getDecDigit(str[3])*100;
Number+=getDecDigit(str[4])*10;
Number+=getDecDigit(str[5])*1;
break;
case 7:
Number+=getDecDigit(str[0])*1000000;
Number+=getDecDigit(str[1])*100000;
Number+=getDecDigit(str[2])*10000;
Number+=getDecDigit(str[3])*1000;
Number+=getDecDigit(str[4])*100;
Number+=getDecDigit(str[5])*10;
Number+=getDecDigit(str[6])*1;
break;
case 8:
Number+=getDecDigit(str[0])*10000000;
Number+=getDecDigit(str[1])*1000000;
Number+=getDecDigit(str[2])*100000;
Number+=getDecDigit(str[3])*10000;
Number+=getDecDigit(str[4])*1000;
Number+=getDecDigit(str[5])*100;
Number+=getDecDigit(str[6])*10;
Number+=getDecDigit(str[7])*1;
break;
default:
Number =0;
break;
}
return Number;
}
// Find length of a string
static int strlength(const char *str)
{
int count=0;
while(str[count]!='\0')
{
count++;
}
return count;
}
// get a digit from corresponding character in input string
static int getDecDigit(const char str)
{
int digit =0;
switch (str)
{
case '0':
digit = 0;
break;
case '1':
digit = 1;
break;
case '2':
digit = 2;
break;
case '3':
digit = 3;
break;
case '4':
digit = 4;
break;
case '5':
digit = 5;
break;
case '6':
digit = 6;
break;
case '7':
digit = 7;
break;
case '8':
digit = 8;
break;
case '9':
digit = 9;
break;
default:
digit =0;
break;
}
return digit;
}
/* Function to convert a string of Numbers into an integer */
long int atoioct(const char* str)
{
long int Number =0;
int stroctlength =strlength(str);
switch(stroctlength)
{
case 0:
Number += getOctDigit(str[0])*0;
break;
// Convert characters to digits with another function.
case 1:
Number += getOctDigit(str[0])*1;
break;
case 2:
Number+=getOctDigit(str[0])*8;
Number+=getOctDigit(str[1])*1;
break;
case 3:
Number+=getOctDigit(str[0])*64;
Number+=getOctDigit(str[1])*8;
Number+=getOctDigit(str[2])*1;
break;
case 4:
Number+=getOctDigit(str[0])*512;
Number+=getOctDigit(str[1])*64;
Number+=getOctDigit(str[2])*8;
Number+=getOctDigit(str[3])*1;
break;
case 5:
Number+=getOctDigit(str[0])*4096;
Number+=getOctDigit(str[1])*512;
Number+=getOctDigit(str[2])*64;
Number+=getOctDigit(str[3])*8;
Number+=getOctDigit(str[4])*1;
break;
case 6:
Number+=getOctDigit(str[0])*32768;
Number+=getOctDigit(str[1])*4096;
Number+=getOctDigit(str[2])*512;
Number+=getOctDigit(str[3])*64;
Number+=getOctDigit(str[4])*8;
Number+=getOctDigit(str[5])*1;
break;
case 7:
Number+=getOctDigit(str[0])*262144;
Number+=getOctDigit(str[1])*32768;
Number+=getOctDigit(str[2])*4096;
Number+=getOctDigit(str[3])*512;
Number+=getOctDigit(str[4])*64;
Number+=getOctDigit(str[5])*8;
Number+=getOctDigit(str[6])*1;
break;
default:
Number =0;
break;
}
return Number;
}
// Get a digit from character input in input string
static int getOctDigit(const char str)
{
int digit =0;
switch (str)
{
case '0':
digit = 0;
break;
case '1':
digit = 1;
break;
case '2':
digit = 2;
break;
case '3':
digit = 3;
break;
case '4':
digit = 4;
break;
case '5':
digit = 5;
break;
case '6':
digit = 6;
break;
case '7':
digit = 7;
break;
default:
digit =0;
break;
}
return digit;
}
// Get a hexadecimal digit from corresponding character in input string
static int getHexDigit(const char str)
{
int digit =0;
switch (str)
{
case '0':
digit = 0;
break;
case '1':
digit = 1;
break;
case '2':
digit = 2;
break;
case '3':
digit = 3;
break;
case '4':
digit = 4;
break;
case '5':
digit = 5;
break;
case '6':
digit = 6;
break;
case '7':
digit = 7;
break;
case '8':
digit = 8;
break;
case '9':
digit = 9;
break;
case 'A' :
case 'a':
digit =10;
break;
case 'B' :
case 'b':
digit = 11;
break;
case 'C' :
case 'c':
digit =12;
break;
case 'D' :
case 'd':
digit =13;
break;
case 'E' :
case 'e':
digit = 14;
break;
case 'F' :
case 'f':
digit = 15;
break;
default:
digit =0;
break;
}
return digit;
}
// Function to convert a string of Numbers into a hexadecimal integer
long long int atoiHex(const char* str)
{
long long int Number =0;
int strHexlength =strlength(str);
switch(strHexlength)
{
case 0:
Number += getHexDigit(str[0])*0;
break;
// Convert characters to digits with another function.
// Implicit type conversion from int to long int.
case 1:
Number += getHexDigit(str[0])*1;
break;
case 2:
Number+=getHexDigit(str[0])*16;
Number+=getHexDigit(str[1])*1;
break;
case 3:
Number+=getHexDigit(str[0])*256;
Number+=getHexDigit(str[1])*16;
Number+=getHexDigit(str[2])*1;
break;
case 4:
Number+=getHexDigit(str[0])*4096;
Number+=getHexDigit(str[1])*256;
Number+=getHexDigit(str[2])*16;
Number+=getHexDigit(str[3])*1;
break;
case 5:
Number+=getHexDigit(str[0])*65536;
Number+=getHexDigit(str[1])*4096;
Number+=getHexDigit(str[2])*256;
Number+=getHexDigit(str[3])*16;
Number+=getHexDigit(str[4])*1;
break;
case 6:
Number+=getHexDigit(str[0])*1048576;
Number+=getHexDigit(str[1])*65536;
Number+=getHexDigit(str[2])*4096;
Number+=getHexDigit(str[3])*256;
Number+=getHexDigit(str[4])*16;
Number+=getHexDigit(str[5])*1;
break;
case 7:
Number+=getHexDigit(str[0])*16777216;
Number+=getHexDigit(str[1])*1048576;
Number+=getHexDigit(str[2])*65536;
Number+=getHexDigit(str[3])*4096;
Number+=getHexDigit(str[4])*256;
Number+=getHexDigit(str[5])*16;
Number+=getHexDigit(str[6])*1;
break;
default:
Number =0;
break;
}
return Number;
}
| 語法 |
#include <cstdlib>
long atol( const char *str );
|
atol() 函式將str 轉換為長整數,然後返回該值。atol() 會從str 讀取,直到找到長整數中不應該出現的任何字元。然後,將生成的截斷值進行轉換並返回。例如,
x = atol( "1024.0001" );
會導致 x 被設定為 1024L。
| 語法 |
#include <cctype>
int isalnum( int ch );
|
如果其引數是數字或字母,則 isalnum() 函式返回非零值。否則,返回零。
char c;
scanf( "%c", &c );
if( isalnum(c) )
printf( "You entered the alphanumeric character %c\n", c );
| 語法 |
#include <cctype>
int isalpha( int ch );
|
如果其引數是字母,則 isalpha() 函式返回非零值。否則,返回零。
char c;
scanf( "%c", &c );
if( isalpha(c) )
printf( "You entered a letter of the alphabet\n" );
| 語法 |
#include <cctype>
int iscntrl( int ch );
|
如果其引數是控制字元(介於 0 和 0x1F 之間或等於 0x7F),則 iscntrl() 函式返回非零值。否則,返回零。
| 語法 |
#include <cctype>
int isdigit( int ch );
|
如果函式 isdigit() 的引數是 0 到 9 之間的數字,則返回非零值。否則,返回零。
char c;
scanf( "%c", &c );
if( isdigit(c) )
printf( "You entered the digit %c\n", c );
| 語法 |
#include <cctype>
int isgraph( int ch );
|
如果函式 isgraph() 的引數是除空格之外的任何可列印字元(如果您可以看到該字元,則 isgraph() 將返回非零值),則返回非零值。否則,返回零。
| 語法 |
#include <cctype>
int islower( int ch );
|
如果函式 islower() 的引數是小寫字母,則返回非零值。否則,返回零。
- 相關主題
- isupper
| 語法 |
#include <cctype>
int isprint( int ch );
|
如果函式 isprint() 的引數是可列印字元(包括空格),則返回非零值。否則,返回零。
| 語法 |
#include <cctype>
int ispunct( int ch );
|
如果函式 ispunct() 的引數是列印字元,但不是字母數字字元或空格,則返回非零值。否則,返回零。
| 語法 |
#include <cctype>
int isspace( int ch );
|
如果函式 isspace() 的引數是某種空格(即單個空格、製表符、垂直製表符、換頁符、回車符或換行符),則返回非零值。否則,返回零。
| 語法 |
#include <cctype>
int isupper( int ch );
|
如果函式 isupper() 的引數是大寫字母,則返回非零值。否則,返回零。
| 語法 |
#include <cctype>
int isxdigit( int ch );
|
如果函式 isxdigit() 的引數是十六進位制數字(即 A-F、a-f 或 0-9),則返回非零值。否則,返回零。
| 語法 |
#include <cstring>
void *memchr( const void *buffer, int ch, size_t count );
|
函式 memchr() 在由 buffer 指向的陣列中查詢 count 個字元中 ch 的第一次出現。返回值指向 ch 的第一次出現的地址,或者如果未找到 ch 則為 NULL。例如
char names[] = "Alan Bob Chris X Dave";
if( memchr(names,'X',strlen(names)) == NULL )
printf( "Didn't find an X\n" );
else
printf( "Found an X\n" );
| 語法 |
#include <cstring>
int memcmp( const void *buffer1, const void *buffer2, size_t count );
|
函式 memcmp() 比較 buffer1 和 buffer2 的前 count 個字元。返回值如下
| 返回值 | 說明 |
|---|---|
| 小於 0 | buffer1 小於 buffer2 |
| 等於 0 | buffer1 等於 buffer2 |
| 大於 0 | buffer1 大於 buffer2 |
| 語法 |
#include <cstring>
void *memcpy( void *to, const void *from, size_t count );
|
函式 memcpy() 將 from 陣列中的 count 個字元複製到 to 陣列中。memcpy() 的返回值為 to。如果 to 和 from 重疊,則 memcpy() 的行為未定義。
| 語法 |
#include <cstring>
void *memmove( void *to, const void *from, size_t count );
|
memmove() 函式與 memcpy() 函式相同,區別在於它即使在 to 和 from 發生重疊時也能正常工作。
| 語法 |
#include <cstring>
void* memset( void* buffer, int ch, size_t count );
|
memset() 函式將 ch 複製到 buffer 的前 count 個字元中,並返回 buffer。memset() 用於將一塊記憶體初始化為某個值。例如,以下命令
const int ARRAY_LENGTH;
char the_array[ARRAY_LENGTH];
...
// zero out the contents of the_array
memset( the_array, '\0', ARRAY_LENGTH );
...是將 the_array 的所有值設定為零的一種非常有效的方法。
下表比較了兩種不同的字元陣列初始化方法:for 迴圈與 memset()。隨著初始化資料大小的增加,memset() 顯然可以更快地完成工作。
| 輸入大小 | 使用 for 迴圈初始化 |
使用 memset() 初始化 |
|---|---|---|
| 1000 | 0.016 | 0.017 |
| 10000 | 0.055 | 0.013 |
| 100000 | 0.443 | 0.029 |
| 1000000 | 4.337 | 0.291 |
| 語法 |
#include <cstring>
char *strcat( char *str1, const char *str2 );
|
strcat() 函式將 str2 連線到 str1 的末尾,並返回 str1。例如
printf( "Enter your name: " );
scanf( "%s", name );
title = strcat( name, " the Great" );
printf( "Hello, %s\n", title ); ;
請注意,strcat() 不執行邊界檢查,因此有可能會覆蓋 str1 或 str2。對於具有邊界檢查的類似(更安全)函式,請參見 strncat()。
| 語法 |
#include <cstring>
char *strchr( const char *str, int ch );
|
strchr() 函式返回指向 str 中 ch 第一次出現的指標,如果未找到 ch 則返回 NULL。
- 相關主題
- strcat - strcmp - strcpy - strlen - strncat - strncmp - strncpy - strpbrk - strrchr -strspn - strstr - strtok
| 語法 |
#include <cstring>
int strcmp( const char *str1, const char *str2 );
|
strcmp() 函式比較 str1 和 str2,然後返回
| 返回值 | 說明 |
|---|---|
| 小於 0 | str1 小於 str2 |
| 等於 0 | str1 等於 str2 |
| 大於 0 | str1 大於 str2 |
例如
printf( "Enter your name: " );
scanf( "%s", name );
if( strcmp( name, "Mary" ) == 0 ) {
printf( "Hello, Dr. Mary!\n" );
}
請注意,如果 str1 或 str2 缺少空終止符,則 strcmp() 可能無法生成有效結果。對於具有顯式邊界檢查的類似(更安全)函式,請參見 strncmp()。
| 語法 |
#include <cstring>
int strcoll( const char *str1, const char *str2 );
|
strcoll() 函式比較 str1 和 str2,類似於 strcmp()。但是,strcoll() 使用由(標準 C 日期和時間)setlocale() 函式指定的區域設定執行比較。
| 語法 |
#include <cstring>
char *strcpy( char *to, const char *from );
|
strcpy() 函式將字串 'from 中的字元複製到字串 to 中,包括空終止符。返回值為 to。
請注意,strcpy() 不執行邊界檢查,因此有可能會覆蓋 from 或 to。對於具有邊界檢查的類似(更安全)函式,請參見 strncpy()。
| 語法 |
#include <cstring>
size_t strcspn( const char *str1, const char *str2 );
|
strcspn() 函式返回 str1 中第一個與 str2 中任何字元匹配的字元的索引。
| 語法 |
#include <cstring>
char *strerror( int num );
|
strerror() 函式返回與 num 對應的實現定義的字串。如果發生錯誤,則錯誤位於全域性變數 errno 中。
- 相關主題
- perror
| 語法 |
#include <cstring>
size_t strlen( char *str );
|
strlen() 函式返回str的長度(由空字元終止符之前的字元數決定)。
strncat
[edit | edit source]| 語法 |
#include <cstring>
char *strncat( char *str1, const char *str2, size_t count );
|
strncat() 函式將最多count個str2的字元連線到str1上,並新增一個空字元終止符。返回結果字串。
strncmp
[edit | edit source]| 語法 |
#include <cstring>
int strncmp( const char *str1, const char *str2, size_t count );
|
strncmp() 函式最多比較str1和str2的count個字元。返回值如下
| 返回值 | 說明 |
|---|---|
| 小於 0 | str1 小於 str2 |
| 等於 0 | str1 等於 str2 |
| 大於 0 | str1 大於 str2 |
如果任一字串中的字元數少於count,則比較將在遇到第一個空字元終止符後停止。
strncpy
[edit | edit source]| 語法 |
#include <cstring>
char *strncpy( char *to, const char *from, size_t count );
|
strncpy() 函式將最多count個from的字元複製到字串to中。只有當from中的字元數少於count時,才會用 '\0' 字元填充剩餘部分。return值是結果字串。
strpbrk
[edit | edit source]| 語法 |
#include <cstring>
char * strpbrk( const char *str, const char *ch );
|
strpbrk() 函式返回指向str中ch中任一字元的首次出現的指標,如果未找到任何字元,則返回NULL。
strrchr
[edit | edit source]| 語法 |
#include <cstring>
char *strrchr( const char *str, int ch );
|
strrchr() 函式返回指向str中ch的最後一次出現的指標,如果未找到匹配項,則返回NULL。
strspn
[edit | edit source]| 語法 |
#include <cstring>
size_t strspn( const char *str1, const char *str2 );
|
strspn() 函式返回str1中第一個不匹配str2中任何字元的字元的索引。
strstr
[edit | edit source]| 語法 |
#include <cstring>
char *strstr( const char *str1, const char *str2 );
|
strstr() 函式返回指向str1中str2首次出現的指標,如果未找到匹配項,則返回NULL。如果str2的長度為零,則 strstr() 將簡單地返回str1。
例如,以下程式碼檢查一個字串中是否存在另一個字串
JHJH-C´(J"JC
char* str1 = "this is a string of characters <tr>hai</tr>";
char* str2 = "hai";
char* result = strstr( str1, str2 );
if( result == NULL ) printf( "Could not find '%s' in '%s'\n", str2, str1 );
else printf( "Found a substring: '%s'\n", result );
執行後,以上程式碼顯示以下輸出
Found a substring: 'a string of characters'
strtod
[edit | edit source]| 語法 |
#include <cstdlib>
double strtod( const char *start, char **end );
|
strtod() 函式將start中首先遇到的任何內容作為雙精度浮點數返回。end被設定為指向start中該雙精度浮點數之後剩餘的任何內容。如果發生溢位,strtod() 將返回HUGE_VAL或-HUGE_VAL。
x = strtod( "42.0is_the_answer" );
會導致 x 被設定為 42.0。
- 相關主題
- atof
strtok
[edit | edit source]| 語法 |
#include <cstring>
char *strtok( char *str1, const char *str2 );
|
strtok() 函式返回指向str1中下一個“標記”的指標,其中str2包含確定標記的分隔符。如果未找到標記,則 strtok() 返回NULL。為了將字串轉換為標記,對 strtok() 的第一次呼叫應該讓str1指向要標記的字串。此後的所有呼叫都應該讓str1為NULL。
例如
char str[] = "now # is the time for all # good men to come to the # aid of their country";
char delims[] = "#";
char *result = NULL;
result = strtok( str, delims );
while( result != NULL ) {
printf( "result is \"%s\"\n", result );
result = strtok( NULL, delims );
}
以上程式碼將顯示以下輸出
result is "now " result is " is the time for all " result is " good men to come to the " result is " aid of their country"
| 語法 |
#include <cstdlib>
long strtol( const char *start, char **end, int base );
|
strtol() 函式返回start中遇到的第一個元素作為長整型,必要時進行base進位制轉換。end指向start中長整型之後的剩餘部分。如果結果不能用長整型表示,則 strtol() 返回LONG_MAX或LONG_MIN。錯誤情況下返回零。
| 語法 |
#include <cstdlib>
unsigned long strtoul( const char *start, char **end, int base );
|
strtoul() 函式的行為與strtol()完全相同,只是它返回一個unsigned長整型,而不是一個普通的長整型。
- 相關主題
- strtol
| 語法 |
#include <cstring>
size_t strxfrm( char *str1, const char *str2, size_t num );
|
strxfrm() 函式操作str2的前num個字元,並將它們儲存在str1中。結果是這樣的,如果對str1和舊的str2執行strcoll(),你將獲得與strcmp()相同的結果。
| 語法 |
#include <cctype>
int tolower( int ch );
|
tolower() 函式返回字元ch的小寫版本。
| 語法 |
#include <cctype>
int toupper( int ch );
|
toupper() 函式返回字元ch的大寫版本。
- 相關主題
- tolower