ibilalkayy Ответов: 1

Как извлечь конкретную подстроку из строки и отдельно распечатать ее?


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

int main(){
  char str[] = "bilal,1000,savings";
  char toFind; 
  char * word1;
  char * word2;
  char * word3;
  int i=0, numberOfFields = 3;
  static const char * listing[] = {"Name","Amount","Account"};
  char name[20], account[20];
  int amount;

  for(i=0; i<numberOfFields; i++){
    printf("%d. Here is your %s \n", i, listing[i]);
  }

  printf("Which one: ");
  scanf("%c", &toFind);

  if(toFind == '0'){
    printf("selected zero\n");
    word1 = strtok(str, ",");
    printf("%s\n", word1);
  }

  else if(toFind == '1'){
    printf("selected one\n");
  }

  else if(toFind == '2'){
    printf("selected two\n");
  }
  return 0;
}


Что я уже пробовал:

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

1 Ответов

Рейтинг:
8

k5054

После первоначального звонка в strtok() вы можете пройти NULL в качестве первого параметра и strtok будет использовать ранее предоставленный строковый буфер для возврата следующей строки.

word1 = strtok(str, ",");
word2 = strtok(NULL, ",");
word3 = strtok(NULL, ",");
if( toFind == '0') {
    printf("%s\n", word1);
}

или, возможно, чаще:
char *words[3];
i = 0;
for(word = strtok(str, ","); word != NULL; word = strtok(NULL, ",") {
    words[i++] = word;
}

int whichWord = atoi(toFind);
/* should check whichWord is in bounds here ... */

whichWord -= 1; /* user will have entered 1-3, but array runs 0-2 */
printf("%s\n", words[whichWord];

Обратите внимание, что если нам нужно увеличить количество полей, все, что нам нужно сделать, это изменить char *words[3] К может быть char *words[10] Мы могли бы даже динамически выделить переменную words подсчитав запятые во входной строке, а затем используя вызов malloc() чтобы создать необходимое пространство.

Имейте в виду, что strtok() изменяет входной буфер, поэтому вы не должны использовать const char, так как это почти наверняка вызовет ошибку во время выполнения. Кроме того, поскольку входной буфер модифицирован, если вам нужно повторно проанализировать входной буфер, в этом случае все запятые будут заменены символами nul ('\0'). В этом случае вы можете сделать копию исходного входного буфера, возможно, используя strdup()


CPallini

5.

KarstenK

Лучше всего создать рабочую копию для strtok().

Maciej Los

5ed!