Не уверен, почему вам нужно использовать scanf, а Грег уже рассказывал, как. Но вы можете использовать вектор вместо обычного строкового массива.
Вот пример использования вектора, который также использует scanf (с C ++ 0x на основе диапазона для циклов):
#include <string>
#include <vector>
#include <cstdio>
using namespace std;
int main() {
vector<vector<string>> v(20, vector<string>(5, string(101, '\0')));
for (auto& row: v) {
for (auto& col: row) {
scanf("%100s", &col[0]);
col.resize(col.find('\0'));
}
}
}
Но это предполагает, что вы хотите заполнить все элементы в порядке ввода от пользователя, что отличается от вашего примера.
Кроме того, getline (cin, some_string), если часто намного лучше, чем cin >> или scanf (), в зависимости от того, что вы хотите сделать.