使用C语言将日期格式从dd/mm/yyyy转换为yyyy/mm/dd

使用C语言将日期格式从dd/mm/yyyy转换为yyyy/mm/dd,c,date,segmentation-fault,C,Date,Segmentation Fault,内部while循环通过有限的i=n值无限执行。 它编译但显示分段错误 我的代码 char s[]="22/02/1997",r[20],temp[20]; int i,j,k,z,n; for(n=strlen(s)-1; n>=0; n=i) { i=n; k=0; while(s[i]!='/' || s[i]!='-') { temp[k++]=s[i]; i--; } i--; for(z=st

内部while循环通过有限的
i=n
值无限执行。
它编译但显示分段错误

我的代码

char s[]="22/02/1997",r[20],temp[20];
int i,j,k,z,n;
for(n=strlen(s)-1; n>=0; n=i)
{
    i=n;
    k=0;
    while(s[i]!='/' || s[i]!='-')
    {
        temp[k++]=s[i];
        i--;
    }
    i--;
    for(z=strlen(temp)-1,j=0; z>=0; z--,j++)
    {
        r[j]=temp[z];
    }
    temp[0]='\0';  //empty the array
}
printf("%s",r);   

代码中存在多个问题

  • j=0
    将在所有循环之外。这意味着它必须被放置在外部for循环的起始位置
  • 您没有正确处理赋值空值。在任何地方,您都没有在数组末尾指定null

  • 您期望的答案是
    yyyy/mm/dd
    。但是您没有将
    /
    -
    分配给输出

  • 在while循环中,您还需要添加一个条件,即检查i的值是否大于或等于0。如果不存在此条件,则它将尝试访问数组中的第-1个位置,而不会分配该位置。所以,只有你得到了分割错误

  • 我终于改正了这些错误。试试下面的代码,它会像你期望的那样工作良好

    #include<stdio.h>
    #include<string.h>
    int main()
    {
        char s[]="12/02/1997",r[50],temp[50];
        int i,j,k,z,n;
        j = 0;
        for(n=strlen(s)-1; n>=0; n=i)
        {
            i=n;
            k=0;
            while(s[i]!='/' && s[i]!='-' && i >= 0)
            {
                temp[k++]=s[i];
                i--;
            }
            i--;
            temp[k] = '\0';
            for(z=strlen(temp)-1; z>=0; z--,j++)
            {
                r[j]=temp[z];
            }
            if(i >= 1) // If the i is greater than 1, then only it have a slash or hypen
            {
                r[j++] = s[i + 1]; //Assigning the / or - to the output.
            }
            temp[0]='\0';  //empty the array
        }
        r[j] = '\0';
        printf("%s\n",r); 
    }
    
    #包括
    #包括
    int main()
    {
    字符s[]=“12/02/1997”,r[50],临时[50];
    int i,j,k,z,n;
    j=0;
    对于(n=strlen(s)-1;n>=0;n=i)
    {
    i=n;
    k=0;
    而(s[i]!='/'和&s[i]!='-'&&i>=0)
    {
    温度[k++]=s[i];
    我--;
    }
    我--;
    温度[k]='\0';
    对于(z=strlen(temp)-1;z>=0;z--,j++)
    {
    r[j]=温度[z];
    }
    if(i>=1)//如果i大于1,则只有它有斜杠或hypen
    {
    r[j++]=s[i+1];//将/或-赋值给输出。
    }
    temp[0]='\0';//清空数组
    }
    r[j]='\0';
    printf(“%s\n”,r);
    }
    
    内部while循环无限执行

    这是因为您使用OR(也称为
    |
    )而不是AND(也称为
    &&
    )。那么你的情况如何

    (s[i] != '/' || s[i] != '-')
    
    永远都是真的。它至少应该是(参见后面的代码):

    。。。。但显示分割错误

    这是无限循环的结果。由于循环不断递增/递减
    k
    i
    ,最终将使用数组边界之外的索引,从而导致崩溃

    此外,您应该检查
    i
    是否变为
    -1
    ,为了完整性,检查
    k
    是否变大

    在使用strlen(temp)

    比如:

    while(i>=0 && k<19 &&s[i]!='/' && s[i]!='-')
    {
        temp[k++]=s[i];
        i--;
    }
    temp[k] = '\0';  // Terminate temp
    

    while(i>=0&&k遵循此
    s[i]!='/'|s[i]!='-'
    !(s[i]='/'&&s[i]='-')
    相同,只有在
    s[i]的情况下,
    while
    -循环才会求值为false
    同时等于
    '/'
    '-'
    ,这种情况永远不会发生。在
    中,当到达当天的nb时,
    循环中,没有控制来停止它,因为后面没有斜杠。最好将
    i>=0
    j=0
    添加到
    循环的第一个
    之外。因为你要重用de>temp
    数组您不能通过仅将第一个字符更改为空字符来清空它。下面的答案是否解决了您的查询?我只是在检查它。请稍等几分钟。我将更新我的答案。+2次投票,而while控制表达式仍然不正确请尝试使用
    I=1
    执行它(Seg.Fault)如果我设置I=1,它会给出堆栈粉碎错误。因此需要在该变量上添加控件:
    I>=0
    @Meninx-メネンックス : 我错过了一个条件检查,而我犯了错误。那就是我必须用0检查条件。现在看我的答案。我被更新了。变量
    k
    上的控件在这种情况下是无用的。@Meninx-メネンックス - 对于固定输入,是的,但是一旦代码与一些动态输入一起使用,最好是安全的,并防止溢出。
    while(i>=0 && k<19 &&s[i]!='/' && s[i]!='-')
    {
        temp[k++]=s[i];
        i--;
    }
    temp[k] = '\0';  // Terminate temp