具有scanf的字符串的长度(“%number[^\n],数组[n].struct)

具有scanf的字符串的长度(“%number[^\n],数组[n].struct),c,arrays,string,scanf,sizeof,C,Arrays,String,Scanf,Sizeof,因此,我必须创建一个程序来管理库,而不使用include 我的问题是,在我用来添加书籍的函数中,我必须告诉用户是否超出了数组限制。您建议我怎么做 我决定使用scanf%NUMBER[^\n],libro[I].title 以下是我到目前为止在printf中的内容,我基本上要求输入作者和内容,或者我告诉用户他超出了限制: int main(int argc, char *argv[]){ int N, codice, i = 0, j = 0; book Library[MAXli

因此,我必须创建一个程序来管理库,而不使用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");
    }
}
示例测试代码

#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;
} 

我认为这里有几个问题: 首先,也是最重要的一点,您可能需要重新思考如何管理图书馆中书籍的内存。允许书名、作者等使用最大字符数是一个非常糟糕的主意。您将遇到严重的限制

对于这一点,我建议您使用字符串,因为内存分配是透明的——您可以调整大小、清除、删除它们,而不必太担心内存。 如果你坚持使用字节数组,也就是char[N],你可以这样做,但是你应该动态分配内存。这将允许你的字段有任何长度,并且不会浪费内存

通过查看内核,我怀疑您使用的是静态分配的缓冲区。我真的希望您没有在堆栈上分配缓冲区,因为这对它们来说是最糟糕的地方。如果您坚持静态分配缓冲区,则应该全局声明它们,因此至少在.data部分中是这样

回到您最初的问题,如何获得长度,您可以使用scanf%s\n,然后使用strlen

读取字符串时,只要考虑到限制就可以使用所需的函数:FESTS在“\n”或EOF上停止。例如,如果在两行上有标题,这可能是个问题。SCANF另一方面阅读格式文本Souu,您必须小心,您的文本都以相同的方式形成。


希望这有帮助

没有include意味着什么?如果没有包含stdio.h,您就不能使用scanf,并且您的格式可能是错误的:%19[^\n]读取19的确切内容是什么?我想您需要%19[^\n]s@EliasVanOotegem%19[^\n]s:s不是必需的。@BLUEPIXY:对,你是……不过,不包含位很奇怪。OP可能依赖gcc的自动包含,但没有意识到。-墙-可能没有使用迂腐的标志here@EliasVanOotegem是的,只是简单地在include中添加了一个原型。它可能不能作为一个整体工作。