[C] Tablice znakowe/(tekstowe?)

macikiw2
Użytkownik
Użytkownik
Posty: 218
Rejestracja: 28 lis 2012, o 16:59
Płeć: Mężczyzna
Lokalizacja: Daleko
Podziękował: 39 razy
Pomógł: 4 razy

[C] Tablice znakowe/(tekstowe?)

Post autor: macikiw2 »

Chciałbym wczytać 4 teksty z klawiatury i zapisać je do tablicy.
Nie za bardzo wiem jak to wykonać - do tej pory operowałem na liczbach i podany poniżej sposób działał(oczywiście zmieniając char i %s na wersje liczbowe).

Kod: Zaznacz cały

int main(int argc, const char **argv)
{
    int i;
    char tab[4];
    for(i=0;i<4;i++){
    puts("Podaj nazwe towaru");
    scanf("%s",&tab[i]);}
    for(i=0;i<4;i++){
    printf("Nazwy twoich towarow to: %d, %s
", i, tab[i]);}
	return 0;
}
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C] Tablice znakowe/(tekstowe?)

Post autor: kalwi »

1) wcięcia
2) należy używać ++i zamiast i++
3)

Kod: Zaznacz cały

tab[4]
oznacza tablicę 4 znaków, czyli krótko mówiąc możesz pobrać co najwyżej 4 litery.

Aby pobrać 4 razy jakiś tekst, należy zrobić tablicę 4 tablic, gdzie każda będzie mogła przechowywać napis. Czyli tak:

Kod: Zaznacz cały

#include <stdio.h>

const int G_NAME_LENGTH = 30;

int main()
{
    char tab[4][G_NAME_LENGTH];

    for(int i = 0; i < 4; ++i)
    {
        printf("Wprowadz nazwe %d. produktu: ", i + 1);
        scanf("%s", tab[i]);
    }
    
    for(int i = 0; i < 4; ++i)
        puts(tab[i]);
    return 0;
}
Gouranga
Użytkownik
Użytkownik
Posty: 1592
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 246 razy

[C] Tablice znakowe/(tekstowe?)

Post autor: Gouranga »

nie ma w tym przypadku róznicy między i++ a ++i
i dla każdego napisu musi być o jeden znak więcej, dla tablicy char tab[4] możesz wczytać napis długości 3, ostatni znak w tab[3] jest automatycznie wpisywany jako '\0'
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C] Tablice znakowe/(tekstowe?)

Post autor: kalwi »

W tym przypadku - nie ma. Ale dobrą praktyką jest wyrobienie sobie zwyczaju, aby używać pre-inkrementacji, a nie post-inkrementacji - w przypadku tej drugiej jest tworzony obiekt tymczasowy.

Co do tab[4], to tak - masz rację. Coś mnie zamroczyło jak to pisałem.
Awatar użytkownika
miki999
Użytkownik
Użytkownik
Posty: 8691
Rejestracja: 28 lis 2007, o 18:10
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 36 razy
Pomógł: 1001 razy

[C] Tablice znakowe/(tekstowe?)

Post autor: miki999 »

kalwi pisze:W tym przypadku - nie ma. Ale dobrą praktyką jest wyrobienie sobie zwyczaju, aby używać pre-inkrementacji, a nie post-inkrementacji - w przypadku tej drugiej jest tworzony obiekt tymczasowy.
Może z punktu widzenia akademickiego... W rzeczywistości kompilator to zoptymalizuje.
Gouranga
Użytkownik
Użytkownik
Posty: 1592
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 246 razy

[C] Tablice znakowe/(tekstowe?)

Post autor: Gouranga »

miki999, słuszna uwaga, kompilator powinien sam zmienić i++ w ++i jeśli jest to użyte "luzem".
różnica pojawia się dopiero przy konstruktach typu tab[i++] = x; itp.
ODPOWIEDZ