Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Алерон
5 / 5 / 0
Регистрация: 13.10.2009
Сообщений: 539
#1

Запись в строку char*, входящую в структуру - C++

20.04.2015, 22:35. Просмотров 853. Ответов 28
Метки нет (Все метки)

Данная функция, преобразует строку в структуру student. Ошибки нет, но записывается ересь. Вроде и понимаю, что написано ужасно криво, но где неверно, понять не могу.
Строка представляет собой следующее: "Владимир Математика 3".
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
struct student
{
    char* name;
    char* subject;
    int mark;
};
 
student LineToStudent(string line)
{
    student st;
    st.name = (char*)malloc(1);
    st.subject = (char*)malloc(1);
    st.mark = 0;
    int i = 0;
    int k = 1;
    while (line[i] != ' ')
    {
        st.name = (char*)realloc(st.name, k*sizeof(char));
        st.name[k] = line[i];
        i++;
        k++;
    }
    cout << st.name;
    i++;
    k = 1;
    while (line[i] != ' ')
    {
        st.subject = (char*)realloc(st.subject, k*sizeof(char));
        st.subject[k] = line[i];
        i++;
        k++;
    }
    i++;
    st.mark = atoi(&line[i]);
    return st;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2015, 22:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Запись в строку char*, входящую в структуру (C++):

Запись символов из файла в единичный char и строку - C++
Всем привет, учусь получать данные из файла и нашёл такое явление: если у нас есть такой код: ifstream gt(&quot;test.ini&quot;); char buff; ...

Что означает такая запись char *smt=new char[1]? - C++
что означает такая запись char *smt=new char?

Запись строки char в массив char - C++
Глупый вопрос, но что поделать, многое забыл... Хочу записть строку типа char в массив строк типа char, но выдает ошибку что &quot;невозможно...

Запись в *char элемента из массива *char[i] - C++
Есть динамический массив, например char *drives = {&quot;A:&quot;, &quot;B:&quot;, &quot;C:&quot;, &quot;D:&quot;, &quot;E:&quot;, &quot;F:&quot;, &quot;G:&quot;, &quot;H:&quot;, &quot;I:&quot;, &quot;J:&quot;, &quot;K:&quot;, &quot;L:&quot;,&quot;M:&quot;, &quot;N:&quot;,...

Измените структуру CStash чтобы данные хранились в объекте типа vector<char> - C++
Измените структуру CStash чтобы данные хранились в объекте типа vector&lt;char&gt; //hello.h struct CStash{ int size; int quantity; ...

Запись в структуру - C++
Вот такой вот вопрос - Есть структура struct scan_data{ char login; char pass; }; Нужно записать хеш пароля в структуру ...

28
nmcf
5542 / 4852 / 1645
Регистрация: 14.04.2014
Сообщений: 19,698
20.04.2015, 22:37 #2
Где установка '\0'?
0
Алерон
5 / 5 / 0
Регистрация: 13.10.2009
Сообщений: 539
20.04.2015, 22:40  [ТС] #3
nmcf, а зачем? У меня в строке 3 слова разделенные проблемами. Первые два ищу до пробела, а последнее это цифра к которой обращаюсь напрямую.
0
nmcf
5542 / 4852 / 1645
Регистрация: 14.04.2014
Сообщений: 19,698
20.04.2015, 22:46 #4
Ты собрал слово из букв и выводишь в 23-й строке, а '\0' где? Это же не string, как программа найдёт конец? У тебя и массив должен быть больше на 1 под это.
1
Kerry_Jr
Модератор
Эксперт PHP
2206 / 2002 / 701
Регистрация: 14.05.2014
Сообщений: 5,867
Записей в блоге: 1
Завершенные тесты: 5
20.04.2015, 22:48 #5
Цитата Сообщение от Алерон Посмотреть сообщение
а зачем?
а затем что вы под имя и название предмета выделяете мало памяти, выделяйте на один символ больше и последним вводите терминальный ноль.
1
Алерон
5 / 5 / 0
Регистрация: 13.10.2009
Сообщений: 539
20.04.2015, 22:48  [ТС] #6
nmcf, ах да, просто не сразу понял о чём вы.
После исправления выводиться: НКоролёвээээ<<<<<<<<оюоюНСемёновээээ<<<<<<<<оюоюДля продолжения нажмите любую кл
авишу . . .
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,206
20.04.2015, 22:52 #7
Цитата Сообщение от Алерон Посмотреть сообщение
nmcf, а зачем?
затем что без нуля строка не строка а набор символов и пока не вставишь 0 в name и subject они строкой не будут
далее
Цитата Сообщение от Алерон Посмотреть сообщение
int k = 1;
..........
* * * * st.name[k] = line[i];
что пишешь в первый элемент строки (индекс 0)?
где проверки выделения, перевыделения памяти?
что будет если между словами будет 2 пробела?
1
Bushmeister
22 / 22 / 6
Регистрация: 19.03.2015
Сообщений: 137
20.04.2015, 22:56 #8
В C++ new и delete
В С malloc realloc free

Код на C++? Да. - Используй new и delete
1
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,206
20.04.2015, 23:00 #9
Цитата Сообщение от Bushmeister Посмотреть сообщение
Код на C++? Да. - Используй new и delete
там нет realloc
в первом подсчитывать количество букв выделить память и во втором прочитать символы

Добавлено через 39 секунд
Цитата Сообщение от Bushmeister Посмотреть сообщение
В С malloc realloc free
я правильно понимаю что в С++ эти функции под запретом?
0
nmcf
5542 / 4852 / 1645
Регистрация: 14.04.2014
Сообщений: 19,698
20.04.2015, 23:01 #10
Если код на C++, то только string.
Без realloc придётся копировать каждый раз содержимое.
1
Алерон
5 / 5 / 0
Регистрация: 13.10.2009
Сообщений: 539
20.04.2015, 23:04  [ТС] #11
Переписал код:
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
student LineToStudent(string line)
{
    student st;
    st.name = (char*)malloc(1);
    st.subject = (char*)malloc(1);
    st.mark = 0;
    int i = 0;
    int k = 1;
    while (line[i] != ' ')
    {
        st.name = (char*)realloc(st.name, (k));
        st.name[k-1] = line[i];
        i++;
        k++;
    }
    i++;
    st.name[k-1] = '\0';
    cout << st.name;
    k = 1;
    while (line[i] != ' ')
    {
        st.subject = (char*)realloc(st.subject, (k));
        st.subject[k-1] = line[i];
        i++;
        k++;
    }
    i++;
    st.subject[k-1] = '\0';
    cout << st.subject;
    st.mark = atoi(&line[i]);
    cout << st.mark;
    return st;
}
Выводит вроде бы правильно. Благодарю всех за оказанную помощь!
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,206
20.04.2015, 23:05 #12
Цитата Сообщение от nmcf Посмотреть сообщение
Если код на C++, то только string.
а если в условии ясно сказано char*?
0
nmcf
5542 / 4852 / 1645
Регистрация: 14.04.2014
Сообщений: 19,698
20.04.2015, 23:08 #13
Цитата Сообщение от ValeryS Посмотреть сообщение
а если в условии ясно сказано char*
Тогда не получится строгого C++.
0
IrineK
Заблокирован
20.04.2015, 23:14 #14
Цитата Сообщение от Алерон Посмотреть сообщение
Строка представляет собой следующее: "Владимир Математика 3"
А если имя с фамилией, предмет из двух-трех слов и несколько оценок?
Как-то всё это не то.
0
Алерон
5 / 5 / 0
Регистрация: 13.10.2009
Сообщений: 539
20.04.2015, 23:20  [ТС] #15
IrineK, у строки(которая передается функции) есть четкие ограничения. То есть, мы абсолютно уверены, что строка содержит два слова и цифру разделенные пробелами.
0
20.04.2015, 23:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2015, 23:20
Привет! Вот еще темы с ответами:

Преобразовать строку из файла, содержащую запись десятичного числа, в строку с двоичным числом - C++
Дана строка, изображающая десятичную запись целого положительного числа. Вывести строку, изображающую двоичную запись этого же числа. И...

Запись байтов в массив char - C++
Есть переменная типа char ch как можно записать туда числа в таком порядке в какой я хочу, у меня есть задача запихать в первые 2 байта...

Запись элемента строки в char - C++
Никак не получается записать элемент строки в переменную char. #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;cstdlib&gt; ...

Запись числа в массив char - C++
Нужно записать int число в виде char. То есть число записать по битам в массив. Как сделать ?


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru