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
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 *
Я использую 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_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);
}
}
}
Такая же проблема с 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 **);