2011-10-25 22 views
10

Tôi đang cố gắng để trích xuất một chuỗi và một số nguyên ra khỏi một chuỗi sử dụng sscanf:C - không sscanf làm việc

#include<stdio.h> 

int main() 
{ 
    char Command[20] = "command:3"; 
    char Keyword[20]; 
    int Context; 

    sscanf(Command, "%s:%d", Keyword, &Context); 

    printf("Keyword:%s\n",Keyword); 
    printf("Context:%d",Context); 

    getch(); 
    return 0; 
} 

Nhưng điều này mang lại cho tôi kết quả:

Keyword:command:3 
Context:1971293397 

Tôi mong đợi sản lượng này:

Keyword:command 
Context:3 

Tại sao sscanf hoạt động như thế này? Cảm ơn trước sự giúp đỡ của bạn!

+1

Có lý do chính đáng nào bạn không kiểm tra kết quả 'sscanf' không? –

Trả lời

14

sscanf hy vọng %s thẻ để được khoảng trắng phân (tab, không gian, newline), vì vậy bạn sẽ cần phải có một khoảng trống giữa chuỗi và:

cho một xấu xí trông hack you có thể thử:

sscanf(Command, "%[^:]:%d", Keyword, &Context); 

sẽ buộc mã thông báo không khớp với dấu hai chấm.

+0

Ý bạn là, không có cách nào tôi có thể sử dụng dấu ":" làm dấu phân cách? – dpp

+0

Vì vậy, không thể trích xuất chuỗi và trình tích hợp từ "lệnh: 3"? – dpp

+0

có, đó là: 'sscanf (Lệnh,"% 7s:% d ", Từ khóa & Ngữ cảnh);' ở đầu kia, điều này chỉ chấp nhận các lệnh dài 7 ký tự. – fritzone

2

sử dụng quy ước %[ tại đây. xem trang hướng dẫn sử dụng của scanf: http://linux.die.net/man/3/scanf

#include <stdio.h> 

int main() 
{ 
    char *s = "command:3"; 
    char s1[0xff]; 
    int d; 
    sscanf(s, "%[^:]:%d", s1, &d); 
    printf("here: %s:%d\n", s1, d); 
    return 0; 
} 

cung cấp "here: command: 3" làm đầu ra của nó.

5

Nếu bạn không cụ thể về việc sử dụng sscanf, bạn luôn có thể sử dụng strtok, vì những gì bạn muốn là mã hóa chuỗi của bạn.

char Command[20] = "command:3"; 

    char* key; 
    int val; 

    key = strtok(Command, ":"); 
    val = atoi(strtok(NULL, ":")); 

    printf("Keyword:%s\n",key); 
    printf("Context:%d\n",val); 

Điều này dễ đọc hơn nhiều, theo ý kiến ​​của tôi.

+0

Cảm ơn, nhưng tôi muốn học 'sscanf'. – dpp

+0

Tôi đã sử dụng mã này vào mã của tôi, cảm ơn. – dpp