가장 분명한 방법으로 개행 문자를 제거하는 단계 :
- , header
NAME
를 사용하여 문자열의 길이를 결정하십시오 . 참고 종료를 계산하지 않습니다 .strlen()
string.h
strlen()
\0
size_t sl = strlen(NAME);
- 문자열이 하나의
\0
문자로 시작하거나 하나의 문자 만 포함하는지 확인하십시오 (빈 문자열). 이때 sl
것 0
때문에 strlen()
I가 계산 나던 위에 상기와 같은 \0
그것의 첫번째 발생 정차 :
if(sl == 0)
{
// Skip the newline replacement process.
}
- 적절한 문자열의 마지막 문자가 개행 문자인지 확인하십시오
'\n'
. 이 경우, 대체 \n
로모그래퍼 \0
. 인덱스 수는 처음부터 시작 0
되므로 다음을 수행해야합니다 NAME[sl - 1]
.
if(NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
fgets()
문자열 요청 에서 Enter 만 누른 경우 (문자열 내용은 개행 문자로만 구성됨) NAME
이후 문자열은 빈 문자열이됩니다.
if
논리 연산자를 사용하여 2 단계와 3 단계를 하나의 문장으로 결합 할 수 있습니다 &&
.
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
- 완성 된 코드 :
size_t sl = strlen(NAME);
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
fgets
매번 다시 입력하지 않고 일반적으로 출력 문자열 을 처리하여이 기술을 사용하는 함수를 선호하는 경우 다음과 fgets_newline_kill
같습니다.
void fgets_newline_kill(char a[])
{
size_t sl = strlen(a);
if(sl > 0 && a[sl - 1] == '\n')
{
a[sl - 1] = '\0';
}
}
제공된 예에서 다음과 같습니다.
printf("Enter your Name: ");
if (fgets(Name, sizeof Name, stdin) == NULL) {
fprintf(stderr, "Error reading Name.\n");
exit(1);
}
else {
fgets_newline_kill(NAME);
}
입력 문자열에 \0
s 가 포함되어 있으면이 방법이 작동하지 않습니다 . 이 경우 strlen()
첫 번째까지만 문자 수를 반환합니다 \0
. 그러나 대부분의 문자열 읽기 기능은 일반적으로 처음에 멈추고 \0
해당 null 문자까지 문자열을 가져 오기 때문에 이것은 일반적인 접근 방식이 아닙니다.
그 자체로 질문을 제외하고. 코드가 명확하지 않은 이중 부정을 피하십시오 if (!(fgets(Name, sizeof Name, stdin) != NULL) {}
. 간단하게 할 수 있습니다 if (fgets(Name, sizeof Name, stdin) == NULL) {}
.
if (!fgets(Name, sizeof Name, stdin))
(최소한 두 가지 부정,! 및! =을 사용하지 마십시오)