C - разбить строку и ввести в массив - PullRequest
0 голосов
/ 20 февраля 2019

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

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

 int main(){
     char str[]="titanic.txt";
     char parts[2][5];
     char *name = strtok(str, ".");
     for (int i = 0; i < 2; i++){
          parts[i][5] = name;
          char name = strtok(NULL, ".");

     }
     printf("%c\n", str[0]);
     return 0;
  }

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

 char part[2][10]{
     {'t', 'i', 't', 'a', 'n', 'i', 'c'},
     {'t', 'x', 't'}
 };

В качестве альтернативы я пробовал что-то подобное, используя строковое копирование как таковое.

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

 int main(){
     char str[]="titanic.txt";
     char parts[2][10];
     char *name = strtok(str, ".");
     for (int i = 0; i < 2; i++){
         strcpy(parts[i], name);
         name = strtok(NULL, ".");

      }
     printf("%s\n", parts[1]);
     return 0;
 }

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

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

В случае, если отделение имени файла от его расширения действительно имеет отношение к тому, что вы пытаетесь выполнить, я предполагаю, что вы используете Windows, и укажу вам документацию для рекомендуемой библиотеки Windows API для этого, <pathcch.h>.

Что касается вашего фактического вопроса, ваш первый код не работает, потому что:

  1. Вы назначаете один символ в строкеparts[i][5] = name;.Вы также переполнены, поскольку parts[i] имеет тип char [5], который имеет только позиции от 0 до 4.
  2. Вы переименовываете name как один char вместо char * Указатель, который является правильным типом и был объявлен как таковой (правильно) вне области видимости цикла.Ваша новая переменная char name перезаписывает существующую переменную char *name.

Вы не можете обойтись, используя функции strcpy -семейства, чтобы назначить массив символов для этого (и большинства других) вариантов использования.Единственный раз, когда синтаксис char foo[] = "Hello World"; действителен, сразу после объявления.Кроме того, строковые литералы хранятся в постоянной памяти.

0 голосов
/ 20 февраля 2019

Следуя вашему стилю кодирования, это решение:

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

int main()
{
    char str[] = "titanic.txt";
    char delim[] = ".";
    char parts[2][10];
    char *ptr = strtok(str, delim);
    int i = 0;

    for (i = 0; i < 2; i++){
        if(ptr != NULL)
        {                
            snprintf(parts[i], sizeof(parts[0])  ,"%s", ptr);
            ptr = strtok(NULL, delim);
        }
    }

    printf("'%s'\n", parts[0]);
    printf("'%s'\n", parts[1]);

    return 0;
}
0 голосов
/ 20 февраля 2019

Массив parts должен быть массивом указателей, а не двумерным массивом символов:

char *parts[2];

Затем вы назначаете:

parts[i] = name;

Если вы хотитескопировать из входной строки в parts, вам нужно объявить 2-е измерение, достаточно большое для максимально возможной строки:

char parts[2][10];

, а затем вы должны использовать strcpy() вместо присвоения для его копирования.

strcpy(parts[i], name);

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

...