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


Автор: Palladin 21.1.2007, 22:56
Пишу на С++, создавая консольное приложение в Borland C++ 6

Вот задача:

Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие  клавиши "Ввод". Программа должна определить длину введенной строки L, и, если длина L>10, то удаляются все цифры.

Лаба из двух частей: 1) сделать по обычному 2) с использованием указателей

1 пункт я сделал(код ниже), а вот с указателями что-то ен получается, вроде и делаю подобно тому как в книге, а чет не то, вообщем вот код без указателей, переделайте его плз чтоб с использование указателей!!!


Код

int main()
{
char s[100];
char s2[100];
int d,n,i,t;
cout<<"Vvedite stroku: ";
cin.get(s,100);
cout<<endl;
t=0;
if(strlen(s)>10)
{
for(i=0;i<strlen(s);i++)
{
if(s[i]!='0')
{
if(s[i]!='1')
{
if(s[i]!='2')
{
if(s[i]!='3')
{
if(s[i]!='4')
{
if(s[i]!='5')
{
if(s[i]!='6')
{
if(s[i]!='7')
{
if(s[i]!='8')
{
if(s[i]!='9')
{
s2[t]=s[i]; t++;
}}}}}}}}}}}}




if(strlen(s)>10)
{
cout<<"STROKA:";
for(i=0;i<t;i++)
cout<<s2[i];
}
if(strlen(s)<10)
cout<<"STROKA:"<<s<<endl;


getch();
return 0;
}

Автор: SparF 21.1.2007, 23:17
Код

// roor.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <new>
#include <conio.h>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    char *s;
    char *s2;
    int d,n,i,t;

    s = new char[100];
    s2 = new char[100];

    cout<<"Vvedite stroku: ";
    cin.get(s,100);
    cout<<endl;
    t=0;
    if(strlen(s)>10)
        for(i=0;i<strlen(s);i++)
            if(*(s+i*sizeof(char))<'0'||*(s+i*sizeof(char))>'9'){
                *(s2+t*sizeof(char))=*(s+i*sizeof(char)); 
                t++;
            }

    if(strlen(s)>10){
        cout<<"STROKA:";
        for(i=0;i<t;i++)
        cout<<*(s2+i*sizeof(char));
    }
    else 
        cout<<"STROKA:"<<s<<endl;
    getch();
    return 0;
}


Добавлено @ 23:18 
я тут немного ее еще оптимизировал) а то лишнего много было)

Автор: Palladin 22.1.2007, 00:57
Ща протещу, сенкс, эт ты ифы мои убралsmile) ненадо было, по заданию такsmile)) 

Автор: Palladin 22.1.2007, 01:12
Все норм пашет, тока вот ты память походу забыл освободить, но я незнаю как там кактто с помощью delete:) и ещё объясни че это за sizeof(char)??? s+i я понял это типа s[i] а вот зачем сайзоф и что это такое, плз объясни

Автор: Palladin 22.1.2007, 02:01
Что-то тесты показали что программа прекрасно работает и без sizeof(char) smile))

Сорри за оффтоп

Автор: zkv 22.1.2007, 03:27
Цитата(RooR @  22.1.2007,  01:12 Найти цитируемый пост)
и ещё объясни че это за sizeof(char)???

sizeof(TYPE) - возвращает размер памяти в байтах занимаемый переменной типа TYPE. В твоем случае работает без него так же как и с ним потому что размер char'а равен 1 байту. 
но учти, что SparF был не прав так используя этот оператор:
*(s + i * sizeof( char ) ), просто повезло, что опять таки, sizeof( char ) == 1
поясню на примере
Код

unsigned int    vInt[10];
unsigned int *pInt = &vInt[0];
//сдвигаемся к следующему элементу
pInt += sizeof( unsigned int );//в этом случае pInt указывает на элемент с индексом 2
pInt += 1; //в этом случае pInt указывает на элемент с индексом 1

те компилятор сам смотрит какого типа указатель, и расчитывает нужное количество байт, программисту нужно лишь указать число элементов
НО, необходимо помнить что нужное смещение расчитывается на основе типа указателяа не массива, например :
Код

unsigned int    vInt[10];
char *pChar = (char)&vInt[0];
//сдвигаемся к следующему элементу
pInt += sizeof( unsigned int );//в этом случае pInt указывает на первый байт элемента с индексом 1
pInt += 1; //в этом случае pInt указывает на второй байт элемента с индексом 0

Автор: Palladin 22.1.2007, 03:38
Вот эт я понимаю, исчерпывающий ответ, покрайней мере для меняsmile) сенкс smile 

я тут топ создал тож про указатели но уже с массивами. можеш подправить, а лучше какуюнить методичку по двумерным массивам+указателям выложить в том топе??? вообщем топ этом же форуме называется [C++]Массивы+указатели smile 

Автор: SparF 22.1.2007, 05:45
Итак, конечный вариант:
Код

// roor.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <new>
#include <conio.h>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    char *s;
    char *s2;
    int d,n,i,t;

    s = new char[100];
    s2 = new char[100];

    cout<<"Vvedite stroku: ";
    cin.get(s,100);
    cout<<endl;
    t=0;
    if(strlen(s)>10)
        for(i=0;i<strlen(s);i++)
            if(*(s+i)<'0'||*(s+i)>'9'){
                *(s2+t)=*(s+i); 
                t++;
            }

    if(strlen(s)>10){
        cout<<"STROKA:";
        for(i=0;i<t;i++)
        cout<<*(s2+i);
    }
    else 
        cout<<"STROKA:"<<s<<endl;

    delete s;
    delete s2;
    getch();
    return 0;
}


zkv, Спасибо))

Автор: Palladin 23.1.2007, 01:24
Сенкс всем

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