2015-02-25 1 views
-1

Я делаю программу для хранения коллекции книг библиотеки. Один из вариантов - добавить новую книгу в массив структур.c-строка сохраняется в конце другой c-строки

Вот код

do 
{ 
    repeat = 0; 

    cout << "Enter the book's title: "; 
    cin.getline(tempTitle, (TITLE_SIZE) * 2); 

    for (int i = 0; i < bookNumber; i++) 
    { 
     if (strcmp(tempTitle, bookArray[i].title) == 0) 
     { 
      cout << "That title has already been entered, please enter a new book\n"; 
      repeat = 1; 
     } 
    } 

    if (strlen(tempTitle) < 1 || strlen(tempTitle) > TITLE_SIZE) 
    { 
     cout << "The Book's title must be between 1 and 50 characters long\n"; 
     repeat = 1; 
    } 

} while (repeat == 1); 

strncpy(bookArray[bookNumber].title, tempTitle, TITLE_SIZE); 
file << bookArray[bookNumber].title << "\n"; 


do 
{ 
    repeat = 0; 

    cout << "Enter the book's ISBN number: "; 
    cin.getline(tempIsbn, (ISBN_SIZE) * 2); 

    if (strlen(tempIsbn) != ISBN_SIZE) 
    { 
     cout << "The Book's title must be 13 digits long\n"; 
     repeat = 1; 
    } 

} while (repeat == 1); 

strncpy(bookArray[bookNumber].isbn, tempIsbn, ISBN_SIZE); 

Вот мой вход

Enter the book's title: new book title 
Enter the book's ISBN number: 0000000000000 
Enter the book's author: Person 
Is the book currently in stock (y/n)? y 

Вот что она сохраняется как

Title : new book title 
ISBN #: 0000000000000Person 
Author: Person 
Status: Available 

Почему он сохраняет c-строку автора до конца c-строки isbn?

ответ

0

книга :: ISBN, похоже, представляет собой массив из 13 элементов. Если вы передаете этот массив функции C-обработки строк, функция получает только начальный адрес, а не длину, поэтому он сканирует память для байта с числовым значением 0 (не ASCII '0') и считает, что это конец строки. Тринадцать символов в ISBN полностью заполняются цифрами и непосредственно следуют за автором, поэтому печать ISBN продолжается до завершения 0 байта члена автора.

Вы можете сделать печать ограниченной длины, как это, например:

printf("ISBN: %.13s\n", books[index].ISBN); 
0

Ваша логика inputing данных недействительна. Например, если член isbn данных определен как

char isbn[ISBN_SIZE]; 

, где ISBN_SIZE равно 13, то этот элемент данных может хранить только 12 цифры, так как последний символ массива будет хранить завершающий ноль.

Таким образом, вы должны определить ISBN_SIZE как равный 14, если вы хотите, чтобы этот элемент данных isbn. будет хранить 13 цифр.

Кроме того, если isbn имеет размер ISBN_SIZE тогда не понятно, почему вы используете выражение (ISBN_SIZE) * 2 ввести значение.

cin.getline(tempIsbn, (ISBN_SIZE) * 2); 

Таким образом, после того, как enetering элемент данных isbn значение не содержит завершающий нулевой строки.

Соответствующий фрагмент кода может выглядеть следующим образом

bool repeat = false; // the initialization only for exposition 

do 
{ 
    cout << "Enter the book's ISBN number: "; 
    cin.getline(tempIsbn, ISBN_SIZE); 

    if (repeat = (strlen(tempIsbn) != ISBN_SIZE - 1)) 
    { 
     cout << "The Book's ISDN number must be " << ISBN_SIZE - 1 << " digits long\n"; 
    } 

} while (repeat); 

strcpy(bookArray[bookNumber].isbn, tempIsbn); 

Те же замечания действительны для ввода названия книги.

Смежные вопросы