Строки С++

  • Автор темы photonr
  • Дата начала
P

photonr

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

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


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; // выходим
}
Спасибо
 

lazybiz

Well-known member
03.11.2010
1 339
0
#2
Грубовато но сойдет. Тут только определение есть ли в строке двузначные цифры или нет.
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;
}
 
R

Rififi

#3
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]