Строки С++

Тема в разделе "C/C++/C#", создана пользователем photonr, 11 янв 2011.

  1. photonr

    photonr Гость

    Вот такая задача:
    Написать программу которая считывает текст из файла и выводит на экран только строки, содержащие двузначные числа.

    Есть задача сделанная с немного другим условием, строки содержащие двузначные числа наоборот не выводит, и вроде немного неправильно, трехзначные тоже не выводит, вот она


    Код (C++):
    #include <iostream>
    #include <stdio.h>
    #include <ctype.h>

    using namespace std;

    #define STRING_LEN 70 // длина строки

    int main()
    {
    FILE *file;
    char buff[STRING_LEN];
    unsigned int n, i, dig;

    file = fopen("file.txt", "r"); // открываем файл для чтения
    if(!file) // если не открыли
    return -1; // выходим
    while(fgets(buff, STRING_LEN, file)) // читаем все строки до конца файла
    {
    dig = 0; // флаг наличия двузначного числа
    n = strlen(buff); // получаем длину строки
    if(n >= 2) // если длина строки больше или равно 2
    {
    for(i = 0; i != n; i++) // проходим по всей строке
    {
    // устанавливаем значение флага присутствия двузначного числа
    dig = isdigit(buff[i]) // текущий символ - цифра
    & isdigit(buff[i+1]); // и следующий за ним символ - цифра
    if(dig) // если есть двухзначное число
    break; // выходим из цикла
    }
    if(!dig) // если двузначного числа в строке нет
    cout << buff; // выводим строку в консоль
    }
    }
    fclose(file); // закрываем файл
    return 0; // выходим
    }
    Спасибо
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Грубовато но сойдет. Тут только определение есть ли в строке двузначные цифры или нет.
    Код (C++):
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>

    char get_char( char *s, int i, int n )
    {
    if ( i >= 0 && i < n ) return s[i];
    return ' ';
    }

    int two_digit_string( char *s )
    {
    int n = strlen( s );
    for ( int i = 0; i < n - 1; i++ ) {
    if (
    !isdigit( get_char( s, i - 1, n ) ) &&
    isdigit( get_char( s, i , n ) ) &&
    isdigit( get_char( s, i + 1, n ) ) &&
    !isdigit( get_char( s, i + 2, n ) ) ) return 1;
    }
    return 0;
    }

    int main()
    {
    char *  s0 = "lalalala 123 sadlf";  // stroka 1
    char *  s1 = "lalalala 45 sadlf";   // stroka 2

    printf( "s0 == %d\n", two_digit_string( s0 ) );
    printf( "s1 == %d\n", two_digit_string( s1 ) );

    return 0;
    }
     
  3. Rififi

    Rififi Гость

    photonr

    Код (C++):
    #include <locale>
    #include <string>
    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <iterator>
    #include <algorithm>
    #include <functional>

    #include <vector>

    /*
    Написать программу которая считывает текст из файла и выводит на экран только строки, содержащие двузначные числа.
    */


    struct line
    {
    friend std::istream& operator>> (std::istream& s, line& l)
    {
    std::getline(s, l.s_);
    return (s);
    }

    friend std::ostream& operator<< (std::ostream& s, const line& l)
    { return s << l.s_; }

    const std::string& str() const { return (s_); }
    std::string s_;
    };

    struct F : public std::unary_function<line, bool>
    {
    bool operator()(const line& l) const
    {
    std::stringstream ss(l.str());

    std::string s;
    while (ss >> s)
    {
    std::stringstream num(s);
    int i;
    if (num >> i && i >= 10 && i < 100)
    return true;
    }

    return false;
    }
    };

    void filter(std::istream& is)
    {
    typedef std::istream_iterator<line> I;
    typedef std::ostream_iterator<line> O;

    std::remove_copy_if(I(is), I(), O(std::cout, "\n"), std::not1(F()));
    }

    int main()
    {
    setlocale(LC_ALL, "");

    std::ifstream ifs("text.txt");
    if (!ifs)
    return 0;

    filter(ifs);

    return 0;
    }
    для файла text.txt с содержимым:

    <!--shcode--><pre><code class='txt'>lalalala 123 sadlf
    lalalala 45 sadlf
    lalalala 6 sadlf[/CODE]

    вывод будет, естессно, таким:

    [pre]
    lalalala 45 sadlf
    [/pre]
     
Загрузка...

Поделиться этой страницей