01/10/2018, 10:43

Xử lý string trong C++

#include <iostream>
#include<string>
#include <math.h> 
#include <vector> 
using namespace std;


int main()
{
	int i, j, k;
	vector<string> SS; //Vector of string 
	string Str = "I love you. anh yeu em. anh yeu em";
	while (!Str.empty())
	{
		SS.push_back(Str.substr(0, Str.find(" ")));// add word to vector 
	
		if (Str.find(" ") > Str.size()) //Check if found " " (Space) 
		{
			break;
		}
		else
		{
			Str.erase(0, Str.find(" ") + 1); // Update string 
		}
	}


	for (int i = 0; i < SS.size(); i++)
	{
		cout << SS[i] << endl;
	}


	

	system("pause");
	return 0;
}

Em đã viết được hàm cắt chuối trong string và lưu vào vector ,nhưng bây giờ em muốn xuất ra màn hình số lần xuất hiện của các string đã cắt ,xuất hiện trong trong xâu chính.nhưng không biết phải viết,thao tác như thế nào.A/c nào pro giúp em với.Em là dân ngoại,không phải là dân lập trình,nên có gì a/c thông cảm nếu em không biểu đạt đúng.
Ý tưởng của em không biết có đúng không,a/c tham khảo: em định xóa đi phần tử trùng nhau trong vector .sau đó so sánh SS[i] với xâu ban đầu,đưa ra biến đếm số lần xuất hiện.<mỗi tội làm mãi vẫn báo lỗi>hihi

Quang Minh viết 12:47 ngày 01/10/2018

Ờm… lần tới viết bài thì để yêu cầu của bài toán lên đầu nhé, rồi code bên dưới, cho dễ hiểu.
Chứ vào topic Xử lý string trong C++ .Please! rồi bên dưới độp cả đống code, sợ lắm.
Quay lại với bài này, có phải ý của bạn là đếm số lần xuất hiện của từng chuỗi trong mảng (vector)?
Nếu đúng như vậy thì mình có mấy dòng code dưới đây.

	//***********************************************************************//
	vector <int> counting;
	for (int i = 0; i < SS.size() - 1; i++) {
		int count = 1;
		for (int j = SS.size() - 1; j > i; j--)
			if (SS[i] == SS[j]) {
				count++;
				SS.erase(SS.begin() + j);
			}
		counting.push_back(count);
	}
	if (SS.size() - counting.size()) counting.push_back(1);
	cout << "\n---------------------\n";
	for (int i = 0; i < SS.size(); i++) cout << SS[i] << '\t' << counting[i] << '\n';
	//***********************************************************************//

Ý tưởng của mình sẽ dùng 2 vòng lặp, vòng ngoài chạy xuôi còn vòng trong chạy ngược lại, nếu gặp phần tử giống nhau thì sẽ xóa bỏ phần tử đó (erase) và đồng thời tăng biến đếm (count) lên 1 đơn vị.
Kết thúc một vòng lặp trong thì sẽ add biến đếm đó vào mảng counting luôn, nên vậy chỉ số của phần tử cần đếm và số lần xuất hiện trong 2 mảng SScounting sẽ giống nhau, tiện cho việc hiển thị.
Chèn vào code của bạn:

#include <iostream>
#include <string>
#include <math.h>
#include <vector>
using namespace std;


int main()
{
	int i, j, k;
	vector<string>SS; //Vector of string
	string Str = "I love you. anh yeu em. anh yeu em";
	while (!Str.empty())
	{
		SS.push_back(Str.substr(0, Str.find(" ")));// add word to vector

		if (Str.find(" ") > Str.size()) //Check if found " " (Space)
		{
			break;
		}
		else
		{
			Str.erase(0, Str.find(" ") + 1); // Update string
		}
	}


	for (int i = 0; i < SS.size(); i++)
	{
		cout << SS[i] << endl;
	}

	//***********************************************************************//
	vector <int> counting;
	for (int i = 0; i < SS.size() - 1; i++) {
		int count = 1;
		for (int j = SS.size() - 1; j > i; j--)
			if (SS[i] == SS[j]) {
				count++;
				SS.erase(SS.begin() + j);
			}
		counting.push_back(count);
	}
	if (SS.size() - counting.size()) counting.push_back(1);
	cout << "\n---------------------\n";
	for (int i = 0; i < SS.size(); i++) cout << SS[i] << '\t' << counting[i] << '\n';
	//***********************************************************************//

	// system("pause");
	return 0;
}
Dong viết 12:53 ngày 01/10/2018

Em đang làm load 1 file tiếng anh dàii vào, code anh làm hình như đếm lỗi,.Giờ sửa nó ntn cho đúng với trường hợp file hay xâu dài ạ,Em thử nhưng không được,không biết sai ở đâu nữa.

Dark.Hades viết 12:52 ngày 01/10/2018

Ý tưởng của mình thì split string đó ra mảng, mình có viết sẵn hàm util đấy , bạn xem rồi áp dụng:

github.com

HadesD/Utilities/blob/master/CPP/str_split.cpp

#include <vector>
#include <string>

std::vector<std::string> split(const std::string &s, const char delim)
{
  unsigned int i = 0;
  auto pos = s.find(delim);
  std::vector<std::string> v;
  while (pos != std::string::npos) {
    v.emplace_back(s.substr(i, pos-i));
    i = ++pos;
    pos = s.find(delim, pos);
  }
  if (pos == std::string::npos)
  {
     v.emplace_back(s.substr(i, s.length()));
  }
  
  return v;
}
This file has been truncated. show original

Quang Minh viết 12:44 ngày 01/10/2018

Thì bây giờ bạn sửa input đi, thành đọc từ file .txt.
Bạn xem thêm phần thao tác với tệp nhé:

Chào các bạn đang theo dõi khóa học lập trình trực tuyến ngôn ngữ C++. Mình đã trình bày đến các bạn một số thao tác cơ bản với file khi sử dụng thư viện cstdio (trong ngôn ngữ lập trình C), sử dụng thư viện này, chúng ta sẽ sử dụng một con trỏ kiểu FILE làm cầu nối trung gian giữa chương trình của chúng ta và file, mọi thao tác trên file đều phải sử dụng con trỏ kiểu FILE này. Trong bài học này, các bạn sẽ cùng mình tìm hiểu thêm một số cách để thao tác với file bằng cách sử dụng các stream mà…

Dong viết 12:48 ngày 01/10/2018

Em đã thao tác với tệp hành công file english.nhưng đém bị lỗi.em sd code anh page

HK boy viết 12:54 ngày 01/10/2018

Em đã thao tác với tệp hành công file english.nhưng đém bị lỗi.em sd code anh page

Ý bạn là gì???

Quang Minh viết 12:50 ngày 01/10/2018

nhưng đém bị lỗi

Mình nghĩ bị lỗi là do các dấu “.”, dấu “,” hay dấu ngoặc ()… vì các ký tự này liền với từ, chương trình sẽ nhận luôn nó vào thành chuỗi. ví dụ như câu trên có từ “em” và từ “em.”, hai chuỗi này khác nhau.
Bạn sửa chương trình để nó lọc những dấu này ra nhé.

Bài liên quan
0