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」と入力すると、2番目の入力を入力するように求められますが、「12:34」と入力すると、バックスペースを使用して「34」を削除し、もう一度「34」と入力すると、 2番目のprintfですが、2番目の入力を入力できず、プログラムが終了します。

個人的なコメント:

gets()文字を数えないので、関数を使って文字列を入力する方が良いことに気づきました\n

4

1 に答える 1

3

を使用するときは注意してくださいfgets。呼び出しでは、改行またはEOFに到達する前に、最大6文字を読み込む必要があります。fgets改行文字が有効な文字であると見なし、そのような文字が見つかった場合はそれも格納します。さて、あなたの場合、最後の文字はCスタイルの文字列のようにNULLではなく、\n。CスタイルのNULLで終了する文字列を期待するNULLパスに渡す前に、これをaに置き換える必要があります。strtolそれで:

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 に答える