는 인수가 문자 *입니다Char *를 Char * 끝에서 제거하려면 어떻게합니까?
예 : 나는 "(LAN을이의 char *의 마지막 3 자리 숫자를 제거해야 myFile.lan
") 그리고"asm "(예 : myFile.asm)으로 변경하십시오.
strcpy
을 통해 char 포인터에 char을 추가하는 것이 정말 쉬운 것처럼 보이지만 char 포인터에서 chars를 제거 할 수있는 방법을 알고있는 사람이 있습니까?
는 인수가 문자 *입니다Char *를 Char * 끝에서 제거하려면 어떻게합니까?
예 : 나는 "(LAN을이의 char *의 마지막 3 자리 숫자를 제거해야 myFile.lan
") 그리고"asm "(예 : myFile.asm)으로 변경하십시오.
strcpy
을 통해 char 포인터에 char을 추가하는 것이 정말 쉬운 것처럼 보이지만 char 포인터에서 chars를 제거 할 수있는 방법을 알고있는 사람이 있습니까?
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
char *
으로 작업하는 것은 기본 'C'입니다. 메모리 공간에 무엇이든 쓸 수 있지만 할당 된 공간의 끝을지나 가지 않도록주의하십시오.
char *
문자열은 모두 null 바이트 \0
으로 끝납니다. 따라서 자르려면 \0
을 적절한 위치에 놓습니다.
한편, 문자를 덮어 쓰려면 배열 구문을 사용하십시오. 예 : 문자열의 길이가 10이고 마지막 문자를 변경하려는 경우 c_string[9] = 'X';
은 해당 문자를 X
으로 변경합니다.
문자열이 C로 끝나는 방법을 알아야합니다. 문자열 길이는 \0
문자의 첫 번째 항목에 의해 결정됩니다. 따라서이 문자를 뒤로 이동하면 문자열이 짧아집니다. 그래서 당신은 아마 도트의 첫 번째 위치에 대한 문자열을 검색하고 \0
이이 점을 바꿀 (이것은 문자열 입력이 어떻게 보이는지에 따라 달라집니다. 나는 항상 어딘가에 점이있는 파일 이름이라고 가정하고 있지만 더 잘 아는).
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"확장명을 추가하십시오.
C++ * always *를 사용하는 경우 std :: string을 사용하십시오. – pm100
당신은 그들을 덮어'strcpy'를 사용할 수 있습니다. 비록 당신이 덮어 쓰고있는 적어도 3 자릿수가 없다면 이것이 작동하지 않을 것이므로 조심하십시오. 작동시키지 못하면 시도한 코드를 게시하십시오. –
'나는 이것들이 매우 단순 해 보인다 '라는 것을 알고있다. 전문 프로그래머에 의한 많은 버그는 원시 C 문자열과'char *'를 사용하여 이러한 "슈퍼 단순"한 일을하는 것을 막는다. 그것이 C++에'std :: string'이있는 이유입니다 ... – PaulMcKenzie
strstr()을 사용하면 검색 문자열의 시작 부분을 찾을 수 있습니다 (* I *는 '.'을 검색 한 다음 끝 문자열을 찾기 위해 한 단계 건너 뜁니다.) 우리는 '.'다음에 항상 3 문자가 있다고 가정하고 '.'다음에 나오는 첫 번째 문자를 '\ 0'으로 설정하여 후행 문자를 바꾸고 strcat (원래 문자열 "asm")을 사용합니다. – user3629249