Тема: Помилка DEADLYSIGNAL при спробі ввести аргумент командного рядка

Маю за мету написати програму, яка дозволить мені зашифрувати повідомлення шифром Цезаря.
Поки що це фрагмент коду, який має працювати з аргументами командного рядка. Якщо це одне натуральне число (на даному етапі просто ціле число), то має виводитися повідомлення про успіх + це число. В іншому випадку - таке повідомлення: "Usage: ./caesar key".
Цей фрагмент компілюється, але при введенні аргументу командного рядка видає таку помилку:

UndeftnedBehavtorSanttizer : DEADLYSIGNAL
==1552==ERROR: UndefinedBehavtorSanttizer: SEGV on unknown address 0x7f11fa44c8e8 (pc e0x000000422
517 bp 0x7ffeda396280 sp 0x7ffeda3961c0 T1552)
==1552==The stgnal is caused by a READ nenory access.
        #0 0x422516 (/root/sandbox/caesar+0x422516)
        #1 0x7f1245bażb96 (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)
        #2 0x402b29 (/root/sandbox/caesar+0x402b29)

UndeftnedBehavtorSanttizer can not provide addittonal info.
==1552==ABORTING

Ось і сам фрагмент коду:

#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, string argv[])
{
    if (argc == 2 && isdigit(argv[1]))
    {
        int m = atoi(argv[1]);
        printf("Success, %i\n", m);
        return 0;
    }
    else
    {
        printf("Usage: ./caesar key\n");
        return 1;
    }
}

Дякую.

2

Re: Помилка DEADLYSIGNAL при спробі ввести аргумент командного рядка

Завжди на лінуксі мав якісь помилки. Встановіть краще wine і запустіть там FalconCpp (програма для windows):
http://falconcpp.sourceforge.net/
Спробуйте ще прибрати string

int main(int argc, char argv[])
Подякували: Катерина421

3

Re: Помилка DEADLYSIGNAL при спробі ввести аргумент командного рядка

string з cs50 - це char *.
argv - це вказівник на string, тобто char **
argv[1] - це string
isdigit приймає параметром символ, не стрічку. У вас вказівник argv[1] перетворюється на число (тобто адресу в пам'яті), а потім заганяється в isdigit. Цілком можливо, що падіння відбувається тут, це абсурдна дія. Робіть

 isdigit(argv[1][0])
Подякували: Chemist-i, mrofon, Катерина423

4

Re: Помилка DEADLYSIGNAL при спробі ввести аргумент командного рядка

Після зміни фрагменту на такий

if(argc == 2)
{
    for(int i = 0; int n = strlen(argv[1]); argv[1][i] < n; i++)
    {
        if(isdigit(argv[1][i])
        {
            int m = atoi(argv[1][i]);
            printf("%i", m);
            return 0;
        }
    } 
}

маю помилку у рядку

for(int i = 0; int n = strlen(argv[1]); argv[1][i] < n; i++)

(незадекларовані ідентифікатори i та n).
Можете сказати в чому саме проблема?
Дякую.

5

Re: Помилка DEADLYSIGNAL при спробі ввести аргумент командного рядка

У for має бути 3 вирази (ініціалізація, умова і перехід), а у вас - чотири (дві ініціалізації). Об'єднайте ініціалізації чи винесіть котрусь з них з for.
Ну і що ви хочете досягти порівнянням коду i-го символу стрічки argv[1] із довжиною цієї стрічки - я взагалі не розумію. Так само як і використанням коду цього символу як адреси стрічки для перетворення на число. Можете словами записати, що ви тут намагаєтеся зробити?

Подякували: leofun011

6

Re: Помилка DEADLYSIGNAL при спробі ввести аргумент командного рядка

Поки номер (і) символу в аргументі менший за його довжину, робити:
    Якщо і-ий символ у аргументі - число, робити:
        Вивести символ у вигляді числа