2014-12-04 4 views
0

Я хочу изменить строку с помощью указателей. Я получаю ошибку сегментации! Есть идеи по этому поводу? Детали указаны в коде. Кстати, это правильный способ реализовать этот материал?Реверсивные строки с использованием массивов и указателей

Спасибо,

Gerhard!

МОЙ КОД:

void copy_and_reverse(char* output, char* input) { 

int c = 0; 
int len = 0; 
char *begin; 
char *last; 

len = strlen(input); 
len -= 1; 

begin = input; 
last = output; 

for (c = 0; c < len; c += 1) { 
    last += 1; 
} 

len += 1; 

for (c = 0; c < len; c +=1, begin += 1, last -= 1 { 
temp = *begin; 
*last = *begin; // Here is my problem. Why am I not allowed to access this storage? I have no Idea about that! 
} 
} 

int main(int argc, char **argv) { 

int i = 0; 
int leng = 0; 
char *input[999] = {0}; // input gets the string of the argument, the string should stay in the right order 
char *output[999] = {0}; // output should get the reversed string 



if (argc == 1) { 
    printf("Too few arguments."); 
    return -1; 
} 

for (i = 0; i < argc; i += 1, argv += 1) { 
    if (strlen(*argv) > 100) { 
     printf("Maximum string length exceeded."); 
     return -2; 
    } 
} 
argv -= i; //Unnecessary stuff 
*argv += 1; 
argv += 1; 
argc -= 1; 


for (i = 0; i < argc; i += 1, argv += 1) { 
    *input = *argv; 
    copy_and_reverse(*output, *input); 
} 

return 0; 
} 

ответ

0

Вы объявляете:

void copy_and_reverse(char* output, char* input); 

но вы звоните:

copy_and_reverse(*output, *input); 

где

char *input[999] = {0}; 
char *output[999] = {0}; 

Другими словами, вы определили массив из 999 точек ers для элементов char, а не строки из 999 единиц char, как вы, вероятно, планировали.

И проблема в том, что вы инициализируете первый элемент вывода [] как 0, поэтому * output == 0, другими словами, вы передаете указатель NULL на copy_and_reverse(). Когда вы пытаетесь указать, что вы получаете ошибку сегментации.

Что вы на самом деле нужно:

char input[999] = {0}; 
char output[999] = {0}; 

и

copy_and_reverse(output, input); 

и вы должны быть в порядке.

Есть и другие проблемы с вставным кодом, например, @Mike S., но я считаю, что эти обратные копии-пасты.

+0

Если это нравится входной сигнал этого входа [999] = {0}; вывод на выход [999] = {0}; .. Как я могу передать аргумент (string) в массив? Нет никакого шанса сделать это: * input = * argv; , больше, не так ли? – MrShow

+0

О, да, вы можете, определяя ввод символов [999]; * input * на самом деле является (char *), поэтому вы можете рассматривать это как указатель. При использовании оператора [], например, ввода [3], это равнозначно делать * (ввод + 3). Кроме того, учтите точки @Mike S. поднимает !!! – kostas

0

Найдено несколько проблем, которые не решить вашу проблему ...

1) С помощью этой

for (c = 0; c < len; c += 1) { 
    last += 1; 
} 

вы получаете указатель "последний" набор до конца строки. Btw, это для цикла бесполезно - проще было бы last = output + len;

2) Вы не указали переменную «темп». Как вы можете скомпилировать этот код? И тогда временная переменная не используется.

3) может быть одной из главных проблем! - у вас есть ввод как массив указателей на строку. Вы можете иметь массив символов (также известный как строка) - поэтому не используйте char * array[999] но char array[999]

3) Почему у вас есть if (strlen(*argv) > 100) и массив длиной 999?

4) *input = *argv; недействителен. После того, как вы восстановите определения oyur массивов char, его следует ввести = * argv. И, конечно, вам не нужно это делать, просто назовите его function(*argv). Лучше будет function[argv[1]] или что.

5) Имейте некоторое время с основами языка C, не забудьте взглянуть на работу с указателями, массивами и const ключевое слово.

Хорошего дня

Смежные вопросы