2015-08-03 2 views
0

Так что я пытаюсь прочитать слова из файла. Однако я должен использовать putchar(ch), где ch является int. Как преобразовать ch в строку (char *), чтобы я мог сохранить ее в переменной char * и передать ее другой функции, которая принимает char * в качестве параметра. И я просто хочу сохранить его, но не печатать.Преобразование int в char * C

Это то, что у меня есть:

int main (void) 
{ 
    static const char filename[] = "file.txt"; 
    FILE *file = fopen(filename, "r"); 
    if (file != NULL) 
    { 
     int ch, word = 0; 
     while ((ch = fgetc(file)) != EOF) 
     { 
     if (isspace(ch) || ispunct(ch)) 
     { 
      if (word) 
      { 
       word = 0; 
       putchar('\n'); 
      } 
     } 
     else 
     { 
      word = 1; 
      putchar(ch); 
     } 
     } 
     fclose(file); 
    } 
    return 0; 
} 
+1

'printf ("% c \ n ", ch)'? – kaylum

+0

На самом деле я хочу сохранить его в переменной char *, чтобы передать эту переменную функции, которая принимает char * в качестве параметра – PTN

+2

Тогда, пожалуйста, обновите свой вопрос. Не совсем понятно, что вы хотите сделать. Если вы хотите, чтобы это была строка (которая технически не эквивалентна символу 'char *'), вам нужно выделить для нее память (или вызывающий должен предоставить буфер). Затем вы просто копируете каждый символ в буфер и завершаете буфер с помощью '\ 0'. – kaylum

ответ

1

Таким образом, у вас есть одно значение char типа, он же int8_t (или uint8_t на некоторых системах). Вы сохранили его в файле int, поэтому fgetc может вернуть -1 за ошибку, но все равно сможет вернуть любой символ 8 бит.

Одиночные символы - это всего лишь 8-битные целые числа, которые вы можете хранить в любом размере целочисленной переменной без проблем. Поместите их в массив с нулевым байтом в конце, и у вас есть строка.

char buffer[10] = {0}; 
int c = 'H'; 
buffer[0] = c; 
// now buffer holds the null-terminated string "H" 
buffer[1] = 'e'; 
buffer[2] = 'l'; // you can see where this is going. 
c = buffer[1]; // c = 'e' = 101 
    // (assuming you compile this on a system that uses ASCII/unicode, not EBCDIC or some other dead character mapping). 

Обратите внимание, что завершающий строку нуль-байты попал в буфер, потому что я его инициализировал. Использование инициализатора массива нулевает любые элементы, которые вы не упоминаете в списке инициализаторов.

2

sprintf(char_arr, "%d", an_integer);

Это делает char_arr равным строковому представлению an_integer (Это не печатает ничего на консоль выводится в случае, если вам интересно, это как раз это «магазинах») Пример:

char char_arr [100]; 
int num = 42; 
sprintf(char_arr, "%d", num); 

char_arr сейчас является строкой "42". sprintf автоматически добавляет нулевой символ \0 в char_arr.

Если вы хотите добавить больше к концу char_arr, вы можете сделать это:

sprintf(char_arr+strlen(char_arr), "%d", another_num); 

«+ StrLen» часть так начинает добавлять в конце.

подробнее здесь: http://www.cplusplus.com/reference/cstdio/sprintf/

1

Для представления одного символа в виде строки символов, я считаю, используя простой буфер 2 символов, чтобы быть столь же легко, как и все остальное. Вы можете воспользоваться тем фактом, что разыменование строки указывает на первый символ и просто назначает символ, который вы хотите представить в виде строки. Если вы настроите свой буфер 2-обугленный в 0 (или '\0') при объявлении, вы застраховали вашу строка всегда null-terminated:

короткого примеру

#include <stdio.h> 

int main (void) { 

    int ch; 
    char s[2] = {0}; 
    FILE *file = stdin; 

    while ((ch = fgetc(file)) != EOF) { 
     *s = ch; 
     printf ("ch as char*: %s\n", s); 
    } 

    return 0; 
} 

Используйте/Output

$ printf "hello\n" | ./bin/i2s2 
ch as char*: h 
ch as char*: e 
ch as char*: l 
ch as char*: l 
ch as char*: o 
ch as char*: 

Примечание: вы можете добавить && ch != '\n' в th e while, чтобы предотвратить печать новой строки.

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