2

私は char* を受け取り、それを「スローモーション」で出力する小さな関数を C で書いています。

私のコードは次のとおりです。

void funnyprint(char* string)
{
  int i=0;
  int len=strlen(string);
  if(len==0)
    return;
  int k=0;
  char temp[1];
  temp[0]=string[k];
  for(i=0; i<7142800*len; i++)
  {  
    fflush(stdout);
    if((i!=0) && (i%7142800==0))
    {
      printf(temp);
      k++;
      if(k<len)
           temp[0]=string[k];
    }
  }
}

さて、問題は文字列を出力せず、部分的に私の char* を与え、部分的に意味不明なものを代わりに与えることです。

問題はメモリにあることがわかったので、「string」を「new」と呼ばれる新しいchar *にコピーしてみました。私はそのコードを手に入れました:

void funnyprint(char* string)
{
  int i=0;
  int len=strlen(string);
  if(len==0)
    return;
  int k=0;
  char temp[1];
  char * new=malloc(len*sizeof(char));
  strncpy(new,string,len);
  temp[0]=new[k];
  for(i=0; i<7142800*len; i++)
  {  
    fflush(stdout);
    if((i!=0) && (i%7142800==0))
    {
      printf(temp);
      k++;
      if(k<len)
           temp[0]=new[k];
    }
  }
}

それでも結果は変わりませんでした。ここで小さな問題が欠けていると感じています。誰かが私を啓発してくれればとてもうれしいです。

ありがとう!

4

2 に答える 2

2
printf(temp);

あなたの一時配列はnullで終了していないため、奇妙な(未定義の)動作です。ここでは char 配列の必要性がわかりません。単一の文字にする必要があります。

char temp = string[k];

そしてその後

printf("%c", temp);
于 2013-05-19T11:16:58.080 に答える
1

整数にも注意してiください.32ビットのsigned intの場合、約300文字後にオーバーフローします。カウンターとして unsigned (32 ビット) int を使用すると、600 に戻りますが、使用しているプラ​​ットフォームやオペレーティング システムに応じて、代わりに sleep()、nanosleep()、または同様の関数を使用することをお勧めします。

于 2013-05-19T11:33:43.730 に答える