LINUX.ORG.RU

int to char


0

0

 делаю вот так
int c;
char *cmd;
....// прочее в программе
while(!feof(fp)){
    c = getc(fp);
    if(c == '\n'){
        cmd=(char*)c; // конвертирую в строку
        cfg->remote_cmd_ptr = cmd;// выполняю работу и тут у меня программа вылетает(
    }
}

пробовал переводить в строчку через itoa, sprintf, snprintf

почему вылетает то? вроде перевод в строку правильно сделал.
anonymous

А память под char* где-нибудь выделяется?

UVV ★★★★★
()

> cmd=(char*)c; // конвертирую в строку

Ты вообще понимаешь, что эта строка делает?

> почему вылетает то? вроде перевод в строку правильно сделал.

RTFM. Учи С для начала, по K&R, например.

Begemoth ★★★★★
()

>cmd=(char*)c;

попытка использовать '\n' в качестве указателя провалилась, лучше почитать какой-нибудь учебник по основам языка C.

dn2010 ★★★★★
()
Ответ на: комментарий от dn2010

если без указателя, то тоже вылетает
while(!feof(fp)){
    c = getc(fp);
    if(c == '\n'){
        char cmd=(char*)c; 
        cfg->remote_cmd_ptr = cmd;
    }
}

anonymous
()
Ответ на: комментарий от dn2010

аааа
память выделил, такое ощущение, что  if(c == '\n') не работает(
char *cmd;
int c;

while(!feof(fp)){
	 c = getc(fp);
	 if(c == '\n'){
		 cmd=(char*)malloc(1024);
		 *cmd=(char)c;
		printf("%s\n", cm);
		free(cmd);
	 }
	}
только выводит не строчки, а ерунду какую-то=(
☺Й

☺Й

☺Й

☺Й

☺Й

☺Й

anonymous
()
Ответ на: комментарий от anonymous

ты понимаешь, чему у тебя будет равна переменная c внутри блока if с таким условием? и какой в этом смысл?

vden ★★
()
Ответ на: комментарий от vden

->ты понимаешь, чему у тебя будет равна переменная c внутри блока if с таким условием? и какой в этом смысл?
вообще странно что это отдается в int, а не в char.
я хочу получить на вывод строчку, потом следующую, итд... пока файл ен кончится.
когда я делаю в ифе
printf("%c",c); 
то файлик построчно выводится.
как тогда быть с переводом "строчки" в char?

anonymous
()
Ответ на: комментарий от anonymous

Блин, третий раз пишу --- возьми книжку по C и внимательно прочитай сначала главу про указатели и работу с памятью, потом главу про работу со строками.

HINT: char * --- это не строка, это указатель на первый символ строки.

dn2010 ★★★★★
()
Ответ на: комментарий от anonymous

> вообще странно что это отдается в int, а не в char.

IMHO это отдаётся в int, потому что в int'е можно разместить не только char, но и EOF.

sergey_feo
()
Ответ на: комментарий от anonymous

> ☺Й

Пространство какбэ когворит ☺Й тебе а нестрочку!

iBliss
()
Ответ на: комментарий от anonymous

> while(!feof(fp)){
>   c = getc(fp);
>   if(c == '\n'){
>     cmd=(char*)malloc(1024);
>     *cmd=(char)c;
>     printf("%s\n", cm);
>     free(cmd);
>   }
> }

Недочёт 1.
cmd=(char*)malloc(1024);

Здесь выделилось 1024 байта памяти. А если бы размер char не был 
равен одному байту? Короче, принято писать так:
cmd=(char*)malloc(sizeof(char) * 1024);

Недочёт 2.
Память выделяется в каждом "обороте" цикла. Зачем, если можно 
выделить один раз до цикла? Ведь это путь к тормозам :-)

Недочёт и даже ошибка 3.
*cmd=(char)c;
printf("%s\n", cmd);

Записали в начало выделенной области памяти символ.
Остальная часть области - какой-нибудь мусор (не определено).
Заставили printf() вывести cmd как строку. В Си строка - это набор 
симолов. Имя строки - это указатель на начальный символ строки. 
Конец строки - это символ '\0' после последнего символа строки.
Такие строки называются null-terminated strings.
printf() идёт от начала области, на которое указывает cmd, и выводит 
символы, пока не встретит '\0'. Так как '\0' мы не поставили - она 
может уйти за пределы выделенной области в 1024 байта и что-нибудь 
переглючить. Это называется переполнением буфера и является частой 
ошибкой в программах на Си, часто используемой как брешь в 
безопасности.

Недочёт 4.
И как всё это должно выполнить поставленную задачу? :-)

