C语言 可运行出窗口,但提取不出来信息,求看看那里出问题了

include <stdio.h>

include <conio.h>

include <string.h>

include <stdlib.h>

#include <malloc.h> /将数字转换成整数/ int ChangeStrToInt (char str[]){ int result = 0;
/* 下面代码中把数组名当作指针变量来使用 */
for(; * str!= '\0'; str++)
{
/*将字符表示的数字转换成对应的整数数字并拼接成对应的整数 */ result = result * 10 + ( str - 48); }
return result; } /
从字符串中取出对应的子串 / / 如:字符串"ABCD",取出第二个字符开始到第4个字符结束,得到字符串"BCD" / char * GetSubString(char * str, int begin, int end)
{
char * result;
int i;
/
为局部变量申请内存 */
result = (char )malloc(100); / 用空字符填充字符串 /
for(i = 0; i<100;i++) result[i] = 0;
/
取子串 */
for(i = begin - 1;i<= end - 1;i++) result[i - begin + 1] = str[i]; return result;
}
void GetIDCodeInfo(char * idCode,int currentYear,int * year, int * month, int * day, int * age, int * gender)
{ /*GetSubString(idCode,7,10)是函数调用语句 */
/*把一个函数调用的结果作为另外一个函数调用语句的实际参数 */
/*称为函数的嵌套使用 */

  • year = ChangeStrToInt(GetSubString(idCode,7,10));
  • month = ChangeStrToInt(GetSubString(idCode,11,12));
  • day = ChangeStrToInt(GetSubString(idCode,13,14));
  • age = currentYear -* year; if(ChangeStrToInt(GetSubString(idCode,15,17)) % 2 == 0)
    {
  • gender = 0;
    }
    else
    {
  • gender = 1;
    }
    }
    main()
    {
    char idCode[30] =""; int year,month,day,age,currentYear = 2021,gender;
    year = month = day = age = gender = 0;
    printf("输入18位的身份证号码[如:429004197507022369]:") ; gets(idCode); GetIDCodeInfo(idCode,currentYear,&year,&month,&day,&age,&gender); printf("\n输入身份证号码为:%s\n 当前年份为:%d\n\t 出生日期为:[%4d/2d:%2d]\n\t 年龄:%d\n\t 性别:%s", idCode,currentYear,year,month,day,age,gender == 0? "女":"男"); getch(); }

6301看好西宁滴呗。

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

/*将数字转换成整数*/
int ChangeStrToInt(char *str)
{
    int result = 0;

    /* 下面代码中把数组名当作指针变量来使用 */
    //for (; *str != '\0'; str++)
    while(*str)
    {
        /*将字符表示的数字转换成对应的整数数字并拼接成对应的整数 */
        result +=  *str - '0';
        result *= 10;
        *str++;
    }

    return result/10;
} // 从字符串中取出对应的子串
// 如:字符串"ABCD",取出第二个字符开始到第4个字符结束,得到字符串"BCD"
char *GetSubString(char *str, int begin, int end)
{
    char *result;
    int i,j;
    /* 为局部变量申请内存 */
    //result = (char)malloc(100); /* 用空字符填充字符串 */
    result = (char *)calloc(100, sizeof(char)); //分配内存并用0填充
    // for (i = 0; i < 100; i++)
    // {
    //     result[i] = 0;
    // }

    /* 取子串 */
    //还得检测是否到字符串结尾了
    for (i = begin - 1,j=0; i <= end - 1 && str[i] != '\0'; i++,j++) //for (i = begin - 1; i <= end - 1; i++)
    {
        //result[i - begin + 1] = str[i];
        result[j] = str[i];
    }
    result[j] = '\0';
    return result;
}
void GetIDCodeInfo(char *idCode, int currentYear, int *year, int *month, int *day, int *age, int *gender)
{
    /*GetSubString(idCode,7,10)是函数调用语句 */
    /*把一个函数调用的结果作为另外一个函数调用语句的实际参数 */
    /*称为函数的嵌套使用 */

    //日期,年龄,性别都是指针,需要*
    *year = ChangeStrToInt(GetSubString(idCode, 7, 10));
    *month = ChangeStrToInt(GetSubString(idCode, 11, 12));
    *day = ChangeStrToInt(GetSubString(idCode, 13, 14));
    *age = currentYear - *year;

    if (ChangeStrToInt(GetSubString(idCode, 15, 17)) % 2 == 0)
    {
        *gender = 0;
    }
    else
    {
        *gender = 1;
    }
}
int main()
{
    char idCode[30] = "";
    int year, month, day, age, currentYear = 2021, gender;
    year = month = day = age = gender = 0;

    printf("输入18位的身份证号码[如:429004197507022369]:");
    gets(idCode);    
    GetIDCodeInfo(idCode, currentYear, &year, &month, &day, &age, &gender);
    //printf("\n输入身份证号码为:%s\n 当前年份为:%d\n\t 出生日期为:[%4d/2d:%2d]\n\t 年龄:%d\n\t 性别:%s", idCode,currentYear,year,month,day,age,gender == 0? "女":"男"); 
    printf("\n输入身份证号码为:%s\n当前年份为:%d\n出生日期为:[%4d-%2d-%2d]\n年龄:%d\n性别:%s\n", idCode, currentYear, year, month, day, age, gender == 0 ? "女" : "男");

    getchar();
    return 0;
}

img

