Если вы хотите использовать верхний модуль, вам нужно использовать вложение без сокращения A::B
:
module Foo
class Main
def some_method
Bar::Object1.new
Bar::Object2.new
end
end
end
Источники:
Необходимо закончить строку \0 символами. Вот почему их называют, нуль завершил строки.
Также мудро выделить 1 дополнительный символ для содержания \0.
В дополнение к предыдущим комментариям о нулевом завершении также необходимо взять на себя ответственность за то, что она не переполнила собственного буфера. Это не останавливается в 8 символах, потому что Ваш код не останавливается! Вам нужно что-то как следующее (осуществляющий контрейлерные перевозки на предложение Jeremy):
#define DATA_LENGTH 8
#define BUFFER_LENGTH (DATA_LENGTH + 1)
char Buffer[BUFFER_LENGTH]; //holds the byte stream
int charPos=0; //index to next character position to fill
while (charPos <= DATA_LENGTH ) { //user input event has occured
Buffer[i] = charInput;
Buffer[i+1] = '\0';
// Display a response to input
printf("Buffer is %s!\n", Buffer);
i++;
}
Другими словами, удостоверьтесь, что прекратили принимать данные, когда максимальная длина была достигнута, независимо от того, что среда пытается продвинуть в Вас.
Если Вы программируете в C или C++, необходимо помнить что: 1) строки закончены с \0 символами. 2) C не имеет граничной проверки в строках, они - просто символьные массивы.
Это нечетно, что никто не упомянул эту возможность:
char Buffer[8]; //holds the byte stream
int i = 0;
while (i < sizeof(Buffer) && (charInput = get_the_users_character()) != EOF)
{
Buffer[i] = charInput;
i++;
// Display a response to input
printf("Buffer is %.*s!\n", i, Buffer);
}
Эта нотация в printf () строка формата указывает максимальную длину строки, которая будет отображена и не требует пустого завершения (хотя пустое завершение является в конечном счете лучшим способом пойти - по крайней мере, после того как Вы оставляете этот цикл).
while
цикл более вероятен, чем простое if
, и эта версия гарантирует, чтобы Вы не переполняли конца буфера (но не гарантирует, чтобы Вы оставили достаточно пространства для запаздывания NUL '\0'
. Если Вы хотите обработать это, использовать sizeof(Buffer) - 1
и затем добавьте NUL после цикла.
Единственной вещью Вы являетесь передающими к printf () функция, является указатель на первый символ Вашей строки. printf () не имеет никакого способа знать размер Вашего массива. (Это даже не знает, является ли это фактический массив, так как указатель является просто адресом памяти.)
printf () и все стандартные функции струны до предполагают, что существует 0 в конце Вашей строки. printf (), например, будет продолжать печатать символы в памяти, начиная в символе, который Вы передаете функции, пока это не поражает 0.
Поэтому необходимо изменить код на что-то вроде этого:
char Buffer[9]; //holds the byte stream
int i=0;
if( //user input event has occured )
{
Buffer[i] = charInput;
i++;
Buffer[i] = 0; // You can also assign the char '\0' to it to get the same result.
// Display a response to input
printf("Buffer is %s!\n", Buffer);
}
Вы могли бы также хотеть изучить использование a stringstream
.