Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Строки


Автор: steet 13.5.2007, 17:52
Задание:

"Напечатать строку слов в обратном порядке слов"

Код, но он не запускается, конвертировал с паскаля, не могу понять в чем ошибка, пожалуйста исправьте, кто может
используется С

Код

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <locale.h>

int x,k,len;
char str[50],buf[50];

void PrintString(char *buf,int k)
{
int i;
if (k==1)
    {
    printf(" ");
    buf="";
    }
else
    {
    i=k;
    while (i>=1)
        {
        printf(&buf[i]);
        i=i-1;
        }
    printf(" ");
    buf="";
    }
}

void main()
     {
     printf("Vvedite slova:");
     scanf(str,"\n");
     printf("Resultat:");
     k = 1;
     x = str[0];
     if (str[0]==1) printf(str,"\n");
     while (x>=1) {
            if ((str[x]==" ")||(x==1))
               {
                if (x==1)
                else k=k-1;
                PrintString(buf,k);
                k=1;
               }
            else
                {
                 buf[k]=str[x];
                 if (x=2) buf[k+1]=str[x-1];
                 k=k+1;
                }
           x=x-1;
           }
     printf("\n\n");
     printf("Press any key to quit...");
}

Автор: JackYF 14.5.2007, 02:48
Столько кода ради такой задачи...

Код

#include <string>
#include <vector>
#include <algorithm>
#include <iterator>

int main()
{
  std::vector< std::string > words;
  std::copy ( std::istream_iterator(std::cin), std::istream_iterator(), back_inserter<std::string>(words) ); 
  std::copy ( words.rbegin(), words.rend(), std::ostream_iterator(std::cout, " ") );

  return 0;
}


Писал на ходу.

Добавлено через 2 минуты и 43 секунды
Ах да, используется С...

Если С++ использовать не разрешается, то тогда лучше перепиши код заново. Имхо, конечно.

Цитата(steet @  13.5.2007,  17:52 Найти цитируемый пост)
не могу понять в чем ошибка

а мысли компилятора по этому поводу?

Автор: steet 14.5.2007, 06:29
Вот изначальный код на pascal, работает замечательно, но преподаватель требует на обычном C

Код

program slova;
uses crt;
var
   x,k,len : byte;
   str,buf : string;
procedure PrintString(var buf : string ; var k : byte);
var
   i : byte;
begin
     if k=1 then begin
                      write(' ');
                      buf:='';
                 end
            else
                begin
                     i:=k;
                     while i>=1 do begin
                                        write(buf[i]);
                                        i:=i-1;
                                   end;
                     write(' ');
                     buf:='';
                end;
end;
begin
     clrscr;
     writeln('Vvedite slova:');
     readln(str);
     writeln;
     writeln('Resultat:');
     k := 1;
     x := length(str);
     if length(str)=1 then writeln(str);
     while x>=1 do begin
                        if (str[x]=' ') or (x=1) then
                           begin
                                if x=1 then else k:=k-1;
                                PrintString(buf,k);
                                k:=1;
                           end
                        else
                            begin
                                 buf[k]:=str[x];
                                 if x=2 then buf[k+1]:=str[x-1];
                                 k:=k+1;
                            end;
                   x:=x-1;
                   end;
     writeln;writeln;
     write('Press any key to quit...');
     readkey;
end.


компилятор пишет
nonportable pointer conversion
показывает ошибку в положении выделенным красным

