Napis i plik tekstowy na wywołaniu, poszukiwanie wystąpień

0

Witam!

Chciałbym Was zapytać o sposób w jaki można napisać program w C, który dostaje jako argumenty wywołania napis oraz plik tekstowy. Napisem jest na przykład ciąg cyfr typu 12345 i program powinien na wyjściu wypisać liczbę wystąpień poszczególnych cyfr

To co mam do tej pory. Jak można to poprawić?

#include <stdio.h> 
#include <string.h>
#include <stdlib.h>
int main(int argc, char **argv){
FILE *in; 
char i;
int n;
int *wyniki;
if (argc < 2)
return 1;
in =  fopen(argv[2], "r");
if (in = NULL)
return 1;
n=strlen(argv[1]);
while(i = fgetc(in){
for (i=0; i<n; i++){
if(i==argv[1][i]){
wyniki[i]++;
}
}
}
for (i = 0; i < n; i++){
printf("Znak %c wystapil %d razy", argv[1][i], wyniki[i]);
}
return 0;
}
1
  1. Sformatuj kod
  2. Zmień nazwy zmiennych tak aby z nazwy można było się domyślić do czego służy
    Gwarantuje że po tych dwóch zabiegach znajdziesz błąd samodzielnie.
0

Dziękuję za odpowiedź.

Nieco zmieniona wersja programu:

#include <stdio.h> 
#include <string.h>
#include <stdlib.h>
int main(int argc, char **argv){

FILE *in; 
int i;
int dlugosc;
int pobranyznak;
int wystap=0;
if (argc < 2)
    return 1;
in =  fopen(argv[2], "r");
if (in == NULL)
    return 1;

dlugosc=strlen(argv[1]);
for (i = 0; i < n; i++){
    in = fopen(argv[2], "r");
while((pobranyznak=fgetc(in)) != EOF){
    if (argv[1][i] == pobranyznak)
        wystap++;
}

printf("Znak %c wystapil %d razy\n", argv[1][i], wystap);
wystap = 0;
fclose(in);
}
return 0;
}
2

Wywal tą wersje do jest do bani i popraw poprzednią zgodnie ze wskazówkami.
Jedyne co w tej drugiej wersji jest całkiem dobre to fclose(in); - warto dodać do starej.

0

Dzięki za odpowiedź. Program się kompiluje, ale myśli, myśli i nic. Zapomniałem wtedy o mallocu i jeszcze kilka drobnych błędów. Chyba już nie wiem o co chodzi.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char **argv){
FILE *in;
char pobranyznak;
int i;
int dlugosc;
int *wyniki;
if (argc < 2)
    return 1;
in =  fopen(argv[2], "r");
if (in == NULL)
    return 1;
dlugosc=strlen(argv[1]);
wyniki = malloc(dlugosc * sizeof *wyniki);
while(pobranyznak = fgetc(in)){
for (i = 0; i < dlugosc; i++){
    if(pobranyznak==argv[1][i]){
        wyniki[i]++;
        }
    }
}
for (i = 0; i < dlugosc; i++){
    printf("Znak %c wystapil %d razy\n", argv[1][i], wyniki[i]);
}
fclose(in);
free(wyniki);
return 0;
}
1
int pobranyznak;
while((pobranyznak = fgetc(in))!=EOF)

Poza tym formatowanie nadal do bani ale już znacznie lepiej.

0

Dziękuję za pomoc. Totalnie zapomniałem o EOF.

A takie formatowanie jest już w miarę akceptowalne?

#include <stdio.h> 
#include <string.h>
#include <stdlib.h>
int main(int argc, char **argv){
        FILE *in;
        char pobranyznak;
        int i;
        int dlugosc;
        int *wyniki;
        if (argc < 2)
                return 1;
        in =  fopen(argv[2], "r");
        if (in == NULL)
                return 1;

        dlugosc = strlen(argv[1]);

        wyniki = malloc(dlugosc * sizeof *wyniki);

        while ((pobranyznak = fgetc(in)) != EOF){
                for (i = 0; i < dlugosc; i++){
                        if (pobranyznak == argv[1][i]){
                                wyniki[i]++;
                        }
                }
        }
        for (i = 0; i < dlugosc; i++){
                printf("Znak %c wystapil %d razy\n", argv[1][i], wyniki[i]);
        }
        fclose(in);
        free(wyniki);
        return 0;
}

1

Jedno z typowych, ujdzie.

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