2013-01-21 1 views
0

Я хочу написать программу c для разбиения строки «23 * 34» на основе оператора и сохранить числа как отдельную строку в массиве строк. Я следующий код.Чтобы сохранить символ по символу в массиве String

struct exp_details 
{ 
     char operator[10]; 
     char *number[10]; 
}ed; 

int split(int m,int n,char *str) /*m for operator index, n for str index */ 
{ 
     int i,j=0; 
     for(i=n;(str[i] != ed.operator[m]) && (str[i] != '\0');i++,j++) 
     { 
       ed.number[m][j] = str[n]; 
     } 
     if(str[i] != '\0') 
     { 
       split(m++,i++,str); 
     } 
     else 
       return 1; 
     return 0; 
} 

, но это кодирование показывает ошибку сегментации. он работает до

ed.number[m][j] = str[n]; 

это заявление. Я думаю, что это утверждение вызывает только проблему. Я думаю, что моя логика правильная. Но я не знаю, как ее исправить. Пожалуйста помогите. Спасибо заранее.

ответ

2

Похоже, вы не инициализируете j.

+0

Это не делает разные выходные данные. – Dhasneem

+0

j кажется инициализированным: 'int i, j = 0;' –

1

Возможно, вам необходимо инициализировать j в ваш цикл: -

for(i=n, j = 0;(str[i] != ed.operator[m]) && (str[i] != '\0');i++,j++) 

Кроме того, я вижу некоторые проблемы с рекурсивным вызовом. В следующем заявлении: -

split(m++,i++,str); 

Вы передаете значение m++ для operator index. Итак, здесь вы предполагаете, что операторы в вашей строке будут отображаться в том же порядке, что и в вашем массиве char operator[10]. Это неправильно.

Для например: -

Если массив содержит оператор: - {'*', '+', '/', '-'}. И ваша строка: - 23*45-30+29, затем, когда вы разделите строку на первого оператора - *, то при следующем вызове вы передаете + в качестве оператора, так как он занимает второе место в вашем operator array. Теперь, в следующем прогоне, ваш цикл будет повторяться до тех пор, пока он не найдет + в вашей строке, и, таким образом, он добавит - 45-30 в ваш массив numbers. Итак, есть ошибка.

Вам, вероятно, нужно проверить каждый символ в строке при итерации, независимо от того, присутствует ли он в массиве operator или нет. Кроме того, вы в конечном итоге сохранили бы operators в вашем массиве numbers.

0

приращения здесь бессмысленно

split(m++,i++,str); 

, так как м и я являюсь локальным, и вы увеличиваете их после вызова функции split().

Вы должны также проверить границы, когда вы обращаетесь массив, убедитесь, что они находятся внутри допустимого диапазона, т.е. 0..9

assert(m >= 0 && m <= 9); 
assert(j >= 0 && j <= 9); 
assert(n >= 0 && n <= 9); 

ed.number[m][j] = str[n] 

еще лучше настройки постоянной для ваших массивов

#define MAXSIZE 10 

struct exp_details 
{ 
     char operator[MAXSIZE]; 
     char *number[MAXSIZE]; 
} ed; 

... 
assert(m >= 0 && m < MAXSIZE); 
assert(j >= 0 && j < MAXSIZE); 
assert(n >= 0 && n < MAXSIZE); 
Смежные вопросы