2014-12-04 77 views
0

所以,我必須創建一個程序來管理庫,而無需使用的#include長度的scanf(「%數[^ n]的,陣列[N] .struct)的字符串的

我的問題是在功能我用添加了一本書,我已經告訴用戶,如果他超出數組限制或不。你有什麼建議我做什麼?

我決定用scanf(" %NUMBER[^\n], libro[i].title)

這裏就是我有到目前爲止(在printf中,我基本上要求輸入作者和內容,或者我告訴用戶他超出了限制):

int main(int argc, char *argv[]){ 
    int N, codice, i = 0, j = 0; 
    book Library[MAXlibri]; 
    boolean ricerca, esito; 

void InsertBook(book libro[], int i){ 
    printf("Inserire il titolo del libro (max 50 caratteri)\n"); 
    scanf(" %49[^\n]", libro[i].title); 
    if(sizeof(libro[i].title) > 50){ 
     printf("Sono stati inseriti troppi caratteri quando si inseriva il titolo del libro\n"); 
    } 
    printf("Inserire autore o autori (max 30 caratteri)\n"); 
    scanf(" %29[^\n]", libro[i].auth); 
    if(sizeof(libro[i].auth) > 30){ 
     printf("Sono stati inseriti troppi caratteri quando si inseriva l'autore\n"); 
    } 
    printf("Inserire casa editrice (max 20 caratteri)\n"); 
    scanf(" %19[^\n]", libro[i].editor); 
    if(sizeof(libro[i].editor) > 20){ 
     printf("Sono stati inseriti troppi caratteri quando si inseriva la casa editrice\n"); 
    } 
    printf("Inserire una breve descrizione (max 50 caratteri)\n"); 
    scanf(" %49[^\n]", libro[i].descr); 
    if(sizeof(libro[i].descr) > 50){ 
     printf("Sono stati inseriti troppi caratteri quando si inseriva la descrizione\n"); 
    } 
    printf("Inserire genere letterario (max 20 caratteri)\n"); 
    scanf(" %19[^\n]", libro[i].genre); 
    if(sizeof(libro[i].genre) > 20){ 
     printf("Sono stati inseriti troppi caratteri quando si inseriva il genere letterario\n"); 
    } 
    printf("Inserire codice numerico libro\n"); 
    scanf("%d", &libro[i].code); 
    printf("Inserire anno di pubblicazione\n"); 
    scanf("%d", &libro[i].year); 
    printf("Inserire numero pagine\n"); 
    scanf("%d", &libro[i].pages); 
    if(sizeof(libro[i].title) < 50 && sizeof(libro[i].auth) < 30 && sizeof(libro[i].editor) < 20 && sizeof(libro[i].descr)<50 && sizeof(libro[i].genre) < 20){ 
     printf("Libro inserito con successo!\n"); 
    } 
    else{ 
     printf("Il libro non e' stato inserito correttamente, riprovare\n"); 
    } 
} 
+1

你是什麼意思_「without'#include'」_?你不能在不包含'stdio.h'的情況下使用'scanf',並且你的格式可能是錯誤的:''%19 [^ \ n]「'讀到19是什麼?我拿你想要的東西''%19 [^ \ n] s「' – 2014-12-04 12:19:39

+0

@EliasVanOotegem'」%19 [^ \ n] s「':'s'不是必需的。 – BLUEPIXY 2014-12-04 12:29:11

+0

@BLUEPIXY:對,你......仍然沒有「#include」位很奇怪。 OP可能在沒有意識到的情況下依賴於gcc的auto-includes。 '-Wall -pedantic'標誌可能沒有在這裏使用 – 2014-12-04 12:33:00

回答

0

示例測試代碼。

#include <stdio.h> 
#include <string.h> 

int main(){ 
    char buff[10+1]; 
    char ch = 0; 
    int len; 
    while(1){ 
     printf("input max 10 characer(type '.' for exit)\n"); 
     scanf(" %10[^\n]%c", buff, &ch); 
     if(*buff == '.') 
      break; 
     len = strlen(buff); 
     printf("i received : '%s'\n", buff); 
     printf("input length : %d\n", len); 
     if(ch != '\n'){//Input is greater than in the case where a newline is not set 
      printf("you typed greater than 10 character\n"); 
      while(getchar() != '\n') 
       ;//drop upto newline 
     } 
    } 
    return 0; 
} 
0

我覺得這裏有幾個問題:一是 ,最重要的是你可能要重新考慮如何在圖書館圖書管理內存。爲標題,作者等設置最大數量的字符是一個非常糟糕的主意。你會遇到嚴重的限制。

爲此,我建議您使用字符串,它使事情變得更簡單,因爲內存分配是透明的 - 您可以調整大小,清除,刪除它們而不用擔心內存太多。 如果你堅持使用字節數組(即char [N]),你可以這樣做,但你應該動態地分配內存。這將允許你有你的領域任何長度,不會浪費記憶。

通過查看核心,我懷疑你正在使用靜態分配的緩衝區。我真的希望你沒有把它們分配在堆棧上,因爲這對他們來說是最糟糕的地方。如果你堅持讓他們靜態分配,他們應該全球宣佈,所以至少在數據部分

回到你的初始問題,如何獲得長度,你可以使用scanf(「%s \ n 「),然後strlen。

要讀取字符串,您可以使用任何您想要的功能,只要您考慮限制:fgets停止在'\ n'或EOF上。這可能是一個問題,例如,如果你有兩行標題)。另一方面,scanf會讀取格式化文本,所以您必須小心,您的文本全部以相同方式格式化。

希望這會有幫助

相關問題