1

私のプログラムでは、ある時点で を作成しscanf(" %d %d", &num1, &num2);、SegmentationFault を取得し続けます。理由がわかりません.つまりint.. それらにメモリを割り当てる必要があるかどうかはわかりません。これは完全なコードです。

typedef struct my_type{
   int attr1;
   bool attr2;
} my_type;

int main (int argc, char * const argv[]) {

    int testCase, result, totalDom, numLines, num1, num2; 
    int aux_map_int = 0, linesScanned = 0;
    bool firstTime;
    scanf("%d\n %d %d", &testCase, &totalDom, &numLines);
    printf("totalDom: %d; numLines: %d\n", totalDom, numLines);

    std::map<int, std::vector<my_type> > my_map;

    while(aux_map_int < testCase+1){
        std::vector<my_type> my_vector;
        firstTime=true;

        while (linesScanned < numLines) {

            std::cin>>num_dom>>num_next_dom; /** SEGFAULT **/


            if(firstTime){
                my_vector[0].attr1 = num1;
                my_vector[0].attr2 = true;
                firstTime=false;
            }

            my_vector[num1].attr1 = num2;
            my_vector[num1].attr2 = false;

            linesScanned++;
        }
        aux_map_int++;
        my_map.insert(std::pair<int, std::vector<my_type> >(aux_map_int, my_vector));
    }
}
4

3 に答える 3

5

%d は int へのポインターを想定しています。あなた自身の言葉によると、ポインタを double に渡しています。

于 2013-03-13T19:51:41.873 に答える
2

更新: セグメンテーション違反は scanf が原因ではなく、無限 while ループ内のベクトルに要素を挿入しているためです。aux_map_int がインクリメントされているかどうかを確認してください:)

 std::cin>>num_dom>>num_next_dom; /** SEGFAULT **/

私はその行が読むべきだと仮定するつもりです

 std::cin>>num1>>num2; /** SEGFAULT **/

その場合、内側の while ループで my_vector に挿入しようとすると、segfault が発生します。

        if(firstTime){
            my_vector[0].attr1 = num1;
            my_vector[0].attr2 = true;
            firstTime=false;
        }

        my_vector[num1].attr1 = num2;
        my_vector[num1].attr2 = false;

その時点までは、ベクターに何も挿入しておらず、ベクターから読み取ろうとしています。これもセグメンテーション違反になるコードです

#include <vector>

typedef struct my_type{
   int attr1;
   bool attr2;
} my_type;

int main (int argc, char * const argv[]) 
{
    std::vector<my_type> v;
    v[0].attr1 = 1;
    v[0].attr1 = true;
}

上記のコードを修正すると、問題を修正する方法がわかります。申し訳ありませんが、私はあなたに答えを与えることができません:)

また、std::cin で scanf を使用している特定の理由はありますか? 答えが「いいえ」の場合は、代わりにこれを使用します。

#include <iostream>
....
std::cin>>num1>>num2; 

通常の scanf の手間をかけずに、同様に機能します。

scanf を使用する必要がある場合は、そのドキュメントを参照してください。問題は、正しい書式指定子を使用していないことです。それが何であるかを説明するだけでなく、自分で読んでください

投稿したコードから、scanf を使用している理由は、空白を処理するためのようです。この場合は、std::cin を使用してください。空白の問題は過去のものです。

于 2013-03-13T19:55:06.130 に答える
0

as @Tomek says. %d for int. %f for float Try this:

double num1, num2;
char str[128];
scanf("%f %f", &num1, &num2);
于 2013-03-13T19:58:31.923 に答える