2016-11-10 75 views
3

這裏是我的代碼:如何通過電子郵件解決sscanf問題?

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    const char example[]="13902796D ; Josefa Moral Fidalgo ; [email protected] ; 01/03/2001 ; 0 ; 1 ;"; 
    char DNI[10]; 
    char name[100]; 
    char email[100]; 
    char date[10]; 
    int gender; 
    int uni; 

    sscanf(example, "%[^;] ; %[^;] ; %[^;] ; %[^;] ; %d ; %d ; ", 
     DNI, name, email, date, &gender, &uni); 

    printf("DNI: %s\n", DNI); 
    printf("Name: %s\n", name); 
    printf("Email: %s\n", email); 
    printf("Date: %s\n", date); 
    printf("Gender: %d\n", gender); 
    printf("Uni: %d\n", uni); 
    return 0; 
} 

而這裏的結果:

DNI: 13902796D 
Name: Josefa Moral Fidalgo 
Email: 
Date: 01/03/2001 
Gender: 0 
Uni: 1 

但我希望得到的結果:

DNI: 13902796D 
Name: Josefa Moral Fidalgo 
Email: [email protected] 
Date: 01/03/2001 
Gender: 0 
Uni: 1 

我用C新手,但我可以」在互聯網上找到任何答案,在這裏也沒有Stackoverflow,並檢查一些書籍,但無法找到代碼的原因

sscanf(example, "%[^;] ; %[^;] ; %[^;] ; %[^;] ; %d ; %d ; ", 
      DNI, name, email, date, &gender, &uni); 

不起作用。誰能幫我?我不能使用sscanf以外的其他功能,這就是我的教授想要在代碼中使用的功能。

+1

除尾部空格外,還需要爲空字符串終止符留出空間。 – Barmar

回答

3

緩衝區溢出。

代碼如何知道不要溢出DNI[]?只有DNI的地址被傳遞給sscanf()。由於OP的代碼沒有爲輸入提供足夠的空間,所以DNI[]被覆蓋,導致未定義的行爲(UB)。

sscanf(example, "%[^;] ... ", DNI, .... 

相反,傳遞給讀取的字符的最大數目,該寬度。 A 9將限制掃描最多9個字符。由於數組大小爲10,因此9個字符和附加的空字符將有足夠的內存。代碼還需要使緩衝區更大以適應用戶輸入。

char DNI[10*2]; 
sscanf(example, "%19[^;] ... ", DNI, .... 

但是整個掃描是正確的?
一個簡單的方法是用" %n"記錄掃描的偏移量。如果掃描達到"%n",則n將具有新值。

int n = -1; 
sscanf(example, "%9[^;] ;... %n", DNI, ..., &n); 

將這個共同

int main(int argc, char **argv) { 
    const char example[]="13902796D ; 1 ;"; 
    char DNI[10*2]; 
    int uni; 

    int n = -1; 
    sscanf(example, "%19[^;] ; %d ; %n", DNI, &uni, &n); 
    if (n < 0) { 
     puts("Fail"); 
    } else { 
     printf("DNI: %s\n", DNI); 
     printf("Uni: %d\n", uni); 
    } 
    return 0; 
} 

代碼還是有問題的DNI[]可能"13902796D "(注尾隨空格),但是那是另一個問題了OP處理。

+0

非常感謝你!有效! –