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


Автор: DeathKnight 4.11.2008, 17:29
задача такая:
ввести неизвестное кол-во строк по 100 символов
все слова нечётной длинны перевернуть..

Код

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int _tmain(int argc, _TCHAR* argv[])
{
    char **ms, *n,*s, d;
    int i,j,k,c,kk,l,z;
    i=j=kk=k=l=0;
    c=-1;
    ms=(char**)calloc(2,sizeof(char*));
    for(i=0;i<2;i++)
        ms[i]=(char*)calloc(100,sizeof(char));

    printf("vvedite text:\n");
    do
    {
        if(k>1)
        {
            if(!(ms=(char**)realloc(ms,(k+1)*sizeof(char*)))) printf("oshibka");
                for(;i<=k;i++)
                if(!(ms[i]=(char*)calloc(100,sizeof(char)))) printf("oshibka");
        }

        fgets(ms[k], 99, stdin);

        for(j=0;j<100;j++)
        {    
            if(ms[k][j]=='\n')
            {
                ms[k][j]='\0'; break;
            }
        }

        k++; 
        
    }while(ms[k-1][0]!='\0');

    if(k==1){printf("vi ne vveli ni odnoi stroki\n"); return 0;}
    
    for(i=0; i<k;i++)
        puts(ms[i]);

    for(i=0;i<k;i++)
    {
        for(j=0;j<100;j++)
        {
            kk=1;
            if(ms[i][j]==' ' || ms[i][j]=='\t' || ms[i][j]=='\0'||ms[i][j]==',' ||ms[i][j]=='.')
            {
                l=c;
                c=-2;
                kk=0;
            }
            c++;
            
            if(!kk && !(l%2) && l)
            {
                s=(*(ms+i)+j-1);
                n=s-l;
                                
                for(z=l/2;z>=0;z--,n++, s--)
                {
                    d=*s;
                    *s=*n;
                    *n=d;
                }
            }
        }
    }
    for(i=0;i<k;i++)
        puts(ms[i]);

    return 0;
}




вопрос в том, что препод может придраться к решению..
помогите улучшить алгоритм

Автор: ИванМ 4.11.2008, 18:50
Лучше пользоваться не fgets, а gets, тогда не надо присваивать элементу со значением "\n" значение 0. И кол-во символов в строке можно узнать с помощью strlen, а не вручную высчитывать.  Обратить строку можно легче:
Код

inr len=strlen(str);
for(int i=0;i<len/2;i++)
{
    char c=str[i];
    str[i]=str[len-i-1];
    str[len-i-1]=c;
}



Автор: darkart 5.11.2008, 20:15
Код

#include<malloc.h>
#include<stdio.h>
#include<conio.h>
#include<ctype.h>

#define MAX_STRING_LENGTH 101 //максимальная длина строки + 1 на 0 символ

int RevertWordsWithOddLength( char* szString )
/*функция возвращает количество перевернутых слов в строке szString*/
{
    int i, iWordLength, iRetVal;// i - счетчик, iWordLength - длина слова, iRetVal - возвращаемое значение
    char *pWordStart, *pSymbol, *pWordEnd;//pWordStart - указатель на начало слова, pSymbol - указатель на текущий символ, pWordEnd - указатель на конец слова

    iRetVal = 0;//инициализация возвращаемого значения
    pSymbol = szString;//инициализация указателя на текущий символ - начало строки

    while( *pSymbol )//пока не конец строки
    {
        while( *pSymbol && !isalpha( *pSymbol ) )//пока не конец строки и символ не буква
            pSymbol++;//переход к следующему символу

        pWordStart = pSymbol;//запоминаем указатель на начало слова или на конец строки

        while( isalpha( *pSymbol ) )//пока очередной символ - буква
            pSymbol++;//переход к следующему символу

        iWordLength = pSymbol - pWordStart;//вычисляем длину слова

        if( iWordLength & 1 )//если длина слова - нечетна
        {
            iWordLength >>= 1;//делим на два

            pWordEnd = pSymbol - 1;//запоминаем позицию конца слова

            for( i = 0; i < iWordLength; i++ )//iWordLength раз меняем символы местами
            {
                *pWordStart ^= *pWordEnd ^= *pWordStart ^= *pWordEnd;//обмен символов, основываясь на свойстве xora
                pWordStart++;//движемся к ентру слова слева
                pWordEnd--;//движемся к центру слова справа
            }
            iRetVal++;//увеличиваем количество перевернутых слов
        }
    }
    return iRetVal;//возвращаем количество перевернутых слов
}

int main()
{
    char** dszStrings;//для хранения массива строк
    int i, nStrings;//i - счетчик, nStrings - количество строк

    printf( "Please enter strings count:\n" );
    scanf( "%d", &nStrings );//ввод количества строк

    dszStrings = ( char** )calloc( nStrings, sizeof( char* ) );//выделение памяти под nStrings указателей на 0-строки
    for( i = 0; i < nStrings; i++ )//выделение памяти для каждой строки
    {
        dszStrings[ i ] = ( char* )calloc( MAX_STRING_LENGTH, sizeof( char ) );//выделение памяти
        printf( "Please enter a string number %d:", i );
        fflush( stdin );
        gets( dszStrings[ i ] );//читаем очередную строку
    }

    //печать исходных строк
    printf( "Source strings:\n" );
    for( i = 0; i < nStrings; i++ )
        printf( "%s\n", dszStrings[ i ] );

    for( i = 0; i < nStrings; i++ )
        RevertWordsWithOddLength( dszStrings[ i ] );//переворачиваем слова в каждой из строк

    //печать строк-результата
    printf( "Result strings:\n" );
    for( i = 0; i < nStrings; i++ )
        puts( dszStrings[ i ] ) ;

    //освобождение памяти
    for( i = 0; i < nStrings; i++ )
        free( dszStrings[ i ] );
    free( dszStrings );

    getch();//ждем ввода

    return 0;
}

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