Версия для печати темы

Нажмите сюда для просмотра этой темы в оригинальном формате

WinCity.Ru _ Программирование _ удаление лишнего пробелма в строке

Автор: shplint Пятница, 06 Февраля 2009, 16:09

int main(int argc, char* argv[])
{
char *str,*buf;
int pos,i,length,offset;

offset=0;
printf("Enter string->");
str=new char [50];
buf=(char*)calloc(50,sizeof(char));
gets(str);
str[50]='\0';
buf[50]='\0';
length=strlen(str);
printf("\nlength string->%d",length);
if(length>49)
{ printf("\nERROR!");
return 0;
}
else
{ for (i=0;i<length;i++)
{ if ((str[i]==' ')&&(str[i+1]==' '))
{ offset=length-(i+1);
printf("\noffset->%d",offset);
strncpy(buf,str,offset);
}
offset=0;
}
printf("\n%s",str);
printf("\n\n%s",buf);
}
(void)getch();

return 0;
}

Подскажите почему программа работает не верно. И подскажите как исправить. smile.gif

Автор: shplint Понедельник, 09 Февраля 2009, 14:48

Программисты, отзовитесь, ответьте на мой вопрос!!!

Автор: Квазимодо Вторник, 10 Февраля 2009, 17:45

shplint, что-то не соображу, что эта программа должна делать - удалять пробелы из строк (т.е. чтобы они оставались по одному)? Если да, то ты в

Код
strncpy(buf,str,offset);

копируешь в выходной буфер (buf) не хвост, а голову строки. А на хвост у тебя будет указывать str+i+2.

Автор: shplint Среда, 11 Февраля 2009, 11:45

Вот есть строка, состоящая из слов и если какие-то слова разделены двумя пробелами программа должна удалить лишний пробел. А в буфер я вроде все прально копирую строку str со смещением, т.е. без второго пробелма оставляя только первый пробел.

Автор: Квазимодо Среда, 11 Февраля 2009, 19:24

shplint, вообще-то, даже в Википедии о строковых функциях пишут: http://ru.wikipedia.org/wiki/Strncpy. По этому описанию понятно, что третий параметр у тебя - не смещение, а максимальная длина копируемой строки.

Автор: shplint Четверг, 12 Февраля 2009, 10:24

Тьфу ты, ну да я копирую в буфер число символов без лишнего пробела, вроде так ну или по крайне мере так задумал. Короч, че мне надо сделать чтобы прога работала корректно?

Автор: Квазимодо Четверг, 12 Февраля 2009, 15:50

Хорошо, немного поправим этот if, в котором все крутится:

Код

if(length>49)
{ printf("\nERROR!");
return 0;
}
else
{ strncpy(buf,str,49);
int j=0;
for (i=0;i<length;i++)
{ if ((str[i]==' ')&&(str[i+1]==' '))
{ offset=length-(i+1);
if (i==0) {j++; offset--;};
printf("\noffset->%d",offset);
strncpy(buf+i+1-j,str+i+2,offset);
j++;
}
offset=0;
}


(переменная j подсчитывает количество обнаруженных двойных пробелов). Ты просто начало буфера каждый раз затираешь.
P.S. В следующий раз, когда пришлешь программу, пожалуйста, выделяй код тегом - тут же кнопка "Код" есть. А то воспринимается как-то не очень. smile.gif

Автор: shplint Четверг, 12 Февраля 2009, 22:25

Пасибо большое smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)