Основные проблемы:
- вы никогда не сбросите s на 0, поэтому столбец всегда будет увеличиваться, а не быть с 0 до 4 (если 5 чисел в строке), поэтому вы не будете писать ожидаемые записи в массиве из вторая строка, и у вас есть риск записи из массива с неопределенным поведением (например, ошибка сегментации)
- проверьте, что вы не читаете слишком много столбцов и строк (30 в вашем коде), иначе вы можете записать из массива неопределенное поведение (например, ошибка сегментации)
- вы используете неправильно
strtok_r
, первый параметр должен быть не нулевым только при первом анализе строки (перед вашим редактированием)
- делает
number = strtok_r(from, " ", &next)
следующий изменяется на strtok_r
, в то время как он используется для инициализации с для следующей строки, поэтому вторая строка не будет прочитана правильно и ваше выполнение только:
это коляски [0] [0]: 11
это коляски [0] [1]: 12
это коляски [0] [2]: 13
это коляски [0] [3]: 14
это коляски [0] [4]: 15
это коляски [3] [5]: 0
с data.txt , содержащим:
11 12 13 14 15
21 22 23 24 25
31 32 33 34 35
41 42 43 44 45
51 52 53 54 55
(также посмотрите на индексы [3][5]
, потому что вы пропустили сброс s )
Дополнительные замечания:
- проверка fopen успех
- инициализируйте прам или запомните, сколько столбцов в первой строке, и проверьте, что это всегда то же самое количество столбцов в следующих строках, также запомните, сколько строк, конечно, иначе вы этого не сделаете узнайте позже, где находятся считанные числа в массиве
- atoi не указывает, прочитали ли вы число или нет
Предложение принять во внимание эти замечания: (Я инициализирую массив 0, не делая предположения о количестве чисел в строке):
#include <stdio.h>
#include <string.h>
#define LINELENGTH 30
#define SIZE 30
int main(){
// read data from customer.txt
char lines[LINELENGTH];
FILE * file = fopen("data.txt", "r");
if (file == NULL) {
fprintf(stderr, "cannot read data.txt");
return -1;
}
// data.txt currently holds five lines
// 1 1 1 1 1
// 2 2 2 2 2
// 3 3 3 3 3
// 4 4 4 4 4
// 5 5 5 5 5
int t = 0;
int prams[SIZE][SIZE] = { 0 };
while (fgets(lines, LINELENGTH, file)) {
char * number;
char * str = lines;
int s = 0;
while ((number = strtok(str, " \n")) != NULL) {
char c;
int i;
if (sscanf(number, "%d%c", &i, &c) != 1) {
fprintf(stderr, "invalid number '%s'\n", number);
return -1;
}
prams[t][s] = i;
printf("this is prams[%d][%d]: %d\n", t, s, prams[t][s]);
str = NULL;
if (++s == SIZE)
break;
}
if (++t == SIZE)
break;
}
fclose(file);
}// main
Я использую sscanf(number, "%d%c", &i, &c) != 1
, чтобы легко определить, читается или нет число и только число, обратите внимание, что я добавил \n
- разделители для strtok
Компиляция и исполнение:
pi@raspberrypi:/tmp $ !g
gcc -pedantic -Wall -Wextra l.c
pi@raspberrypi:/tmp $ cat data.txt
11 12 13 14 15
21 22 23 24 25
31 32 33 34 35
41 42 43 44 45
51 52 53 54 55
pi@raspberrypi:/tmp $ ./a.out
this is prams[0][0]: 11
this is prams[0][1]: 12
this is prams[0][2]: 13
this is prams[0][3]: 14
this is prams[0][4]: 15
this is prams[1][0]: 21
this is prams[1][1]: 22
this is prams[1][2]: 23
this is prams[1][3]: 24
this is prams[1][4]: 25
this is prams[2][0]: 31
this is prams[2][1]: 32
this is prams[2][2]: 33
this is prams[2][3]: 34
this is prams[2][4]: 35
this is prams[3][0]: 41
this is prams[3][1]: 42
this is prams[3][2]: 43
this is prams[3][3]: 44
this is prams[3][4]: 45
this is prams[4][0]: 51
this is prams[4][1]: 52
this is prams[4][2]: 53
this is prams[4][3]: 54
this is prams[4][4]: 55