> я хочу получить на вывод строчку, потом следующую, итд... пока 
> файл ен кончится.

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

Вариант 1.

while ((c = getc(fp)) != EOF) {
  putc(c);
}

Вариант 2.

#define MAXLEN 1024
cmd=(char*)malloc(sizeof(char) * MAXLEN);
int i = 0;
while ((c = getc(fp)) != EOF) {
  i++;
  if (i >= MAXLEN-1) {
    printf("error\n");
    break;
  }
  if (c == '\n') {
    cmd[i] = '\0';
    i = 0;
    printf("line=[%s]\n", cmd);    
  } else {
    cmd[i] = (char)c;
  }
}
free(cmd);

Этот вариант плох тем, что имеется ограничение на длину строки в 
1024 символа. В GNU/Linux принято делать так, чтобы таких 
ограничений не было.
И ещё: что такое '\n'? В Unix'ах принято заканчивать строки символом 
LF (10), а в ДОСах - сразу двумя символами: CR и LF (13 и 10). 

Вариант 3.

Это без ограничения на длину строки.

объявить динамический массив cmd и очистить его;
while ((c = getc(fp)) != EOF) {
  if (c == '\n') {
    printf("line=[%s]\n", получить_null-terminated_string(cmd));    
    очистить cmd;
  } else {
    добавить_символ_в_конец(cmd);
  }
}
возможно, удалить динамический массив.

Как делаются динамические массивы в Си - хорошо показано тут: http://trubetskoy1.narod.ru/dynarray.html
Там же сказано, что в С++ всё это уже есть в готовом виде.
 

sergey_feo
()
Ответ на: комментарий от anonymous

> AFAIK, sizeof(char) == 1 по определению

Да, стандарт (http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf)
говорит про sizeof() весьма интересно: "When applied to an
operand that has type char, unsigned char, or signed char,
(or a qualified version thereof) the result is 1. When applied to an
operand that has array type, the result is the total number of bytes in the array"

Ещё там же:
"J.3 Implementation-defined behavior
1 A conforming implementation is required to document its choice of
behavior in each of the areas listed in this subclause. The following
are implementation-defined:
[...]
J.3.4 Characters
1 — The number of bits in a byte (3.6)."

И вот из Вики на эту тему (http://en.wikibooks.org/wiki/C_Programming/Reference_Tables#Table_of_Data_Types):
"sizeof gives the size in units of chars. These "C bytes" need not be
8-bit bytes (though commonly they are); the number of bits is given by
the CHAR_BIT macro in the limits.h header."

Я путаюсь или по стандарту возможна ситуация:
char c - 8 бит,
байт b - 16 бит,
char q[4] - 32 бита,
char w[3] - 24 бита,
sizeof(c) = 1,
sizeof(q) = 2 вместо 4,
sizeof(w) = 24/16 = 1.333(3), что ли?

sergey_feo
()
Ответ на: комментарий от andreyu

>> itoa

>> нет такой функции

> sprintf()

для тех, кто в танке: это я написал специально, чтобы *всяким* не приходила в голову использовать нестандартную, тем паче отсутствующую в glibc функцию.

trapezoid
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.