Почему gcc просит добавить & ldquo; __ & rdquo; перед strtok_r? [Дубликат]

def get_int_or_float(v):
    number_as_float = float(v)
    number_as_int = int(number_as_float)
    return number_as_int if number_as_float == number_as_int else number_as_float
5
задан jobin 30 May 2014 в 19:41
поделиться

4 ответа

strtok_r не является стандартной функцией C. Вы запросили только C99 с помощью флага компилятора -std=c99, поэтому файлы заголовков (glibc) сделают доступными только стандартные функции C99 в string.h.

Включить расширения с помощью -std=gnu99 или путем определения одного из расширений, показанного в manpage strtok, который поддерживает strtok_r перед включением string.h. Например,

#define _GNU_SOURCE
#include <string.h>

Обратите внимание, что в коде есть и другие проблемы, strtok_r возвращает char *, но вы пытаетесь назначить это массиву char в integer = strtok_r(str2, delimiter2, &saveptr2);. Ваша переменная integer должна быть char *

7
ответ дан nos 5 September 2018 в 07:54
поделиться

Я использую 4.8.2 и ubuntu 14.04 64bit тоже. Но у меня разные ошибки.

    incompatible types when assigning to type 'char[200]' from type 'char *' 
        line = strtok_r(str1, delimiter1, &saveptr1);
             ^

здесь, line объявлен «char [200]», но strtok_r возвращает char*.

Аналогичные ошибки в строке для integer = ....

Чтобы избавиться от этих ошибок компиляции, вы можете объявить что-то вроде char *line;.

Для предупреждения о неявном объявлении проверьте это

Могу ли я использовать strtok () в модуле ядра Linux?

1
ответ дан Community 5 September 2018 в 07:54
поделиться

проблема в том, что функция strtok_r возвращает указатель на char, ведь вы пытаетесь назначить массив символов, поэтому для его работы вам необходимо объявить переменные line и integer как указатель символа char, затем выделите память с помощью malloc.

void string_to_int_array(char file_contents[BUFFER_SIZE << 5], int array[200][51]) {
  char *saveptr1, *saveptr2;

  char *str1, *str2;

  char delimiter1[2] = "\n";
  char delimiter2[] = " ";
  char *line;
  char *integer;
  int j;
  line = (char*)malloc(200);
  integer = (char*)malloc(200);
  for(j = 1, str1 = file_contents; ; j++, str1 = NULL) {
    line = strtok_r(str1, delimiter1, &saveptr1);
    printf("%s\n", line);
    if (line == NULL) {
      break;
    }
    printf("end of first\n");

    for (str2 = line; ; str2 = NULL) {
    printf("begin of second\n");
      printf("asdf%s\n", line);
      integer = strtok_r(str2, delimiter2, &saveptr2);
      if (integer == NULL) {
        break;
      }
      printf("%s\n", integer);
    }
  }
}
1
ответ дан Cristian 5 September 2018 в 07:54
поделиться

Такая же проблема с GCC 7.4.2 на Debian

Решена с использованием __strtok_r или -std=gnu99 или добавления protoype после включает в себя:

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

#define BUFFER_SIZE 1024

extern char *strtok_r(char *, const char *, char **);
1
ответ дан Keine Lust 5 September 2018 в 07:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: