2011-10-22 8 views
1

문자열 (mystring)과 char (ch)을 입력하라는 프로그램이 있습니다. 그런 다음 입력 된 모든 문자 (ch)를 문자열 (mystring)에서 삭제합니다. 예를 들어 "abcabc"와 char 'a'를 입력하면 결과는 "bcbc"가됩니다. - scanf를 사용할 때 문자열에 공백이 없으면 프로그램이 제대로 작동합니다. "abc abc abc"라고 입력하면 처음 3 글자 만 읽고 (공백까지) 처리합니다. 그런 다음 gets (mystr)를 사용하는 것이 좋습니다. 왜냐하면 모든 휘몰아 치기를 읽을 수 있기 때문입니다. 하지만 gets를 사용할 때 결과는 입력 문자열과 동일하므로 아무 일도 일어나지 않습니다.C 문자열에서 문자 삭제

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define N 100 

int main(int argc, char *argv[]) 
{ 
    char mystr[N] ,result[N]; 
    char ch; 
    int i,k; 
    k=0; 

    printf("enter string \n"); 
    //gets(mystr);/////////////////////////// 
    //scanf("%s",&mystr);/////////////////// 
    printf("enter char \n"); 
    scanf("%c",&ch); 
    scanf("%c",&ch); 

    for (i = 0; i <= strlen(mystr); i++) 
    { 
    if (mystr[i] != ch) 
    { 
     result[k]=mystr[i]; 
     k++; 
    } 
    } 
    puts(result); 
    system("pause"); 
    return 0; 
} 
+2

** **'gets()'를 사용하지 마십시오. 그것은 본질적으로 안전하지 않습니다. –

답변

6
scanf("%c",&ch); 
scanf("%c",&ch); 

scanf초로 문제가 있음을 . 그것은 당신이 제거하고자하는 문자 다음에 입력하는 새로운 줄 문자를 집어 들고 (이전 값인 ch을 덮어 씁니다).

제거하십시오. 맨 페이지 말한대로

는 참고 :

는 사용하지 마십시오()을 가져옵니다. 데이터를 미리 알지 못해서 얼마나 많은 문자를 미리 알지 못하기 때문에 문자가 읽히고, gets()가 버퍼를 지나서 문자를 계속 저장하기 때문에 매우 위험합니다. 그것은 컴퓨터 보안을 깨는 데 사용되었습니다. fgets() 대신 을 사용하십시오.

+2

괜찮은 사용자 입력 기능을 위해서는 http://getackoverflow.com/questions/4023895/how-to-read-string-entread-by-user-in-c/4023921#4023921을 참조하십시오. – paxdiablo

1

흠 - 확실하지 않은 문제가 무엇인가 - 사용 getstr하지만, 문자열을 scanf, 그리고 Visual Studio에서 나를 위해 작동하지 않음

int main(int argc, char *argv[]) 
{ 
    char mystr[N] ,result[N]; 
    char ch; 
    int i,k; 
    k=0; 

    printf("enter string \n"); 
    gets(mystr);/////////////////////////// 
    //scanf("%s",&mystr);/////////////////// 
    printf("enter char \n"); 
    scanf("%c",&ch); 
    // scanf("%c",&ch); 

    for (i = 0; i <= strlen(mystr); i++) 
    { 
    if (mystr[i] != ch) 
    { 
     result[k]=mystr[i]; 
     k++; 
    } 
    } 
    puts(result); 
    system("pause"); 
    return 0; 
} 
1

사용이 하나

char temp[2]; 
scanf("%1s",temp); 
ch = temp[0]; 

char의와 함께 사용하면 gets

scanf을 사용하여 몇 가지 문제가 (이 "오래된"새로운 라인을 얻는다)이있다. 여기서 우리는 조금 "속임수"를 쓰고 우리는 scanf을 사용하여 한 문자까지 가질 수있는 문자열을 얻습니다. 1 문자의 문자열에는 종료 문자에 대한 두 번째 문자가 분명히 필요하므로 2 문자의 배열입니다.

검색 할 문자에 scanf을 사용하면 공백 문자를 삽입 할 수 없습니다.

gets은 "악의적 인"기능입니다. 버퍼 오버런을 사용하여 쉽게 버퍼 오버런을 수행 할 수 있습니다 (버퍼가 충분히 크지 않은지 확인하지 않음). "올바른"방법은 보통 다음과 같습니다. fgets(mystr, N, stdin); ("파일"변형 gets은 읽을 수있는 최대 문자 수를 가지며 끝에 \0을 추가합니다). fgets에 150 개의 문자를 삽입하면 99 개가 문자열로 이동합니다 (최대 크기를 100 개 부여했기 때문에). 1x\0이 추가되고 다른 문자는 다음 버퍼의 "ready"에 그대로 유지됩니다. scanf/gets/fgets ... (테스트하려면 5 자 등의 작은 값으로 버퍼를 줄이고 몇 가지 테스트를 수행하십시오)

1

작은 해킹으로 xanatos에서 제안한 fgets()를 사용할 수 있으므로 신뢰할 수 있습니다 리턴 문자를 처리하십시오. fgets를 사용하여 얻은 문자열에서 '\ n'을 '\ 0'으로 변경하십시오.

그리고 프로그램에서 '\ 0'을 사용하여 새 문자열을 종료하는 것을 잊었습니다. 찾으시는 코드는 다음과 같습니다.

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

#define N 100 

int main(int argc,char **argv){ 

char string[N],str1[N]; 
char ch; 
int i,k = 0; 

fgets(string,N,stdin); 
string[strlen(string)-1] = '\0'; 
scanf("%c",&ch); 

printf("\n%s , %c",string,ch); 
for (i=0;i<=strlen(string);i++) 
    if(string[i] != ch) 
     str1[k++] = string[i]; 

str1[k] = '\0'; 
printf("\n%s , %s\n",string,str1); 
return 0; 
}