2015-04-22 6 views
-3

Итак, у меня есть программа, которая анализирует выражения в строке текста, такие какСтранные символы, напечатанные в конце строки - C

11110000 & 11001100 ; 

и оценивает бинарные результаты. Мой код правильно разбирается и правильно оценивает, но для двух моих тестовых входов (в том числе и выше) мой printf также печатает эти странные символы после каждого прогона.

eos$ ./interpreter < program02.txt 
11000000 + 
eos$ ./interpreter < program02.txt 
11000000 2ñ 
eos$ ./interpreter < program02.txt 
11000000 "] 
eos$ ./interpreter < program02.txt 
11000000 ÒØ 
eos$ ./interpreter < program02.txt 
11000000 Ê 
eos$ ./interpreter < program02.txt 
11000000 òJ 

Строка malloc'd как этот

char *str = (char *) malloc ((getLength(src) + 1) * sizeof(char)); 

А вот как строка печатается

char *str = binaryToString(val); 
printf("%s\n", str); 

Любая помощь будет удивительным! Благодаря!

+4

есть строка null прекращено? – Sarang

+3

Выполняет ли 'binaryToString()' правильную строку? –

+3

, вероятно, забыл нулевой ограничитель, позволяя printf() запускать «минус конец» строки. –

ответ

0

Строки имеют нулевое завершение в C. Когда вы загружаете malloc(), оно будет заполнено тем, что было в блоке ранее.

Одним из решений является, чтобы заполнить буфер с нулевым символом \0 через memset() (находится в string.h) после использования malloc() как так:

int strLen = getLength(src) + 1; 
char *str = (char*)malloc(strLen * sizeof(char)); 
memset(str, '\0', strLen); // Fill with null chars 

Одинаково вы могли бы просто написать \0 после последнего символа.

EDIT: Это нехороший совет в соответствии с комментарием iharob. Принимая это во внимание, и учитывая, что вы знаете длину струны:

int strLen = getLength(src) + 1; 
char *str = calloc(strLen, sizeof(char)); // Allocate strLen * sizeof(char) 
if (str == NULL) { 
    // Error allocating str - handle error 
} 
str[strLen - 1] = '\0'; // zero-based, so char is after final character 

Это лучшее решение.

+0

Это очень плохой совет по-разному, 1. [Не бросайте результат 'malloc()'] (http://stackoverflow.com/a/605858/1983495), 2. 'sizeof (char) = = 1' ** по определению **. 3. Ваш 'memset()' совершенно не нужен, если вы выделяете символы 'strLen', просто' str [strLen - 1] = '\ 0'' достаточно, используя 'memset()', чтобы это могло, скрыть ошибки , когда вы пытаетесь, например, отлаживать программу с помощью таких инструментов, как [valgrind] (http://www.valgrind.org). 4. Существует 'calloc()'. 5. Не разыгрывайте указатель, если вы еще не проверяли «NULL». –

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