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 的指针。根据您自己的话,您正在传递指向双打的指针。

于 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 时会出现段错误:

        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

正如@Tomek 所说。%d 代表整数。%f for float 试试这个:

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