web-dev-qa-db-ja.com

ポインターを使用して文字列をコピーする方法

文字列定数をコピーするために書いたプログラムを次に示します。

プログラムを実行するとクラッシュします。なんでこんなことが起こっているの ?

#include <stdio.h>

char *alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char c;
char *l;

main(){
   while((c = *alpha++)!='\0')
       *l++ = *alpha;
   printf("%s\n",l);
}
15
Arabeka

Cで文字列をコピーするには、strcpyを使用できます。以下に例を示します。

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

const char * my_str = "Content";
char * my_copy;
my_copy = malloc(sizeof(char) * (strlen(my_str) + 1));
strcpy(my_copy,my_str);

偶発的なバッファオーバーフローを回避する場合は、strncpyの代わりにstrcpyを使用します。例えば:

const char * my_str = "Content";
const size_t len_my_str = strlen(my_str) + 1;
char * my_copy = malloc(len_my_str);
strncpy(my_copy, my_str, len_my_str);
18
Vitor Villar

そのような手動コピーを実行するには:

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

int main()
{
    char* orig_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char* ptr = orig_str;

    // Memory layout for orig_str:
    // ------------------------------------------------------------------------
    // |0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|  --> indices
    // ------------------------------------------------------------------------
    // |A|B|C|D|E|F|G|H|I|J|K |L |M |N |O |P |Q |R |S |T |U |V |W |X |Y |Z |\0|  --> data
    // ------------------------------------------------------------------------

    int orig_str_size = 0;
    char* bkup_copy = NULL;

    // Count the number of characters in the original string
    while (*ptr++ != '\0')
        orig_str_size++;        

    printf("Size of the original string: %d\n", orig_str_size);

    /* Dynamically allocate space for the backup copy */ 

    // Why orig_str_size plus 1? We add +1 to account for the mandatory 
    // '\0' at the end of the string.
    bkup_copy = (char*) malloc((orig_str_size+1) * sizeof(char));

    // Place the '\0' character at the end of the backup string.
    bkup_copy[orig_str_size] = '\0'; 

    // Current memory layout for bkup_copy:
    // ------------------------------------------------------------------------
    // |0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|  --> indices
    // ------------------------------------------------------------------------
    // | | | | | | | | | | |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |\0|  --> data
    // ------------------------------------------------------------------------

    /* Finally, copy the characters from one string to the other */ 

    // Remember to reset the helper pointer so it points to the beginning 
    // of the original string!
    ptr = &orig_str[0]; 
    int idx = 0;
    while (*ptr != '\0')
        bkup_copy[idx++] = *ptr++;

    printf("Original String: %s\n", orig_str);   
    printf("Backup String: %s\n", bkup_copy);

    return 0;
}
17
karlphillip

lにスペースを割り当てる必要があります。現在、メモリ内のランダムなスポットを指しているため、そのスポットに書き込もうとすると、オペレーティングシステムがアプリケーションをシャットダウン(クラッシュ)する可能性があります。コードをそのまま使用したい場合は、lmalloc()でスペースを割り当てるか、"ABCDEFGHIJKLMNOPQRSTUVWXYZ"とNULLターミネータを保持するのに十分なスペースを持つ文字配列としてlを作成します。

ポインターの入門書については、 http://cslibrary.stanford.edu/106/ を参照してください。

3
lreeder

文字列「定数/リテラル​​/ポインター」をコピー

_char *str = "some string thats not malloc'd";
char *tmp = NULL; 
int i = 0; 
for (i = 0; i < 6; i++) {
    tmp = &str[i];
}
printf("%s\n", tmp);
_

反転

_char *str = "some stupid string"; 
char *tmp, *ptr = NULL; 
ptr = str;
while (*str) { ++str; } 
int len = str - ptr;
int i = 0;
for (i = len; i > 11; i--) {
    tmp = &ptr[i];
} 
printf("%s\n", tmp); 
_

_tmp = &blah[i]_はtmp = &(*(blah + i))と交換できます。

0
user5062183

以下のコードを直接実行できます。

char *alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char *l = alpha;

コードが以下の場合:

const char *alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const char *l = alpha;

:)

0

cpy関数は2つのcharポインターを取り、srcポインターはmain関数で定義されたsrc(char配列)の初期文字を指し、desポインターが同じで定義されたdes(char配列)の初期位置を指しますメイン関数とsrcポインターのwhileループ値は、desポインターに値を割り当て、次の要素へのポインターをインクリメントします。これは、whileループがnullに遭遇し、ループから出てdesポインターが単純にnullを割り当てるまで発生しますすべての値を取得します。

#include<stdio.h>
void cpy(char *src,char *des)
{
     while(*(des++) = *(src++));
     *des = '\0';
}

int main()
{
     char src[100];
     char des[100];
     gets(src);
     cpy(src,des);
     printf("%s",des);
}

出力: 画像

0
Shadab Eqbal
#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 256
int main(void) {
    char *original, *copy, *start; //three character pointers
    original = malloc(sizeof(char) * MAX_LENGTH); //assigning memory for strings is good practice
    gets(original); //get original string from input
    copy = malloc(sizeof(char) * (strlen(original)+1)); //+1 for \0

    start = copy;
    while((*original)!='\0')
       *copy++ = *original++;
    *copy = '\0';
    copy = start;

    printf("The copy of input string is \"%s\".",copy);
    return 0;
}
0
Shail