Jak przerobić kod w C++ na C?

0

Jak przerobić ten kod z C++ na C?:
[quote]
#include <iostream>
#include <windows.h>
#include <string>
#include <ctime>
#include <cctype>
#include <conio.h>
#include <fstream>
using namespace std;
string wl="ON";
string wyl="OFF";
string zdanie;
string* wsk1=&wyl;
string* wsk2=&wyl;
string* wsk3=&wyl;
string* wsk4=&wyl;
string* wsk5=&wyl;
void wypisz()
{
cout<<"\nF1 - Wczyt. z pliku jest "<<wsk1<<endl;
cout<<"\nF2 - Zam. z 1 lub 2 na 5 || z 6 i 7 na 9 jest "<<wsk2<<endl;
cout<<"\nF3 - Zam. wilkosci co jest "<<wsk3<<endl;
cout<<"\nF4 - Dopisanie skrotu na koncu jest "<<wsk4<<endl;
cout<<"\nF5 - Zapis do pliku jest "<<wsk5<<endl;
cout<<"\nF12 - ZAPISZ"<<endl;
}
int main(void)
{
wypisz();
while(1)
{
if(GetAsyncKeyState(VK_F1))
{
if(
(wsk1)==wyl)
wsk1=&wl;
else
wsk1=&wyl;
wypisz();
}
if(GetAsyncKeyState(VK_F2))
{
if(
(wsk2)==wyl)
wsk2=&wl;
else
wsk2=&wyl;
wypisz();
}
if(GetAsyncKeyState(VK_F3))
{
if(
(wsk3)==wyl)
wsk3=&wl;
else
wsk3=&wyl;
wypisz();
}
if(GetAsyncKeyState(VK_F4))
{
if(
(wsk4)==wyl)
wsk4=&wl;
else
wsk4=&wyl;
wypisz();
}
if(GetAsyncKeyState(VK_F5))
{
if(
(wsk5)==wyl)
wsk5=&wl;
else
wsk5=&wyl;
wypisz();
}
if(GetAsyncKeyState(VK_F12))
{
break;
}
Sleep(150);
}
cout<<"Zdanie: ";
if((wsk1)==wl)
{
string tmp;
ifstream pliko("testwej.txt");
{
getline(pliko,zdanie);
}
}
if(
(wsk1)==wyl)
getline(cin,zdanie,'\n');
if(*(wsk2)==wl)
{
for(int i=0; i<zdanie.length(); i++)
{
if(zdanie[i]=='1' || zdanie [i]=='2')
{
zdanie.replace(i,1,"5");
}

        else if(zdanie[i]=='6' || zdanie[i]=='7')
        {
            zdanie.replace(i,1,"9");
        }
    }
}

if(*(wsk3)==wl)
{
    for(int i=1; i<zdanie.length(); i+=4)
    {
        zdanie[i]=toupper(zdanie[i]);
    }
}

if(*(wsk4)==wl)
{
    srand(time(NULL));
    int losowa=rand()%4;
    if(losowa==1)zdanie.append(" zl");
    else if(losowa==2)zdanie.append(" dolar");
    else if(losowa==3)zdanie.append(" euro");
    else zdanie.append(" gbp");
}

if(*(wsk5)==wl)
{
    ofstream plik("testwyj.txt", ios::out | ios::trunc);
    {
        plik<<zdanie;
    }
}
cout<<"\n"<<zdanie;
getch();
return 0;

}
[/quote]

0

To akurat nie jest trudne, ale pytanie jest po prostu głupie.
Po co Ci tyle bibliotek??
Za bardzo się nie wgłębiałem w kod, ale chyba tylko musisz zamienić cout na printf itd.

0

Biblioteki często wpieprzam na wszelki wypadek :D.
Nie, no to to akurat mały pikuś, z cin na printf'a, ale nie wiem np. na co zamienić stringi, żeby w C śmigało. Strumieniowe otwieranie pliku na zwykłe fopen/fclose, czy fgets/fputs?

Poza tym, po szczątkowych próbach, powiedzmy 'konwersji' z c++ na c, kompilator wywala mi błąd coś nt. standardu C99, a tak dokładniej, w tej pętli:

if(*(wsk3)==wl)
{
for(int i=1; i<zdanie.length(); i+=4)
{
zdanie[i]=toupper(zdanie[i]);
}
}

0

