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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2011, 10:25   #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;
}


1) Просьба внимательнее относиться к наименованию создаваемой темы!
Название темы должно адекватно отражать суть решаемой задачи/проблемы.

2) Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)

Модератор.

Последний раз редактировалось Serge_Bliznykov; 04.07.2011 в 13:23.
Алексей Денисов вне форума Ответить с цитированием
Старый 04.07.2011, 12:11   #2
l1pton17
Пользователь
 
Аватар для l1pton17
 
Регистрация: 01.11.2010
Сообщений: 75
По умолчанию

s = dict[j];
l = strlen(s);

вот тут неправильно, строка в s без завершающего символа 0, и поэтому strlen не может правильно определить размер s.
l1pton17 вне форума Ответить с цитированием
Старый 04.07.2011, 12:20   #3
l1pton17
Пользователь
 
Аватар для l1pton17
 
Регистрация: 01.11.2010
Сообщений: 75
По умолчанию

и самое главное:

*(form + j) = c;
тут присваиваешь адрес, а не значение.
то есть в form[j] является адресом на какое-то слово. И ты ложишь в form[j] адрес переменной с. В которой на последнем этапе цикла будет слово Адель. И поэтому такая ошибка.

нужно делать так:
form[j]=malloc((strlen(c)+1)*sizeof(char)) ;
for (i=0;i<=l;i++)
form[j][i]=c[i];
l1pton17 вне форума Ответить с цитированием
Старый 04.07.2011, 13:09   #4
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от l1pton17 Посмотреть сообщение
s = dict[j];
l = strlen(s);

вот тут неправильно
Ну почему "неправильно"? Правильно.

Цитата:
Сообщение от l1pton17
строка в s
В s НЕТУ СТРОКИ! В s - УКАЗАТЕЛЬ на символьную константу (вернее - 5 указателей по очереди на 5 разных символьных констант).

Цитата:
Сообщение от l1pton17
без завершающего символа 0
Завершающий '\0' у каждой из констант - есть, их туда подобавлял, как ему и положено, транслятор.

Цитата:
Сообщение от l1pton17
и поэтому strlen не может правильно определить размер s.
strlen() определяет длины правильно. Добавьте после
Код:
l = strlen(s);
Код:
cout << l << endl ;
и убедитесь.

...

Насчёт "самого главного" - того, что ошибка - здесь
Код:
*(form + j) = c;
верно.
Vago вне форума Ответить с цитированием
Старый 04.07.2011, 13:46   #5
l1pton17
Пользователь
 
Аватар для l1pton17
 
Регистрация: 01.11.2010
Сообщений: 75
По умолчанию

ох лол. Скажи это Borland C++, когда я в нём такое писал.
l1pton17 вне форума Ответить с цитированием
Старый 05.07.2011, 10:30   #6
Алексей Денисов
Пользователь
 
Регистрация: 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][20];
	char *s;
	char *c;
	int i, j, n, l;

	c = (char *) malloc(20);
	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';
			
		sscanf(c, "%s", *(form + j));	

	}	

	for(i = 0; i < j; i++)
		cout << *(form + i) << "\n";
	
	_getch();
	return 0;
}
Алексей Денисов вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Результат функции в виде массива! Replicant Общие вопросы Delphi 3 18.03.2011 14:33
Удаление элемента из символьного массива Mixim Visual C++ 4 03.12.2010 16:38
Вывод результат запроса в label,каким образом? nuevegramodelamor Помощь студентам 1 28.04.2010 16:06
Как результат обработки одного массива загнать в другой массив? delphifan PHP 1 16.04.2010 16:13
Запомнить результат в виде массива Georgia Помощь студентам 4 22.05.2008 16:14