2014-12-08 3 views
0
내가 파일 이름에 대한 인수에 소요 C++에서 프로그램을 쓰고 있어요

는 인수가 문자 *입니다Char *를 Char * 끝에서 제거하려면 어떻게합니까?

예 : 나는 "(LAN을이의 char *의 마지막 3 자리 숫자를 제거해야 myFile.lan

") 그리고"asm "(예 : myFile.asm)으로 변경하십시오.
strcpy을 통해 char 포인터에 char을 추가하는 것이 정말 쉬운 것처럼 보이지만 char 포인터에서 chars를 제거 할 수있는 방법을 알고있는 사람이 있습니까?

+0

당신은 그들을 덮어'strcpy'를 사용할 수 있습니다. 비록 당신이 덮어 쓰고있는 적어도 3 자릿수가 없다면 이것이 작동하지 않을 것이므로 조심하십시오. 작동시키지 못하면 시도한 코드를 게시하십시오. –

+2

'나는 이것들이 매우 단순 해 보인다 '라는 것을 알고있다. 전문 프로그래머에 의한 많은 버그는 원시 C 문자열과'char *'를 사용하여 이러한 "슈퍼 단순"한 일을하는 것을 막는다. 그것이 C++에'std :: string'이있는 이유입니다 ... – PaulMcKenzie

+0

strstr()을 사용하면 검색 문자열의 시작 부분을 찾을 수 있습니다 (* I *는 '.'을 검색 한 다음 끝 문자열을 찾기 위해 한 단계 건너 뜁니다.) 우리는 '.'다음에 항상 3 문자가 있다고 가정하고 '.'다음에 나오는 첫 번째 문자를 '\ 0'으로 설정하여 후행 문자를 바꾸고 strcat (원래 문자열 "asm")을 사용합니다. – user3629249

답변

0

string.h의 도구를 사용하면 작업을 단순화 할 수 있습니다. strrchr은 파일 이름에 마지막으로 '.'을 발견하여 확장 프로그램을 조작 할 수 있습니다. new/old 확장자의 길이를 테스트하여 \0 - null-terminating character을 덮어 쓰지 않도록하십시오 (길이가 다른 경우 항상 문자열 크기를 연결하거나 재 할당 할 수 있지만이 예제의 범위를 벗어납니다). 이 솔루션을 통해보고 당신이 어떤 질문이 있으면 알려 주시기 :

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

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

    if (argc < 3) { 
     fprintf (stderr, "\n error: insufficient input. Usage: %s <filename> <new_ext>\n\n", argv[0]); 
     return 1; 
    } 

    char *filename = strdup (argv[1]); /* copy argv[1] to prevent clobbering it */ 
    char *p = strrchr (filename, '.'); /* pointer to last '.' in filename   */ 
    char *ext = strdup (p+1);   /* make a copy of existing extension  */ 
    size_t esz = strlen (ext);   /* length of existing extension in filename */ 
    size_t nesz = strlen (argv[2]);  /* length of new extension     */ 

    if (esz < nesz) { 
     fprintf (stderr, "\n error: invalid extension size. (%s > %s)\n\n", argv[2], ext); 
     return 1; 
    } 

    printf ("\n The original filename: %s\n", filename); 

    strncpy (p+1, argv[2], nesz);  /* copy new extension to filename   */ 
    if (nesz < esz)      /* if new extension is shorter than old  */ 
     *(p+1+nesz) = 0;    /* null terminate after new extesion size */ 

    printf (" The amended filename : %s\n\n", filename); 

    if (filename) free (filename);  /* free memory allocated by strdup   */ 
    if (ext) free (ext); 

    return 0; 
} 

출력 :

$ ./bin/swapext myfile.lan asm 

    The original filename: myfile.lan 
    The amended filename : myfile.asm 

$ ./bin/swapext myfile.lan c 

    The original filename: myfile.lan 
    The amended filename : myfile.c 
2

char *으로 작업하는 것은 기본 'C'입니다. 메모리 공간에 무엇이든 쓸 수 있지만 할당 된 공간의 끝을지나 가지 않도록주의하십시오.

char * 문자열은 모두 null 바이트 \0으로 끝납니다. 따라서 자르려면 \0을 적절한 위치에 놓습니다.

한편, 문자를 덮어 쓰려면 배열 구문을 사용하십시오. 예 : 문자열의 길이가 10이고 마지막 문자를 변경하려는 경우 c_string[9] = 'X';은 해당 문자를 X으로 변경합니다.

1

문자열이 C로 끝나는 방법을 알아야합니다. 문자열 길이는 \0 문자의 첫 번째 항목에 의해 결정됩니다. 따라서이 문자를 뒤로 이동하면 문자열이 짧아집니다. 그래서 당신은 아마 도트의 첫 번째 위치에 대한 문자열을 검색하고 \0이이 점을 바꿀 (이것은 문자열 입력이 어떻게 보이는지에 따라 달라집니다. 나는 항상 어딘가에 점이있는 파일 이름이라고 가정하고 있지만 더 잘 아는).

3

C++을 사용하는 경우 인수를 std :: string으로 변환해야합니다. 이것은 경계선 밖으로 나가는 것을 막을 것이고 더 분명합니다.

#include <string> 
#include <iostream> 

int main() 
{ 
    // ... get the arg 
    const char* arg = "myFile.lan"; 
    std::string filenameAsm(arg); 
    filenameAsm = filenameAsm.substr(0, filenameAsm.find_last_of(".")); 
    filenameAsm += ".asm"; 

    std::cout << filenameAsm; // prints myFile.asm 
    return 0; 
} 

이 코드의 기능은 파일 이름 앞에 "." 파일 확장자 구분 기호 (존재하지 않는 경우 전체 파일 이름이 적용됩니다)를 입력하고 원하는 ".asm"확장명을 추가하십시오.

+2

C++ * always *를 사용하는 경우 std :: string을 사용하십시오. – pm100