2012-07-31 33 views
14

Mam następujący kod:Jak poprawnie wydrukować liczbę całkowitą i ciąg w c?

char *s1, *s2; 
char str[10]; 

printf("type a string: "); 
scanf("%s", str); 

s1 = &str[0]; 
s2 = &str[2]; 

printf("%s\n", s1); 
printf("%s\n", s2); 

Kiedy uruchomić kod i wprowadź wejście "A 1" następująco:

type a string: A 1 

Mam następujący wynik:

A 
�<� 

Próbuję odczytać pierwszy znak jako ciąg i trzeci znak jako liczbę całkowitą, a następnie wydrukować je na ekranie. Pierwsza postać zawsze działa, ale ekran po prostu wyświetli losowe rzeczy .... Jak mam to naprawić?

Dzięki

+1

Inna sprawa, że ​​ludzie nie wspomniał na trochę: proszę nie scanf do bufora o ograniczonym rozmiarze. Użytkownik może z łatwością wpisać więcej niż limit i przykręcić program. (patrz także: ataki z przepełnieniem bufora) –

+0

@DennisMeng: Można dodać specyfikator szerokości np. '% 123s'. Jest nadal potencjalnie niebezpieczny, ponieważ ta szerokość nie zawiera terminatora zerowego. – diapir

+0

@diapir Prawda. Ważnym bitem jest uniknięcie przepełnienia bufora. –

Odpowiedz

22

Jesteś na dobrej drodze. Oto wersja poprawiona:

char str[10]; 
int n; 

printf("type a string: "); 
scanf("%s %d", str, &n); 

printf("%s\n", str); 
printf("%d\n", n); 

Pomówmy przez zmiany:

  1. przydzielić int (n), aby zapisać swój numer w
  2. powiedzieć scanf czytać w pierwszy ciąg, a następnie numer (%d oznacza numer, jak już wiesz z Twojego printf

To prawie wszystko jest do tego. Twój kod jest trochę niebezpieczny, ponieważ każde wejście użytkownika dłuższe niż 9 znaków przepełni str i rozpocznie deptanie twojego stosu.

+0

Ahh dzięki bardzo! nie zdawałem sobie sprawy, że mogę to zrobić. Dzięki! – user1420474

5

scanf("%s",str) skanuje tylko do momentu znalezienia znaku odstępu. Przy wprowadzeniu "A 1", skanuje on tylko pierwszy znak, a zatem s2 wskazuje na śmieci, które miały miejsce w str, ponieważ ta tablica nie została zainicjowana.

+0

Tak, zdałem sobie sprawę, że jeśli wprowadzę "ABCFS", to nie wyświetli się śmieci. Teraz wiem, gdzie jest problem. Dzięki! – user1420474

1

Spróbuj kod przyjacielu ...

#include<stdio.h> 
int main(){ 
    char *s1, *s2; 
    char str[10]; 

    printf("type a string: "); 
    scanf("%s", str); 

    s1 = &str[0]; 
    s2 = &str[2]; 

    printf("%c\n", *s1); //use %c instead of %s and *s1 which is the content of position 1 
    printf("%c\n", *s2); //use %c instead of %s and *s3 which is the content of position 1 

    return 0; 
} 
Powiązane problemy