скопированная строка, преобразованная через atoi, доставляет 0 - PullRequest
0 голосов
/ 17 августа 2011

этот инструмент должен, если он готов, определить возраст человека.он получает системную дату и запрашивает у пользователя дату рождения.затем он разбил введенную строку на «год» (bjahr), «месяц» (bmonat) и «день» (btag), скопировав важные символы в новую строку.после этого он преобразует их через atoi в значение int.

, чтобы проверить, все ли прошло хорошо, я позволил напечатать его.Но там проблема начинается.год работает нормально, но "intmonat" и "inttag", кажется, равны 0. Я не могу найти ошибку, можете ли вы помочь мне, пожалуйста?

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <string.h>

int main ()
{
    SYSTEMTIME time;
    GetSystemTime (&time);

char name[20], bday[10], bjahr[4], bmonat[2], btag[2]; 

int year = time.wYear;
int month = time.wMonth;
int day = time.wDay;
int intjahr, intmonat, inttag;

printf("\n\n today is the: %i.%i.%i \n\n",day,month,year);
printf(" please insert Birthdate (dd.mm.jjjj).\n\n");

gets(bday);

strncpy(bjahr , &bday[6], 5);
strncpy(btag  , &bday[0], 1);
strncpy(bmonat, &bday[3], 1);

intjahr  = atoi(bjahr) ;
intmonat = atoi(bmonat);
inttag   = atoi(btag)  ;

printf("\n\n jahr %i \n\n",intjahr);
printf(" monat %i \n\n",intmonat);
printf(" tag %i \n\n",inttag);        

system("PAUSE");

}

Я немец, поэтому некоторые словаможет быть не англичанин, надеюсь, это не имеет значения.

Ответы [ 2 ]

2 голосов
/ 17 августа 2011

Ваши переменные слишком короткие: например, вы ожидаете два символа для месяца, но вам также необходимо учитывать для \0, который завершает строку.Кроме того, вы просто копируете один символ в день и месяц, а не завершаете его нулем.Таким образом, это должно быть:

char name[20], bday[11], bjahr[5], bmonat[3], btag[3];

...

gets(bday);

strncpy(bjahr , &bday[6], 4);
bjahr[4] = 0;
strncpy(btag  , &bday[0], 2);
btag[2] = 0;
strncpy(bmonat, &bday[3], 2);
bday[2] = 0;

Но лучшим способом было бы использовать scanf вместо этого, вы должны прочитать об этом и ознакомиться с ним.Это может легко помочь вам правильно проанализировать ввод, например 1.2.2000.

Кроме того, ваше текущее решение с массивами фиксированного размера может легко привести к переполнению буфера (просто введите abcdefghijklmnopqrst).Вы должны сделать это вместо:

fgets(bday, sizeof(bday), stdin);
1 голос
/ 17 августа 2011

ваши strncpy немного отключены, вы скорее этого хотите, чтобы вы получили правильное количество цифр:

strncpy(bjahr , &bday[6], 4);
strncpy(btag  , &bday[0], 2);
strncpy(bmonat, &bday[3], 2);

Кроме того, ваши буферы должны быть немного больше, чтобы вместить терминатор NULL, который требуется atoi (я выровняю затем кратные четыре, просто для лучшего соответствия тому, что будет делать распределитель стека компиляции), который вы можете добавить в себя, или получить путем предварительного обнуления буферов:

char name[20] = {0}, bday[10] = {0}, bjahr[8] = {0}, bmonat[4] = {0}, btag[4] = {0};

однако вам лучше использовать что-то вроде scanf из sscanf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...