Этот раздел:
for(i=0; i<sizeof(wp); i++) {
if(wp != NULL)
fscanf(wp, "%s", &tab[i]);
else
break;
}
Проблематично.
Во-первых, есть несколько проблем со строкой: fscanf(wp, "%s", &tab[i]);
Это должно быть записано как: fscanf(wp, "%s", tab); //removed & and array notation.
В отличие от int
или float
типов переменных, имя вашего char
массив (то есть tab
) уже является указателем, указывающим на адрес переменной, что делает ненужным (и неправильным) использование адреса оператора (&
).
Относится к вышесказанному ... (и вероятная причина ошибки сегментации.)
Поскольку определение tab
относится к простому массиву char
(char tab[BUFFER];
), обозначение tab[i]
относится только к ih byte
(или char
) массива, а не ко всему массиву.Из-за используемого спецификатора формата "%s"
функция fscanf () ожидает char *
, а не char
, что делает tab
правильным аргументом для использования.
Если вы хотите использовать массив строк, переменная должна быть создана как 2D массив символов:
#define NUM_LINES 100
#define LINE_LEN 80
int main() {
char tab[NUM_LINES][LINE_LEN] = {{0}}; // zero initialized array of
// NUM_LINE strings
// each of LINE_LEN-1 capacity
В операторе for(i=0; i<sizeof(wp); i++) {
sizeof(wp)
будет равно количеству байтов указателя wp
, 32 или 64, в зависимости от целевой адресации вашего приложения.Это, вероятно, не то, что вы хотели.(или хотите.)
Рассмотрите другой подход:
Если вы работаете с текстовыми файлами, попробуйте использовать комбинацию while()
и fgets () для чтения строк из файла.Затем вы можете обработать каждую строку на основе ее известного синтаксиса.
(В следующем примере для упрощенной иллюстрации используется массив char
с одним измерением.)
char line[some_len];
wp = fopen(some_file_name, "r");
if(wp)
{
while(fgets(line, some_len, wp))
{
// use line. In this case, just print to stdout
printf("%s\n", line);
}
fclose(wp);
}