Нет необходимости в событии TextChanged. Вы можете использовать событие KeyPress для TextBox.
if(e.KeyCode==Keys.Enter){
if(textBox1.Text = "some string"){
//your code here...
}
}
Это будет в конечном счете seg отказ, но прежде, который это распечатает любые байты, находятся на той же странице. Вот почему Вы видите случайные символы на экране.
Они могут включать escape-последовательности для изменения (говорят) что кодировка символов консоли. Вот почему Вы заканчиваете с мусором, когда Вы вводите на консоли после того, как из этого выходят, также.
В дополнение к тому, что все остальные сказали в отношении Вас игнорирующий строковый символ терминала и просто печатающий волей-неволей, что находится в памяти мимо строки, причина, почему Ваша командная строка является также "мусором", состоит в том, что путем печати конкретного "непечатного" символа, терминальный сеанс покинули в странном текстовом режиме. (Я не знаю, какой символ это или какое изменение режима это делает, но возможно кто-то еще может передать по каналу приблизительно в этом, который знает лучше, чем я.)
Поскольку у Вас есть бесконечный цикл (while(1)
), и Вы продолжаете получать текущее значение указателя (*s
), и затем перемещая указатель один символ вперед (s++
). Это имеет эффект похода хорошо мимо конца строки в "мусор" (неинициализированная память), который печатается к консоли в результате.
Ваш цикл не завершается, таким образом, println печатает то, что находится в памяти после текста, который Вы пишете; в конечном счете это получит доступ к памяти, которую не позволяется считать, вызывая его к segfault.
Можно изменить цикл, как другие предположили, или можно использовать в своих интересах то, что в c, нуль является ложью и пустым указателем (который завершается, все строки) также нуль, таким образом, можно создать цикл как:
while (*s) {
Вместо:
while (*s != '\0')
Первый может быть более трудно понять, но он действительно имеет преимущество краткости, таким образом, он часто используется для сохранения небольшого количества ввода.
Вы просто распечатываете то, что находится в памяти, потому что Ваш цикл не останавливается в конце строки. Каждый случайный байт интерпретируется как символ. Это будет seg давать сбой, когда Вы достигнете конца страницы памяти (и войдите в нечитабельную территорию).
Расширение очень немного на ответах, данных здесь (которые все превосходны)... Я столкнулся с этим несколько раз сам, когда я только начинал с C, и это - легкая ошибка сделать.
Быстрая тонкая настройка к Вашему while
цикл зафиксирует его. Все остальные дали Вам, почему, я подниму трубку Вас с как:
#include <stdio.h>
int main() {
char *s = "lolololololololol";
while (*s != '\0') {
printf("%c", *s);
s++;
}
}
Обратите внимание на это вместо бесконечного цикла (while(1)
), мы делаем проверку цикла, чтобы гарантировать, что указатель, который мы вытягиваем, не является пустым разделителем для строки, таким образом избегая переполнения, с которым Вы встречаетесь.
Если Вы застреваете, абсолютно нуждаясь while(1)
(например, если это - домашняя работа, и преподаватель хочет, чтобы Вы использовали ее), используйте break
ключевое слово для выхода из цикла. Следующие запахи кода, по крайней мере, мне, но это работает:
#include <stdio.h>
int main() {
char *s = "lolololololololol";
while (1) {
if (*s == '\0')
break;
printf("%c", *s);
s++;
}
}
Оба производят тот же консольный вывод, без разрыва строки в конце:
lolololololololol
Кроме того, можно обычно возвращаться к командной строке при помощи команды 'сброса', вводя вслепую, конечно. (тип Вводит, сбросил, Входит),