Если вы хотите сохранить простоту, вы можете определять границы слов, проверяя два символа за раз. Вот рабочий пример .
using namespace std;
#include
#include
#include
typedef enum boundary_type_e {
E_BOUNDARY_TYPE_ERROR = -1,
E_BOUNDARY_TYPE_NONE,
E_BOUNDARY_TYPE_LEFT,
E_BOUNDARY_TYPE_RIGHT,
} boundary_type_t;
typedef struct boundary_s {
boundary_type_t type;
int pos;
} boundary_t;
bool is_word_char(int c) {
return ' ' <= c && c <= '~' && !isspace(c) && c != ',';
}
boundary_t maybe_word_boundary(string str, int pos) {
int len = str.length();
if (pos < 0 || pos >= len) {
return (boundary_t){.type = E_BOUNDARY_TYPE_ERROR};
} else {
if (pos == 0 && is_word_char(str[pos])) {
// if the first character is word-y, we have a left boundary at the beginning
return (boundary_t){.type = E_BOUNDARY_TYPE_LEFT, .pos = pos};
} else if (pos == len - 1 && is_word_char(str[pos])) {
// if the last character is word-y, we have a right boundary left of the null terminator
return (boundary_t){.type = E_BOUNDARY_TYPE_RIGHT, .pos = pos + 1};
} else if (!is_word_char(str[pos]) && is_word_char(str[pos + 1])) {
// if we have a delimiter followed by a word char, we have a left boundary left of the word char
return (boundary_t){.type = E_BOUNDARY_TYPE_LEFT, .pos = pos + 1};
} else if (is_word_char(str[pos]) && !is_word_char(str[pos + 1])) {
// if we have a word char followed by a delimiter, we have a right boundary right of the word char
return (boundary_t){.type = E_BOUNDARY_TYPE_RIGHT, .pos = pos + 1};
}
return (boundary_t){.type = E_BOUNDARY_TYPE_NONE};
}
}
int main() {
string str;
string ins_left("");
string ins_right(" ");
getline(cin, str);
// can't use length for the loop condition without recalculating it all the time
for (int i = 0; str[i] != '\0'; i++) {
boundary_t boundary = maybe_word_boundary(str, i);
if (boundary.type == E_BOUNDARY_TYPE_LEFT) {
str.insert(boundary.pos, ins_left);
i += ins_left.length();
} else if (boundary.type == E_BOUNDARY_TYPE_RIGHT) {
str.insert(boundary.pos, ins_right);
i += ins_right.length();
}
}
}
Было бы лучше использовать enum class
, но я забыл обозначения. Вы также можете скопировать в буфер вместо генерации новой строки на месте, я просто пытался сохранить ее простотой. Не стесняйтесь расширять его до стиля C ++, основанного на классах. Чтобы получить желаемый результат, сначала удалите пробелы и добавьте пробелы в ins_left и ins_right.
Иногда изменения, внесенные в модель или в ORM, могут неточно отражаться в базе данных даже после выполнения SchemaUpdate
.
Если ошибка действительно не имеет разумного объяснения, попробуйте воссоздать базу данных (или, по крайней мере, создание новой) и построение ее с помощью SchemaExport
.
Когда Ваше поле не nullable, оно требует, чтобы значение по умолчанию было указано на создании таблицы. Воссоздайте таблицу с AUTO_INCREMENT, правильно инициализированным, таким образом, DB не потребует значения по умолчанию, так как это генерирует его отдельно и никогда не помещать ПУСТОЙ УКАЗАТЕЛЬ там.
CREATE TABLE Persons (
Personid int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
PRIMARY KEY (Personid)
);
Взгляните на стратегию GeneratedValue
. Обычно это выглядит примерно так:
@GeneratedValue(strategy=GenerationType.IDENTITY)
Добавьте метод hashCode ()
в свой класс Entity Bean и повторите попытку