Szczerze nie jestem zbyt bardzo zaznajomiony z standardem języka c, ale widzę, że jest w nim np. biblioteka <string.h>

0
sid90 napisał(a)

Szczerze nie jestem zbyt bardzo zaznajomiony z standardem języka c, ale widzę, że jest w nim np. biblioteka <string.h>

Też próbowałem z tą biblioteką wcześniej, ale zwykły 'string' w kodzie programu, nie chciał iść.
Próbowałem też 'typedef char* string' i zostawić te 'string'i w programie, ale zamiast wyświetlania się odpowiednio "WLACZONE"/"WYLACZONE", w dokładnie ich miejscu wyświetla mi takie dziwne znaczki dla "WYLACZONE" (jeśli to w czymkolwiek pomoże, są to 2 znaczki - pierwszy z nich, to znaczek przekręconego o 45stopni kwadratu, a drugi to @), a dla "WLACZONE" nie wyświetla nic.

0

znam trochę c++ i wiem,że c jest jego podzbiorem, ale nie wiem dokładnie czego mogę użyć a czego nie. Gdybym musiał na pewno bym to przerobił, ale bez sensu byłoby czytanie czegoś, tylko po to aby pomóc komuś. Jednak jeżeli byłbyś w stanie za to zapłacić, to mógłbym to przerobić na c.

0
sid90 napisał(a)

znam trochę c++ i wiem,że c jest jego podzbiorem, ale nie wiem dokładnie czego mogę użyć a czego nie. Gdybym musiał na pewno bym to przerobił, ale bez sensu byłoby czytanie czegoś, tylko po to aby pomóc komuś. Jednak jeżeli byłbyś w stanie za to zapłacić, to mógłbym to przerobić na c.

A ile byś sobie życzył za taką usługę ;]?
Trudne to to nie jest, trzeba tylko znać C, a ja go niestety nie bardzo ogarniam.

PS: Dodam, że korzystam z CodeBlocksa, czyli żeby wsio śmigało na MinGW :D.

0

Nie dużo. napisz na priva. gg 4923263

0

Dodam tylko, że z tego co się orientuję, to w C nie można tworzyć zmiennej wewnątrz pętli:
for (int i = 0...)
Trzeba to zrobić poza nią.

0

Heh, ale ten świat pędzi. Za moich czasów stringów w C nie było.

0

Do przepisywania przyda ci się kilka istotnych różnic między c, a c++:

  1. jeśli chcesz aby kod w c był "przyjazny oku" zamiast string stosuj łańcuchy znaków znane z C
  2. jeśli funkcja nie przyjmuje argumentów wpisuj void (jak w twoim mainie): f(void) - oznacza funkcję bez parametrów, f() - funkcja z nieznaną ilością parametrów
  3. literał znakowy ('a') jest typu int, a nie jak w c++ typu char.4. nagłówki: ctime -> time.h itd;
  4. jak ktoś wcześniej wspomniał niestosowanie obiektów ostream itd. (tyczy się też plików) czyli stosuj printfy, scany itp.
  5. zmienne deklaruj przed pierwszą instrukcją danego bloku (czyli na jego początku)
  6. w C nie ma bool (w twoim kodzie też nie widziałem, ale i tak informuję o tym)
  7. naturalnie deklarację przestrzeni nazw również wywal.

Jest jeszcze dużo innych istotnych różnic jednak to ci wystarczy aby przerobić ten kod. Teraz zabieraj się do roboty i czekam na efekty.

0

Hehe, bo std::string w C nie ma. ;) Przerobienie tego nie byłoby trudne, natomiast jakość tego kodu to całkiem inna sprawa. ;)
W C/99 można tworzyć zmienną w pętli for (for (int i = 0;...)), wcześniej tego rzeczywiście nie było.

0

Dobra, w większości już sobie poradziłem. Mam jeszcze kilka problemów, np. z polskimi znakami.
A mianowicie chciałbym, żeby program zamieniał mi np. ę i Ę na e, jak się z tym fantem uporać (zwykła zamiana, np. 'e' i 'E' na dajmy na to 'd' mi śmiga, ale przy polskich znakach, na wyjściu dostaje to samo, co na wejściu w tym miejscu - dalej jest 'ę' lub 'Ę').

0
setlocale(LC_ALL, "polish");
wchar_t* table = L"ęeóoąaśsłlżzźzćcńn";
wchar_t* text = L"ŻĄB";

