在 CI 中进行了一些编程之后,决定直接进入 C++。起初,我对字符串类的存在感到满意,并且能够将字符串视为整个单元而不是字符数组。但我很快发现,C 风格的字符串的优点是可以让程序逐个字符地遍历它,使用指针算术,并执行所需的逻辑操作。
我现在发现自己处于需要这样做的情况,但编译器告诉我它无法从类型字符串转换为 C 样式字符串。所以我想知道,有没有一种方法可以使用指针算术来引用单个字符或将参数作为第一个字符的地址传递给函数,同时仍然使用字符串类而无需创建字符数组或者我只是想有我的蛋糕,也吃吗?
在 CI 中进行了一些编程之后,决定直接进入 C++。起初,我对字符串类的存在感到满意,并且能够将字符串视为整个单元而不是字符数组。但我很快发现,C 风格的字符串的优点是可以让程序逐个字符地遍历它,使用指针算术,并执行所需的逻辑操作。
我现在发现自己处于需要这样做的情况,但编译器告诉我它无法从类型字符串转换为 C 样式字符串。所以我想知道,有没有一种方法可以使用指针算术来引用单个字符或将参数作为第一个字符的地址传递给函数,同时仍然使用字符串类而无需创建字符数组或者我只是想有我的蛋糕,也吃吗?
字符串字符可以通过索引、指针和使用迭代器来访问。
如果你想使用迭代器,你可以创建一个函数来检查字符串中是否有空格:
bool spacecheck(const string& s)
{
string::const_iterator iter = s.begin();
while(iter != s.end()){
if (isspace(*iter))
return true;
else
++iter;
}
}
在函数的开头,我使用.begin()函数初始化了一个指向字符串s开头的迭代器,在这种情况下,它返回一个指向字符串第一个字符的迭代器。在 while 函数中,条件是iter != s.end()。在这种情况下, end()在迭代器中返回指向字符串最后一个字符之后的元素。在正文中,(*iter)是 iter 指向的值,它被发送到函数isspace(),该函数检查字符是否为空格。如果失败,iter 会递增,这使得 iter 指向字符串的下一个元素。
我自己也在学习 c++,通过写出所有这些东西,它帮助我自己理解了一些东西。如果这一切对您来说似乎很简单,我希望我没有冒犯您,我只是想简洁。
我目前正在从 Accelerated c++ 学习,我不能高度推荐它!
您可以使用&your_string[0]
来获取指向字符串中初始字符的指针。您还可以使用your_string.begin()
将迭代器获取到几乎可以像指针一样对待的字符串中(取消引用它,对其进行算术运算等)
不过,您最好告诉我们更多关于您要完成的工作。很有可能有比使用指针更好的方法来做到这一点。
编辑:对于像计算字符串中元音的数量这样的事情,你几乎肯定想要使用一种算法——在这种情况下,std::count_if
可能是最合适的:
struct is_vowel {
bool operator()(char ch) {
static const char vowels[] = "aeiouAEIOU";
return strchr(vowels, ch) != NULL;
}
};
int vowels = std::count_if(my_string.begin(), my_string.end(), is_vowel());
我们仍在使用begin()
,但没有对其进行任何指针(类似)算术。