scanf() a rozmiar tablicy

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

Kopiuj
#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

satirev
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 4 lata
0

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

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:4 minuty
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:

Kopiuj
#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;
}

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
kaczus
  • Rejestracja:około 10 lat
  • Ostatnio:5 dni
  • Lokalizacja:Łódź
  • Postów:1402
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)...

Ogólnie na prace domowe mam stawki zaporowe. Czasem coś o programowaniu znajdzie się na mojej stronie
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:

Kopiuj
#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...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.