1

这是我的生成分段错误的小 C 片段:

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

int checkTiime(char time[]);

int main(int argc, char** argv) {

    char time1[6];
    char time2[6];

    printf("Tempo 1 [hh:mm]: ");
    fgets(time1, sizeof time1, stdin);
    printf("Tempo 2 [hh:mm]: ");
    fgets(time2, sizeof time2, stdin);

    printf("Checktime: %d", checkTime(time1));

    return (EXIT_SUCCESS);
}

int checkTime(char time[]){

    long hours = 0;
    long minutes = 0;

    if(time[2] == ':') {

        if(isdigit(time[3]) && isdigit(time[4]) && isdigit(time[0]) && isdigit(time[1])) {
            hours = strtol(time[0], NULL, 10) + strtol(time[1], NULL, 10);
            minutes = strtol(time[3], NULL, 10) + strtol(time[4], NULL, 10);

            if((hours >= 0 && hours <= 23) && (minutes >= 0 && minutes <= 59)){

                return 0;

            } else {

                return 1;

            }

        } else {

            return 1;

        } 

    } else {

        return 1;

    }

}

有人能帮我吗。我真的不知道为什么给我的问题。

我还注意到,例如,当我输入“12:34”时,它要求我输入第二个输入,但是当我写“12:34”时,我使用退格键删除“34”并再次输入“34”它写道第二个 printf 但不允许我输入第二个输入并且程序退出。

个人评论:

我注意到最好使用gets()函数来输入字符串,因为它不计算\n字符。

4

1 回答 1

3

使用时要小心fgets。您的调用要求它在遇到换行符或 EOF 之前最多读取 6 个字符。fgets将换行符视为有效字符并存储它(如果遇到这样的字符)。现在,在您的情况下,最后一个字符不是 NULL ,因为它应该在 C 样式字符串中,而是\n. 您需要将其替换为 a NULL,然后才能将其传递给strtol期望 C 样式的 NULL 终止字符串。所以:

if (fgets(time1, sizeof time1, stdin) != NULL) {
    time1[ sizeof time1 - 1 ] = NULL;
}

或者,甚至更好:

if (fgets(time1, sizeof time1 - 1, stdin) != NULL) {
    // hurray we have the time!
}

或者,您可以拥有自己的换行安全fgets包装器:

char *chomp(char *buf, size_t sz, FILE *fp, size_t *outsz) {
   char *p = fgets(buf, sz - 1, fp) ; /* make sure there is room for terminating NULL */
   if (p != NULL) {
      char *nl = strchr(buf, '\n');
      if (nl) *nl = NULL; /* replace trailing newline */
      *outsz = strlen(buf); /* recompute */
   }
   return p;
}
于 2012-05-21T21:54:30.347 回答