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+ 浏览量

启动您的职业生涯

通过完成课程获得认证

开始学习
广告