Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2007, 09:36   #1
Panterka
Пользователь
 
Аватар для Panterka
 
Регистрация: 10.12.2007
Сообщений: 28
По умолчанию ОШИБКА в структуре

Есть программа,работает вроде нормально, но в одной колонки (срок годности), по программе прописанно 8 знаков для набора, а в итоге, когда прописываешь 8 знаков, программа выдаёт 9 знаков, причём 9-ый произвольно записывает сама, в чём может быть проблема?
Вот программа:
PHP код:
#include<stdio.h> 
#include<conio.h> 

void main() 
{
 
int S=0;
 
int i;
 
clrscr ();

 
FILE*L6;
 
L6=fopen("C:\laba6.txt""wt");
 
struct Magazin
 
{
  
char nazvanie[15];
  
char srok_godnosti[8];
  
int cena;
  
int kolich;
 } ;
Magazin A[2];
for(
i=0;i<2;i++)
{
printf("\n Tovar %d",i+1);
 
printf ("\n Nazvanie:");scanf("%s",&A[i].nazvanie);
 
printf("\n Srok godnosti:");scanf("%s",A[i].srok_godnosti);
 
printf("\n Cena:");scanf("%d",&A[i].cena) ;
 
printf("\n Kol-vo:");scanf("%d",&A[i].kolich);
 
S+=A[i].cena*A[i].kolich;
}

printf ("\n --------------------------------------------------------------- ") ;
fprintf(L6,"\n --------------------------------------------------------------- ") ;
printf("\n|    Nazvanie   | Srok godnosti |     Cena      |    Kol-vo     |");
fprintf(L6,"\n|    Nazvanie   | Srok godnosti |     Cena      |    Kol-vo     |");
printf ("\n --------------------------------------------------------------- ") ;
fprintf(L6,"\n --------------------------------------------------------------- ");

for (
i=0;i<2;i++)
{
 
printf("\n|     %s    |   %s   |      %d       |        %d      |",
  
A[i].nazvanie,A[i].srok_godnosti,A[i].cena,A[i].kolich);
 
fprintf(L6,"\n|     %s    |   %s   |      %d       |        %d      |",
  
A[i].nazvanie,A[i].srok_godnosti,A[i].cena,A[i].kolich);
 
printf ("\n --------------------------------------------------------------- ");
 
fprintf (L6,"\n --------------------------------------------------------------- ");
}

printf("\n\n Obwaya stoimost: %d",S);
fprintf(L6,"\n\n Obwaya stoimost: %d",S);

getch();

а вот что она выдаёт:
Вложения
Тип файла: zip прога.zip (7.6 Кб, 11 просмотров)
Panterka вне форума Ответить с цитированием
Старый 18.12.2007, 12:03   #2
Panterka
Пользователь
 
Аватар для Panterka
 
Регистрация: 10.12.2007
Сообщений: 28
По умолчанию

Подскажите пожалуйсто в чём дело, срочно нужно!
Panterka вне форума Ответить с цитированием
Старый 18.12.2007, 12:35   #3
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Язык не знаю, поэтому дурацкий совет. Попробуйте методом тыка изменять число 8 на 7 или 9. Может ошибку найдете.
puporev вне форума Ответить с цитированием
Старый 18.12.2007, 12:41   #4
Panterka
Пользователь
 
Аватар для Panterka
 
Регистрация: 10.12.2007
Сообщений: 28
По умолчанию

Цитата:
Сообщение от puporev Посмотреть сообщение
Язык не знаю, поэтому дурацкий совет. Попробуйте методом тыка изменять число 8 на 7 или 9. Может ошибку найдете.
Если в проге прописать [6], то при вводе 6 знаков нормально выдаёт, а если прописать [8] и ввести 8, то 9 сам подписывает.
Panterka вне форума Ответить с цитированием
Старый 18.12.2007, 13:52   #5
n@sok
Пользователь
 
Регистрация: 24.11.2007
Сообщений: 46
По умолчанию

Для строк надо прописывать на один символ больше, чтобы хранить нулевой символ. Для вывода 8 символов нужно написать
Код:
  char srok_godnosti[9];
Иначе девятым символом выведется содержимое поля cena.
n@sok вне форума Ответить с цитированием
Старый 18.12.2007, 14:17   #6
Panterka
Пользователь
 
Аватар для Panterka
 
Регистрация: 10.12.2007
Сообщений: 28
По умолчанию

Цитата:
Сообщение от n@sok Посмотреть сообщение
Для строк надо прописывать на один символ больше, чтобы хранить нулевой символ. Иначе девятым символом выведется содержимое поля cena.
спасибо помогло!
PS: но интересно, почему же когда [6], выводит 6 и ничего не дописывает, а когда [8] дописывает?
Panterka вне форума Ответить с цитированием
Старый 18.12.2007, 15:43   #7
n@sok
Пользователь
 
Регистрация: 24.11.2007
Сообщений: 46
По умолчанию

Поле cenа имеет тип int и значит выравнивается на границу 4 байта. Если написано char srok_godnosti[6], то между этими полями появляется пустое место размером в 2 байта заполненое нулями. Они и принимаются за конец строки.
n@sok вне форума Ответить с цитированием
Старый 19.12.2007, 09:24   #8
Panterka
Пользователь
 
Аватар для Panterka
 
Регистрация: 10.12.2007
Сообщений: 28
По умолчанию

Цитата:
Сообщение от n@sok Посмотреть сообщение
Поле cenа имеет тип int и значит выравнивается на границу 4 байта. Если написано char srok_godnosti[6], то между этими полями появляется пустое место размером в 2 байта заполненое нулями. Они и принимаются за конец строки.
Спасибки,разобралась.
Panterka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка Devourer12345 Microsoft Office Access 2 10.08.2008 20:24
ошибка ben95 Общие вопросы Delphi 5 06.02.2008 23:25
ошибка mci nikolya Помощь студентам 1 05.02.2008 22:52
помогите: динамический массив в структуре tangar Общие вопросы C/C++ 4 28.12.2006 12:42