Làm thế nào tôi có thể đếm số lượng "_"
trong một chuỗi như thế "bla_bla_blabla_bla"
nào?
Làm thế nào tôi có thể đếm số lượng "_"
trong một chuỗi như thế "bla_bla_blabla_bla"
nào?
Câu trả lời:
#include <algorithm>
std::string s = "a_b_c";
size_t n = std::count(s.begin(), s.end(), '_');
std::count
trả về loại iterator_traits<InputIt>::difference_type
, mà đối với hầu hết các container tiêu chuẩn std::ptrdiff_t
, thì không std::size_t
.
Mã giả:
count = 0
For each character c in string s
Check if c equals '_'
If yes, increase count
EDIT: mã ví dụ C ++:
int count_underscores(string s) {
int count = 0;
for (int i = 0; i < s.size(); i++)
if (s[i] == '_') count++;
return count;
}
Lưu ý rằng đây là mã để sử dụng cùng với std::string
, nếu bạn đang sử dụng char*
, thay thế s.size()
bằngstrlen(s)
.
Cũng lưu ý: Tôi có thể hiểu bạn muốn một cái gì đó "nhỏ nhất có thể", nhưng tôi khuyên bạn nên sử dụng giải pháp này thay thế. Như bạn thấy, bạn có thể sử dụng một hàm để đóng gói mã cho bạn để bạn sẽ không phải viết ra for
vòng lặp mọi lúc, nhưng chỉ có thể sử dụng count_underscores("my_string_")
trong phần còn lại của mã. Sử dụng các thuật toán C ++ nâng cao chắc chắn là có thể ở đây, nhưng tôi nghĩ nó quá mức cần thiết.
Giải pháp lỗi thời với các biến được đặt tên thích hợp. Điều này cung cấp cho mã một số tinh thần.
#include <cstdio>
int _(char*__){int ___=0;while(*__)___='_'==*__++?___+1:___;return ___;}int main(){char*__="_la_blba_bla__bla___";printf("The string \"%s\" contains %d _ characters\n",__,_(__));}
Chỉnh sửa: khoảng 8 năm sau, nhìn vào câu trả lời này, tôi cảm thấy xấu hổ vì tôi đã làm điều này (mặc dù tôi tự biện minh nó là một câu châm chọc vào một câu hỏi nỗ lực thấp). Điều này là độc hại và không ổn. Tôi không xóa bài viết; Tôi đang thêm lời xin lỗi này để giúp thay đổi không khí trên StackOverflow. Vì vậy, OP: Tôi xin lỗi và tôi hy vọng bạn có bài tập về nhà ngay cả khi tôi troll và câu trả lời như của tôi không khiến bạn nản lòng khi tham gia trang web.
#include <boost/range/algorithm/count.hpp>
std::string str = "a_b_c";
int cnt = boost::count(str, '_');
Bạn đặt tên cho nó ... phiên bản Lambda ... :)
using namespace boost::lambda;
std::string s = "a_b_c";
std::cout << std::count_if (s.begin(), s.end(), _1 == '_') << std::endl;
Bạn cần một số bao gồm ... Tôi để lại cho bạn như một bài tập ...
Sử dụng hàm lambda để kiểm tra ký tự là "_" thì chỉ tính sẽ được tăng lên nếu không phải là ký tự hợp lệ
std::string s = "a_b_c";
size_t count = std::count_if( s.begin(), s.end(), []( char c ){if(c =='_') return true; });
std::cout << "The count of numbers: " << count << std::endl;
[]( char c ){if(c =='_') return true; }
gọi hành vi không xác định vì bạn đã không trả về giá trị trong tất cả các đường dẫn mã
Có một số phương pháp của std :: string để tìm kiếm, nhưng find có lẽ là thứ bạn đang tìm kiếm. Nếu bạn có nghĩa là một chuỗi kiểu C, thì tương đương là strchr. Tuy nhiên, trong cả hai trường hợp, bạn cũng có thể sử dụng vòng lặp for và kiểm tra từng ký tự. Vòng lặp về cơ bản là những gì hai cái này kết thúc.
Khi bạn biết cách tìm nhân vật tiếp theo được cung cấp vị trí bắt đầu, bạn liên tục tiến hành tìm kiếm (nghĩa là sử dụng vòng lặp), tính khi bạn đi.
Đếm số lần xuất hiện của ký tự trong một chuỗi rất dễ dàng:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s="Sakib Hossain";
int cou=count(s.begin(),s.end(),'a');
cout<<cou;
}
Bạn có thể tìm ra sự xuất hiện của '_' trong chuỗi nguồn bằng cách sử dụng các hàm chuỗi. Hàm find () có 2 đối số, chuỗi thứ nhất có lần xuất hiện mà chúng ta muốn tìm hiểu và đối số thứ hai có vị trí bắt đầu. Vòng lặp được sử dụng để tìm ra sự xuất hiện cho đến khi kết thúc chuỗi nguồn.
thí dụ:
string str2 = "_";
string strData = "bla_bla_blabla_bla_";
size_t pos = 0,pos2;
while ((pos = strData.find(str2, pos)) < strData.length())
{
printf("\n%d", pos);
pos += str2.length();
}
Tôi đã làm theo cách này:
#include <iostream>
#include <string>
using namespace std;
int main()
{
int count = 0;
string s("Hello_world");
for (int i = 0; i < s.size(); i++)
{
if (s.at(i) == '_')
count++;
}
cout << endl << count;
cin.ignore();
return 0;
}
Tôi đã làm một cái gì đó như thế :)
const char* str = "bla_bla_blabla_bla";
char* p = str;
unsigned int count = 0;
while (*p != '\0')
if (*p++ == '_')
count++;
Thử
#include <iostream>
#include <string>
using namespace std;
int WordOccurrenceCount( std::string const & str, std::string const & word )
{
int count(0);
std::string::size_type word_pos( 0 );
while ( word_pos!=std::string::npos )
{
word_pos = str.find(word, word_pos );
if ( word_pos != std::string::npos )
{
++count;
// start next search after this word
word_pos += word.length();
}
}
return count;
}
int main()
{
string sting1="theeee peeeearl is in theeee riveeeer";
string word1="e";
cout<<word1<<" occurs "<<WordOccurrenceCount(sting1,word1)<<" times in ["<<sting1 <<"] \n\n";
return 0;
}
public static void main(String[] args) {
char[] array = "aabsbdcbdgratsbdbcfdgs".toCharArray();
char[][] countArr = new char[array.length][2];
int lastIndex = 0;
for (char c : array) {
int foundIndex = -1;
for (int i = 0; i < lastIndex; i++) {
if (countArr[i][0] == c) {
foundIndex = i;
break;
}
}
if (foundIndex >= 0) {
int a = countArr[foundIndex][1];
countArr[foundIndex][1] = (char) ++a;
} else {
countArr[lastIndex][0] = c;
countArr[lastIndex][1] = '1';
lastIndex++;
}
}
for (int i = 0; i < lastIndex; i++) {
System.out.println(countArr[i][0] + " " + countArr[i][1]);
}
}