2016-12-03 6 views
-1

(Предупреждение) Да, это часть задания, над которым я работаю, но я совершенно отчаянна в этом вопросе, и нет, я не ищу, чтобы вы, ребята, решили это для меня, но любой намек был бы очень оценен!/Предупреждение)Почему strlen вызывает ошибку сегментации в C?

Я в значительной степени пытаюсь создать интерактивное меню, пользователь должен ввести выражение (например, «5 3 +»), и программа должна обнаружить, что это в постфиксной нотации, к сожалению, я был получение ошибок ошибок сегментации, и я подозреваю, что они имеют какое-то отношение к использованию функции strlen.

EDIT: Я был в состоянии сделать его работу, сначала char expression[25] = {NULL}; линия
становится char expression[25] = {'\0'};

И при вызове функции determine_notation я удалил [25] из массива я передаю так: determine_notation(expression, expr_length);

Также input[length] часть I изменена на input[length-2], так как упоминалось в предыдущем комментарии, input[length] == '\0' и input[length--] == '\n' ,

Всего благодарностей за помощь!

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

int determine_notation(char input[25], int length); 

int main(void) 
{ 
    char expression[25] = {NULL}; // Initializing character array to NULL 
    int notation; 
    int expr_length; 

    printf("Please enter your expression to detect and convert it's notation: "); 
    fgets(expression, 25, stdin); 

    expr_length = strlen(expression[25]); // Determining size of array input until the NULL terminator 
    notation = determine_notation(expression[25], expr_length); 
    printf("%d\n", notation); 
} 

int determine_notation(char input[25], int length) // Determines notation 
{ 

    if(isdigit(input[0]) == 0) 
    { 
     printf("This is a prefix expression\n"); 
     return 0; 
    } 
    else if(isdigit(input[length]) == 0) 
    { 
     printf("This is a postfix expression\n"); 
     return 1; 
    } 
    else 
    { 
     printf("This is an infix expression\n"); 
     return 2; 
    } 
} 
+2

'вход [длина]' 'это '\ 0'' (и:' 'входной [длина-1 ] 'is' '\ n'' И: 'expression [25];' индексы за пределами размера объекта) – wildplasser

+1

strlen получает строку (указатель-на-первый символ), а не символ. –

+1

'выражение char [25] = {NULL};' не имеет значения. замените на '{'\ 0'}' или '" "' – Stargateur

ответ

4

вероятно Вы получили предупреждение, объясняя, что вы преобразуете char к указателю на этот призыв:

expr_length = strlen(expression[25]); 
//        ^^^^ 

Это проблема - ваш код ссылки на несуществующий элемент прошлое конец массива (неопределенное поведение) и пытается передать его strlen.

Поскольку strlen принимает указатель на начало строки, вызов должен быть

expr_length = strlen(expression); // Determining size of array input until the NULL terminator 
+0

Я вижу, это решило часть моей проблемы. По крайней мере, теперь он фактически вводит функцию. Благодаря тонну! – Stoon