[TIL]20210926


C


文字列定数に関連付けられます。


  • int main(void){
    
        char *dessert= "apple"; //문자열을 주소이다!!. 주소에 접근한 후 상자를 열어 값을 수정해야하지, 주소 값을 apple, banana로 바꿀려니까 안되지.
       
        printf("%s %p\n",dessert,dessert);
        dessert="banana"; 
        printf("%s %p\n",dessert,dessert); // 문자열은 상수. 포인터로 주소에 접근해서 상자 내부의 값을 변경하는 것이 아니라, 다른 상자 주소를 가리키도록 만드는 것.
    }

  • int main(void){
    
        char str[80]; //char* 을 이용해 칸 수 제한을 없애든지, str[80]등으로 칸 수 제한을 두던지.
        scanf("%s",str); // scanf();는 공백이 없는 연속된 문자열을 입력받음.
        printf("%s\n",str);
        scanf("%s",str);
        printf("%s\n",str);
        // "apple jam" 입력하면
        // apple
        // jam
        // 이렇게 출력됨.
    }
    apple jamと入力すると、バッファは2つの単語を一時的に格納し、scanfはスペース単位で切断されるため、apple万が得られる.その後、scanfからjamを取り出す.

    gets


    スペースまたはタブを入力する必要がある場合は、gets()を使用します.
    int main(void){
    
        char str[80]; //char* 을 이용해 칸 수 제한을 없애든지, str[80]등으로 칸 수 제한을 두던지.
        gets(str);
        printf("%s\n",str);
    }
    入力apple jamで出力できます.
    scanfは、スペース、タブ、enter入力値を/0に変換し、getsはenter入力値のみを/0に変換し、残りは元の値を保持します.

    fgets


    前のscanf、getsはバッファからインポートされた文字列のサイズと宣言された配列のサイズを比較しないため、入力時にメモリ領域が割り当てられていないという問題が発生する可能性があります.このような状況を予防するために、fgetsを使用します.
    fgets(str, sizeof(str), stdin);
    列名、列幅、標準入力順で記入します.
    配列サイズは-1を必要としないため、最後のセルは\0で、入力を受け入れます.
    最後の標準入力はscanfとgetのデフォルトで標準入力が使用されますが、fgetsは入力バッファを選択できます.標準入力をstdinとして使用し、他の入力と同じです.
    fgetsは、企業入力値\n\0に変換した関数とは異なり、開行文字を保存し、最後に上空文字を追加します.したがって、次のように%sの後に文字を作成すると、開いた後に「」が出力されます.これを予防するために、str[strlen(str)-1]='\n';が使用される.strlen(str)の位置は\0で、1つの格子の前は\nなので、-1を加えます.
    int main(void){
    
        char str[80]; //char* 을 이용해 칸 수 제한을 없애든지, str[80]등으로 칸 수 제한을 두던지.
        fgets(str,sizeof(str),stdin);
        str[strlen(str)-1]='\n';
        printf("%s입니다.",str);
    }

    scanf、getchar|get、およびfgetsのバッファ共有の問題と解決策。


    scanf()関数はn(変換子)をインポートせず、最後に0(空文字)を付けます.
    getchar関数もscanfに似ていますか?(彼はよく知らない)
    get()関数はn(変換子)にインポートされ、nを0で置き換えます.
    fgets()関数はn(変換子)にインポートされ、0が付加されます.
    すなわち、scanfおよびgetcharは、バッファに\nを残す.オープンライン文字の前の値をメモリに入力し、\0を追加します.getsまたはfgetsは\nをもたらします.
    この違いが問題を引き起こした.
    scanfまたはgetcharを使用して文字を入力すると、バッファは\nを保持し、次回バッファから値を取得しようとすると、この\nを入力するだけで関数を終了します.
    この問題を解決するために、
    1.
    getchar();
    2.
    scanf("%*c");
    3.
    fgetc(stdin);
    関数を使用します.
    上記のコードは起動方式に少し違いがありますが、最終的にはバッファの前のスペースを取り出して捨てます.

    puts, fputs

    put(str); // 자동 줄 바꿈.
    put(str,stdout); // 줄 바꾸지 않음.

    strcat, strncat


    文字列を後ろにつなぐ.
    char str[80]= "straw";
    strcat(str, "berry"); --> strawberry
    strncat(str, "piece" ,3); --> strawpie
    使用するシナリオは初期化する必要があります.貼り付けるときはあなたの文字の位置をベースにしているからです.

    strcmp, strncmp


    文字列の比較.strcmp(str1, str2);str 1とstr 2が同じ大文字と小文字の場合にのみ、正しい比較が行われます.
    各ビット数を比較し、str 1がstr 2よりも前に現れる場合(Askyコード値が大きい場合)、1を返し、逆に-1を返します.等しい場合は0を返します.

    strcpy関数を作成します。

    char *my_strcpy(char *pd, char *ps);
    
    int main(void){
    
        char str[80]="starwberry";
    
        printf("before : %s\n", str);
        my_strcpy(str,"apple");
        printf("after : %s\n", str);
    
        return 0;
    }
    
    char *my_strcpy(char *pd, char *ps){
        char *po  = pd; //예전 파이썬 알고리즘 할때 공부한 내용. pd는 주소값이 계속 변하기때문에, 초기 메모리 위치를 기억할 친구가 하나 필요.
    
        while(*ps != '\0'){
            *pd=*ps; //배열이 아니기 때문에 문자열 상수가 아님. 그럼으로 내부수정이 가능. *pd로 주소의 상자를 열고 *ps로 다른 상자의 내용물을 그대로 복사.
        pd++;
        ps++;
    
        }
        *pd='\0'; 
        return po;
    }