2017-01-12 2 views
0

내 프로그램은 배열 및 이스케이프 처리 된 문자를 처리합니다. 본질적으로 그것은 tr 유닉스 명령을 모델링합니다. 대부분의 경우 이스케이프 처리 된 문자를 처리 할 때를 제외하고 작동합니다. tr 명령을 사용할 때, 이런 식입니다 : 그러나C에서 이스케이프 된 문자 잡기

$ echo "abc" | tr "abc" "\nxy" 

xy 
$ 

, 나는 현재 내 프로그램 반환 위와 같은 예를 들어 문제 해결에있어 방법 : 내 프로그램은 '아무튼

\nx 

을 이 문자는 이스케이프 처리 된 문자이며 정상적으로 처리합니다. 하지만이 문제를 해결할 방법을 찾지 못했습니다. 어떤 제안이라도 대단히 감사 할 것입니다.

'A', 'B', '당신이 당신의 첫 번째 문자열은 문자로 아래로 생겼습니다 tr 다음

에주는 당신이 작업하는

size_t q; 
int s,c; 
unsigned char table[256]; 

for(s = 0; s < 256; s++) 
{ 
    table[s] = s; 
} 
for(q = 0; set1[q] !='\0'; q++) 
{ // Ensure if there are excess characters in set1, 
    // they are replaced by the last character of set 2 
    if(q>=length(set2)) 
    { 
    table[(int)set1[q]] = set2[length(set2)-1]; 
    } 
    else if(set2[q] != set1[q]) 
    { 
     table[(int)set1[q]] = set2[q]; 
    } 
} 

while((c = getchar()) != EOF) 
{ 
    putchar(table[c]); 
} 
+4

보이지 않는 코드는 수정할 수 없습니다. –

+1

그리고 우리는 [mcve]없이 도울 수있는 방법과 mor 세부 사항은 [ask]에 자세히 설명되어 있습니까? – Olaf

답변

1

문자열은 같은 문자열이 아닌 C ','\ 0 '

여기에 문자로 두 번째 문자열입니다 : 는'\ ','N ','X ','Y ','\ 0 '

다음

문자열 일이다 tr에서보고있다 :

를 '\ n', 'X', 'Y', '\ 0'

을 그래서 코드는 주어진 문자열 "옳은 일"을하고있다. tr에 두 번째 문자열을 입력하면 프로그램이 생성하는 것과 동일한 결과가 나타납니다. 이를 위해 백 슬래시 (물론 백 슬래시를 사용)를 탈출해야하므로 프로그램이하는 것과 같습니다보다는

TR "ABC" "\\ NXY"

:

tr "abc" "\ nxy"

해결 방법은 코드에 전달하기 전에 두 번째 문자열에서 이스케이프 시퀀스를 사용하는 것입니다. 한 번에 하나의 작업에만 집중한다면 프로그램이 더 깨끗해질 수있는 유용한 도구이기 때문에이 기능을 별도의 기능으로 수행하는 것이 좋습니다.

자신 만의 기능을 작성하거나 다른 사람이 작성한 기능을 찾아 볼 수 있습니다. (Google은 귀하의 친구입니다)

변환 코드를 작성한 후에 예상대로 작동하지 않으면 다시 돌아와 다른 질문을하십시오. [정상적으로 작동하면 승리!]

RE : 쓰는 방법? 입력 문자열을 반복하면서 다른 문자열을 만듭니다.

+0

대단히 감사합니다. – GreenSkies

+0

방금 ​​들여다 보았지만 "\ nxy"가 마치 "\ nxy"처럼 처리되어 내 프로그램이 처리됩니다. 그들은 둘 다 여전히 나에게 "\ nx"를 전처럼주고 있습니다. 이 문제의 원인이 무엇인지 아십니까? @Dale Wilson – GreenSkies

+0

@GreenSkies : 당신은 껍질과 싸우고 있습니다. 프로그램에서 무엇을보고 있는지 알고 싶다면 작은 따옴표를 사용하십시오.''x \ ny ''를 인자로 사용하여, 프로그램은 4 문자 문자열을 전달합니다. 왜냐하면'\ n'은이 문맥에서 특별한 의미가 없기 때문입니다. ''x \\ ny "'와 함께, 시퀀스''\\''는 특수한 의미를 가지며 - 백 슬래시 하나를 의미하므로 - 명령에 다시 4 자리 문자열이 전달됩니다. 대신 작은 따옴표를 사용하면''x \ ny''에 4 자리의 문자열을,''x \\ ny''에 5 자리수의 문자열을 보게 될 것입니다. 셸이 간섭하는 시점을 이해하는 것이 중요합니다. –