尝试从C中的字符串中删除连字符

尝试从C中的字符串中删除连字符,c,C,我正在解决一个问题,其中我有一个日期(YYYY-MM-DD)作为用户输入,我需要找出日期(星期日、星期一……)。我已经试着删除连字符,以便继续执行泽勒的规则。为了实现这一点,我使用了一个循环。然而,它似乎不起作用。 这是我的代码: #include<stdio.h> int main(){ char date[11], datenum[9]; int date_num; printf("Enter the date in yyyy-mm-dd fo

我正在解决一个问题,其中我有一个日期(YYYY-MM-DD)作为用户输入,我需要找出日期(星期日、星期一……)。我已经试着删除连字符,以便继续执行泽勒的规则。为了实现这一点,我使用了一个循环。然而,它似乎不起作用。 这是我的代码:

#include<stdio.h>
int main(){
    char date[11], datenum[9]; 
    int date_num;
    printf("Enter the date in yyyy-mm-dd format\n");
    scanf("%s", &date);
    int j = 0;
    for (int i=0; i<10; i++){
        if (date[i]!='-' && j<8){
            datenum[j] = date[i];

            j++;
        }
    } 
    printf("%s\n", datenum);
    return 0;
}
#包括
int main(){
字符日期[11],日期编号[9];
int date_num;
printf(“以yyyy-mm-dd格式输入日期\n”);
scanf(“%s”和日期);
int j=0;

对于(int i=0;i您的工作太辛苦了。与其将数据复制到一个缓冲区中然后四处移动,不如将数据写入正确的位置。例如:

#include<stdio.h>
int
main(void)
{
        char datenum[9];

        printf("Enter the date in yyyy-mm-dd format\n");
        if( 3 != scanf("%4s-%2s-%2s", datenum, datenum + 4, datenum + 6) ){
                fprintf(stderr, "Invalid input\n");
                return 1;
        }
        printf("%s\n", datenum);
        return 0;
}
#包括
int
主(空)
{
char-datenum[9];
printf(“以yyyy-mm-dd格式输入日期\n”);
如果(3!=scanf(“%4s-%2s-%2s”,datenum,datenum+4,datenum+6)){
fprintf(stderr,“无效输入”);
返回1;
}
printf(“%s\n”,datenum);
返回0;
}

代码中有很多问题需要解决,但实际上解决了您的问题,即控制台上打印的内容不是您所期望的

您希望打印
20210609
。但您得到的是
2021060920210609█2021-06-09

printf("%c", datenum[j]);
在循环中打印来自
datenum
的字符

然后,有一个
printf(“%s\n”,datenum);
它将附加
datenum
所包含的字符串。去掉循环后的
printf()
,注意
printf()循环中的
正在执行预期的操作。但是,请注意,
datenum
的内容与循环中打印的内容不同。因此,您仍然需要解决一些问题

请考虑以下事实:
printf(“%s\n”,datenum);
能够打印出比
datenum
所能容纳的更多的内容。一定是出了什么问题。对于字符串,它通常是缺少的
“\0”

提示:在填充
datenum
后,是否忘记添加
'\0'

要完全解决此问题,在不优化设计的情况下,请删除循环中的
printf()
,并添加
datenum[8]='\0';
,然后调用
print()
,使用
%s
将其打印为字符串


试试看:

date
不够大,您没有为空终止符留出空间。您也没有为
datenum
中的空终止符留出空间,并且没有在末尾添加一个。您是否完全忘记了C中的字符串以
\0
字符结尾?您可以使用
strtok()
将输入拆分为
-
个字符,而不是您自己的循环。抱歉,我将编辑它。但是,问题似乎不是这样。谢谢您的回答。我肯定会遵循此答案。但是,您能看到我的代码是如何出错的吗?正如几条注释中提到的,您未能终止字符串。
printf打印初始值
20210609
,循环外的
printf
再次打印该数据,然后是
datenum
之后内存中的任意随机垃圾(此行为未定义,但基于输出,这似乎就是发生的情况)。您的平台似乎已将
date
放在
datenum
之后的内存中,因此您会看到几个字节的随机垃圾,后面跟着
date
。关于内部printf语句,我只是尝试调试,但在发布到此处之前忘记删除它。我担心的是2021-06-09超出了此范围。谢谢您的帮助向我解释。谢谢你帮我把它分解。我用内部循环检查哪里出了问题,但在发布之前忘了删除。我现在已经编辑了。谢谢!