Сначала давайте разделим ваш код на две разные функции с двумя разными целями, чтобы мы могли поговорить о них по отдельности:
Удалить не буквы из строки
Ваш код:
void purge(char *ini) {
int x = 0;
bool answ;
char *elim = ini;
for (int i = 0; ini[i] != '\0'; i++) {
if (ini[i] >= 'A' && ini[i] <= 'Z') {
elim[i] = ini[i] + 32;
x++;
} else if (!(ini[i] >= 'a' && ini[i] <= 'z')) {
elim[i]='\0';
} else{
x++;
}
}
}
Основная проблема с этим кодом:
Что должен делать x
? Похоже, он должен отслеживать количество допустимых символов, но вы никогда не используете его. На самом деле, если мы запустим тест:
char s[256] = "a!bc";
purge(s);
ASSERT_EQ("abc", s); // This fails, purge changed the string s into just "a".
Как мы можем это исправить?
Ну, используя x
!
void purge(char *str) {
int x = 0;
for (int i = 0; ini[i] != '\0'; i++) {
if (str[i] >= 'A' && str[i] <= 'Z') {
str[x] = str[i] - 'A' + 'a';
x++;
} else if (str[i] >= 'a' && str[i] <= 'z') {
str[x] = str[i];
x++;
}
}
// Make sure we null terminate the new string.
str[x] = '\0';
}
Проверить, если строка представляет собой палиндром
Ваш код:
bool is_palindrome(char *test, int u){
char *well = test;
bool chk = false;
for (int i = 0; i<2; i++) {
if (well[i] != well[u-i-1]) {
return false;
}
cout << well[i];
}
return true;
}
Проблемы с кодом:
- Неверные имена переменных. Каким должен быть
u
? Что well
должно быть? - Почему вы только зацикливаетесь на
i=0..2
?
Как мы можем это исправить ...
bool is_palindrome(char *str, int str_length) {
for (int i = 0; i < str_length / 2; i++) {
if (str[i] != str[str_length - i - 1]) {
return false;
}
}
return true;
}
Другие мысли
Переписав код в виде двух отдельных функций, мы можем начать добавлять тесты в этот код. Например, мы могли бы использовать инфраструктуру модульного тестирования Google, чтобы сделать что-то вроде:
TEST(MyTests, Purge_Nothing) {
char a[256] = "abc";
purge(a);
EXPECT_EQ(std::string("abc"), a);
}
TEST(MyTests, Purge_Non_Letters_At_Front) {
char a[256] = "!abc";
purge(a);
EXPECT_EQ(std::string("abc"), a);
}
TEST(MyTests, Purge_Non_Letter_In_Middle) {
char a[256] = "ab!c";
purge(a);
EXPECT_EQ(std::string("abc"), a);
}
TEST(MyTests, Purge_Non_Letters_At_End) {
char a[256] = "abc!";
purge(a);
EXPECT_EQ(std::string("abc"), a);
}
TEST(MyTests, Purge_Uppercase) {
char a[256] = "Abc!";
purge(a);
EXPECT_EQ(std::string("abc", a);
}
TEST(MyTests, Palindrome) {
EXPECT_TRUE(is_palindrome("abcba");
EXPECT_TRUE(is_palindrome("abba"));
EXPECT_TRUE(is_palindrome("aba"));
EXPECT_TRUE(is_palindrome("aa"));
EXPECT_TRUE(is_palindrome("z"));
EXPECT_TRUE(is_palindrome(""));
EXPECT_FALSE(is_palindrome("abcda");
EXPECT_FALSE(is_palindrome("abda");
EXPECT_FALSE(is_palindrome("abd");
EXPECT_FALSE(is_palindrome("ad");
}