sscanf_s не может найти все значения из строки

#c #string #visual-c #format #scanf

#c #строка #visual-c #формат #scanf

Вопрос:

Я хочу проанализировать целые числа из строки текста, которая выглядит как:

 "f 1/2/3 4/5/6 7/8/9"
  

в:

 int arr1[3] = { 1, 4, 7 };
int arr2[3] = { 2, 5, 8 };
int arr3[3] = { 3, 6, 9 };
  

Я написал следующий код для sscanf_s синтаксического анализа в соответствии с общим форматом строк:

 // line = "f 1/2/3 4/5/6 7/8/9"
int arr1[3], arr2[3], arr3[3];

sscanf_s(line.c_str(), "f %d/%d/%d %d/%d/%d %d/%d/%d",
    amp;arr1[0], amp;arr2[0], amp;arr3[0],
    amp;arr1[1], amp;arr2[1], amp;arr3[1],
    amp;arr1[2], amp;arr2[2], amp;arr3[2]);
  

Как ни странно, содержимое моих массивов после запуска этого кода:

 arr1 = { 4, 7, -858993460 };
arr2 = { 5, 8, -858993460 };
arr3 = { 6, 9, -858993460 };
  

Это какой-то странный результат, он почти как будто правильно загружает данные, но затем сдвигает массивы влево на единицу. Как ни странно, sscanf_s возвращает 9 , что указывает на то, что он нашел 9 совпадений, используя формат, который я передал. Я пытался найти ошибку, но я действительно не вижу, что код делает неправильно.

Ответ №1:

Только что скомпилировал этот код:

 #include <iostream>
#include <cstdio>

using namespace std;

int arr1[3], arr2[3], arr3[3];

int main()
{
    std::string line = "f 1/2/3 4/5/6 7/8/9";
    sscanf_s(line.c_str(), "f %d/%d/%d %d/%d/%d %d/%d/%d",
        amp;arr1[0], amp;arr2[0], amp;arr3[0],
        amp;arr1[1], amp;arr2[1], amp;arr3[1],
        amp;arr1[2], amp;arr2[2], amp;arr3[2]);

    std::cout << "arr1 : " << arr1[0] << ", " << arr1[1] << ", " << arr1[2] << std::endl;
    std::cout << "arr2 : " << arr2[0] << ", " << arr2[1] << ", " << arr2[2] << std::endl;
    std::cout << "arr3 : " << arr3[0] << ", " << arr3[1] << ", " << arr3[2] << std::endl;
}
  

И это работает нормально.

Комментарии:

1. Я перестроил все решение VS, и, похоже, теперь оно работает нормально… На самом деле понятия не имею, почему раньше он работал некорректно. Тем не менее, спасибо за ваш ответ.