C получить n-е слово в строке - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь создать функцию, которая будет возвращать n-е слово в массиве символов, например, если строка:

aaa bbb ccc ddd eee

И, скажем, я хочу получить третье слово в строке, поэтому он должен вернуть ccc.

Вот что у меня есть:

#include <stdio.h>
#define SIZE 1000

static char line[SIZE];

int length_to_space(char *s){
    char *i = s;
    while(*i != ' ' && *i != '\0'){
        i++;
    }
    return i - s;
}

char * split_space(char * string, int index){
    char *pointer = string;
    int counted = 0;
    while(*pointer != '\0'){
        if(*pointer == ' '){
            if(counted == index){
                int new_size = length_to_space(++pointer);
                char word[new_size];
                for(int i = 0; i < new_size; i++){
                    word[i] = *(pointer + ++i);
                    return word;
                }
            }
            counted++;
        }
        pointer++;
    }
    return 0;
}

int main(){
    fgets(line, SIZE, stdin);
    char * word = split_space(line, 2);
    printf("%s\n", word);
    return 0;
}

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

Спасибо за помощь!

1 Ответ

0 голосов
/ 20 октября 2018

char word[new_size]; создает локальную переменную, которая уничтожается при возврате функции.Таким образом, вы можете использовать malloc для динамического выделения памяти в куче

#include <stdio.h>
#include <stdlib.h>
#define SIZE 1000
char line[SIZE];
int length_to_space(char *s) {
  char *i = s;
  while (*i != ' ' && *i != '\0') {
    i++;
  }
  return i - s;
}
char *split_space(int index) {
  char *pointer = line;
  int counted = 1;
  while (*pointer != '\0') {
    if (*pointer == ' ') {
      if (counted == index) {
        int new_size = length_to_space(++pointer);
        char *word = malloc(new_size + 1);// dynamically allocate memory 
        for (int i = 0; i < new_size; i++) {
          word[i] = pointer[i];
        }
        word[new_size] = '\0';// char to end of the string '\0'
        return word;// return should be out of the loop
      }
      counted++;
    }
    pointer++;
  }
  return 0;
}

int main() {
  fgets(line, SIZE, stdin);
  char *word = split_space(2);
  printf("%s\n", word);
  free(word);
  return 0;
}

Ввод:

aaa bbb ccc ddd eee

Ввод:

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