-2

i=(strlen(data));このプログラムは、メッセージが表示された時点でクラッシュします

「strlen()」のソースはありません

しかし、なぜ?

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


int main (void) { 
    char data[]="Hallo";
    char buffer[100];
    if (strlen(data)!=0)
    {
        size_t i=0;
        i=(strlen(data));
        snprintf(buffer,i,"Data: %s \n",data);
        return strlen(data)+1;
    }
    return -1;
}
4

3 に答える 3

5

あなたが引用するエラーメッセージはクラッシュのようには聞こえません。システムライブラリ関数にステップインしようとするデバッガのようなものです。

于 2012-09-11T14:59:16.053 に答える
1

問題の原因は

snprintf(buffer,i,"Data: %s \n",data);

これiが「バッファサイズ」です。iの長さでもありdataます。したがって、バッファサイズよりも長い文字列をバッファに書き込んでいます。その結果snprintf()、出力が切り捨てられるため、文字列全体dataが書き込まれるわけではありません。

実際、は6文字の長さで、 (5)Data:よりも長くなっています。iそれで、おそらく何が起こっているのかというと、snprintfは%s変更されたものを決して利用せず、それがどういうわけかスタックを壊してしまうのでしょうか?

に置き換えiてみて、sizeof(buffer)それがうまくいくかどうかを確認してください。

于 2012-09-11T14:46:28.710 に答える
0

このプログラムをEclipseで実行したところ、正常に動作します。コードを1行ずつステップ実行しているように聞こえます。strlen電話に出たら、「ステップオーバー」(F6)ではなく「ステップイン」(F5)を実行します。そのため、Eclipseはデバッグを試みていstrlenます。

いずれにせよ、これはEclipseの問題でありEclipse、質問にタグを追加することをお勧めします。

于 2012-09-11T15:17:30.533 に答える