0

を使用して、C に関するいくつかの基本的なチュートリアルを実行していCode::Blocksます。

誰かが次のコードで私を助けてくれますか? ビルドはしますが、実行するとクラッシュします。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX_LEN 40

main()
{
   int pos;
   char *line,*aster,*blank;

   line=(char *)malloc(MAX_LEN);
   aster=(char *)malloc(1);
   blank=(char *)malloc(1);
   line="                                        ";
   aster="*";
   blank="";

   printf("Enter position of star (1-40): ");
   scanf("%d",&pos);

   if(pos>0&&pos<41)
   {
       printf("\n");
       printf("         1         2         3         4\n");
       printf("1234567890123456789012345678901234567890\n");
       puts(strcat(strncat(blank,line,pos-1),aster));
   }
   else
    printf("Out of range");
}

問題はコードの strcat 行にあるようですが、ポインターの使用を推測しますか?

4

1 に答える 1

0

問題は、blankフィールドに 1 文字分のスペースが用意されているのに、最大 40 文字が必要なことです。strcatまたはを使用する場合strncat、デスティネーション バッファ (いずれかの関数の最初の引数) は、連結された文字列と終了\0文字に十分なスペースを提供する必要があります。

あなたがしたいことは次のようなものです

line = "                                        ";
blank = malloc(MAX_LEN+1); /* 40 characters + terminating '\0' */
blank[0] = 0; /* Needed for strcat to work */
[...]
puts(strcat(strncat(blank, line, pos-1), aster));

別の注意: と を使用するlineaster、メモリ リークが発生します。で割り当てられたメモリmallocをスペースで埋めたい場合は、 を使用する必要があります。memset文字列リテラルを割り当てたい場合は、まったく使用mallocしないでください。実際に行うことは、 によって返されるポインターを上書きすることですmalloc

于 2013-04-14T18:06:38.723 に答える