Почему в этом коде ошибка сегментации?

0

Я хочу сравнить две строки чисел, чтобы подсчитать каждое вхождение одной цифры

#include <cstdlib>
#include <iostream>
using namespace std;
void function(string number1, string number2)
{
   int taille = number1.size();
   int tab[]={0,0,0,0,0,0,0,0,0,0};
   int chiffre=0;

   for (int i=0; i<taille;i++) {
       for (int j=0;j<taille;j++){
           if (number1[i]==number2[j])
           {
              cout <<  "chiffre " <<number1[i]<< endl;
              chiffre = number1[i];
              tab[chiffre]++; 
           }
        }
   }

   for (int i=0; i<10;i++) {
       if (tab[i]!=0)
       cout << "index " << i<< " value "<<  tab[i]<< endl;
   }

}

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

     string number1 = "5143436111";
     string number2 = "4501234567";
    function(number1,number2);
    cout << "Press the enter key to continue ...";
    cin.get();
    return EXIT_SUCCESS;
}

Строка с вкладкой [chiffre] ++; похоже, сбой программы. Пожалуйста, объясните мне, почему

  • 1
    Пожалуйста, используйте отладчик!
  • 0
    Спасибо всем, проблема решена
Показать ещё 1 комментарий
Теги:
segmentation-fault

5 ответов

2
Лучший ответ

Тебе нужно:

chiffre = number1[i]-'0';

Кроме того, у вас есть следующее:

   int taille = number1.size();

Но что, если число1 и номер2 имеют разные размеры? Тогда ваш внутренний цикл (например, for (int j=0;j<taille;j++) может индексироваться из числа 2, если number2 меньше числа 1, или он не будет достаточно циклы, если число2 больше числа 1.

1

Когда вы используете tab ["5"], вы используете значение ascii 5, которое равно 53, выходящее из 10 привязки. Вам нужно указать значение ascii или использовать вкладку [chiffre-48] 48 is'0 'в ascii

1

Проблема в этой строке:

chiffre = number1[i];

Когда вы назначаете номер chiffre, он не будет назначать его как число (от 0 до 9), а как код ASCII (от "0" до "9").

Вы можете преобразовать его в число, используя это:

chiffre = number1[i] - '0';
1

в этой строке:

chiffre = number1[i];

вы преобразовываете символ (например, "5") в целое число. Должен быть:

chiffre = number1[i] - '0';

Я не знаю, что вы хотите получить точно, но я полагаю, вы хотите сравнить только первое число в номере1 с первым номером2 и что вы предполагаете два числа одинаковой длины? В этом случае ваш цикл должен стать следующим:

if (number1.size() == number2.size()){
    for (int i=0; i<taille;i++) {
           if (number1[i]==number2[i])
           {
              cout <<  "chiffre " <<number1[i]<< endl;
              chiffre = number1[i] - '0';
              tab[chiffre]++; 
           }
       }
   }
  • 2
    Хотя общая идея atoi() , atoi() ожидает строку, а не символ.
  • 0
    спасибо за замечание, я изменил это
1

number1[i] содержит некоторый символ, например, '5'. Его код ASCII равен 53. В массиве нет 53 элементов.

Поэтому измените это утверждение

          chiffre = number1[i];

в

          chiffre = number1[i] - '0';

Также ваш алгоритм работает неправильно. Например, если число 1 равно "55" а число 2 равно 45 тогда ваш алгоритм печатает цифру 5, содержащуюся в номере2 два раза.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню