C++程式傳遞字串到函式


任何使用函式的程式語言,其程式碼都更簡單、更模組化,並且在除錯時更容易修改。函式是模組化程式碼中一個非常有益的組成部分。函式可以接收引數並在其上執行某些操作。與其他基本資料型別一樣,我們也可以將物件型別或陣列作為引數傳遞。在本文中,我們將瞭解如何在C++中將字串型別資料作為函式引數傳遞。

將C++風格的字串引數傳遞給函式

C++支援更強大的字串物件,它實際上是一個類,並與之關聯不同的成員函式。字串物件作為引數傳遞類似於普通基本資料型別的傳遞。語法也十分相似。

語法

<return type> function_name ( string argument1, string argument2, … ) {
   // function body
}

在下面的示例中,我們將看到一個程式來檢查給定的字串是否為迴文。將有兩個函式,一個用於反轉字串,另一個用於檢查字串是否為迴文。讓我們看看演算法和相應的C++實現。

演算法

  • 定義一個函式reverse(),它將接收一個字串s
  • n := floor of (length of s / 2)
  • for i ranging from 0 to n/2; do
    • temp := s[i]
    • s[i] := s[ n - i - 1 ]
    • s[ n - i - 1 ] := temp
  • end for
  • return s
  • end of reverse() function
  • 定義一個函式isPalindrome(),它將接收s
  • revS := 呼叫reverse() 並將s傳遞給它以反轉字串s
  • 如果s和revS相同,則
    • return True
  • 否則
    • return False
  • end if
  • end of isPalindrome() function

示例

#include <iostream> #include <sstream> using namespace std; string reverse( string s ) { char temp; int n = s.length(); for( int i = 0; i < n / 2; i++ ) { temp = s[i]; s[i] = s[ n - i - 1 ]; s[ n - i - 1 ] = temp; } return s; } string isPalindrome( string s ) { string revS = reverse( s ); if( s == revS ) { return "True"; } else { return "False"; } } int main() { cout << "Is "racecar" a palindrome? " << isPalindrome( "racecar" ) << endl; cout << "Is "abcdef" a palindrome? " << isPalindrome( "abcdef" ) << endl; cout << "Is "madam" a palindrome? " << isPalindrome( "madam" ) << endl; cout << "Is "sir" a palindrome? " << isPalindrome( "sir" ) << endl; }

輸出

Is "racecar" a palindrome? True
Is "abcdef" a palindrome? False
Is "madam" a palindrome? True
Is "sir" a palindrome? False

將C風格的字元陣列傳遞給函式

由於C++支援C幾乎所有支援的功能,因此我們也可以使用類似C的字元陣列來定義字串。要將C風格的字串傳遞給函式,必須將字元陣列或指向字串基地址的字元指標傳遞給它。語法如下所示:

語法

(使用字元指標)

<return type> function_name ( char* <string variable>, … ) {
   // function body
}

語法

(使用字元陣列)

<return type> function_name ( char <string variable>[], … ) {
   // function body
}

讓我們看看使用字元陣列傳遞的相同迴文檢查示例。這裡reverse()函式將修改陣列,因此我們必須將此字串作為字元陣列傳遞,而不是字元指標。而isPalindrome()只會檢查字串是否與反轉後的字串相同,因此它可以接收字元指標或字元陣列,效果相同。演算法類似,因此我們直接進入程式碼。

示例

#include <iostream> #include <cstring> #include <cstdlib> using namespace std; void reverse( char s[] ) { char temp; int n = strlen( s ); for( int i = 0; i < n / 2; i++ ) { temp = s[i]; s[i] = s[ n - i - 1 ]; s[ n - i - 1 ] = temp; } } string isPalindrome( char* s ) { char* sRev = (char*) malloc( strlen(s) ); strcpy( sRev, s ); reverse( sRev ); if( strcmp( sRev, s ) == 0 ) { return "True"; } else { return "False"; } } int main() { string s = "racecar"; cout << "Is "racecar" a palindrome? " << isPalindrome( const_cast<char*> (s.c_str()) ) << endl; s = "abcdef"; cout << "Is "abcdef" a palindrome? " << isPalindrome( const_cast<char*> (s.c_str()) ) << endl; s = "madam"; cout << "Is "madam" a palindrome? " << isPalindrome( const_cast<char*> (s.c_str()) ) << endl; s = "sir"; cout << "Is "sir" a palindrome? " << isPalindrome( const_cast<char*> (s.c_str()) ) << endl; }

輸出

Is "racecar" a palindrome? True
Is "abcdef" a palindrome? False
Is "madam" a palindrome? True
Is "sir" a palindrome? False

在這個例子中,我們看到在C++中調整C風格的字串需要幾個步驟。對於C風格的字串,cstring庫用於獲取長度、字串比較和其他操作。從C++字串到C字串的轉換,需要c_str()函式,但此函式返回const char*,然而,我們的函式只接收char*型別的資料。對於這種情況,我們需要使用const_cast<char*>將值強制轉換為char*。

結論

函式可以接收基本資料型別以及陣列、物件型別等。在處理字串時,它們在C++中是物件型別,在C中是字元陣列型別。但由於C++也支援C語法,因此在C++中也是有效的。傳遞字串物件很簡單,但傳遞字元陣列需要特別注意,並需要遵循一些嚴格的步驟才能使用。C風格的字串可以以陣列格式或字元指標的形式傳遞。當我們知道函式將更改字串本身時,必須將字串作為字元陣列傳遞,否則不允許從指標修改字串。當字串僅被使用時,我們可以使用指標或字元陣列傳遞,效果相同。但在這種情況下,透過字元陣列傳遞是好的,因為它將阻止對字串的意外更新。

更新於: 2022年10月19日

22K+ 瀏覽量

啟動您的職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.