Работа со структурами+strcpy
, из char в char
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.116] |
|
|
Работа со структурами+strcpy
, из char в char
|
Сообщ.
#1
,
|
|
|
|
Добрый день.
Помогите разобраться! Уже пролазил в поиске, но даже точно не знаю, где искать. ![]() ![]() #include <stdio.h> #include <string.h> #define NAME_SIZE 256 typedef struct { int id; char name[NAME_SIZE]; } Data; int main(){ Data postoi[100]; printf("Vvedite nomer"); scanf("%d", &postoi->id); printf("Vvedite bykvi"); scanf("%s", postoi->name); printf("%d%s", postoi->id, postoi->name); printf("Zapisano v stryktyry postoi\n"); char tempa[NAME_SIZE]; tempa = *postoi->name; // strcpy(tempa, postoi->name); эта строка в Visual Studio не катит printf("Perezapisano vo vremenyu peremenyu, %s\n", tempa); Data vremennai[100]; strcpy(vremennai->name, tempa); printf("Zapisano v novyu stryktyry%s\n", vremennai->name); int p; scanf("%d", &p); return 0; } Суть проблемы, хочу записать из структуры символы в переменную, потом из переменной, переписать символы в новую структуру. На этот код компилятор выдаёт : incompatible types in assignment of `char' to `char[256]' У меня по ходу проблема с осознанием значений указателей и адресов...Подскажите, как правильно выполнить копирование. И правильно ли здесь используются указатели? |
|
Сообщ.
#2
,
|
|
|
|
Начни с прочтения какой-нибудь книжки.
Здесь проще сказать что правильно, чем что неправильно - неправильно практически всё. Добавлено Цитата muskos @ tempa = *postoi->name; Вместо этого должно быть: ![]() ![]() strncpy(tempa, postoi[N].name, sizeof(tempa)); tempa[sizeof(tempa)/sizeof(tempa[0])-1]=0; или просто ![]() ![]() strncpy(tempa, postoi[N].name, 100); tempa[99]=0; Где N - индекс элемента массива с которым ты хочешь работать. |
|
Сообщ.
#3
,
|
|
|
|
Ты пишешь:
![]() ![]() tempa = *postoi->name; tempa имеет тип char*, postoi->name имеет тип char*, но ты это дело разыменовываешь и получаешь char. Стоит ли удивляться, что компилятор выдает ошибку? |
|
Сообщ.
#4
,
|
|
|
|
awax, какой строчкой я это делаю?
|
|
Сообщ.
#5
,
|
|
|
|
Той, что находится перед закомментированной
![]() Закомментируй ее, а ту что закомментирована, разкомментируй. |
|
Сообщ.
#6
,
|
|
|
|
Я хотел вот cppasm'у сказать ещё...
строчка strcpy в визуал студио не работает( В деве без того, что awax называет разименовать, работает нормально. Т.е. если раскоментить строчку и убрать разименовывание... Так а что делать? Как сделать, что бы заработало? Добавлено Там суть вообще, надо сделать пузырьковым методом...Это всё товарисчу. у него не получается сохранить строку из структуры в отдельную строку, что бы потом отпузырить её и удалить... |
|
Сообщ.
#7
,
|
|
|
|
Закомментируй ее, а ту что закомментирована, разкомментируй.
|
|
Сообщ.
#8
,
|
|
|
|
в Devc++ работает
в Microsoft Visual Studio2008 не работает |
|
Сообщ.
#9
,
|
|
|
|
Компилируется?
|
|
Сообщ.
#10
,
|
|
|
|
Цитата muskos @ strcpy(tempa, postoi->name); Вот это не работает, postoi - это массив, а не структура. У него нету поля name. Замени на strcpy(tempa, postoi[0].name); Но лучше так как я написал выше. |
|
Сообщ.
#11
,
|
|
|
|
to awax сорри, что долго у самого вс нету(
error C3861: 'strcpy': identifier not found вот что ругает на эту строчку... может есть другой подход...Опишу суть задания и логику... Саздаём файл, в него записываем структуры...там к примеру имя фамилия и номер... надо прочитать из файла...это готово. надо записать в файл...это готово. надо удалить из файла...фатал надо переписать в файле....фатал. Начал с удалить... У чувака логика... Считываем структуры из файла. Узнаём с консоли номер строки для удаления. Потом сортируем пузырьковым методом, что бы структура оказалась последней в массиве. Записываем всё назад в файл, без последней структуры. И вот он меня спрашивает...надо переписать структуру во временную переменную, для пузырька. Сам я с методом не знаком. Я пытался реализовать перепись структуры во временную переменную. Он говорит, что целые числа переписывает на легке, а вот с чарами трабл. ПС НИКИТА ЗАРЕГЕСТРИРУЙСЯ НА ФОРУМЕ И САМ ПЕЧАТАЙ БУКВИ!!! Добавлено cppasm спасибо, ща пробую! Добавлено тупо в вижуал Си не пашет STRCPY функция из string.h Добавлено а я вообще решил выбрать цветы в векторе для пригласительного на свадьбу с моей невестой) |
|
Сообщ.
#12
,
|
|
|
|
Цитата muskos @ error C3861: 'strcpy': identifier not found #include<string.h> есть? Цитата muskos @ И вот он меня спрашивает...надо переписать структуру во временную переменную, для пузырька. Ты не всю структуру переписываешь, а только строку из неё. |
|
Сообщ.
#13
,
|
|
|
|
to cppasm
да, подкручиваю я библиотеку эту... microsoft visual studio 2005 или 2008 стоит... 2)Да я понял, что только эту строку...так я и пытаюсь реализовать сохранение текста из строки во временную переменную |
|
Сообщ.
#14
,
|
|
|
|
![]() ![]() #include <stdio.h> #include <string.h> #include <stdafx.h> #define NAME_SIZE 256 typedef struct { int id; char name[NAME_SIZE]; } Data; int main(){ Data postoi[100]; for (int i=1;i<4;i++){ printf("Vvedite nomer"); scanf("%i",&postoi[i].id); printf("Vvedite bykvi"); scanf("%s",postoi[i].name); } char temp[NAME_SIZE]; temp=postoi[1].name // Вопрос в этой строчке postoi[1].name=postoi[2].name // И в этой. printf("Perezapisano vo vremenyu peremenyu, %s\n", temp); int p; scanf("%d", &p); return 0; } Мой вопрос как правильно переменной temp присвоить значение поля name из структуры и postoi[1].name=postoi[2].name и это правельно написать. |
|
Сообщ.
#15
,
|
|
|
|
Nik198, гугли strcpy(). И прочитай уже хотя бы одну книжку по С.
Добавлено muskos, вдруг у тебя там "с" русская? Ггг Если у тебя крутая студия, как ты говоришь, то ставь Visual Assist последний какой-нибудь, наводи курсор на strcpy() и брякай кнопку "Go". Она тебе файл покажет, в каком она описана, его и заинклудишь. |
|
Сообщ.
#16
,
|
|
|
|
to spyтолько в студии сдавать надо лабы) да ладно) я с указателями с большего разобрался) думаю всё получится) сегодня уже не то время, что бы думать) подумаю завтра)
Спасибо всем за помошь) |
|
Сообщ.
#17
,
|
|
|
|
Цитата Мой вопрос как правильно переменной temp присвоить значение поля name из структуры и postoi[1].name=postoi[2].name и это правельно написать. Temp - это просто указатель на первый элемент массива длиной NAME_SIZE!!! Такая же ситуация и для postoi[1].name!!! Поэтому, когда ты пишешь ![]() ![]() temp=postoi[1].name то это означает, что ты просто присвоил адрес массива name переменной, где до этого был адрес массива temp, при этом действительный адрес начала массива temp безвозвратно теряется. Т.е. теперь temp указывает на массив name и может создаться иллюзия, что произошло копирование массива name в массив temp. Но это не так!!! Для того, что бы копирование действительно произошло тебе надо "ручками" в цикле каждый элемент массива name скопировать в соответствующий элемент массива temp, или не изобретать велосипед и воспользоваться одной из специально предназначенных для этого функций (strcpy, strncpy), пример использования которых тебе любезно продемонстрировал cppasm. |
|
Сообщ.
#18
,
|
|
|
|
muskos, Visual Assist - это аддон к студии. Очень удобная штука.
|