while (x>=1) {
            if ((str[x]==" ")||(x==1))
               {
                if (x==1)
                else k=k-1;
                PrintString(buf,k);
                k=1;
               }

Автор: boriska 14.5.2007, 09:17
Цитата

 if ((str[x] == " ") || (x == 1))


замени на
 
Код

 if ((str[x] == ' ') || ( x==1 )) 

т.к. " " - это строка состаящая из двух символов : пробела и символа конца строки ("_\0"),
а ты должен сравнивать с только с символом пробела

Автор: ama_kid 14.5.2007, 09:43
steet, 
Вот так будет компилироваться:
Код
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <conio.h>
#include <locale.h>

int x,k,len;
char str[50],buf[50];

void PrintString(char *buf,int k)
{
int i;
if (k==1)
    {
    printf(" ");
    buf="";
    }
else
    {
    i=k;
    while (i>=1)
        {
        printf("%c",buf[i]);
        i=i-1;
        }
    printf(" ");
    buf="";
    }
}

void main()
     {
     printf("Vvedite slova:\n");
     scanf("%s",str);
     printf("Resultat:\n");
     k = 1;
     x = strlen(str);
     if (x==1) printf("%s\n",str);
     while (x>=1) {
            if ((str[x]==' ')||(x==1))
               {
                if (x==1) ;
                else k--;
                PrintString(buf,k);
                k=1;
               }
            else
                {
                 buf[k]=str[x];
                 if (x==2) buf[k+1]=str[x-1];
                 k++;
                }
           x--;
           }
     printf("\n\n");
     printf("Press any key to quit...");
     getch();
}
но работать все равно будет не правильно, ибо строки в паскале и строки в С устроены АБОСЛЮТНО по разному, а ты с ними работаешь как будто в паскале... Ну и куча других ньюансов есть...

Вот примерный набросок твоей задачи, реализованной на С:
Код
#include <stdio.h>
#include <string.h>
#include <conio.h>

int x,k,len;
char str[50],buf[50];

void PrintString(char *buf)
{
    int  len = strlen(buf)-1;
    for (int i=len;i>=0;i--) 
        printf("%c",buf[i]);
    printf(" ");
}

void main()
     {
     printf("Vvedite slova:\n");
     gets(str);
     printf("Resultat:\n");
     k = 1;
     len = strlen(str);
     x = len-1;
     *buf = '\0';
     while (x>=0)
     {
        if (*(str+x)!=' ')
        {
            buf[strlen(buf)+1]='\0';
            buf[strlen(buf)]=*(str+x);
        } else { PrintString(buf); *buf = '\0';}
        x--;
     }
     if (strlen(buf)) { PrintString(buf); *buf = '\0';}

     printf("\n\n");
     printf("Press any key to quit...");
     getch();
}

Автор: steet 14.5.2007, 11:08
boriska,
подправил изменение, но программа не заработала :( просто не активирует диалоговое окно ввода

ama_kid, 
первая программа скомпилировалась, но работает действительно не правильно

вторая пишет ошибки :(

спасибо всем, что помогаете

Автор: Partizan 14.5.2007, 11:10
steet, имхо проще было бы поюзать strtok()  и получив все токены строки, переписать их в обратном порядке...

Автор: steet 14.5.2007, 11:31
Partizan, 
такое мне не посильно, для меня чем проще тем лучше

Автор: ama_kid 14.5.2007, 11:36
steet, а ты каким компилятором пользуешься? Если досовским BC - тогда замени void main() на int main() и добавь в конец return 0; - тогда не должен писать ошибки (только что проверил) при условии, что все пути к include'ам прописаны верно...

Добавлено через 1 минуту и 3 секунды
и вообще - какие ошибки-то пишет?

Автор: steet 14.5.2007, 11:45
ama_kid, 
пользуюсь досовским компилятором
изменить вот так, да?
Код

#include <stdio.h>
#include <string.h>
#include <conio.h>
int x,k,len;
char str[50],buf[50];
void PrintString(char *buf)
{
    int  len = strlen(buf)-1;
    for (int i=len;i>=0;i--) 
        printf("%c",buf[i]);
    printf(" ");
}
int main()
     {
     printf("Vvedite slova:\n");
     gets(str);
     printf("Resultat:\n");
     k = 1;
     len = strlen(str);
     x = len-1;
     *buf = '\0';
     while (x>=0)
     {
        if (*(str+x)!=' ')
        {
            buf[strlen(buf)+1]='\0';
            buf[strlen(buf)]=*(str+x);
        } else { PrintString(buf); *buf = '\0';}
        x--;
     }
     if (strlen(buf)) { PrintString(buf); *buf = '\0';}
     printf("\n\n");
     printf("Press any key to quit...");
     getch();
     return 0;
}

Автор: ama_kid 14.5.2007, 11:47
steet
да...
Цитата(ama_kid @  14.5.2007,  11:36 Найти цитируемый пост)
Добавлено через 1 минуту и 3 секундыи вообще - какие ошибки-то пишет?
  smile  smile 

Автор: steet 14.5.2007, 11:56
ama_kid, 
вот ошибки smile

http://img204.imageshack.us/my.php?image=88216899er4.jpg

Автор: vinter 14.5.2007, 12:01
ну и че там за символ между int и i??

Автор: steet 14.5.2007, 12:22
vinter,
там выделен пробел,

код который на скриншоте:

Код

#include <stdio.h>
#include <string.h>
#include <conio.h>
int x,k,len;
char str[50],buf[50];
void PrintString(char *buf)
{
    int  len = strlen(buf)-1;
    for (int i=len;i>=0;i--) 
        printf("%c",buf[i]);
    printf(" ");
}
int main()
     {
     printf("Vvedite slova:\n");
     gets(str);
     printf("Resultat:\n");
     k = 1;
     len = strlen(str);
     x = len-1;
     *buf = '\0';
     while (x>=0)
     {
        if (*(str+x)!=' ')
        {
            buf[strlen(buf)+1]='\0';
            buf[strlen(buf)]=*(str+x);
        } else { PrintString(buf); *buf = '\0';}
        x--;
     }
     if (strlen(buf)) { PrintString(buf); *buf = '\0';}
     printf("\n\n");
     printf("Press any key to quit...");
     getch();
     return 0;
}

Автор: zkv 14.5.2007, 12:32
steet, ну попробуй объявление i сделать перед циклом:
Цитата(steet @  14.5.2007,  12:22 Найти цитируемый пост)
   for (int i=len;i>=0;i--) 
        printf("%c",buf[i]);

как то так
Код

int i;
for (i=len;i>=0;i--) 
        printf("%c",buf[i]);

не помню, но возможно у Borland'а есть с этим какие то проблемы 

Автор: steet 14.5.2007, 12:51
zkv,
да, сработало!!!!

всех благодарю за помощь!!!!!!!! выручили, спасибо!

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