scanf() a rozmiar tablicy

0

Witam,
Borykam się z pewnym problemem związanym z funkcją scanf(). Martwi mnie sposób jej działania w przypadku przypisania wartości skanowanej do zmiennej o mniejszej wartości niż wartość skanowana

#include <stdio.h>

int main (int argc, char* argv[]) {
    int i;
    char komenda[1];
    while (1) {
        printf(">>> ");
        scanf("%s", komenda);
        printf(">>> %s\n", komenda);
        printf(">>> %c\n",komenda[2]);
    }
    return 0;
}
 

Powyższy kod w przypadku inputu "abc" wypisze 'c'...
Czyli wypisze 3 z kolei znak przypisanego stringa... Dlaczego skoro tablica zaalokowana jest statycznie i ma 1 wiersz i 1 kolumne (1 element).

Pozdrawiam

0

Buffer overflow to undefined behaviour. Lepiej by było gdybyś wczytywał dane do tablicy za pomocą funkcji fgets.

1

Dokumentacja twoim przyjacielem: http://www.cplusplus.com/reference/cstdio/scanf/

cplusplus.com napisał(a)

width - Specifies the maximum number of characters to be read in the current reading operation (optional).

Czyli to jest bezpieczne:

#include <stdio.h>
 
int main (int argc, char* argv[]) {
    int i;
    char komenda[16];
    printf(">>> ");
    while (1 = scanf("%15s", komenda)) {
        printf(">>> %s\n", komenda);
        printf(">>> %c\n>>> ",komenda[2]);
    }
    return 0;
}
0

@Czarny Szczur Rozwiązanie podał już @MarekR22, natomiast to co napisałeś nie jest prawdą:

Powyższy kod w przypadku inputu "abc" wypisze 'c'...
Czyli wypisze 3 z kolei znak przypisanego stringa... Dlaczego skoro tablica zaalokowana jest statycznie i ma 1 wiersz i 1 kolumne (1 element).

  • powyższy kod może wypisać takie coś, ale równie dobrze może pójść w krzaki 1) nadpisujesz nieprzydzieloną sobie pamięć (czasami kompilatory/systemy alokując pamięć biorą ją z naddatkiem, ale tak wcale nie zawsze musi być), 2) wypisujesz zawartość obcej pamięci (co tam się znajduje wie tylko system operacyjny - Ty możesz nadpisać tą pamięć tu, a inny wątek za chwilę może zapisać co innego, a jakby 2 wątki jednocześnie tam próbowały zapisywać, będzie bum)...
0
satirev napisał(a):

Buffer overflow to undefined behaviour. Lepiej by było gdybyś wczytywał dane do tablicy za pomocą funkcji fgets.

Musisz kompilować jakimś innym kompilatorem bo mi żadne błędy nie wyskakują... sprawdzę fgets().

MarekR22 napisał(a):

Dokumentacja twoim przyjacielem: http://www.cplusplus.com/reference/cstdio/scanf/

cplusplus.com napisał(a)

width - Specifies the maximum number of characters to be read in the current reading operation (optional).

Czyli to jest bezpieczne:

#include <stdio.h>
 
int main (int argc, char* argv[]) {
    int i;
    char komenda[16];
    printf(">>> ");
    while (1 = scanf("%15s", komenda)) {
        printf(">>> %s\n", komenda);
        printf(">>> %c\n>>> ",komenda[2]);
    }
    return 0;
}

Wszystko pięknie ładnie... Ale to jest opcja która ma ucinać wielkość wpisanego stringa w przypadku gdy będzie większy niż oczekiwany... Natomiast dziwi mnie to ze funkcja pozwala na nadpisanie większego stringa niż pozwala zmienna...

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