C 为什么我的程序会出现分段错误?

C 为什么我的程序会出现分段错误?,c,C,我必须编写一个程序,将日期和todo-s作为命令行参数读取,并将其放入文本文件(逐行)中 正确输入: ./todo 13:58 todo1 00:00 todo2 08:30 todo3 ./todo 13:58 todo1 24:00 todo2 08:30 todo3 or ./todo 13:58 todo1 todo2 00:00 08:30 todo3 输入错误: ./todo 13:58 todo1 00:00 todo2 08:30 todo3 ./todo 13:58 to

我必须编写一个程序,将日期和todo-s作为命令行参数读取,并将其放入文本文件(逐行)中

正确输入:

./todo 13:58 todo1 00:00 todo2 08:30 todo3
./todo 13:58 todo1 24:00 todo2 08:30 todo3 or ./todo 13:58 todo1 todo2 00:00 08:30 todo3
输入错误:

./todo 13:58 todo1 00:00 todo2 08:30 todo3
./todo 13:58 todo1 24:00 todo2 08:30 todo3 or ./todo 13:58 todo1 todo2 00:00 08:30 todo3
更正todolist.txt文件:

13:58 - todo1
00:00 - todo2
08:30 - todo3
代码已成功编译,但当我运行程序时,出现分段错误:

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

bool isValidTime(char* argv)
{
    char hour[2] = {0};
    char minute[2] = {0};

    for (unsigned int i = 0; argv[i] != ':'; i++) {
        hour[i] = argv[i];
    }
    int hourNum = atoi(hour);
    if (!(hourNum >= 0 && hourNum < 24)) {
        return false;
    }

    for (unsigned int i = 3; i < sizeof(*argv) / sizeof(argv[0]); i++) {
        minute[i] = argv[i];
    }
    int minuteNum = atoi(minute);
    if (!(minuteNum >= 0 && minuteNum < 60)) {
        return false;
    }

    return true;
}

bool isValidTodo(char* argv)
{
    for (unsigned int i = 0; i < sizeof(*argv) / sizeof(argv[0]); i++) {
        if (!(argv[i] >= 'a' && argv[i] <= 'z')) {
            return false;
        }
    }
    return true;
}

int main(int argc, char* argv[])
{
    if (argc < 3) {
        printf("Incorrect input!\n");
        return 1;
    }
    
    FILE* file;
    file = fopen("todolist.txt", "w");
    if (file == NULL) {
        printf("File failed to open.\n");
        return 1;
    }

    for (int i = 1; i < argc; i++) {
        if (!(isValidTime(argv[2 * i - 1]) && isValidTodo(argv[2 * i]))) {
            printf("Incorrect input!\n");
        }
        fprintf(file, "%s - %s\n", argv[2 * i - 1], argv[2 * i]);
    }

    fclose(file);

    return 0;
}
#包括
#包括
#包括
bool isValidTime(字符*argv)
{
字符小时[2]={0};
字符分钟[2]={0};
for(无符号整数i=0;argv[i]!=':';i++){
小时[i]=argv[i];
}
小时内=原子(小时);
如果(!(hourNum>=0&&hourNum<24)){
返回false;
}
对于(无符号整数i=3;i=0和分钟数<60)){
返回false;
}
返回true;
}
bool isValidTodo(字符*argv)
{
对于(无符号整数i=0;i如果(!(argv[i]>='a'&&argv[i]很可能是因为以下代码:

for (int i = 1; i < argc; i++) {
    if (!(isValidTime(argv[2 * i - 1]) && isValidTodo(argv[2 * i]))) {
        printf("Incorrect input!\n");
    }
    fprintf(file, "%s - %s\n", argv[2 * i - 1], argv[2 * i]);
}
for (unsigned int i = 0; argv[i] != ':'; i++) {
    hour[i] = argv[i];
}

在参数中没有<代码>:<代码>时,您将无限期循环,并且将得到另一个分段错误,因为Time[i] < /C>和Agv[i] /Cyto>

请只标记您正在使用的语言。编译此代码既可以是C,也可以是C++,但不太可能需要用两种语言编译。[2*i-1]
可能会超过argv[]的结尾;argv[]仅为[0..argc]定义。此外,在isValidTodo中,sizeof*argv/sizeof(argv[0])始终为1。字符串的长度由strlen()发现。