2012-07-31 34 views
14

Tôi đã mã sau:Làm thế nào để đúng printf số nguyên và chuỗi trong 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); 

Khi tôi chạy mã, và nhập vào "A 1" như sau:

type a string: A 1 

tôi có kết quả sau:

A 
�<� 

Tôi đang cố gắng đọc ký tự đầu tiên dưới dạng chuỗi và ký tự thứ ba dưới dạng số nguyên rồi in ra trên màn hình. Nhân vật đầu tiên luôn hoạt động, nhưng màn hình sẽ chỉ hiển thị các nội dung ngẫu nhiên sau đó .... Tôi nên sửa nó như thế nào?

Cảm ơn

+1

Một điều mà mọi người đã không được đề cập một chút: xin đừng scanf vào một bộ đệm giới hạn kích thước. Người dùng có thể dễ dàng chỉ cần nhập nhiều hơn giới hạn và sửa đổi chương trình của bạn. (xem thêm: các cuộc tấn công tràn bộ đệm) –

+0

@DennisMeng: Người ta có thể thêm một bộ định dạng chiều rộng, ví dụ: '% 123s'. Nó vẫn có khả năng nguy hiểm vì chiều rộng đó không bao gồm null terminator. – diapir

+0

@diapir True. Bit quan trọng là tránh tràn bộ đệm. –

Trả lời

22

Bạn đang đi đúng hướng. Dưới đây là một phiên bản sửa:

char str[10]; 
int n; 

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

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

Hãy nói qua những thay đổi:

  1. phân bổ một int (n) để lưu trữ số điện thoại trong
  2. nói scanf để đọc trong lần đầu tiên một chuỗi và sau đó một số (%d là số, như bạn đã biết từ số printf

Đó là tất cả có nó. Mã của bạn hơi nguy hiểm một chút, bởi vì bất kỳ đầu vào nào của người dùng dài hơn 9 ký tự sẽ tràn str và bắt đầu chà đạp ngăn xếp của bạn.

+0

Ahh cảm ơn rất nhiều !! không nhận ra tôi có thể làm theo cách này. Cảm ơn! – user1420474

5

scanf("%s",str) chỉ quét cho đến khi tìm thấy ký tự khoảng trắng. Với đầu vào "A 1", nó sẽ chỉ quét ký tự đầu tiên, do đó s2 điểm tại thùng rác xảy ra ở str, vì mảng đó không được khởi tạo.

+0

Vâng, tôi nhận ra rằng nếu tôi nhập "ABCFS", nó không hiển thị rác. Bây giờ tôi biết vấn đề ở đâu. Cảm ơn! – user1420474

1

Hãy thử mã này bạn tôi ...

#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; 
} 
Các vấn đề liên quan