因此,我必须创建一个程序来管理库而不使用#include
我的问题是,在我用来添加书籍的函数中,我必须告诉用户他是否超出了数组限制。你建议我做什么?
我决定使用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");
}
}
答案 0 :(得分: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;
}
答案 1 :(得分:0)
我认为这里有一些问题: 首先也是最重要的是,您可能想重新考虑如何管理库中书籍的内存。允许标题,作者等的最大字符数是一个非常糟糕的主意。你将遇到严重的限制。
为此,我建议您使用字符串,因为内存分配是透明的,这使得事情变得更容易 - 您可以调整大小,清除,删除它们而不必过多担心内存。 如果你坚持使用字节数组(即char [N]),你可以这样做,但你应该动态分配内存。这将允许您为您的字段设置任何长度,并且不会浪费内存。
通过查看核心,我怀疑您正在使用静态分配的缓冲区。我真的希望你没有在堆栈上分配它们,因为这对他们来说是最糟糕的地方。如果你坚持让他们静态分配,他们应该在全球宣布,所以至少在.data部分去了
回到你最初的问题,如何获得长度,你可以使用scanf(“%s \ n”)和strlen。
要阅读字符串,只要您考虑限制,就可以使用您想要的任何功能:fgets在'\ n'或EOF上停止。如果您有两行标题,这可能是一个问题)。另一方面,scanf读取格式文本,你必须小心你的文本都是以同样的方式格式化。
希望这有帮助