포인터 관련 기초 질문입니다.

jmonaco88의 이미지

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
 
void string_up(char *p);
 
int main(int argc, char *argv[])
{
        if(argc != 2){
                printf("try again\n");
                exit(1);
        }
 
        string_up(argv[1]);
 
        printf("%s\n", *argv[1] );
 
        return 0;
}
 
void string_up(char *p)
{
        *p = toupper(*p);
}

argv 매개변수 공부중이라서요 효율적이지는 않은 코드지만 꼭 사용할려고합니다.

argv[1]에 들어온 매개변수를 toupper함수 이용해서 대문자로 만들어준뒤에

출력해주는 내용인데요

단순하게 알아보기쉽게 만들어놨는데 core dumped 오류뜨네요... 흠... 조언좀 주세요 ㅠㅠ

jick의 이미지

(1) Warning 다 켜고 컴파일하세요. (gcc라면 -W -Wall)
(2) *argv[1]의 타입이 무엇일까요?

그리고 문자열의 첫 글자만 대문자로 만들면 되는 건가요?

jmonaco88의 이미지

모두다 대문자로 만들어야합니다 ^^

HDNua의 이미지

1. 다음 두 문장 중 런타임 에러가 일어나는 것은 무엇일까요?

#include <stdio.h>
 
int main(void)
{
    char *str1 = "Hello";
    char str2[] = "Hello";
 
    str1[0] = 'h';    // 런타임 에러
    str2[0] = 'h';    // 에러 없음
 
    return 0;
}

답은 str1인데, str2가 내용을 변경할 수 있는 문자열인 데 비해 str1은 그 내용을 변경할 수 없는 상수형 문자열이기 때문입니다.

2. 다음 중 문자열은 무엇입니까?

#include <stdio.h>
#define ROW     3
#define COL     4
 
int main(void)
{
    char *arr1[] = {"Hello", "world"};  // 문자열 배열을 초기화하는 방법
    char arr2[ROW][COL] = {"Hello", "world"};
 
    puts(arr1);         // char * [2]
    puts(*arr1);        // char *
    puts(arr1[0]);      // char *
    puts(arr1+1);       // char **
    puts(*(arr1+1));    // char *
    puts(**arr1);       // char
 
    puts(arr2);         // char (*)[2]
    puts(*arr2);        // char *
    puts(arr2[0]);      // char *
    puts(arr2+1);       // char **
    puts(*(arr2+1));    // char *
    puts(**arr2);       // char
 
    return 0;
}

이는 문자열 부분을 다시 공부해보시면 아실 수 있습니다.

3. 다음 중 런타임 에러가 발생하는 코드는 무엇입니까?

#include <stdio.h>
 
int main(void)
{
    char *arr1[2] = {"Hello", "world"};
    char arr2[2][6] = {"Hello", "world"};
 
    puts(arr1[0]);
    puts(arr2[0]);
 
    arr1[0][0] = 'h';   // 상수형 문자열을 변경중... 런타임 에러!
    arr2[0][0] = 'h';   // 내용 변경 가능한 문자열을 변경중... 에러 없음
 
    puts(arr1[0]);
    puts(arr2[0]);
 
    return 0;
}

arr2는 내용 변경이 가능한 문자열로 배열을 초기화하고 있는 반면, arr1은 문자열 상수로 초기화하고 있습니다.

4. 종합.

#include <stdio.h>
 
int main(int argc, char* argv[])
{
    // 문자열 상수의 내용을 변경... 런타임 에러!
    argv[1][0] = 'h';
 
    puts(argv[1]);
 
    return 0;
}

이렇게 된 것이지요.

-----
그런데 main 함수의 매개 변수로 넘겨줄 때 두 번째 인자의 타입은 반드시 char **이어야 합니다.
char argv[5][5];와 같은 타입으로 변경할 수가 없지요(이 때 argv는 char (*)[5] 타입이며 이는 char **와는 분명히 다릅니다.).
따라서 위처럼 만드시겠다면, argv[] 문자열을 복사한 후 이 문자열을 수정하는 방법으로 진행하셔야 합니다.

다 써놓고 다시 보니.. "내용 변경이 가능한 문자열로 초기화"라는 문장은 꼭 원래부터 변경이 가능했던 문자열을 대입한다는 말처럼 들리는군요.
배열로 초기화했기 때문에 내용 변경이 가능하다는 설명이 옳습니다.

저는 이렇게 생각했습니다.

jmonaco88의 이미지

흠 그럼... 내용 변경이 가능한 문자열로 초기화 한후에

그 문자열을 toupper이용해서 올려준후에 그걸 출력하게 해야겠군요???

흠.... 아직 모르는게 너무많네요 저는 ㅋㅋ

HDNua의 이미지

Q. argv로 받은 문자는 바로 초기화가 불가능하다는 소리인가요??
A. 프로그램 prog를 다음과 같이 실행하는 상황이라고 생각해보면,
$ prog test1.txt test2.txt
main 함수의 인자 argc와 argv는 각각 다음과 같이 초기화된 것과 사실상 같습니다.
int argc = 3;
char* argv[] = {"prog", "test1.txt", "test2.txt"};
솔직히 질문 자체가 이해가 안 갑니다.

Q. 내용 변경이 가능한 문자열로 초기화 한후에 그 문자열을 toupper이용해서 올려준후에 그걸 출력하게 해야겠군요???
A. char tmp[BUF_MAX]; strcpy(tmp, argv

    ); 한 다음 tmp를 쓰겠다고 하시는 거라면 옳습니다.
    "내용 변경이 가능한 문자열로 초기화한다"라는 말은 좀 거슬리니 "임시 배열을 만들고 문자열을 복사한다"라고 말하는 게 좀 더 좋을 것 같습니다.

    저는 이렇게 생각했습니다.

    jmonaco88의 이미지

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
     
    void string_up(char *p);
     
    int main(int argc, char *argv[])
    {
     
            char str[80];
     
            if(argc != 2){
                    printf("try again\n");
                    exit(1);
            }
     
            strcpy(str, argv[1]);
            string_up(str);
     
            printf("%s\n", str);
     
            return 0;
    }
     
    void string_up(char *p)
    {
            while(*p)
                    *p++ = toupper(*p);
    }

    코드를 이런식으로 수정했습니다 ㅎ
    많은 도움 주신 두분께 감사드립니다 ㅎㅎ

    댓글 달기

    Filtered HTML

    • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
    • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
    • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
    • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

    BBCode

    • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
    • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
    • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
    • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

    Textile

    • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
    • You can use Textile markup to format text.
    • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

    Markdown

    • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
    • Quick Tips:
      • Two or more spaces at a line's end = Line break
      • Double returns = Paragraph
      • *Single asterisks* or _single underscores_ = Emphasis
      • **Double** or __double__ = Strong
      • This is [a link](http://the.link.example.com "The optional title text")
      For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
    • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
    • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

    Plain text

    • HTML 태그를 사용할 수 없습니다.
    • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
    • 줄과 단락은 자동으로 분리됩니다.
    댓글 첨부 파일
    이 댓글에 이미지나 파일을 업로드 합니다.
    파일 크기는 8 MB보다 작아야 합니다.
    허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
    CAPTCHA
    이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.