2009-09-01 4 views
2

Я использую C. У меня возникают проблемы с использованием указателей для функции fscanf. Когда я пытаюсь сделать:Вопрос о указателях в fscanf

int *x; 
/* ... */ 
fscanf(file, "%d", x[i]); 

Мой компилятор дает мне предупреждение о том, «формат аргумента не является указателем» и код просто не работает (я получаю сообщение о том, «Water.exe перестал работать»). Если я заменю x на * x, он просто не компилируется ... Это просто проблема синтаксиса?

+0

Я подозреваю, что что-то важное происходит в «...». Можете ли вы показать нам полную версию самой маленькой программы, которую вы можете сделать? Это скопировать программу, вырезать как можно больше, все еще получая ошибку. – dmckee

+0

Также в этом случае, пожалуйста, укажите, что вы хотите сделать, слишком много «не работает». –

+1

Оба '* x' и' x [i] 'являются типа' int', а не типа 'int *', как ожидалось, 'fscanf (file,"% d "...)'. Так что да, это принципиально синтаксическая ошибка. Предполагая, что вам выделено достаточно места, на которое указывает 'x', то есть вы хотели бы написать' fscanf (файл, "% d", & x [i]) 'или эквивалентно' fscanf (файл, "% d" х + я) '. – RBerteig

ответ

11

Если вы хотите, чтобы прочитать одно целое, это сделать:

int x; 
fscanf(file, "%d", &x); 

Если вы хотите, вы можете сделать это, чтобы прочитать одно целое число в динамически выделяемой переменной:

int *x = malloc(sizeof(int)); 
fscanf(file, "%d", x); 

Если вы хотите массив целых чисел, сделайте следующее:

int *x = malloc(sizeof(int) * DESIRED_ARRAY_SIZE); 
fscanf(file, "%d", &x[i]); 

%d ожидает указатель на int, но x[i] - это int, поэтому вам нужно взять адрес вашего элемента списка, используя адрес-оператора (унарный &).

+1

+1 для включения образца, демонстрирующего адрес элемента массива, который, как мне кажется, является источником путаницы OP. – RBerteig

8

Вам нужно выделить некоторое пространство для результатов.

int *x; // declares x 

x = malloc(600000 * sizeof(int)) // and allocates space for it 

for (int i = 0; i < 600000; ++i) { 
    fscanf(file, "%d", &x[i]); // read into ith element of x 
} 
+0

Я попытался выделить пространство, выполнив следующее: x = (int *) calloc (600000, sizeof (int)); Тем не менее, это все еще не работает ... – wolfPack88

+2

То, что вы показываете, это правильный способ сделать это, но это не значит, что проиллюстрировать, что делает OP неправильно: int * x; x = malloc (sizeof (int)); fscanf (файл, "% d", x); должно сработать. –

+1

Учитывая, что OP пытается прочитать значения в 'x [i]', я думаю, что он хочет массив, а не один 'int'. –

Смежные вопросы