01/10/2018, 09:59
Vector và con trỏ
Mình có viết một hàm GetTokens() chỉ lấy 1 hoặc 2 tokens bằng C. Bây giờ mình muốn đổi sang C++ và sử dụng vector để lưu giá trị 2 tokens đó. Mình muốn hàm GetTokens() trả về một con trỏ tới vector nhưng mình không chắc lắm. Mấy bạn có cho mình ý kiến với.
Đây là header của mình:
#ifndef Tokenizer_h
#define Tokenizer_h
#include <vector>
using namespace std;
class Tokenizer {
public:
is_number(char *arr);
vector<string>* GetTokens();
};
#endif
Còn đây là hàm GetTokens
#include <vector>
#include <stdlib.h>
#include <strings.h>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <iostream>
#include <string>
#include "Tokenizer.hpp"
using namespace std;
int is_number(char *arr){
int check = 0;
for (int i= 0; i < strlen(arr); i++){
if (isdigit(arr[i])){
//check = 0; //number
} else check++;//string
//*arr++;
}
if (check == 0)
return 0;//number
else
return 1; //string
}
vector<string>* GetTokens()
{
vector<string> *ptrVT = new vector<string>();;
int countVT = 0;
char str[256];
char *ptr;
char *ptr2;
char **b = (char **)malloc(256*sizeof(char));
char *p;
int count =0;
int index;
int j =0;
int num_space;
int checkNumCL = 0;
do{
do{
count = 0;
index = 0;
num_space = 0;
countVT =0;
/*if (checkNumCL > numCL)
{
exit(0);
}*/
//stdin_flush();
cout << "> " ;
fgets(str,66,stdin);
str[strlen(str)-1] = ' ';
if (strlen(str)>20){
cout << "ERROR! Input string too long." << endl;
//checkNumCL++ ;
continue;
}
ptr = str;
while (*ptr != ' '){
if (*ptr == ' '){
num_space++;
}
ptr++;
}
p = strtok(str," ");
while (p != NULL){
b[index] = p;
ptrVT->push_back(&p[index]);
count++;
index++;
countVT++;
p = strtok(NULL," ");
}
if (count > 2 || count <= 0){
cout << "ERROR! Incorrect number of tokens found." << endl;
//checkNumCL++ ;
}
ptr = str;
}while(count > 2 || count <= 0);
if (count == 2){
char temp[256] = {};
for (int i=0; i < count; i++){
if (is_number(b[i]) == 0)//number
strcat(temp,"INT");
else
strcat(temp,"STR");
}
if (strcasecmp(temp,"STRINT")!= 0){
cout << "ERROR! Expected STR INT." << endl;
//checkNumCL++ ;
continue;
}
}
else if(count == 1)
{
if(is_number(b[0]) == 0){
cout << "ERROR! Expected STR." << endl;
//checkNumCL++ ;
continue;
}
}
if (strcasecmp(str,"quit") == 0){
exit(0);
}
j = 0;
while (j < index){
if (is_number(b[j]) == 0)
cout << "INT ";
else
cout << "STR ";
j++;
}
checkNumCL++;
printf("
");
}while(strcasecmp(str,"quit
") != 0); //&& checkNumCL < numCL);
return ptrVT;
}
Bài liên quan
Trong class thì bạn khai báo
vector<string>* GetTokens();
Trong định nghĩa hàm thì lại làvector<string> GetTokens(int numCL)
. Rốt cuộc bạn muốn trả về con trỏ hay trả về vector?Với cả nếu trả về con trỏ hay vector, tại sao lại return 0?
Mình bỏ nhầm code cũ. Mình đã update lại rồi đó bạn. Bạn xem giúp mình là mình đã khai báo biến trong header va class đã đúng chưa. Thầy mình yêu cầu là file Tokenizer.cpp sẽ trả về con trỏ của vector kiểu string.
Đây là lỗi lúc mình compile. Không biết có phải là mình dùng C code trong C++ sẽ bị lỗi không?
phương thức
is_number()
chưa có kiểu dữ liệu.trong phương thức
GetTokens()
, bạn sai cú pháp. Đọc kỹ thông báo lỗi đi :))Hàm is_number mình đã khai báo biến con trỏ như vậy không được hả bạn. Còn trong hàm GetTokens mình muốn lấy giá trị lấy từ con trỏ đẩy vào vector có được không vậy bạn. Vì trong chương trình mình viết bằng C, mình dùng hàm strtok để lấy giá và dùng hàm con trỏ để chỉ tới giá trị cần lấy. Từ C chuyển qua C++ nên mình không rành lắm
Gợi ý dài dòng quá. Mình chỉ luôn lỗi nhé:
Hàm is_number, bạn khai báo thế này:
Thế thì rốt cuộc hàm này trả về cái gì? Nếu không trả về gì thì phải là
void is_number(char* arr);
chứThứ 2:
Hàm
GetTokens();
được khai báo ở trên, ở dưới lại có hàmTokenizer()
nào thế?Thứ 3:
Thế dấu
;
trước return đâu?Thứ 4:
Hàm Tokenizer() trả về kiểu dữ liệu
vector<string>*
trong khi VTname là kiểu dữ liệuvector<string>
, làm sao mà return được.Cảm ơn bạn. Mình đã fix những lỗi nhỏ đó nhưng vẫn không chạy được. Mình đã updated code của mình. Bạn xem giúp mình là mình dùng push_back(p[index]) để gán giá trị từ token vào trong vector có đúng không?
Đây là lỗi của mình
Hàm này đã được khai báo đâu, bạn phải đọc log để debug chứ.
Mình đã include header vào trong Tokenizer.cpp rồi mà tại sao mình vẫn phải dùng :: để vào hàm GetTokens là sao bạn? Bạn có thể giải thích cho mình được không?
đúng, vẫn phải dùng
vector<string>* Tokenizer::GetTokens()
để định nghĩa.Như bạn viết:
Nó chỉ là 1 hàm ở bên ngoài chương trình, không liên quan gì tới class cả
Vậy làm cách nào để định nghĩa nó trong header vậy bạn?
Bạn đưa vào header như thế là đúng rồi. Nhưng chỉ có tác dụng cho chương trình biết được Tokenizer thôi. Còn muốn xây dựng hàm thì vẫn phải dùng toán tử ::
bạn thực sự không biết về toán tử :: à. Thấy cú pháp mình đưa ở trên không?