Вы не указали значение ввода n
и m
в вопросе. Но из показанной входной и выходной строки кажется, что char
array a[i]
не имеет достаточно места для завершения нулевого символа \0
. Когда вы задаете спецификатор формата %s
, scanf()
автоматически добавляет завершающий нулевой символ в конце сохраненной последовательности. Я попробовал ваш код с вводом 2
для n
и m
, и я получаю вывод, когда вы получаете:
$ ./a.out
2 2
ab
cd
abcd
cd
Дайте значение 4
m
, и вы получите:
2 4
ab
cd
ab
cd
При использовании scanf()
для строкового ввода рекомендуется добавить проверку на максимальный модификатор символов, который на 1
меньше длины входного буфера. Итак, если размер входного буфера равен 4
, то вы можете сделать
scanf("%3s",a[i]);
При этом scanf()
будет читать не более 3
символов в a[i]
и добавит \0
в четвертом месте a[i]
. Остерегайтесь этого, он не отбрасывает оставшиеся входные данные из входного потока, и они будут использованы последовательным вызовом scanf()
.
Если вы хотите отбросить дополнительный ввод, который не использовался scanf, один из способов сделать это - прочитать и отбросить дополнительный ввод, используя цикл, например:
int c;
while((c = getchar()) != '\n' && c != EOF)
/* discard the character */;
Вы можете добавить его после scanf()
чтения данных из входного потока, например:
for(i=0; i<n; i++) {
scanf("%3s", a[i]); // assuming the size of a[i] is 4
int c;
while((c = getchar()) != '\n' && c != EOF) // <=== This loop read the extra input characters and discard them
/* discard the character */;
}
Это будет хорошо работать для ввода, который не содержит пробельных символов. Если ваш ввод содержит какой-либо символ пробела, он может работать не так, как ожидалось. Следовательно, я бы посоветовал вам прочитать о fgets()
, который дает вам лучший контроль над вводом строки.
Проверьте это: fgets
и это: Как читать из stdin с помощью fgets ()?