Объединение int в char[]

Я новичок в C (очевидно), и я получаю следующую ошибку:

warning: passing argument 2 of ‘strncat’ makes pointer from integer without a cast [enabled by default]

Вот код:

int main(void)
{
  FILE *fp;
  int c;
  unsigned char file[1024] = "/path/to/file";
  unsigned char text[1024] = "SomeText";

  fp = fopen(file, "r");
  if (fp == NULL)
  {
    perror("Error opening file");
    return(-1);
  }

  while ((c = fgetc(fp)) != EOF && c != '\n')
  {
    strncat(text,c,1);
  }
}

Очевидно, это имеет смысл для меня, но, к сожалению, не для компилятора. Как бы мне написать это лучше?


c
person mrbean    schedule 07.10.2014    source источник


Ответы (5)


strncat не может добавлять символ к строке, потому что он добавляет строки к строкам. Вы можете сделать односимвольную строку из вашего символа c, но использование strcat является излишним: вам лучше сделать указатель и добавить к нему символы:

char *p = &text[strlen(text)]; // Start appending at the last position of text
while ((c = fgetc(fp)) != EOF && c != '\n') {
    *p++ = c;
    if (p == &text[1023]) break;
}
*p = '\0';

Добавлена ​​проверка указателя в цикле для борьбы с переполнением буфера.

person Sergey Kalinichenko    schedule 07.10.2014

Неявное преобразование между целым числом и строкой, представляющей значение, хранящееся в целом числе, отсутствует. Вы должны вручную преобразовать его.

Функция itoa может сделать это за вас:

int value = 1234;
char tempBuffer[MAX_DIGITS];
itoa(value, tempBuffer, 10);
person Jack    schedule 07.10.2014

strcat() объединяет две строки, а строка C представляет собой массив с завершающим символом '\0'. Так что это несоответствие.

Однако strncat() объединяет две строки и позволяет вам установить максимальное количество символов для копирования. Таким образом, вы можете передать адрес c, и он будет рассматриваться как массив только с одним элементом. Итак, вы можете попробовать что-то вроде этого:

strncat(text, (char*)&c, 1);

В противном случае вам нужен буфер символов для хранения этого материала.

person Jonathan Wood    schedule 07.10.2014
comment
Это превращается в предупреждение, и я получаю это: note: expected ‘const char * __restrict__’ but argument is of type ‘int *’ extern char *strncat (char *__restrict __dest, const char *__restrict __src, - person mrbean; 07.10.2014
comment
Я добавил исправление для этого. - person Jonathan Wood; 07.10.2014
comment
Получил это сейчас. Считается ли это плохой практикой? Как это соотносится с вышеперечисленными методами? - person mrbean; 07.10.2014
comment
Это немного нестандартно, но в этом нет ничего, что я бы назвал плохой практикой. Когда вы передаете массив символов, вы передаете адрес первого элемента. Итак, здесь я просто передаю адрес одного символа и рассматриваю его как массив с одним элементом. Единственное, о чем нужно помнить, это то, что в конце массива нет завершающего '\0'. Вот почему последний аргумент 1 очень важен для strncat(). - person Jonathan Wood; 07.10.2014
comment
Это немного более прямолинейно, чем другие предложения, и использует для этого меньше памяти (хотя это может быть не важно). - person Jonathan Wood; 07.10.2014
comment
Это зависит от порядка байтов, но в противном случае забавный подход :) - person mafso; 07.10.2014

strncat предназначен для объединения строк (в стиле C). text — это char[], так что это работает, но c — это int, который определенно не является строкой, отсюда и ошибка.

person Nick Russo    schedule 07.10.2014

попробуй это strncat(text, &c,1)

person Farouq Jouti    schedule 07.10.2014