2014-12-04 45 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会读取格式化文本,所以您必须小心,您的文本全部以相同方式格式化。

希望这会有帮助

相关问题