2011-08-17 44 views
0

這個工具應該,如果它準備好了,找出一個人的年齡。它獲取systemdate並詢問用戶生日。然後通過將重要字符複製到新字符串中,將輸入的字符串拆分爲「年」(bjahr),「月」(bmonat)和「日」(btag)。之後它通過atoi將它們轉換爲int值。複製的字符串通過atoi轉換提供0

檢查是否一切正常,我讓它打印。但是那個問題開始了。今年工作正常,但「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"); 

} 

我是德國人,這就是爲什麼有些詞可能不是英語希望它沒關係。

回答

1

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}; 
但是

,你」 d使用類似的東西做得更好of sscanf

2

您的變量太短:例如,您期望該月有兩個字符,但您還需要考慮終止該字符串的\0。此外,你只是每天和每月複製一個字符,而不是null終止它。因此,它應該是:

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);