main函数中的printf()中漏了一个% 代码修改如下:

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h> 
/*将数字转换成整数*/ 
int ChangeStrToInt (char str[])
{ 
    int result = 0;
    /* 下面代码中把数组名当作指针变量来使用 */
    for(; * str!= '\0'; str++)
    {
        /*将字符表示的数字转换成对应的整数数字并拼接成对应的整数 */ 
        result = result * 10 + ( *str - 48); //修改
    }
    return result; 
} 
/*从字符串中取出对应的子串 */ 
/* 如:字符串"ABCD",取出第二个字符开始到第4个字符结束,得到字符串"BCD" */ 
char * GetSubString(char * str, int begin, int end)
{
    char * result;
    int i;
    /* 为局部变量申请内存 */
    result = (char* )malloc(end -begin + 2); /* 用空字符填充字符串 */
    for(i = 0; i<end -begin + 2;i++) result[i] = 0;
    /* 取子串 */
    for(i = begin - 1;i<= end - 1;i++) 
        result[i - begin + 1] = str[i]; 
    return result;
}
void GetIDCodeInfo(char * idCode,int currentYear,int * year, int * month, int * day, int * age, int * gender)
{ /*GetSubString(idCode,7,10)是函数调用语句 */
    /*把一个函数调用的结果作为另外一个函数调用语句的实际参数 */
    /*称为函数的嵌套使用 */

    *year = ChangeStrToInt(GetSubString(idCode,7,10));
    *month = ChangeStrToInt(GetSubString(idCode,11,12));
    *day = ChangeStrToInt(GetSubString(idCode,13,14));
    *age = currentYear - *year; 
    if(ChangeStrToInt(GetSubString(idCode,15,17))%2 == 0)
    {
        *gender = 0;
    }
    else
    {
        *gender = 1;
    }
}
int main()
{
    char idCode[30] ={0}; 
    int year,month,day,age,currentYear = 2021,gender;
    year = month = day = age = gender = 0;
    printf("输入18位的身份证号码[如:429004197507022369]:") ; 
    gets(idCode); 
    GetIDCodeInfo(idCode,currentYear,&year,&month,&day,&age,&gender); 
    printf("\n输入身份证号码为:%s\n 当前年份为:%d\n\t 出生日期为:[%4d/%2d:%2d]\n\t 年龄:%d\n\t 性别:%s", idCode,currentYear,year,month,day,age,gender == 0? "女":"男"); 
    getch(); 
    return 0;
}

#include "stdafx.h" #include "CStr.h"

CStr::CStr() { } CStr::~CStr() {

}

//字符串中有多少个指定字符串 //str是字符串,tmp是指定字符串 int CStr::StrTmpNum(string str, string tmp) { int num = str.length(); int tmpnum = 0;//记录有多少个* while (1) { int a = str.find(tmp); if (a == -1) { break; } str = str.substr(a + 1, num); //cout << str << endl; tmpnum++; //system("pause"); } if (tmpnum == 0) { return -1; } else { return tmpnum; }

}

//拆分字符串中以*分割 一行两列 //str是字符串,tmp是分割字符 Split CStr::Arrstr(string str, string tmp) { Split cf; int strcount = str.length();

int charcount = StrTmpNum(str, tmp);//字符串中有多少个指定字符串
if (charcount == -1)
{
    string z = "-1";
    string *err = &z;
    cf.a = err;
    cf.b = err;
    return cf;
    
}

int tmpcount = tmp.length();
string *arr = new string[(charcount + 1) / 2];
string *brr = new string[(charcount + 1) / 2];
for (int i = 0; i < (charcount + 1) / 2; i++)
{
    if (!str.empty())//判断字符串后面是否为空
    {
        int index = str.find(tmp);//指定字符串的位置
        arr[i] = str.substr(0, index);//截取分界符前面的字符串
        str = str.substr(index + tmpcount, strcount);//刷新字符串
    }
    if (!str.empty())//判断字符串后面是否为空
    {
        int index1 = str.find(tmp);//指定字符串的位置
        brr[i] = str.substr(0, index1);//截取分界符前面的字符串
        str = str.substr(index1 + tmpcount, strcount);//刷新字符串
    }
}

cf.a = arr;
cf.b = brr;
return cf;

}

//拆分字符串中以*分割 一行一列 //str是字符串,tmp是分割字符串 Split CStr::Substr(string str, string tmp) { int num = str.length(); int strcount = StrTmpNum(str, tmp);//字符串中有多少个指定字符串 string *arr = new string[strcount]; for (int i = 0; i < strcount; i++) { int index = str.find(tmp); arr[i] = str.substr(0, index); str = str.substr(index + 1, num); }

Split cf;
cf.a = arr;
return cf;

}

//查找字符串中的指定字符串并删除 //str是字符串,tmp是要删除的字符串 string CStr::Delstr(string str, string tmp) {

int tmpnum = tmp.length();//删除字符串的长度
while (1)
{
    int strnum = str.find(tmp);//删除字符串的位置

    if (strnum == -1)
    {
        break;
    }
    else
    {

        str = str.erase(strnum, tmpnum);//删除指定字符串

    }
}
return str;

}

//指定字符串后面插入字符串 //str是字符串,tmp是指定字符串,text是插入内容 string CStr::Insertstr(string str, string tmp, string text) { string s;

int strcount = str.length();
int tmpcount = StrTmpNum(str, tmp);//字符串中有多少个指定字符串
if (tmpcount == -1)
{    
    s = str;    
}
else
{
    for (int i = 0; i < tmpcount; i++)
    {
        int tmpnum = str.find(tmp) + tmp.length();//指定字符串的后面
        str = str.insert(tmpnum, text);//指定字符串的后面插入text内容
        s = s + str.substr(0, tmpnum + 1);//截取字符串中插入内容前面的字符串
        str = str.substr(tmpnum + 1, str.length());//刷新str字符串
    }
}

return s;

} c++写的看看对你有用吗