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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2012, 23:25   #1
eymar
Пользователь
 
Регистрация: 23.09.2012
Сообщений: 17
По умолчанию Выводит иероглифы

Здравствуйте. Есть такая вот задача.. Нужно написать функцию:

error_t argz_create_sep (const char *string, int sep, char **argz, size_t *argz_len). Функция преобразует null-terminated строку string в argz вектор разбивая строку на элементы всякий раз, когда встречается символ sep. Вектор argz есть null-terminated строка, в которой элементы разделены символом ’\0’. являются пары
name=value
Например,
char *const string = "SHELL=/bin/bash:usr=monty:PWD=/bin/monty:LANG=en_US.UTF-8";
char *argz;
int argz_len;

Код:
argz_create_sep (string, 58 /*ASCII for : */, &argz, &argz_len);

В результате вызова вектор примет вид
SHELL=/bin/bash’\0’usr=monty’\0’PWD=/bin/monty’\0’LANG=en_US.UTF-8’\0’
а  argz_len будет равно 58.
Код:


Код функции: 

error_t argz_create_sep(const char *string, int sep, char **argz, size_t *argz_len){
	int i=0,j=0,k=0, count=0, ind;
	int len=strlen(string);
		

	while(i<len){
		if(string[i]==sep) j++;
		i++;
	}

	j++;
	count=j;
	
	argz=(char**)malloc(sizeof(char));
	

	for (i=0; i<=count; i++){
		argz[i]=(char*)malloc(sizeof(char));
	}
		
	j=0;
	i=0;
	ind=0;
	printf("%s\n", string);
	while (string[i]!=0){
		if ((string[i]!=sep)&&(string[i]!='\0')){
			argz[j][ind]=string[i];
			ind++;
			i++;

		} else {
			i++;
			argz[j][ind]=0;
			j++;
			ind=0;

		}

	}
		
	for (i=0; i<count; i++){
		printf("%s\n", argz[i]);

	}

	printf("%d\n", count);
	return OK; 	
	
}
На изображении видно, что в последний элемент вектора дописываются непонятные символы. Из-за чего они могут появляться? И как это можно устранить? Заранее большое спасибо!

P.S. Если изначальную строку изменить(убрать последние 2 символа) на
char *string1="SHELL=/bin/bash:usr=monty:PWD=/bin/monty:LANG=en_US.UTF";
то иероглифы не выводятся, аналогичный результат если добавить определенное количество лишних символов.




(изображение )
eymar вне форума Ответить с цитированием
Старый 18.10.2012, 19:51   #2
LynXzp
Пользователь
 
Аватар для LynXzp
 
Регистрация: 04.10.2012
Сообщений: 95
По умолчанию

многие функции работы со строками в качестве признака окончания строки используют символ \0 Поэтому, длина строки должна быть на 1 символ меньше буфера, а последний символ лучше всегда чтобы был \0. (Если длина строки меньше длины буфера то это может быть и не последний символ, но если последний всегда будет \0 хуже от этого не станет) Вот скорее всего у тебя из-за отсутствия \0 на вывод подается какой-то мусор. Ну или вывод через функцию которая принимает длинну, а длина оказалась больше длины строки и опять на вывод попадает мусор.

Код если чесно не смотрел, судя по твоему комментарию скорее всего это так, и сам сталкивался с этой проблемой не раз. (в GUI "квадратики" чаще вместо иероглифов )))

Думаю разберешься, судя по тексту, человек умный ) Но если что, попробую помочь.
Пишу на чистом С, плюсы спилил.
LynXzp вне форума Ответить с цитированием
Старый 20.10.2012, 14:41   #3
eymar
Пользователь
 
Регистрация: 23.09.2012
Сообщений: 17
По умолчанию

Спасибо большое! С проблемой разобрался.
eymar вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SendMessage иероглифы !? Pozitif Помощь студентам 3 08.12.2011 21:03
MessageBox и иероглифы ImmortalAlexSan Общие вопросы C/C++ 5 10.03.2011 12:22
Иероглифы в командной строке ac1d_buRn Операционные системы общие вопросы 8 26.02.2011 20:27
Вместо русского иероглифы Kart Общие вопросы C/C++ 3 20.07.2009 09:25
Иероглифы в Equation mitrandir Microsoft Office Word 9 25.09.2007 09:06