int length = wcslen(text);
wchar_t* replaced = (wchar_t*)calloc(length + 1, sizeof(wchar_t));
	
for(int i = 0; i < length; i++)
{
	wchar_t character = towlower(text[i]);
	wchar_t* pos = wcschr(table, character);

	if(pos)
		replaced[i] = *(pos + 1);
	else
		replaced[i] = character;
}

Wymagane nagłówki to stdlib.h, locale.h oraz wchar.h.

0
Rev.pl napisał(a)
setlocale(LC_ALL, "polish");
wchar_t* table = L"ęeóoąaśsłlżzźzćcńn";
wchar_t* text = L"ŻĄB";

int length = wcslen(text);
wchar_t* replaced = (wchar_t*)calloc(length + 1, sizeof(wchar_t));
	
for(int i = 0; i < length; i++)
{
	wchar_t character = towlower(text[i]);
	wchar_t* pos = wcschr(table, character);

	if(pos)
		replaced[i] = *(pos + 1);
	else
		replaced[i] = character;
}

Wymagane nagłówki to stdlib.h, locale.h oraz wchar.h.

Coś mi nie bangla:

9|error: expected declaration specifiers or '...' before numeric constant
9|error: expected declaration specifiers or '...' before string constant
9|warning: data definition has no type or storage class
9|warning: type defaults to 'int' in declaration of 'setlocale'
9|error: conflicting types for 'setlocale'
9. czyli linijka setlocale(LC_ALL, "polish");

13|error: initializer element is not constant
14|error: initializer element is not constant
17|error: expected identifier or '(' before 'for'
17|error: expected '=', ',', ';', 'asm' or 'attribute' before '<' token
17|error: expected '=', ',', ';', 'asm' or 'attribute' before '++' token
13. int length = wcslen(text);
14. wchar_t* replaced = (wchar_t*)calloc(length + 1, sizeof(wchar_t));
17.for(i=0; i<length; i++)

0
#include <stdlib.h>
#include <locale.h>
#include <wctype.h>
#include <wchar.h>

int main(void)
{
	wchar_t* table = L"ęeóoąaśsłlżzźzćcńn";
	wchar_t* text = L"ŻĄB";
	wchar_t* replaced;
	int length, i;

#ifdef WIN32
	setlocale(LC_ALL, "polish");
#else
	setlocale(LC_ALL, "pl_PL.UTF8");
#endif
	
	length = wcslen(text);
	replaced = (wchar_t*)calloc(length + 1, sizeof(wchar_t));
	
	for(i = 0; i < length; i++)
	{
		wchar_t character = towlower(text[i]);
		wchar_t* pos = wcschr(table, character);

		if(pos)
			replaced[i] = *(pos + 1);
		else
			replaced[i] = character;
	}
	
	wprintf(L"Oryginalny: %ls\n", text);
	wprintf(L"Zamieniony: %ls\n", replaced);
	
	free(replaced);
	return 0;
}
revik:/home/rev# gcc -ansi -pedantic replace.c -o replace && ./replace
Oryginalny: ŻĄB
Zamieniony: zab

Coś popierdzielić musiałeś.

0

Ok, już kumam.
Teraz wyskakuje mi jedynie:
error: converting to execution character set: Illegal byte sequence
w 8 i 9 linijce kodu.

0

Zapisz plik w Unicode.

0
Rev.pl napisał(a)

Zapisz plik w Unicode.

Może trochę głupie pytanie, ale niby jak :)? Korzystam z Code Blocksa, czyli kompilator MinGW.

0

Nie wiem, nie korzystam. Ale polecam wpisać w google "code::blocks source file encoding".

0

Dobra, śmiga.
Teraz mam inny problem, jeśli zamieniam na wejściu np. literę "a" lub "A", tak aby na wyjściu otrzymać zamiast niej "44", to mam taki cudo:

if(zd[i]=='a' || zd[i]=='A')
{
zd[i]='4';
zd[i+1]='4';
}

Wszystko spoko, tylko jak na wejściu dam "Witam cie", to na wyjściu otrzymuje "Wit44 cie" - pożarło "m", czyli następną po tej literze "a" literę.

Tak samo, gdybym zrobił z "a" lub "A" na wyjściu "444":

