2011-08-19 6 views
1

시스템 호출을 사용하여 파일을 읽고 문자열을 역순으로 출력 파일로 출력해야합니다. 입력 파일이 test.txt이면 출력은 reverse_test.txt 파일에 기록되어야합니다. 결과를 쓸 출력 파일의 이름에 문자열 reverse_을 어떻게 추가 할 수 있는지 알려주십시오.입력 파일 이름에 문자열을 추가하십시오.

아래 코드를 시도했지만 오류가 발생합니다.

strcat("reverse_",argv[1]); 

나는 나머지 코드를 작성 했으므로이 부분을 해결할 수는 없지만 잘 동작합니다.

답변

1

strcat() 표준 라이브러리 함수는 대상 및 소스 문자열의 두 매개 변수를 허용합니다.

이 의미, 당신이 이런 식으로 뭔가하려고하면 당신은 실제로이 같은 말을하는지

strcat("reverse_", argv[1]); 

을 (수정할 수 없기 때문에,

"reverse_" = "reverse_" + argv[ 1 ] 

잘못 요식 또는 , 적어도, 당신은하지 말아야합니다) 리터럴 "reverse_". 이 과정에서 코드에서 다른 리터럴을 사용하지 못하게되므로 길이를 변경할 수 없습니다.

@cnicutar는 당신에게 당신이 찾고있는 결과를 달성하는 방법에 대한 힌트를 제공하고 있지만 경우에 당신은 당신이 다음 한 과정을 준수하고 싶은, 여기에 대한 설명입니다

a) 귀하가 필요 메모리에서 반전 된 파일 이름을 저장할 장소를 예약하십시오.

b) "reverse_"라고 써야합니다.

c)는 마지막으로, ARGV에있는 파일 이름 [1]

첫 번째 단계는 놀랍게도 가장 어려운 하나입니다 CONCAT해야합니다. 얼마나 많은 공간이 필요합니까? 주어진 파일 이름 255 자까지 될 수

http://en.wikipedia.org/wiki/NTFS

http://en.wikipedia.org/wiki/Ext4

는 ... 그러나, 어떠한 절대 또는 상대 경로를 입력하는 사용자를 중지하지 않는다. 이것은 아마도 명령 줄에서 처리 할 수있는 최대 문자 길이를 지정해야한다는 것을 의미합니다. 이는 ...

http://support.microsoft.com/kb/830473

¡ 8192 자! ...이 곳이 우리를 선도하지 않습니다.

가장 좋은 방법은 argv [1] 문자열의 문자 수를 계산 한 다음 접두어에 필요한 문자를 추가하고 그 값에 1을 더한 값을 더하는 것입니다. 문자열 끝의 표시를 저장하십시오.

const char * prefix = "reserve_"; 
int needed = strlen(argv[ 1 ]) + strlen(prefix) + 1; 

char store[ needed ]; 

strcpy(store, prefix);     // store <- prefix 
strcat(store, argv[ 1 ]);     // store <- store + argv[ 1 ] 

printf("%s\n", store); 

이러한 종류의 벡터를 사용할 수없는 경우 동적 메모리를 예약하고 사용해야합니다.

const char * prefix = "reserve_"; 
int needed = strlen(argv[ 1 ]) + strlen(prefix) + 1; 

char * store = (char *) malloc(sizeof(char) * needed); 

strcpy(store, prefix);     // store <- prefix 
strcat(store, argv[ 1 ]);     // store <- store + argv[ 1 ] 

printf("%s\n", store); 
free(store); 

희망이 있습니다.

+0

가변 배열, C99에만 해당. – phoxis

+1

해결 된 변수 배열 문제가 @phoxis에 의해 지적되었습니다 – Baltasarq

+0

정말 고마워요. 이것은 매력처럼 작동했습니다. 다시 한 번 감사드립니다. –

6

"reverse_"리터럴에 추가 할 수 없습니다. 이 같은 것을보십시오 : 귀하의 예를 들어 "reverse_"에서

char str[ENOUGH] = {0}; 
snprintf(str, sizeof(str), "reverse_%s", argv[1]); 
+0

미안하지만, 나는 출력이 쓰여질 새로운 파일을 만들기 위해 creat (2) 시스템 호출을 사용할 것임을 잊어 버렸다. creat (2)를 사용하여 만든 파일의 이름은 reverse_test.txt 여야합니다. –

+0

예 : (fdw = creat ("outfile", S_IREAD | S_IWRITE) 여기서 outfile은 reverse_argv [1] 여야합니다. 일부 신입 사원입니다. 효율적인 방법으로 설명하지 못할 수도 있습니다. –

+1

무엇이 문제입니까? – glglgl

1

을 문자열 리터럴 상수이고 당신은 가능하지 않은 상수 리터럴에 다른 메모리 위치를 추가하려고합니다.

는 다음과 같은 작업을 수행 할 수 있습니다

char *buffer; 

buffer = malloc (sizeof (char) * BUFSIZ); 

strcpy (buffer, "reverse_"); 
strcat (buffer, argv[1]); 

/* Work here */ 

free (buffer); /* before termination */ 

또는 당신은 또한 BUFSIZ 길이 정적 배열로 버퍼를 정의 할 수 있습니다.

+0

이전 솔루션이 작동했지만 좋은 수행 방법을 제공해 주셔서 감사합니다. 과제를 제출 한 후에 나는 반드시 이것도 시도해 볼 것입니다 .. –

관련 문제