Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2011, 11:43   #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;
}
Алексей Денисов вне форума Ответить с цитированием
Старый 04.07.2011, 12:10   #2
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

char c[20];
...
*(form + j) = c; // это ведь у тебя не копирование строки а присвоение указателя.
Адрес массива с[] постоянный и все присвоения этого указателя левому выражению *(form + j) будут ссылаться разумеется на этот адрес.
А в нем сохранена последняя в цикле строка.
EUGY вне форума Ответить с цитированием
Старый 04.07.2011, 22:34   #3
Алексей Денисов
Пользователь
 
Регистрация: 04.07.2011
Сообщений: 16
По умолчанию

спасибо, я догадывался об этом )). только не могу сообразить, как правильно собрать в массив строк переделанные строки из массива *dict[]
Алексей Денисов вне форума Ответить с цитированием
Старый 04.07.2011, 23:42   #4
Алексей Денисов
Пользователь
 
Регистрация: 04.07.2011
Сообщений: 16
По умолчанию

решил:
вместо *(form + j) = c;
сделал sscanf(c, "%s", form[j]);

в смысле это работает. только скажите, плз, это изврат? есть способ более канонический?
Алексей Денисов вне форума Ответить с цитированием
Старый 04.07.2011, 23:42   #5
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Код:
...
    c[i] = '\0';
    //*(form + j) = c;
    *(form + j)=new char[i+1];
    strcpy(*(form + j), c);
} 

for(i = 0; i < j; i++)
{
    cout << *(form + i) << "\n";
    delete [] *(form + i) ;
}
EUGY вне форума Ответить с цитированием
Старый 04.07.2011, 23:47   #6
Алексей Денисов
Пользователь
 
Регистрация: 04.07.2011
Сообщений: 16
По умолчанию

спасибо большое за внимание к моему тривиальному вопросу. скажите пожалуйста, а sscanf(c, "%s", form[j]); сильно не правильно?
Алексей Денисов вне форума Ответить с цитированием
Старый 05.07.2011, 00:02   #7
Алексей Денисов
Пользователь
 
Регистрация: 04.07.2011
Сообщений: 16
По умолчанию

а на *(form + j)=new char[i+1]; компилятор ругается, что невозможно преобразовать "char *" в "char [20]"
Алексей Денисов вне форума Ответить с цитированием
Старый 05.07.2011, 00:06   #8
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Оно было бы правильным, если аргумент form[j] был бы адресом буфера выделенной памяти.
char *form[10]; - объявлен массив указателей под будущие строки, но память под сами строки не выделена.
EUGY вне форума Ответить с цитированием
Старый 05.07.2011, 00:16   #9
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Сообщение от Алексей Денисов Посмотреть сообщение
а на *(form + j)=new char[i+1]; компилятор ругается, что невозможно преобразовать "char *" в "char [20]"
char *form[10]; - у тебя так объявлено?
EUGY вне форума Ответить с цитированием
Старый 05.07.2011, 00:35   #10
Алексей Денисов
Пользователь
 
Регистрация: 04.07.2011
Сообщений: 16
По умолчанию

не, прошу прощения, уже так: char form[10][20];
Алексей Денисов вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сделать в гриде строки выше, чтобы не растягивать строки до бесконечности 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