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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2009, 14:06   #1
hen
Пользователь
 
Регистрация: 31.03.2009
Сообщений: 96
По умолчанию объясните почему рубится последний символ

Задание выглядит так:'Отпечатать второе и третье слова произвольного текста'
вообщем проблема в том что при выводе результата последний символ заменяется на какой-нибудь значок...
Код:
#include <string.h>
#include <stdio.h>
#include <conio.h>
void main()
{
int dlin,i,bw,ew, h;
i=0;
char s[50],d[50];
clrscr();
gets(s);
dlin=strlen(s);
s[dlin]=' ';
s[dlin+1]='\0';
dlin+=1;
h=0;
i=0;
bw=0;
while(i<dlin)
{
  if (s[i]==' ') {
	ew=i-1;
	if (s[i]==' ') {
	  strncpy(d,&s[bw],ew-bw);
	  d[ew-bw+1]='\0';
	   if ((h>0)&&(h<3)) printf("%s\n",d);
	  h++;
	  }
	bw=i+1;
  };
 i++;
 }
getch();
}
Плиз объясните в чем проблема
hen вне форума Ответить с цитированием
Старый 07.04.2009, 14:32   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

На первый взгляд проблема здесь:
Код:
	  strncpy(d,&s[bw],ew-bw);
	  d[ew-bw+1]='\0';
В d копируем "ew-bw"символов. Потом символ "ew-bw+1" делаем нулевым. Мне кажется тут +1 не надо. Допустим копируем строку "abc" (3 исмвола, т.е. ew-bw = 3)
В результате будет:
d[0] == 'a';
d[1] == 'b';
d[2] == 'c';
...
Потом выполняем: d[ew-bw+1]='\0', т.е. ноль записываем в d[4], а d[3] пропускаем и там оказывается "мусор".
pu4koff вне форума Ответить с цитированием
Старый 07.04.2009, 18:11   #3
hen
Пользователь
 
Регистрация: 31.03.2009
Сообщений: 96
По умолчанию

pu4koff, нет ничего не изменяется все равно 'съедается' одна буква в конце слов.
hen вне форума Ответить с цитированием
Старый 07.04.2009, 18:17   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

В первом посте написали, что "при выводе результата последний символ заменяется на какой-нибудь значок", теперь оказывается символ "съедается". Раз "съедается", значит копируйте на 1 символ больше. Как-то так:
Код:
strncpy(d,&s[bw],ew-bw+1);
d[ew-bw+1]='\0';
pu4koff вне форума Ответить с цитированием
Старый 07.04.2009, 22:01   #5
DeFace
Пользователь
 
Аватар для DeFace
 
Регистрация: 27.09.2008
Сообщений: 60
По умолчанию

т.к. я новичёк решил твою задачу методом тыка
Код:
#include <string.h>
#include <stdio.h>
#include <conio.h>

void main()
{
    int dlin,i,bw,ew, h;
    i=0;
    char s[50],d[50];
    gets(s);
    dlin=strlen(s);
    s[dlin]=' ';
    s[dlin+1]='\0';
    dlin+=1;
    h=0;
    i=0;
    bw=0;

    while(i<dlin)
	{
      if (s[i]==' ') 
	  {
    	ew=i;
	    if (s[i]==' ') 
		{
	      strncpy(d,&s[bw],ew-bw);
	      d[ew-bw]='\0';

	      if ((h>0)&&(h<3)) printf("%s\n",d);
	     
		  h++;
		}
	    bw=i+1;
	  };
    i++;
	}
getch();
}
DeFace вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему отличаются результаты (Ассемблерная вставка в С++)? Объясните Vasiliusis Общие вопросы C/C++ 3 13.11.2008 19:17
Последний раз выполнялось anton14 Общие вопросы Delphi 3 20.10.2008 19:34
Нужен последний ImageEn c исходниками Domkrat Компоненты Delphi 1 30.09.2008 16:40
Не подскажете название последний версии Delphi? X-Юзер Софт 13 12.03.2008 14:46
[autorun] Последний вопрос Ivan_assm Помощь студентам 2 05.11.2007 20:10