![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 04.07.2011
Сообщений: 16
|
![]()
никак не могу понять, что не так. ниже код консольного приложения. ожидаемый результат:
Адам Адамович Адамовичем Адамовна Адель реальный результат такой: Адель Адель Адель Адель Адель подскажите пожалуйста, в чем тут дело #include <iostream> #include <clocale> #include <cstring> #include <conio.h> using namespace std; int main() { setlocale(LC_ALL, "Russian_Russia.1251"); char *dict[] = { "Адам/K", "Адамович/K", "Адамовичем", "Адамовна/I", "Адель/H" }; char *form[10]; char *s; char c[20]; int i, j, n, l; n = sizeof(dict)/sizeof(dict[0]); for(j = 0; j < n; j++) { s = dict[j]; l = strlen(s); for(i = 0; i < l; i++) { if(s[i] == '/') break; else c[i] = s[i]; } c[i] = '\0'; *(form + j) = c; } for(i = 0; i < j; i++) cout << *(form + i) << "\n"; _getch(); return 0; } |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
![]()
char c[20];
... *(form + j) = c; // это ведь у тебя не копирование строки а присвоение указателя. Адрес массива с[] постоянный и все присвоения этого указателя левому выражению *(form + j) будут ссылаться разумеется на этот адрес. А в нем сохранена последняя в цикле строка. |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 04.07.2011
Сообщений: 16
|
![]()
спасибо, я догадывался об этом )). только не могу сообразить, как правильно собрать в массив строк переделанные строки из массива *dict[]
|
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 04.07.2011
Сообщений: 16
|
![]()
решил:
вместо *(form + j) = c; сделал sscanf(c, "%s", form[j]); в смысле это работает. только скажите, плз, это изврат? есть способ более канонический? |
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
![]() Код:
|
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 04.07.2011
Сообщений: 16
|
![]()
спасибо большое за внимание к моему тривиальному вопросу. скажите пожалуйста, а sscanf(c, "%s", form[j]); сильно не правильно?
|
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 04.07.2011
Сообщений: 16
|
![]()
а на *(form + j)=new char[i+1]; компилятор ругается, что невозможно преобразовать "char *" в "char [20]"
|
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
![]()
Оно было бы правильным, если аргумент form[j] был бы адресом буфера выделенной памяти.
char *form[10]; - объявлен массив указателей под будущие строки, но память под сами строки не выделена. |
![]() |
![]() |
![]() |
#9 |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
![]() |
![]() |
![]() |
![]() |
#10 |
Пользователь
Регистрация: 04.07.2011
Сообщений: 16
|
![]()
не, прошу прощения, уже так: char form[10][20];
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Сделать в гриде строки выше, чтобы не растягивать строки до бесконечности | kris__tina | БД в Delphi | 1 | 09.06.2011 15:31 |
Даны строки S и S0. Удалить из строки S все подстроки, совпадающие с S0 . Если совпадающих подстрок нет, | Шпунюся | Помощь студентам | 1 | 16.12.2010 21:02 |
Создание пустой строки и копирование в неё содержимое предыдущей строки | Gvaridos | Microsoft Office Excel | 2 | 29.10.2010 13:33 |
Определять максимальную длину той части строки s, которая не содержит символы из строки s1. | Александе еть я | Общие вопросы C/C++ | 5 | 13.04.2010 20:54 |
Перенести символа с начала строки в место перед запятой этой же строки. | Zhiltsov | Microsoft Office Excel | 4 | 05.06.2009 13:10 |