#include <iostream>
#include <cstring>
using namespace std;
int main() {
char str[] = "1#2*3$4";
cout << "BEFORE " << str << endl;
int length = strlen(str);
int word_num = 0;
int indexes[length];
int sizes[length];
int word_length = 0;
for(int i = 0; i < length; ++i) {
if(str == '#' || str == '$' || str == '*' || str == '-') {
if(word_length != 0) {
word_num++;
indexes[word_num] = i - word_length;
sizes[word_num] = word_length;
word_length = 0;
}
} else {
word_length++;
if(i == length - 1) {
word_num++;
indexes[word_num] = i - word_length;
sizes[word_num] = word_length;
}
}
}
char out[length];
if(word_num % 2 == 0 && word_num != 0) {
//prefix
int left = indexes[word_num/2];
for(int i = 0; i < left; ++i) {
out = str;
}
// right word first
int right = indexes[1+word_num/2];
int right_size = sizes[1+word_num/2];
for(int i = 0; i < right_size; ++i) {
out[left + i] = str[right + i];
}
// delimiter
int left_end = left + sizes[word_num/2];
int del_size = right - left_end;
for(int i = 0; i < del_size; i++) {
out[left + i + right_size] = str[left_end + i];
}
// left word second
int left_size = sizes[word_num/2];
for(int i = 0; i < left_size; i++) {
out[left + right_size + del_size + i] = str[left + i];
}
//postfix
int right_end = right + right_size;
for(int i = 0; i < length - right_end + 1; ++i) {
out[right_end + i] = str[right_end + i];
}
cout << "AFTER " << out << endl;
}
return 0;
}
Решите пожалуйста задачу на Си!!!!!!
Условие: Дана строка текста, состоящая из слов, разделённых одним из знаков [ # , $ , * , - ]. Если количество слов в предложении чётно, поменяйте местами 2 центральных слова, а если нечётно удалите одно центральное слово.:confused:
Вот, хотя легче было бы с strtok...
Спасибо огромное, но в ней Dev C++ нашёл много ошибок,которые я что то не смог исправить, так как в этих темах я не силён
а кто нить мог бы попробовать решить задачу с - strtok?
Цитата: artem7213
Спасибо огромное, но в ней Dev C++ нашёл много ошибок,которые я что то не смог исправить, так как в этих темах я не силён
никогда не юзал дев с++
кинь хоть вывод
Я тупо из g++ компилил, все работает. А с strtok подстава что он разделители ест
Действительно,выложи хотя б то,что компилятор написал
Извиняюсь очень сильно,всё заработало,просто были проблемы с компилятором.спасибо, кстати, как на Linux подобрать что нить похожее на conio.h в Windows? просто я работаю на Си в Linux,но иногда приходится использовать Windows и Dev С++.Подскажите
Написать функцию split_int (filename 0, filename 1, filename 2). Если первые k элементов файла filename 0>=0, эти элементы перенести в файл filename 1, а остальные элементы - в файл filename 2 (Прежнее результирующих файлов стирается).
Цитата: artem7213
Привет всем !!!! ))))) Извиняюсь,но у меня к Вам последняя просьба, последняя задача:
Написать функцию split_int (filename 0, filename 1, filename 2). Если первые k элементов файла filename 0>=0, эти элементы перенести в файл filename 1, а остальные элементы - в файл filename 2 (Прежнее результирующих файлов стирается).
Написать функцию split_int (filename 0, filename 1, filename 2). Если первые k элементов файла filename 0>=0, эти элементы перенести в файл filename 1, а остальные элементы - в файл filename 2 (Прежнее результирующих файлов стирается).
Если кол-во элементов = 0, то особо не попереносишься. Очевидно, k элементов filename0 > 0.
Код:
// From: artem7213
// Task: Написать функцию split_int (filename 0, filename 1, filename 2).
// Если первые k элементов файла filename 0>=0, эти элементы перенести
// в файл filename 1, а остальные элементы - в файл filename 2 (Прежнее
// результирующих файлов стирается).
// ----------------------------------------------------
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
int split_int( k, file0, file1, file2 )
int k;
char *file0, *file1, *file2;
{
FILE *fin, *fout;
char* buff;
long fpos;
if (k <= 0)
return -1;
else
buff = (char*)malloc( k );
fin = fopen( file0, "r" );
if (fread( buff, sizeof(char), k, fin ) < k)
{
fclose( fin );
return -1;
}
fout = fopen( file1, "w" );
fwrite( buff, sizeof(char), k, fout );
fclose( fout );
fpos = ftell( fin );
fseek( fin, 0L, SEEK_END );
k = (int)(ftell( fin ) - fpos);
buff = (char*)realloc( (char*)buff, (unsigned)k );
fseek( fin, fpos, SEEK_SET );
fread( buff, sizeof(char), k, fin );
fclose( fin );
fout = fopen( file2, "w" );
fwrite( buff, sizeof(char), k, fout );
fclose( fout );
free( buff );
return 1;
}
int main()
{
if (!split_int( 4, "in.dat", "out1.dat", "out2.dat" ))
printf( "error...\n" );
return 0;
}
// Task: Написать функцию split_int (filename 0, filename 1, filename 2).
// Если первые k элементов файла filename 0>=0, эти элементы перенести
// в файл filename 1, а остальные элементы - в файл filename 2 (Прежнее
// результирующих файлов стирается).
// ----------------------------------------------------
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
int split_int( k, file0, file1, file2 )
int k;
char *file0, *file1, *file2;
{
FILE *fin, *fout;
char* buff;
long fpos;
if (k <= 0)
return -1;
else
buff = (char*)malloc( k );
fin = fopen( file0, "r" );
if (fread( buff, sizeof(char), k, fin ) < k)
{
fclose( fin );
return -1;
}
fout = fopen( file1, "w" );
fwrite( buff, sizeof(char), k, fout );
fclose( fout );
fpos = ftell( fin );
fseek( fin, 0L, SEEK_END );
k = (int)(ftell( fin ) - fpos);
buff = (char*)realloc( (char*)buff, (unsigned)k );
fseek( fin, fpos, SEEK_SET );
fread( buff, sizeof(char), k, fin );
fclose( fin );
fout = fopen( file2, "w" );
fwrite( buff, sizeof(char), k, fout );
fclose( fout );
free( buff );
return 1;
}
int main()
{
if (!split_int( 4, "in.dat", "out1.dat", "out2.dat" ))
printf( "error...\n" );
return 0;
}
Безо всяких проверок и прочее. Сам допишешь.
не знаю.спасибо конечно...но она не работает
ну, если хоть чуть-чуть знаешь Си, легко сможешь поправить
Плиз кто нить доделайте её!!!!!!!
Ну не получается!!!!!!!!!!помогите плиз!!!!!!!!!
Чё орешь? Что не работает?
Я не ору.просто dev-cpp выдаёт несколько ошибок!
Ну а мы что–угадывать должны их,подбирать исходя из граничных условий?Хоть бы привёл текст–в какой строке,какая ошибка…