2017-07-20 18 views
-1

こんにちは私はCを使用して文字列に位置Nで文字列を挿入しようとしています。だから私はうまく機能する機能を開発しましたが、その問題はその作業が一度です。 これは私のコードです:関数は一度だけ実行しますC

char *substring(char *string, int position, int length) 
{ 
    char *pointer; 
    int c; 

    pointer = (char*) malloc(length+1); 

    if(pointer == NULL) 
     exit(EXIT_FAILURE); 

    for(c = 0 ; c < length ; c++) 
     *(pointer+c) = *((string+position-1)+c); 

    *(pointer+c) = '\0'; 

    return pointer; 
} 
void insert_substring(char *a, char *b, int position) 
{ 
    char *f, *e; 
    int length; 

    length = strlen(a); 

    f = substring(a, 1, position - 1); 
    e = substring(a, position, length-position+1); 

    strcpy(a, ""); 
    strcat(a, f); 
    free(f); 
    strcat(a, b); 
    strcat(a, e); 
    free(e); 

} 


int main(void) { 



char username[UNLEN+1]; 
DWORD username_len = UNLEN+1; 
GetUserName(username, &username_len); 


char msg1 [] ="Good morning mr "; 

char msg2 [] ="Good evening mr "; 

insert_substring(msg1,username,17); 
printf("%s\n",msg1); 
insert_substring(msg2,username,17); 

printf("%s\n",msg2); 



    return 0; 
} 

プログラムディスプレイ1メッセージ:

おはようMR XXXXXプログラムは後に任意の命令を実行していないことを私が発言何

、 insert_substringの2回目の呼び出し。エラーは表示されません。たぶんローカル変数の問題です。関数で使用されます

+0

'UNLEN'は何ですか? –

+5

配列 'msg1'と' msg2'は、あなたが初期化した文字列(もちろん終端文字も含む)に合う大きさです。これらの配列に追加しようとすると、* out of bounds *が書き出され、*未定義の動作*につながります。 –

+1

Hmm確かに17は_length_と同じですか? – chux

答えて

0

コードを見ると、Win32 API関数を呼び出して現在のユーザーのユーザー名を取得し、時刻に基づいて挨拶メッセージを出力しようとしているようですまだこの部分を実装する)。

2つのヌル終了文字列を連結する場合、ターゲットバッファに連結する2つの文字列を保持するのに十分な領域があることを確認する必要があります。

あなたの場合、UNLENマクロを使用して、ユーザー名を保持するために必要な最大容量をすでに知っています。

したがって、サイズがsizeof(msg1) + UNLENのバッファをmallocを介して割り当てることができます。このような何か:

char *target_msg1 = (char *)malloc(sizeof(msg1) + UNLEN); 

あなたもGetUserNamelpnSizeパラメータを使用し、できるだけ少ないスペースを割り当てるが、あなたはWin32プログラミングを行っているので、私は、メモリのカップルのバイトは懸念の多くではないと思うことができます。

あなたのコードは次のように変更します

strcpy(target_msg1, msg1); 
insert_substring(target_msg1,username,17); 
printf("%s\n",target_msg1); 
+0

問題は大きな長さのストリングの操作です。 IMyプログラムには、30を超える長さの8つ以上の文字列が含まれています。そして、私はそれらを表示したい。それは誤った値を表示する。 2番目のコメントを見てください。 – Amine

+0

バッファに十分なスペースがある限り、文字列の長さは無関係です。 – m0h4mm4d

関連する問題