programing

argv의 문자열을 수정할 수 있습니까?

codeshow 2023. 10. 19. 22:54
반응형

argv의 문자열을 수정할 수 있습니까?

저는 방금 C에서 명령 줄 인수를 읽는 작은 프로그램을 작성했는데, 너무 어려운 것은 아닙니다.매개 변수의 첫 번째 문자를 대문자로 바꾸는 등 수정 작업도 진행 중이었습니다.

문자열 리터럴은 정의되지 않은 동작을 일으킬 수 있기 때문에 수정하면 안 된다는 것을 알고 있습니다. 그래서 문자열이 정의되지 않은 것인지 궁금했습니다.*argv[]변해서는 안 되는 문자입니다.

int main(int argc, char *argv[])

C11 표준 초안 N1570, §5.1.2.2.1/2:

매개변수들은argc그리고.argv그리고 그들이 가리키는 끈들은argv배열은 프로그램에 의해 수정 가능해야 하며, 프로그램 시작과 프로그램 종료 사이에 최종 stored 값을 유지해야 합니다.

수정 가능합니다.그것은 그들이 현악기를 사용하는 문자가 아니라는 것을 의미합니다.

그러나 주의하십시오. 상위 인용은 문자열에 대한 포인터만을 의미하며, 다음의 null 포인터는 의무적으로 제외됩니다.argv[argc]1.
C11 표준 초안 N1570부터 §5.1.2.2.1/2(위와 동일):

argv[argc]null 포인터여야 합니다.


주의:

  • 이 문장과 관련된 것:

    문자열 리터럴을 수정하면 정의되지 않은 동작이 발생할 수 있으므로 수정하면 안 된다는 것을 알고 있습니다 [...]

    "할 수 있다"고요? 항상 그래요.정의되지 않은 동작에는 잘 정의된 것처럼 예상되는 동작과 예상치 못한 동작이 포함됩니다.


1 @black 감사합니다!

문자열을 지원하는 배열은argv수정할 수 있습니다.
하지만 그들의 크기를 알 방법이 없습니다.

현의 크기를 늘리는 코드를 보면 눈살이 찌푸려집니다.

#include <stdio.h>
#include <string.h>
// this program may behave erraticaly
int main(int argc, char **argv) {
    for (int k = 1; k < argc; k++) {
        printf("original argv[%d] is %s\n", k, argv[k]);
    }
    printf("\n");
    for (int k = 1; k < argc; k++) {
        strcat(argv[k], " foo"); // add foo to each argv string
        printf("first modification to argv[%d] is %s\n", k, argv[k]);
    }
    printf("\n");
    for (int k = argc; k > 1; k--) {
        strcat(argv[k - 1], " bar"); // add bar to each argv string
        printf("final argv[%d] is %s\n", k - 1, argv[k - 1]);
    }
    return 0;
}

내 기계에서, 그 프로그램을 호출하는 것은one two three인수가 생산합니다.

argv[1] 원본은 1입니다.원래 argv[2]는 2입니다.원래 argv[3]는 3입니다.
argv[1]에 대한 첫 번째 수정은 하나의 foo입니다.argv[2]로의 첫 번째 수정은 foo foo입니다.argv[3]의 첫 번째 수정은 foo foo입니다.
final argv[3]는 foo foo bar 입니다.final argv[2]는 foo foo bar bar 입니다.final argv[1]는 one foot foo bar bar bar입니다.

언급URL : https://stackoverflow.com/questions/35102922/are-the-strings-in-argv-modifiable

반응형