在C++中选择字符串的前几个字符

22

我想使用C++选择一个字符串的前8个字符。目前我的方法是创建一个8个字符长的临时字符串,并将其填充为另一个字符串的前8个字符。

然而,如果另一个字符串不足8个字符长,我就会得到不需要的空格。

string message = "        ";

const char * word = holder.c_str();

for(int i = 0; i<message.length(); i++)
    message[i] = word[i];

如果word"123456789abc",那么此代码可以正常工作,并且message包含"12345678"

但是,如果word更短,例如"1234",则message最终变为"1234 "

如何选择字符串的前8个字符或整个字符串(如果它少于8个字符)?

6个回答

29

只需要使用std::string::substr函数:

std::string str = "123456789abc";
std::string first_eight = str.substr(0, 8);

2
他的问题含糊不清,无法确定我们哪个答案是正确的。这取决于 OP 在“从字符串中删除其余字符”中所指的“字符串”的含义。 - David Schwartz
如果第一个字符串少于8个字符,对其进行substr操作会改变字符串吗?但感谢您的快速回答,它完美地解决了问题。 - user3483203
@qlear,你应该阅读文档 - substr() 是一个常量方法,即在任何情况下都不会改变对象本身。 - Slava
@qlear 会抛出一个 std::out_of_range 异常。正如 Slava 所说,std::string::substr 不会修改它所调用的字符串;它将返回一个新的字符串。如果想要在没有任何间接操作的情况下修改字符串本身,请参见 DavidSchwartz 的答案。 - cadaniluk

6

只需在字符串上调用resize即可。


4

如果我理解正确,那么您只需要编写以下内容:

std::string message = holder.substr( 0, 8 );

如果您需要从字符数组中提取字符,则可以编写以下代码:
const char *s = "Some string";

std::string message( s, std::min<size_t>( 8, std::strlen( s ) );

1
或者你可以使用这个:

#include <climits>
cin.ignore(numeric_limits<streamsize>::max(), '\n');

如果最大值是8,它会停在那里。但你需要设置。
const char * word = holder.c_str();

对于第8个问题,我相信你可以通过编写

来实现。

 const int SIZE = 9;
 char * word = holder.c_str();

我知道这是否有效。

如果他们在任何时候按下空格键,它只会读取到空格。


0
你可以像下面这样使用"%.xs"。
char str[] = "Hello";
char target[9] = "        ";

sprintf(target, "%.8s", str);

if(strlen(str) < 8)
   target[strlen(str)]=' ';

printf("%s.", target);

-1
char* messageBefore = "12345678asdfg"
int length = strlen(messageBefore);
char* messageAfter = new char[length];

for(int index = 0; index < length; index++)
{
    char beforeLetter = messageBefore[index];
    // 48 is the char code for 0 and 
    if(beforeLetter >= 48 && beforeLetter <= 57)
    {
        messageAfter[index] = beforeLetter;
    }
    else
    {
        messageAfter[index] = ' ';
    }
}

这将创建一个适当大小的字符数组,并将每个数字字符(0-9)传输过来,并用空格替换非数字字符。听起来这正是你要找的。

根据其他人根据你的问题所解释的内容,你可以轻松修改上述方法,以获得只包含数字部分的结果字符串。

类似于:

int length = strlen(messageBefore);
int numericLength = 0;
while(numericLength < length &&
      messageBefore[numericLength] >= 48 &&
      messageBefore[numericLength] <= 57)
{
    numericLength++;
}

然后在先前的逻辑中使用numericLength代替length,你将得到第一批数字字符。
希望有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接