if(zd[i]=='a' || zd[i]=='A')
{
zd[i]='4';
zd[i+1]='4';
zd[i+2]='4';
}

na wejściu "Witam cie", to na wyjściu dostaję "Wit444cie" - pożarło 2 następne litery, po literze "a".

Pomyślałem nawet o tym, żeby zwiększać wtedy długość znaków:
dl+=3;
Ale to jedynie zwiększa na końcu o 3 spacje, czyli otrzymamy: "Wit44 cie " i odpowiednio ""Wit444cie ".

Ktoś mądry pomoże :]?

#include <stdio.h>
#include <stdlib.h>
int il(char lol[])
{
int tmp=1;
int i;
for(i=0; i<100; i++)
{
if(lol[i]==' ' && lol[i+1]==' ')
{
tmp=i;
break;
}
}
return tmp;
}
int main()
{
char zd[100];
int i;
for(i=0; i<100; i++)
zd[i]=' ';
int dl=0;
FILE *fptr;
fptr=fopen("a.txt", "r");
i=1;
while(fgets(zd,100,fptr)!=NULL);
fclose(fptr);
dl=il(zd);
for(i=0; i<dl; i++)
{
if(zd[i]=='a' || zd [i]=='A')
{
zd[i]='4';
zd[i+1]='4';
}
}
FILE *fp;
fp=fopen("b.txt", "w");
for(i=0; i<dl; i++)
fprintf (fp, "%c", zd[i]);
fclose (fp);
return 0;
}

0
wchar_t text[] = L"Babcia";

int len_source = wcslen(text);
wchar_t* buffer = (wchar_t*)calloc(len_source + 1, sizeof(wchar_t));
	
wchar_t from = 'a';
wchar_t to[] = L"44";

int isrc = 0, idst = 0, len_buffer = len_source;
for(;isrc < len_source; isrc++, idst++)
{
	if(text[isrc] == 'a')
	{
		int len_to = wcslen(to);
		buffer = (wchar_t*)realloc(buffer, sizeof(wchar_t) * (len_buffer + 1 + len_to));
			
		wcscpy(buffer + idst, to); 

		idst += len_to - 1;
		len_buffer += len_to;
	}
	else
		buffer[idst] = text[isrc];
}
buffer[idst] = '\0';

Coś takiego trzeba aż napisać (do ansi c już sobie sam dostosuj jak ci gdzieś błąd wywali).

0

Dobra, udało mi się prościej, niż kolega powyżej wysłał:

#include <stdio.h>
#include <stdlib.h>
int il(char lol[])
{
    int tmp=1;
    int i;
    for(i=0; i<127; i++)
    {
        if(lol[i]==' ' && lol[i+1]==' ')
        {
            tmp=i;
            break;
        }
    }
    return tmp;
}
int main()
{
    char zd[127];
    int i;
    int j;
    for(i=0; i<127; i++)
        zd[i]=' ';
    int dl=0;
    FILE *fptr;
    fptr=fopen("a.txt", "r");
    while(fgets(zd,127,fptr)!=NULL);
    fclose(fptr);
    dl=il(zd);
    int ndl=0;
    char nzd[dl+ndl];
    for(i=0, j=0; i<dl; i++, j++)
    {

        if(zd[i]=='a' || zd [i]=='A')
        {
            ndl++;
            nzd[j]='4';
            j++;
            nzd[j]='4';
        }
        else
        {
            nzd[j]=zd[i];
        }
    }
    FILE *fp;
    fp=fopen("b.txt", "w");
    for(i=0; i<dl+ndl; i++)
        fprintf (fp, "%c", nzd[i]);
    fclose (fp);
    return 0;
}

Mam jeszcze tylko problem z wielkością odczytywanych plików. A mianowicie nie mogę otworzyć plików większych, niż 127 lub 128 bajtów (czyli 127 lub 128 znaków). Przy większych plikach, program w pliku wynikowym wpisuje jakieś pierdoły.
Z tego, co pamiętam, char jest do 127, próbowałem zamienić wszystkie char na unsigned char (który działa do bodaj 255), ale program nie działał.

Jest jakiś sposób za obejście tego ;D?

0
  • char zd[127];?
    • for(i=0; i<127; i++)?
      Zrób 256, a w drugim daj jakas zmienna z wielkością czy cóś.

1 użytkowników online, w tym zalogowanych: 0, gości: 1