无法弄清楚为什么strcpy没有有效复制字符串?

时间:2014-07-08 16:41:50

标签: c

我正在尝试构建一个程序,用户以此格式'01'14'2013'输入日期,并将其输出为“2013年1月14日”格式。我试图将保存用户输入的字符串复制到另一个字符串,以后将其连接到没有字符串的第一个和第二个索引的原始字符串,以便我只有'/ 14/2013',来自原始字符串,然后用''替换'/',以便它读取月,日和年....但由于某种原因,当我尝试将原始字符串从输入复制到另一个字符串(一个我计划稍后连接),它没有有效复制,我错过了什么......?

#include <stdio.h>
#include <string.h>


int main() 
{ 

char date[100]; 


   char month[100]; 
   char array[12][100] ={"January", "Febuary", "March", "April", "May", "June", "July",  "August", "September", "October", "November", "December"}; 
   char month2[100]; 

   printf(" Please enter a date "); 
   fgets( date, 100, stdin); 

 strcpy(month2, month);  

 if( date[0] == '0' && date[1] == '1')
 {
   strcpy(month, array[0]); 
 }
 else if( date[0] =='0' && date[1] == '2')
 { 
   strcpy(month, array[1]);
 }
 else if( date[0] =='0' && date[1] == '3')
 { 
   strcpy(month, array[2]);
 }   
 else if( date[0] =='0' && date[1] == '4')
 { 
   strcpy(month, array[3]);
 }
 else if( date[0] =='0' && date[1] == '5')
 { 
   strcpy(month, array[4]);
 }   
 else if( date[0] == '0' && date[1] == '6')
 {
   strcpy(month, array[5]); 
 }
 else if( date[0] =='0' && date[1] == '7')
 { 
   strcpy(month, array[6]);
 }
 else if( date[0] =='0' && date[1] == '8')
 { 
   strcpy(month, array[7]);
 }   
 else if( date[0] =='0' && date[1] == '9')
 { 
   strcpy(month, array[8]);
 }
 else if( date[0] =='1' && date[1] == '0')
 { 
   strcpy(month, array[9]);
 }   
 else if( date[0] =='1' && date[1] == '1')
 { 
   strcpy(month, array[10]);
 }
 else if( date[0] =='1' && date[1] == '2')
 { 
   strcpy(month, array[11]);
 }   









 printf("%s \n", month); 
 printf("%s \n", month2); 
 return 0; 

}

3 个答案:

答案 0 :(得分:1)

strcpy(month2, month); 

monthmonth2都未初始化为此时有用的任何内容。它们的内容是不确定的,并且使用正确终止的C字符串之外的其他内容调用strcpy会调用未定义的行为。

看起来像是一个错字。

答案 1 :(得分:0)

较少的代码,但没有一些验证。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
        char date[100];

        char month[100];
        char array[12][100] = {"January", "Febuary", "March", "April", "May", "June", "July",  "August", "September", "October", "November", "December"};

        printf(" Please enter a date ");
        fgets( date, 100, stdin);

        char month2[100];
        strcpy(month2, date);
        month2[2] = '\0';

        strcpy(month, array[atoi(month2) - 1]);

        printf("%s \n", month);
        return 0;
}

答案 2 :(得分:0)

#include <stdio.h>
#include <string.h>
#include <ctype.h>

typedef struct mon {
    const char *name;
    const int len;
} Month;

#define M(x){ x " ", sizeof(x)}

Month month[] = { {"", 0}, //dummy
    M("January"), M("Febuary"), M("March"), M("April"),
    M("May"), M("June"), M("July"), M("August"),
    M("September"), M("October"), M("November"), M("December")
}; 


int main(){
    char in_date[128];
    char out_date[128] = "";
    int m = 0, pos;
     printf(" Please enter a date E.g MM/DD/YYYY\n");
     fgets( in_date, sizeof(in_date), stdin);

    if(in_date[0] == '0'){
        if(isdigit(in_date[1]) && in_date[1] != '0'){
            m = in_date[1] - '0';
            pos = month[m].len;
            memcpy(out_date, month[m].name, pos);
        }
    } else if(in_date[0] == '1'){
        if('0' <= in_date[1] && in_date[1] <= '2'){
            m = 10 + in_date[1] - '0';
            pos = month[m].len;
            memcpy(out_date, month[m].name, pos);
        }
    }
    if(m){
        memcpy(out_date + pos, in_date + 3, 7);
        out_date[pos + 2] = ',';
        out_date[pos + 7] = '\0';
        printf("%s\n", out_date); 
    } else {
        printf("invalid month\n");
    }
    return 0; 
}