2015-01-19 4 views
0

Я действительно не знаю, как это объяснить. Пожалуйста, несите меня.
Я пытаюсь передать 2 двумерный массив в функцию string[][], и в этой функции я собираюсь создать указатель, который указывает на массив, который я прошел. Я буду делать сравнения элемента в string[][]
Как создать массив указателей для двумерного массива

//From main 
char string[3][3] = {"cat","dog","bat"}; 
//From function 
declare a pointer which points to string; 
if (strcpm(string[1],string[2]) == 1) 
    { 
     pointer[1] value set to address of string[2]; 
     pointer[2] value set to address of string[1] 
    } 
printf("%s", *(pointer)); 

Я не хочу изменять string[3][3], после чего функция перестанет функционировать без возврата
У меня есть идея, но я не знаю, как объявить pointer, пожалуйста, помогите мне. Благодаря! Визуализируйте

In main      In function 
string      ptr 
cat       1000 
dog       1008 
bat       1012 
Do compare 
dog > bat 
ptr[3] = address of dog; 
ptr[2] = addess of bat; 
printf("%s", *(ptr+1); 
printf("%s", *(ptr+2); 
quit function, return nothing 
+0

Должно ли 'strcpm' быть' strcmp'? –

+1

Вам нужно показать нам код, который вызывает эту функцию, показывая нам, как создается 2D-массив строк.Вы также должны показать нам схему функции, которую вы создаете, чтобы выполнить работу - ту, которая содержит сравнение строк и присваивание «указателю». Мы не можем сказать, что вы не делаете неправильно, без этой информации. Простым массивом указателей является 'char * pointer [3];' (это позволит вам указывать указатель [1] 'и' указатель [2] ', но помните C массивы индексов от 0, а не 1). –

+0

Вы собираетесь каким-то образом вернуть эти значения указателя, которые вы вводите внутри функции? Или они используются только в этой функции как часть определения того, что нужно печатать в конце функции? –

ответ

0

Для функции, чтобы принять массив строк (не массив указателей на строки, которая отличается):

void func(size_t rows, size_t cols, char strings[rows][cols]) 
{ 
    char const *pointers[rows]; 

    // Initialize each pointer to point to each row 
    for (size_t i = 0; i < rows; ++i) 
     pointers[i] = &strings[i][0]; 

    // here you can manipulate the pointers, e.g. bubble sort them 

    printf("%s\n", pointers[0]); 
} 

Вызов этой функции:

int main() 
{ 
    char stuff[4][20] = { "cat", "dog", "snuffleupagus", "horse" }; 

    func(4, 20, stuff); 
} 

Pro совет: вы можете вычислить Размеры массива вместо использования магических чисел:

#define LENGTH_OF(array) (sizeof(array)/sizeof((array)[0])) 

char stuff[][20] = { "cat", "dog", "snuffleupagus", "horse" }; 
func(LENGTH_OF(stuff), LENGTH_OF(stuff[0]), stuff); 

Как было отмечено в комментариях, будьте осторожны, о втором измерении (20 в моем случае). C разрешает массив символов char инициализироваться строкой точно такой длины, и в этом случае массив не будет содержать строку (т. Е. Он будет содержать символы, которые не заканчиваются на нуль).

+0

Спасибо, мистер МакНабб, я получил то, что хочу. – thekay

0

в C, строки представлены в виде массива символов. Это представлено двумя нормальными способами: char* identifier и char identifier[]. 2-мерный массив объявляется как указатель на строку. Таким образом, можно записать в виде

char **strArray1 
char *strArray2[] 
char strArray3[][] 

Каждый из них имеет различные последствия, которые я не буду вдаваться в здесь, как это педантичный.

Чтобы ответить на ваш вопрос, как в буквальном смысле, как я могу, вы можете написать код в ваш пост, как

int main (void) { 
    char * strArray[2] = { "This is a String", "This is a String too" }; 
    if (strcmp(strArray[0], strArray[1]) == 0) { 
     ... 
    } 
    return 0; 
} 
0

Я не знаю, правильно ли я понимаю, но если да, то я отправляю пример, где вы можете передать массив «строк» ​​(который в C представлен как массив массивов символов). Тогда вы можете сравнить две первые строки в массиве

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

char* my_function(char *strings[]) { 
    char *ptrToString = NULL; 

    if (strcmp(strings[0],strings[1]) > 0) // Do you really mean '==1' here? 
    { 
     ptrToString = strings[1]; 
    } else { 
     ptrToString = strings[0]; 
    } 

    printf ("%s\n", ptrToString); // No need for '*', %s takes a pointer to char as argument 

    return ptrToString; 
} 

void main (void) { 
    char *a[] = {"dog", "cat"}; 
    my_function(a); 
} 

Примечание: * Я изменил «зЬгстр() == 1», чтобы проверить, если возвращение possitive или нет. Проверка определенного значения является нетрадиционной (может не соответствовать вашей реализации C). В документации единственная гарантия заключается в том, что strcmp будет возвращать положительный, отрицательный или нулевой, но не конкретное значение. http://linux.die.net/man/3/strcmp * В массиве должно быть не менее двух нулевых строк, для того чтобы моя функция функции работала без segfault.

Надеюсь, это поможет вам в правильном направлении.

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