C ++中的C样式字符串

字符串是字符数组。字符串文字是用双引号引起来的单词。

"This is a static string"

要声明一个由49个字母组成的字符串,您需要说:

char string[50];

这将声明一个长度为50个字符的字符串。不要忘记数组从零开始,而不是索引号从1开始。此外,字符串以空字符结尾,即为’\ 0’字符。但是,请记住,字符串的末尾会有一个额外的字符。就像句子结尾的句点一样,它不算作字母,但仍占据一个空格。从技术上讲,在一个50个字符的数组中,您只能在末尾保留49个字母和一个空字符来终止字符串。

请注意:char * arry; 也可以用作字符串。如果您已阅读有关指针的教程,则可以执行以下操作:

arry = new char[256];

这样您就可以像访问数组一样访问arry。请记住,要使用删除,必须将[]放在delete和arry之间,以使其释放已分配的所有256字节内存。

例如:

delete [] arry.

字符串对于保存所有类型的长输入很有用。如果要用户输入其姓名,则必须使用字符串。使用cin >>输入字符串是可行的,但是在读取第一个空格后它将终止该字符串。处理这种情况的最佳方法是使用函数cin.getline。从技术上讲,cin是一类(类似于结构的野兽),您正在调用其成员函数之一。但是,最重要的是要了解如何使用该功能。

该函数的原型是:

istream& getline(char *buffer, int length, char terminal_char);

char * buffer是指向字符数组第一个元素的指针,因此它实际上可以用于访问数组。int长度只是要输入的字符串最大长度(数组有多大)。char terminal_char表示如果用户输入任何字符,则字符串将终止。请记住,它将丢弃任何终端字符。

可以对cin.getline(arry,50);进行函数调用。没有终端字符。注意,“ \ n”是实际告诉编译器您的意思是换行的方式,即有人按下Enter键。

例如:

#include <iostream>
 
using namespace std;
 
int main()
{
  char string[256];                               // A nice long string
 
  cout<<"Please enter a long string: ";
  cin.getline ( string, 256, '\n' );              // Input goes into string
  cout<<"Your long string was: "<< string <<endl;
  cin.get();
}

请记住,当您传递字符串时,实际上是在传递数组的地址,因为数组不需要使用地址运算符(&)来传递其地址。除此之外,您可以将’\ n’设置为所需的任何字符(确保用单引号将其引起来以通知编译器其字符状态),以使getline终止于该字符。

cstring是一个头文件,其中包含许多用于处理字符串的函数。其中之一是字符串比较功能。

int strcmp ( const char *s1, const char *s2 );

strcmp将接受两个字符串。它将返回一个整数。该整数将是:

Negative if s1 is less than s2.
Zero if s1 and s2 are equal.
Positive if s1 is greater than s2.

Strcmp区分大小写。Strcmp还将字符数组的地址传递给函数以允许对其进行访问。

char *strcat ( char *dest, const char *src );

strcat是字符串连接的缩写,表示添加到末尾或追加。它将第二个字符串添加到第一个字符串。它返回一个指向串联字符串的指针。当心此功能,它假定dest足够大,可以容纳src的全部内容及其自身的内容。

char *strcpy ( char *dest, const char *src );

strcpy是字符串复制的缩写,这意味着它将src的全部内容复制到dest中。strcpy之后的dest内容将与src完全相同,这样strcmp(dest,src)将返回0。

size_t strlen ( const char *s );

strlen将返回字符串的长度减去终止符(’\ 0’)。size_t无需担心。只需将其视为不能为负的整数即可。

这是一个使用许多先前描述的功能的小程序:

#include <iostream> //For cout
#include <cstring>  //For the string functions
 
using namespace std;
 
int main()
{
  char name[50];
  char lastname[50];
  char fullname[100]; // Big enough to hold both name and lastname
   
  cout<<"Please enter your name: ";
  cin.getline ( name, 50 );
  if ( strcmp ( name, "Julienne" ) == 0 ) // Equal strings
    cout<<"That's my name too.\n";
  else                                    // Not equal
    cout<<"That's not my name.\n";
  // Find the length of your name
  cout<<"Your name is "<< strlen ( name ) <<" letters long\n";
  cout<<"Enter your last name: ";
  cin.getline ( lastname, 50 );
  fullname[0] = '\0';            // strcat searches for '\0' to cat after
  strcat ( fullname, name );     // Copy name into full name
  strcat ( fullname, " " );      // We want to separate the names by a space
  strcat ( fullname, lastname ); // Copy lastname onto the end of fullname
  cout<<"Your full name is "<< fullname <<"\n";
  cin.get();
}

安全编程
上面的字符串函数都依赖于字符串末尾是否存在空终止符。这并不总是安全的选择。此外,其中的一些字符串(尤其是strcat)依赖于以下事实:目标字符串可以容纳整个字符串,这些字符串将附加到末尾。尽管看起来您永远不会犯这样的错误,但是从历史上看,基于意外注销诸如strcat之类的函数的数组末尾的问题一直是一个主要问题。

幸运的是,C的设计人员以其无穷的智慧,提供了旨在帮助您避免这些问题的函数。与fgets占用适合缓冲区的最大字符数的方式类似,有些字符串函数带有附加参数来指示目标缓冲区的长度。例如,strcpy函数具有类似的strncpy函数

char *strncpy ( char *dest, const char *src, size_t len );

这只会将len个字节从src复制到dest(len应该小于dest的大小,否则写操作仍可能超出数组的范围)。不幸的是,strncpy可能导致一个麻烦的问题:它不能保证dest会附加一个空终止符(如果字符串src比dest长,则可能会发生这种情况)。您可以通过使用strlen获取src的长度并确保它适合dest来避免此问题。当然,如果您打算这样做,那么您可能首先不需要strncpy,对吗?错误的。现在,它迫使您注意这个问题,这是战斗的重要组成部分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值