Проблема с массивом строк и функцией в C - PullRequest
0 голосов
/ 04 декабря 2018

Я только начинаю с C и пытаюсь заставить массив из 3 строк проходить через функцию.Однако в этой функции остается только 1 строка, и, похоже, нет даже массива.Я уже пробовал множество вещей, но не могу исправить это.

#include <stdio.h>
#define NUM_WORDS 3
#define MAX_WORD_SIZE 64

void printStrings(char words[])
{
    //But now 'words' looks like this: "one"  
    for (int i = 0; i < NUM_WORDS; ++i)
        printf("%s", words[i]);
}

void main()
{
    char words[NUM_WORDS][MAX_WORD_SIZE] = { "one", "two", "three" };
    //At this point the array 'words' looks like this:  
    //{ "one", "two", "three" }
    printStrings(words);
}

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Вам нужно:

#include <stdio.h>
#define NUM_WORDS 3
#define MAX_WORD_SIZE 64

static void printStrings(char words[][MAX_WORD_SIZE])
{
    for (int i = 0; i < NUM_WORDS; ++i)
        printf("%s\n", words[i]);
}

int main(void)
{
    char words[NUM_WORDS][MAX_WORD_SIZE] = { "one", "two", "three" };
    printStrings(words);
    return 0;
}

У вас есть полный 2D-массив;Вы должны указать размер всех размеров, кроме первого, как показано.Это полностью отличается от массива указателей (char *words[] = { "four", "five", "six", NULL };).Тогда тип аргумента будет char **words, немного похож на argv до main(), когда он принимает аргументы.

Обратите внимание, что стандарт C говорит, что main() возвращает int,Использование void допустимо только в Windows;в других местах это неправильно.

(я использую static, потому что на функцию не будут ссылаться вне этого исходного файла. Многие (большинство) люди не беспокоятся об этом. Я использую параметры компиляторасделать это необходимо.)

0 голосов
/ 04 декабря 2018

Просто измените параметр функции на char char words[][MAX_WORD_SIZE]:

#include <stdio.h>
#define NUM_WORDS 3
#define MAX_WORD_SIZE 64

void printStrings(char words[][MAX_WORD_SIZE])
{
    //But now 'words' looks like this: "one"  
    for (int i = 0; i < NUM_WORDS; ++i)
        printf("%s", words[i]);
}

void main()
{
    char words[NUM_WORDS][MAX_WORD_SIZE] = { "one", "two", "three" };
    //At this point the array 'words' looks like this:  
    //{ "one", "two", "three" }
    printStrings(words);
}
0 голосов
/ 04 декабря 2018

Ваше объявление words внутри main является правильным, но для передачи двумерного массива в функцию, вы должны объявить его как таковой в функции.Ваше текущее объявление printWords только объявляет его параметр как одномерный массив символов, что объясняет, почему оно не работает правильно.

Минимум, необходимый для правильного объявления этого, следующий:

void printStrings(char words[][MAX_WORD_SIZE])

Однако в этом случае у вас есть возможность сделать это:

void printStrings(char words[NUM_WORDS][MAX_WORD_SIZE])

Это имеет преимущество (и недостаток) в том, что подразумевает большее ограничение на то, что может / должно быть передано в printWords.Это немного похоже на разницу между:

void function(char foo[])

, который принимает массив символов произвольного размера, и

void function(char foo[FOO_SIZE])

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

Обратите внимание, что вы можете исключить только самое внешнее (крайнее левое) измерение, требуются внутренние, чтобы компилятор знал предельный размер каждого внешнего элемента.

...