Ошибка сегментации в C аргументов командной строки при попытке добавить в массив - PullRequest
0 голосов
/ 05 августа 2020

Я новичок в C, и эта программа должна выводить usage: ./substitution key, когда пользователь вводит ключ, который не является буквенным c. В случае, если длина ключа меньше 27 букв, должно выводиться сообщение о том, что длина ключа должна быть 26 букв. Первое сообщение об ошибке генерируется, если пользователь не вводит никаких данных. Отсутствие ввода работает и выводится действительное сообщение об ошибке. Однако, если я попытаюсь ввести другие данные, то есть добавить символы в массив, это покажет ошибку сегментации. Не могли бы вы мне помочь?

#include<stdio.h>
#include<cs50.h>
#include<string.h>
#include<ctype.h>

int main(int argc, char*argv[argc])
{
    int counter = 0;
    if (argc==1)
    {
        printf("Usage: ./substitution key\n");
    }
    for (int i = 1;i <= argc; i++)
    {
        if (isalpha(argv[i]) != 0)
            continue;
        else
            counter++;
    }
    if (counter>1)
        printf("Usage: ./substitution key\n");
    else if (argc!=27 && argc!=1)
        printf("key must contain 26 characters.\n");
}

1 Ответ

1 голос
/ 05 августа 2020

Вы выходите за границы массива. Измените это:

for (int i = 1 ;i <= argc; i++)

на это

for (int i = 1 ;i < argc; i++)

И вы неправильно используете argv - это массив строк с завершающим нулем. Размер массива arg c, длину каждой строки можно получить с помощью функции strlen. Например, проверьте следующий код.

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

int main(int argc, char *argv[])
{
    if (argc == 1) {
        printf("Usage: ./substitution key\n");
    }

    const char *key = argv[1]; // for convenience
    int counter = 0;
    // count alphas
    while (isalpha(key[counter])) { ++counter; }
    // count length
    int len = strlen(key);

    // check if key consists of alphas
    if (counter != len) {
        printf("Usage: ./substitution key\n");
    }
    // check length
    if (counter != 26) {
        printf("key must contain 26 characters.\n");
    }
}
...