몇 가지 문제 :
NEVER NEVER NEVER NEVER NEVER NEVER 사용 gets
. 우선, C99에서 비추천이고 표준의 다음 개정에서 사라질 것입니다. 둘째로, 은 코드에서 오류 지점을 소개합니다 (일 수 없음 소개, 소개). 대신 gets(str)
대신 fgets(str, sizeof str, stdin)
을 사용하십시오. 대신 숫자 값
사용 문자 상수, 전 세계가 ASCII하지 않기 때문에 :
if (str[i] == ' ') // not str[i] == 32
가
공백 양식 피드, 탭이 포함되어, 반환 등뿐만 아니라 공간; 개별 값을 확인하는 대신 isspace()
라이브러리 기능을 사용하십시오.
다음 줄이 문제가됩니다.
str[i++] = str[i];
str[i] = str[i++];
우선, 정의되지 않은 동작이 호출됩니다. 시퀀스 포인트간에 객체를 두 번 이상 읽고 업데이트하려고합니다. 둘째로, 나는 논리가 확실하지 않다. 요소를 건너 뛰지 않고 요소를 바꾸려고하는 것 같습니다.
strlen
에 정수 값을 전달하면 작동하지 않습니다. 그것은 정수 값을 주소로 해석 할 것이고 (잠재적으로 나쁜 결과를 가져와 적어도 경고를 얻어야합니다).
두 배열 인덱스와 단일 루프에서이 작업을 수행 할 수 있습니다
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char str[15];
if (fgets(str, sizeof str, stdin) != NULL)
{
size_t r, w;
printf("Original: \"%s\"\n", str);
/**
* str[r] is the element that we are reading; str[w]
* is the element that we are writing
*/
for (r = 0, w = 0; str[r] != 0; r++)
{
if (!isspace(str[r])) // if str[r] is not a whitespace character
str[w++] = str[r]; // write it to str[w]; note that we only
// advance w for non-whitespace chars
}
str[w] = 0; // add the 0 terminator at the end
printf("Stripped: \"%s\"\n", str);
}
return 0;
}
은 분명히, 이것은 원래의 문자열을 변경합니다. 어떤 이유로 원본 입력을 유지해야하는 경우 수정 된 문자열을 보관할 두 번째 버퍼를 선언해야합니다.
무엇인가 귀하가 게시 한 현재 코드의 단점은 무엇입니까? –
그것의 didnt 일. str [strlen (i)] = '\ 0'; str [strlen (str)] = '\ 0'; – yEL155
숙제? 문제가 없다면 그냥 태그로 표시하여 더 나은 대답을 얻을 수 있습니다. – pmg