ниже мой код, который пытается разделить строку «ключ = значение» на два подмассива «ключ» и «значение», и вот ошибки:
string2StringPair.cc:9:3: ошибка: «std» не называет тип;
string2StringPair.cc:10:3: ошибка: «std» не называет тип;
string2StringPair.cc:13:12: ошибка: ожидаемый инициализатор перед «string2StringPair»
#ifndef __PARSE_H_
#define __PARSE_H_
#include "cppstd.hh"#include <string>
using namespace std;
struct StringPair{
std:string key;
std:string value;
}
StringPair string2StringPair (char* str[]){
std:string x, y;
x = ""; y = "";
for (int i=0;i<str.length();i++){
if str[i]=="="{
for (int j=0;j<i;j++){
x=x+str[j];
}
for (int k=(i+1);k<str.length();k++){
y=y+str[k];
}
break;
}
}
if ((x=="") && (y=="")){
cout<<"ERROR: There is no = in the input string!"<<endl;
}
StringPair tmp;
tmp.key = x;
tmp.value = y;
return tmp;
}
#endif
int main(int argc, char *argv[]){
StringPair pair;
pair.string2StringPair(argv[1]);
cout<<"The pair is "<<pair<<endl;
return 0;
}
был бы очень признателен, если бы вы могли помочь мне исправить ошибки.
Когда я изменился на
std::string key;
std::string value;
Больше не было ошибки «std». Зачем??
Почему инициализатор ожидается перед string2StringPair? Я, хотя у меня уже был один: StringPair?
Вы пропустили этот :
std::
вместо std:
РЕДАКТИРОВАТЬ
Когда я изменился на
std :: string key; std :: string value; Не было больше «стандартной ошибки».
Зачем??
Потому что компилятор C ++ ожидает другого :
после :
согласно определению scope resolution
правила в стандартах C ++.
Разделитель между пространством имен и тем, что следует, состоит из двух символов двоеточия в C ++.
Итак, вам нужно следующее:
std::string key;
Или, так как вы говорите using namespace std
вы можете опустить std::
префикс вообще. Тем не мение, using namespace std
является не считается хорошей практикой кодирования.
Короче говоря: удалить using namespace std;
и использовать std::
префикс.
Кроме того, для включаемых охранников не используйте идентификаторы с двойным подчеркиванием (или даже с единичным подчеркиванием). Существуют довольно строгие правила в отношении начальных подчеркиваний в идентификаторах, которые зарезервированы в стандарте C ++. Хотя вы можете избежать их использования, это определенно не рекомендуется.
Просто используйте
#ifndef PARSE_H
#define PARSE_H
std :: а не std: //note :: is two times.
Если вы используете пространство имен std, в любом случае нет необходимости использовать «std ::». Выберите одно соглашение программирования.
Что касается вашего отредактированного вопроса о том, почему больше нет ошибки после использования ::,
«::» используется для доступа к статическим переменным и методам класса / структуры или пространства имен. Он также обычно используется для доступа к переменным и функциям из другой области. Повторите основы C ++, иначе это будет сложнее, чем больше вы прогрессируете.
Есть ряд ошибок.
Вам нужно использовать две двоеточия после std
где вы используете это.
struct
декларации должны сопровождаться точкой с запятой.
struct StringPair {
std::string key;
std::string value;
}; // <-- add semi-colon here
Вы хотели использовать std::string
в качестве входных данных для string2StringPair (), так как вы используете str
как объект в этой функции.
StringPair string2StringPair (std::string str){
Вам нужно использовать str.size()
для получения длины строки и сравнения символов используйте одинарные кавычки, а не двойные.
for (int i=0 ; i< str.size();i++){ // use str.size()
if(str[i] == '=') { // "=" is a string. '=' is a single character.
В вашей функции main () вы намеревались присвоить результат string2StringPair () в pair
, pair
не имеет методов для вызова.
pair = string2StringPair(argv[1]);