Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 25.01.2015
Сообщений: 4

Сравнение char* и const string

25.01.2015, 20:58. Показов 3243. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решаю небольшую и стандартную задачу с бинарными деревьями и столкнулся с проблемой на этапе ввода данных.
Нужно считать из файла строки, где первой цифрой записано количество строк, а далее идут строки которые имеют различный вид, и если нам встречается строка вида :
Insert a
где а - целое, нужно вызвать функцию ...бла бла бла..., начинаю с того, что бы просто это самое а занести в массив.

Спотыкаюсь на сравнении массива из char'ов c "Insert"
в принципе все логично - "Insert" - строка, она реально длинной 7 (в конце завершающий символ '\0')


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
main()
{
 
    int x;
    int n;
    
    //string s;
    char *s;
    int *mas;
 
//открытие файла
    ifstream input;
    input.open("input.txt");
    input >> n;
    n=3; //отладочное n
 
    s = new char[7]; //знаю что так нельзя, но опять же отладочное значение. 
//Кстати что задать лучше всего? строка может быть бооольшой длинны в теории. 
 
    mas = new int[n]; // тоже пока не имеет значения какой массив, 
//буду потом мультипликативно добавлять память в массив при добавлении новых листов
                                
 
    for(int i=0;i<n;i++)
    {
        input >> s;
        //-----попытки разобраться---------------
        s[6]='\0'; 
        //s[strlen(s)+1]='\0'; // от безнадеги пробовал уже и так 
        cout << s << endl;
        cout <<" Razmer s = "<< strlen(s) << "razmer \"Insert\" : " << sizeof("Insert") <<endl;
        //-----конец попыток-----------
               
        
 
        if(s == "Insert") //вот из-за чего весь сыр-бор
        {
            input >> mas[i];
            //mas[i]=atoi(s);
        }
 
    }
 
    for(int i=0;i<n;i++) cout << mas[i] << " ";
 
    return 0;
}
И вот жешь собака - всегда выводит на экран
Code
1
2
3
4
5
6
7
Insert
 Razmer s = 6razmer "Insert" : 7
100
 Razmer s = 3razmer "Insert" : 7
Insert
 Razmer s = 6razmer "Insert" : 7
-842150451 -842150451 -842150451 Press any key to continue . . .
что бы я ни делал в
C++
1
s = new char[7];
и в
C++
1
s[6]='\0';
что бы не добавлял, все равно у s длинна 6 и 3 .

легко можно снять комменты с
C++
1
//string s
и спрятать упоминания про
C++
1
char*
и все работает.
Но хочется докопаться до сути - можно как-то обойтись без стрингов? или это извращение, так никто не делает и даже не стоит об этом задумываться или все-таки можно что-то сделать?
из того что приходит в голову - посимвольное сравнение, а есть еще варианты?



Файл пока что имеет вид
Code
1
2
3
4
5
6
7
6
Insert 100
Insert 10
Insert 5
Insert 50
Insert 7
Insert 3
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.01.2015, 20:58
Ответы с готовыми решениями:

Сравнение std::string с const char *
В структуре определено неявное преобразование в std::string и const char * и наоборот: public struct three_values { public: const...

Из string в const char
Доброе время суток! Вопрос мягко говоря из букваря, но сижу туплю уже минут 20! Есть функция которая принимает const char, у меня...

ошибка в программе (cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*')
int main() { string fileName, currWord, currMax = &quot;&quot;; cin&gt;&gt;fileName; freopen(fileName, &quot;r&quot;, stdin); while...

8
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.01.2015, 21:12
Я не понял до конца, что тебя не устраивает, чем плох string. Зачем этот sizeof()?
А 36-я строка неверна для char, надо strcmp() тогда использовать.
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
25.01.2015, 21:18
Цитата Сообщение от Prostoaaz Посмотреть сообщение
s == "Insert"
сишные строки сравниваются через strcmp
C++
1
if (strcmp(s, "Insert") == 0) input >> mas[i];
0
0 / 0 / 0
Регистрация: 25.01.2015
Сообщений: 4
25.01.2015, 21:28  [ТС]
String всем устраивает, но хочется понять можно ли это реализовать char'ами, из дотошности =)
может быть будет когда-нибудь такое задание. Или вопрос на собеседовании(мало ли чего в жизни бывает)

sizeof для того что бы было видно что char'ы все еще меньше размером чем string не смотря на добавление символа в конец, кстати не понятно почему. и почему не смотря на то что я выделил массив на 7 элементов мне говорят что его размер 6?

и сколько сделать размер char что бы без проблем читать строки?

ага, про сравнение строк понял, спасибо!
Но это сработает только с string
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
25.01.2015, 21:32
Цитата Сообщение от Prostoaaz Посмотреть сообщение
Но это сработает только с string
Не со string, а с массивом char'ов. string можно сравнивать так же, как Вы пытались сравнивать массивы char'ов.
1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.01.2015, 21:35
По повода размера. Ты же знаешь формат файла - какой максимальной длины строка может быть, столько и резервируй.
0
0 / 0 / 0
Регистрация: 25.01.2015
Сообщений: 4
25.01.2015, 21:40  [ТС]
Из рабочих, но слегка извращенных идей придумал сделать массив
C++
1
char insert[6]={'I','n','s','e','r','t'};
и сравнивать с ним.

а почему кстати лучше использовать функцию ctrcmp а не == ,ведь по идее == работает быстрее?

Добавлено через 2 минуты
а что если
1. в файле ошибка и затесалась большая строка?
2. если в другой задаче это не будет ясно? или такого обычно не бывает?

если что, извините за глупые вопросы
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.01.2015, 21:52
Древние строки сравнивают только функцией strcmp(), формально ты можешь записать == , но смысл сравнения будет совсем другой.
Если в файле может быть ошибка, то надо читать через getline(), чтобы не выйти за пределы буфера. Проще string использовать.
1
0 / 0 / 0
Регистрация: 25.01.2015
Сообщений: 4
25.01.2015, 22:01  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Древние строки сравнивают только функцией strcmp(), формально ты можешь записать == , но смысл сравнения будет совсем другой.
угу... то есть по идее сравняться не значения указателей, а то указывает ли указатель на ту же область памяти?

ага, про getline спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.01.2015, 22:01
Помогаю со студенческими работами здесь

Std::string в const char*
можно ли std::string превратить в const char* и как это сделать?

Реализация функции char *padl(const char *string, int len, int c=' ')
Реализовать функцию возвращающую указатель на новую строку длины len, полученную из string либо удалением лишних символов слева , либо...

Неправильная запись const char* в std::string
Привет, делаю Web-Парсер на плюсах и Python (на Питоне только Web пока что). В данный момент занимаюсь запросами. Решил пойти по-простому...

Как копировать отдельные элементы из string в const char по C++ 98?
в зависимости от выполнения условия нужно скопировать только нужные символы, чтобы потом преобразовать их к int через atoi. Подскажите...

Как передать символ в функцию (const char *string)
Мне нужно передать в функцию atof символы F, F, S, S, но когда я пытаюсь так сделать ошибка invalid conversion from 'char' to 'const...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru