[완료]while(1)에서 엔터키를 입력해도 탈출하고 싶어요.

-@Naver의 이미지

무한루프를 돌리는 상황에서,
엔터키를 누르거나,
숫자1을 10개 입력하면 종료되는 프로그램을 만든다고 가정할 때.
else if 의 break 는 탈출이 되는데,
if 의 break 는 탈출이 안됩니다.

if(str[0] == '\n' || str[1] == '1' && strlen(str) == 10) 로
3개를 묶어서 break문을 하나로 해도,
여전히 엔터키는 탈출이 안됩니다.ㅠㅠ

에러나 경고 메시지는 없고,
컴파일 결과창에서도 엔터키 탈출 빼고는 다 됩니다.ㅠㅠ
제가 어느 부분을 수정하면 엔터키 탈출도 가능할까요?

실력자 분들의 답변을 기다립니다.
읽어주셔서 고맙습니다.

#include <stdio.h>
#include <string.h>
 
int main(void) {
	int i;
	char str[10] = { 0, };
 
	while(1) {
		printf("입력해보세요(엔터키 또는, 1을 10개 입력하면 종료됩니다):\n");
		gets(str);
		if(str[0] == '\n')
			break;
		else if(str[1] == '1' && strlen(str) == 10)
			break;
		else
			continue;
		printf("%s", str);
	}
}
익명 사용자의 이미지

항상 레퍼런스를 가까이.
레퍼런스를 보지 않는 자는 레퍼런스를 본 사람이 답변을 달아줄 때까지 기다려야 하는 운명을 맞게 됩니다.

https://en.cppreference.com/w/c/io/gets

Quote:
The newline character is discarded but not stored in the buffer.

gets 함수는 개행 문자('\n')를 삼켜 버립니다.
차라리 if (str[0] == '\0')를 쓰시지요.

-@Naver의 이미지

고맙습니다. 말씀해주신대로 if를 수정했더니 if와 else if까지 확실히 break가 됩니다.
레퍼런스 링크까지 친절하게 올려주셔서 덕분에 읽어봤습니다.
솔직히...레퍼런스에 관한 내용을(물론, 번역사이트를 이용함 ㅠㅠ 영어 문외한 수준 ㅠㅠ)
천천히 읽었는데, 아직은 다 이해하지는 못했습니다.
Quote 부분의 내용이 핵심 내용인 듯 합니다. 고맙습니다.
언제나 레퍼런스도 읽는 습관을 들이도록 늘...노력하겠습니다. 고맙습니다^^

초보 C언어 학습자. 실력자분들의 도움이 절실합니다.

라스코니의 이미지

line-by-line 으로 디버그를 해보세요.
리턴키를 눌렀을 때 gets() 다음으로 떨어진 다음 str[] 배열에 어떤 값이 들어가 있는지 확인해 보세요.

한가지 gets() 대신에 fget()를 쓰는 것을 고려해 보세요.

-@Naver의 이미지

한 줄씩 디버그를 시도했는데,
dev c++ 툴이 그냥 죽어버리더군요. ㅠㅠ
(디버그 할 줄 알아야 프로그램의 세계에서 좀 편하게 지낼텐데ㅠㅠ)

조언해주신대로 gets 를 포함한 앞 뒤줄에 printf 로 찍었더니.
그 줄을 실행하지 않더라구요.ㅠㅠ

덕분에 실행하지 않음을 알 수 있었습니다.
고맙습니다.

또한 덧붙여서 fgets 를 추천해주신 점도 감사합니다.

우분투에서,
요즘...버퍼오퍼플로 때문에...제 속이 타들어가는 중이거든요.
버퍼오버를 피하고자 소스를 고쳐봤더니,
스택오버플로 방지 메시지까지 보이더군요.
(우분투는 스택오버플로 방지를 위한 detect~ 어쩌고 하는 기능의 메시지가 있다는 것도 처음 알았습니다ㅠ)

fgets 쓰면...좀..나아지겠죠?

디버그 방법에 대한 설명, fgets 조언...정말 고맙습니다.
늘 과정까지도 노력하겠습니다. 감사합니다.

초보 C언어 학습자. 실력자분들의 도움이 절실합니다.

라스코니의 이미지

dev c++ 툴은 최근에는 거의 업데이트가 되지 않는 툴 아닌가요?
Eclipse를 써보세요. 아니면 Netbean이나요.

-@Naver의 이미지

디버그 사라져서 에잇. 하고 지웠는데요.
비주얼은 너무 무겁고.
뭘로 할까 했는데.
툴 추천 고맙습니다^^
정말 고마워요^^~씨익^^

초보 C언어 학습자. 실력자분들의 도움이 절실합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.