Operatore "%*c"

di il
5 risposte

Operatore "%*c"

fscanf(input_file, "%d%*c", &N_words);
premesso che input_file è un file di testo. Non capisco a cosa serva %*c dato che senza N-words rimane lo stesso. fatto sta che se cancello %*c cambia il risultato del programma

5 Risposte

  • Re: Operatore "%*c"

    La documentazione della funzione la puoi trovare qui:

    https://www.cplusplus.com/reference/cstdio/fscanf

    In ogni caso, cosa intendi con "il programma non funziona"? Il comando in se funziona correttamente
    
    #include <stdio.h>
    
    int main (){
      int N_words;
      FILE * input_file = fopen("file.txt","w+");
      fprintf(input_file, "%d", 12345);
      rewind(input_file);
      fscanf(input_file, "%d", &N_words);
      fclose(input_file);
      printf("Ho scritto : %d", N_words);
      
      return 0;
    }
    
  • Re: Operatore "%*c"

    Weierstrass ha scritto:


    La documentazione della funzione la puoi trovare qui:

    https://www.cplusplus.com/reference/cstdio/fscanf

    In ogni caso, cosa intendi con "il programma non funziona"? Il comando in se funziona correttamente
    
    #include <stdio.h>
    
    int main (){
      int N_words;
      FILE * input_file = fopen("file.txt","w+");
      fprintf(input_file, "%d", 12345);
      rewind(input_file);
      fscanf(input_file, "%d", &N_words);
      fclose(input_file);
      printf("Ho scritto : %d", N_words);
      
      return 0;
    }
    
    No dico che omettendo o no il %*c cambia il risultato del programma
  • Re: Operatore "%*c"

    E l'esempio postato funziona allo stesso modo aggiungendo %*c. Per questo devi descrivere cosa non funziona, come dal meccanico...
  • Re: Operatore "%*c"

    Questo è il main.cpp
    #include <cstdio>
    #include <iostream>
    
    #include "conta.h"
    
    #define WRONG_PARAM				-1
    #define ERROR_ON_OPEN_FILE		-2
    #define WRONG_MEM_ALLOC			-3
    #define REALLOC_ERROR			-4
    
    #define SIZE_WORD				20
    
    int main(int argc, char**argv) {
        FILE * input_file;
        int N_words, n_lines = 0, substr_length;
        int word_length, allocated_length = SIZE_WORD;
        int n_substr = 0;
        char *ptrWord = (char*)calloc(SIZE_WORD, sizeof(char)), *ptrReAlloc = NULL;
    
        if (argc != 3) {
            std::cerr << "Not enough parameters: missing the input file and/or the length of substr\n";
            return WRONG_PARAM;
        }
    
        if (ptrWord == NULL) {
            std::cerr << "Not enough memory\n";
            return WRONG_MEM_ALLOC;
        }
    
        sscanf(argv[1], "%d", &substr_length);
    
        input_file = fopen(argv[2], "r");
        if (input_file == NULL) {
            std::cerr << "Cannot open the input file\n";
            return ERROR_ON_OPEN_FILE;
        }
    
    
    
        fscanf(input_file, "%d%*c", &N_words);
        printf("%d\n",N_words);
    
        while (n_lines < N_words) {
            word_length = 0;
            ptrWord[word_length] = (char) fgetc(input_file);
            while ((ptrWord[word_length] != '\n') && (ptrWord[word_length] != EOF)) {
                word_length++;
                if (word_length >= allocated_length) {
                    allocated_length+=SIZE_WORD;
                    ptrReAlloc = (char *)realloc(ptrWord, allocated_length);
    
                    if (ptrReAlloc == NULL) { // in case of error
                        std::cerr << "ReAllocation Issue\n";
                        free(ptrWord);
                        ptrWord = NULL;
                        return REALLOC_ERROR;
                    }
                    ptrWord = ptrReAlloc; // assign the new ptr (even if it is the same as before)
                }
                ptrWord[word_length] = (char) fgetc(input_file);
            }
            ptrWord[word_length] = '\0';
            n_substr += conta(ptrWord, substr_length);
            n_lines++;
        }
    
        std::cout << "Total number of substr (n=" << substr_length << ") with 2 vowels: " << n_substr << '\n';
    
        if (ptrWord != NULL){
            free(ptrWord);
            ptrWord = NULL;
        }
        return 0;
    
    }
    questo conta.cpp
    #include "conta.h"
    
    int isVowel(char a) {
        char la = (char) tolower(a);
        return (la == 'a' || la == 'e' || la == 'i' || la == 'o' || la == 'u');
    }
    
    int conta(char *S, int n) {
        int tot = 0;
        int Slength = strlen(S);
        char *ptrToEnd = S + Slength - n;
        int vowel_ctr;
        if (Slength > n) {
            for (; S <= ptrToEnd; S++) {
                vowel_ctr = 0;
                for (int j = 0; j < n && (vowel_ctr <= 2); j++) {
                    if (isVowel(S[j])) vowel_ctr++;
                }
                if (vowel_ctr == 2) tot++;
            }
        }
    
        return tot;
    }
    questo conta.h
    #ifndef LAB_02_CONTA_H
    #define LAB_02_CONTA_H
    #include <cstring>
    #include <cctype>
    
    int isVowel(char a);
    
    int conta(char *S, int n);
    
    #endif //LAB_02_CONTA_H
    con file di testo

    9
    forExample
    prova
    astruso
    pleonastico
    zuzzurellone
    procastinare
    luculliano
    mentecatto
    supercalifragilisticexpialidocious



  • Re: Operatore "%*c"

    Il comando corretto per il tuo file è
    
    fscanf(input_file, "%d\n", &N_words);
    
    Con il %*c stai ignorando il newline, quindi praticamente hai fatto un workaround che ti permette di far funzionare il seguente fgetc()
Devi accedere o registrarti per scrivere nel forum
5 risposte