определение и перебор массива строк в c - PullRequest
10 голосов
/ 25 июля 2011

Как я могу определить массив строк в c, а затем повторить цикл с элементами в массиве?

Пока у меня есть

char myStrings[][10] = { "one", "two", "three", "four", "five" };
// do I need to specify the "10" maximum length?
// also does it automatically create a null ending character after the string?

int i = 0;
for( i = 0; i < ; i++)
{
// I need to pass each string to  a function which accepts
// const char *
}

Ответы [ 9 ]

11 голосов
/ 25 июля 2011

Когда вы объявляете последовательность символов с помощью "", добавляется нулевой терминатор.

char myStrings[][10] = { "one", "two", "three", "four", "five" };

size_t i = 0;
for( i = 0; i < sizeof(myStrings) / sizeof(myStrings[0]); i++)
{
    fooThatReceivesOneString(myStrings[i]);
}
7 голосов
/ 07 марта 2014
void loopftn (void)
{
  char *numbers[] = {"One", "Two", "Three", ""}, **n;

  n = numbers;
  while (*n != "") {
    printf ("%s\n",  *n++);
  }
  return;
}
  1. Вам не нужно иметь максимальную длину.
  2. Все строки в Си заканчиваются нулем.
2 голосов
/ 25 июля 2011

мне нужно указать максимальную длину "10"?

Да, кроме 1-го измерения массива, вам нужно указать все последующие измерения

Также он автоматически создает нулевой завершающий символ после строка

Да

Мне нужно передать каждую строку в функцию, которая принимает const char *

Вы можете передать каждую строку следующим образом:

for( i = 0; i < ; i++)
{
  foo(myStrings[i]);
}

Кроме того, вы можете выбирать между const char* и char*; так как вы объявили это как массив, он может быть изменен; если бы это было что-то вроде

const char *mystrings[] = { " ", " "}; // string literal

тогда вы должны передать его как const char*, потому что строковые литералы всегда должны быть const char*

1 голос
/ 09 мая 2017

В Си оператор, как показано выше ** n! = "", На первый взгляд недопустим.Он сравнивает указатель со строкой.Даже * n! = "" Будет сравнивать указатель строки с "" указателем строки стека, а не со строками.Следует использовать strcmp или сравнить первый символ ** n == '\ 0' или ** n == 0.Также + * n увеличивает символ внутри указанной строки, а не указатель на строку ...

Вот хорошая реализация:

Код:

static const char* strings[]={"asdf","asdfasdf",0};
const char** ptr = strings;
while(*ptr != 0)
{
   printf("%s \n", *ptr);
   ++ptr;
}
1 голос
/ 25 июля 2011

объявление 1) Необходимо указать длину

объявление 2) Да, строковые литералы заканчиваются нулем.

Внутри вашего for просто вызовите функцию с параметром myStrings [i].

0 голосов
/ 05 октября 2017

Это может помочь

int main()
{
  int upp;

  int num;
  char password[20];
  int i;

  printf("Enter a Password (Must include a special char, a number, and an uppercase letter): \n");
  scanf(" %s", password);

  for (i=0;i<strlen(password);i++){
    if (isupper(password[i])){
      upp=1;

    }else if (isdigit(password[i])){
      num=1;
    }
  }if (num==1 && upp==1){
    printf("u may enter");
  }else
  printf("try again");

  return 0;
}
0 голосов
/ 24 июня 2014

Я всегда так делаю, мне кажется элегантным и легким.
Вы просто определяете массив как обычно, без фиксированного индекса.
Все, что вы должны убедиться, это добавить один 0 в конце.
Затем вы можете создать кратчайший вариант TEST и повторить его с помощью for или while.

Вот пример, он отображает список опций и соответствующий элемент справки (в этом случае массив справки должен быть не меньше длины опций.

const char *options[]={
    "CAL_MAG_MIN",
    "CAL_MAG_MAX",
    0
    };
const char *help[]={
    "<X,Y,Z>",
    "<X,Y,Z>",
    0
    };

int pos;
for (pos=0;options[pos];pos++)
{
    printf("\t %s %s\n",options[pos],help[pos]);
}
0 голосов
/ 25 июля 2011

Попробуйте это ..

int j =0;
while (char myStrings[][j] !='\0'){
  i++;
}
for (i = 0; i < j; i++)    {
  somemethod(myStrings[][i]);
}
0 голосов
/ 25 июля 2011

Да, вам нужно указать длину или добавить запись NULL в качестве последней записи в вашем строковом массиве. C не делает это автоматически для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...