为什么我的一个 C 字符串工作而另一个不工作?[关闭]

Why is one of my strings in C working and the other not? [closed]

提问人:Lucas Bonato Soares 提问时间:11/12/2023 最后编辑:Lucas Bonato Soares 更新时间:11/12/2023 访问量:72

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

10天前关闭。

我一直在制作一个程序,它接收开始时间、结束时间并输出差值(全部采用 HH:MM 格式)。 我的解决方案是为时间值制作字符串,然后从字符串中提取数字。所以我有 2 个字符串:char entryTime[5] 和 char exitTime[5]。

我做了一个函数来接收 2 个字符串以返回差值,这就是我的问题所在。该函数适用于 exitTime,它很好地分离提取了小时和分钟。但是 entryTime 部分总是给出错误的输出。 我开始用 printf 填充函数以输出所有涉及的变量,并将其追溯到字符串本身。出于某种原因,函数作为 entryTime[5] 的参数接收的字符串为空。exitTime[5] 字符串以相同的方式接收,作为函数上的参数,很好。 此外,出于某种原因,当使用 printf 输出 entryTime 字符串的最后 2 个字符时,它工作正常,即使字符串本身在打印时是空的。

创建字符串: 为字符串赋予值: 调用函数:char entryTime[5], exitTime[5];scanf("\n%[^\n]", entryTime);scanf("\n%[^\n]", exitTime);calculateParkingTime(entryTime, exitTime, &dH);

这是函数中无法正常工作的部分:

    //entryTime 
    printf("\n >%s", entryTime); //outputs nothing
    aux[0] = entryTime[0]; 
    aux[1] = entryTime[1];
    hAux = atoi(aux);
    printf("\n-%i\n", hAux); //outputs 0
    aux[0] = entryTime[3];
    aux[1] = entryTime[4];
    mAux = atoi(aux);
    printf("\n-%i\n", mAux); //outputs correctly
    mAux += hAux*60;
    T1 = mAux;

这是工作正常的 exitTime 部分,用于比较:

    //exitTime
    printf("\n>%s", exitTime); //outputs correctly
    aux[0] = exitTime[0];
    aux[1] = exitTime[1];
    hAux = atoi(aux);
    printf("\n-%i\n", hAux); //outputs correctly
    aux[0] = exitTime[3];
    aux[1] = exitTime[4];
    mAux = atoi(aux);
    printf("\n-%i\n", mAux); //outputs correctly
    mAux += hAux*60;
    T2 = mAux;
c 字符串

评论

3赞 Some programmer dude 11/12/2023
请尝试创建一个最小的可重复示例来向我们展示。例如,什么是以及如何初始化。什么是以及如何初始化?等等。另外,请向我们展示您拥有的输出,而不是您期望的输出。当然,也请向我们展示可能的意见。auxhoraEntrada
2赞 Fe2O3 11/12/2023
“hh:mm”为 5 个字符。...你正在使用它们,就好像它们是 C 字符串一样......没有空间容纳构成 C 字符串所需的尾随 NULL......不要吝啬!将这两个数组的尺寸放大到更大的尺寸......char entryTime[5] and char exitTime[5]
0赞 Lucas Bonato Soares 11/12/2023
哦,是因为 C 字符串末尾的“\0”没有空格吗?
0赞 Some programmer dude 11/12/2023
不相关,但请用于阅读整行。除了比 更简单易用之外,它也更安全,因为您提供了缓冲区大小,以减少缓冲区溢出的可能性。fgetsscanffgets

答:

1赞 chqrlie 11/12/2023 #1

要以该格式读取时间,目标数组必须至少有 6 个字节:5 个字节用于字符,一个额外的字节用于 null 终止符。HH:MM

同样,临时数组必须至少有 3 个字节,并且必须在 处设置一个 null 终止符。但请注意,不需要这个中间数组,因为会在第一个非数字字符处停止转换。另请注意,您可以使用 .auxaux[2]atoi()sscanf()"%d:%d"

一个似乎起作用而另一个不起作用的原因是您的行为未定义,这意味着程序可能以不可预测的方式显示或不起作用。

这是修改后的版本:

#include <stdio.h>

int main() {
    char entryTime[10];
    char exitTime[10];
    int hAux, mAux, T1, T2;

    printf("Enter entry and exit times (HH:MM): ");
    if (scanf("%9s %9s", entryTime, exitTime) != 2) {
        fprintf(stderr, "invalid input\n");
        return 1;
    }

    if (sscanf(entryTime, "%d:%d", &hAux, &mAux) != 2) {
        fprintf(stderr, "invalid format: %s\n", entryTime);
        return 1;
    }
    T1 = hAux * 60 + mAux;

    if (sscanf(exitTime, "%d:%d", &hAux, &mAux) != 2) {
        fprintf(stderr, "invalid format: %s\n", exitTime);
        return 1;
    }
    T2 = hAux * 60 + mAux;

    printf("elapsed time: %d minutes\n", T2 - T1);
    return 0;
}