как пользовательский ввод может быть одномерным из многомерного? - PullRequest
0 голосов
/ 04 июля 2018

Ненормальное поведение функции scanf().

#include<bits/stdc++.h>
using namespace std;

char c[100][100];
int main()
{
    for(int i=1;i<=10;++i) scanf("%s",c[i]+1);
}

У меня такой вопрос: поскольку мы объявляем c как 2 мерный array, как scanf может принимать только один размерный ввод без какой-либо компиляции error?

https://ideone.com/954oeO

есть ли какое-то значение по умолчанию для второго параметра?

1 Ответ

0 голосов
/ 04 июля 2018

c[i] совпадает с &c[i][0] из-за массива -> преобразование указателя.
c[i] + 1 совпадает с &c[i][1].

По этой причине использование

scanf("%s", c[i]+1);

действителен с синтаксической точки зрения.

Однако имейте в виду, что если входные данные слишком велики для размещения в заданном месте, вы столкнетесь с проблемой доступа к массиву за пределами допустимых границ. Будет лучше использовать

scanf("%98s", c[i]+1);

В c[i]+1 есть 99 символов. Вы должны иметь место для завершающего нулевого символа. Следовательно, использование %98s.

...