Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Строки, ошибка в коде 
V
    Опции темы
steet
Дата 13.5.2007, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 13.5.2007

Репутация: нет
Всего: нет



Задание:

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

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

Код

#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...");
}


Это сообщение отредактировал(а) steet - 13.5.2007, 17:53
PM MAIL   Вверх
JackYF
Дата 14.5.2007, 02:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Столько кода ради такой задачи...

Код

#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 Найти цитируемый пост)
не могу понять в чем ошибка

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



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
steet
Дата 14.5.2007, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 13.5.2007

Репутация: нет
Всего: нет



Вот изначальный код на 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;
               }

Это сообщение отредактировал(а) steet - 14.5.2007, 06:29
PM MAIL   Вверх
boriska
Дата 14.5.2007, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 7.12.2006
Где: kharkov

Репутация: нет
Всего: нет



Цитата

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


замени на
 
Код

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

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


Это сообщение отредактировал(а) boriska - 14.5.2007, 09:19
PM MAIL ICQ   Вверх
ama_kid
Дата 14.5.2007, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 2
Всего: 95



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();
}



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
steet
Дата 14.5.2007, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 13.5.2007

Репутация: нет
Всего: нет



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

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

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

спасибо всем, что помогаете
PM MAIL   Вверх
Partizan
Дата 14.5.2007, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



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


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
steet
Дата 14.5.2007, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 13.5.2007

Репутация: нет
Всего: нет



Partizan, 
такое мне не посильно, для меня чем проще тем лучше
PM MAIL   Вверх
ama_kid
Дата 14.5.2007, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 2
Всего: 95



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

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


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
steet
Дата 14.5.2007, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 13.5.2007

Репутация: нет
Всего: нет



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;
}

PM MAIL   Вверх
ama_kid
Дата 14.5.2007, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 2
Всего: 95



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



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
steet
Дата 14.5.2007, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 13.5.2007

Репутация: нет
Всего: нет



PM MAIL   Вверх
vinter
Дата 14.5.2007, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



ну и че там за символ между int и i??


--------------------
Мой блог
PM MAIL WWW   Вверх
steet
Дата 14.5.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 13.5.2007

Репутация: нет
Всего: нет



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;
}


Это сообщение отредактировал(а) steet - 14.5.2007, 12:22
PM MAIL   Вверх
zkv
Дата 14.5.2007, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



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'а есть с этим какие то проблемы 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0611 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.