goksurahsan Ответов: 3

Ошибка исключения, когда я использовал scanf_s() и visual studio


Этот вопрос, я думаю, очень прост, но я не понимаю, что он работает с scanf и Code BLock Ide. Но он не работает scanf_s и в Visual Studio. Почему?

Я получаю исключение, когда запускаю эту часть кода.

<pre>#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>


int main()
{
	char city[10];
	for (int i = 0; i < 2; i++)
	{
		
		printf("Please enter name of city:\n");
		scanf_s("%s", city);
	}

	for (int i = 0; i < 2; i++)
	{
		printf("%s",city);
	}

	return 0;
}


Что я уже пробовал:

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>


int main()
{
	char city[10];
	for (int i = 0; i < 2; i++)
	{
		
		printf("Please enter name of city:\n");
		scanf_s("%s", city);
	}

	for (int i = 0; i < 2; i++)
	{
		printf("%s",city);
	}

	return 0;
}

3 Ответов

Рейтинг:
15

OriginalGriff

Скорее всего, пространство, которое вы выделили для city недостаточно большой, чтобы хранить то, что вы вводите: 10 символов-это не так много, и вы, вероятно, превышаете его.
Попробовать это:

int main()
{
	char city[100];
	for (int i = 0; i < 2; i++)
	{

		printf("Please enter name of city:\n");
		scanf_s("%s", city, 10);
	}

	for (int i = 0; i < 2; i++)
	{
		printf("%s", city);
	}

	return 0;
}
Он все равно не будет делать то, что вы хотите, потому что он напечатает фамилию дважды, но он не должен разбиться.


goksurahsan

Да, он напечатает фамилию дважды, но это сработало. Речь идет о массиве символов. Должен ли я использовать указатель?

OriginalGriff

Нет, все сводится к тому, что ваш код "повторно использует" одно и то же пространство памяти для хранения обоих городов. Вы не можете этого сделать, он переписывает первый город с последним, поэтому он печатает одно и то же имя дважды.
Это как вешалка для одежды - она может держать рубашку или пару брюк, но если вы используете ее, чтобы привязать рубашку к линии для сушки, вы не можете "добавить" к ней пару брюк. Когда вы открываете колышек, чтобы вставить брюки, рубашка падает на землю!

Подсказка: посмотрите на создание двумерного массива и использование его вместо этого.

goksurahsan

Спасибо, что ответили. Я ее разгадал. Спасибо снова

OriginalGriff

Всегда пожалуйста!

Рейтинг:
1

Richard MacCutchan

Вам не хватает третьего параметра, который должен быть размером буфера, как описано в разделе scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l | Майкрософт документы[^].

Код должен быть таким:

scanf_s("%s", city, sizeof(city));


Рейтинг:
1

Patrice T

Попробуйте с помощью:

scanf_s("%s", &city);

C - Указатели - Tutorialspoint[^]


goksurahsan

Я попробовал это сделать но ничего не вышло

OriginalGriff

Хм... имя массива является указателем на первый элемент массива - это и есть спецификация языка Си. &city-это указатель на указатель на символ.

Patrice T

Я перестал использовать C/C++ много лет назад, но у меня сохранилась яркая память о пропущенном a & при сканировании и в результате стирании жесткого диска MBR :)

OriginalGriff

Звучит как чертовски хорошая причина для использования языков управляемой памяти ... :Д

Заметьте, я не могу говорить - в тот день я обнаружил, что общий оператор FORTRAN позволит вам изменить тип переменной в двух разных файлах и использовать CHAR в качестве многомерного массива INTs, если вы хотите. И в Primos вы можете изменить операционную систему с помощью этого ... :смеяться:

Patrice T

Согласен, именно поэтому я много лет назад остановился на Clipper, компиляторе семейства Xbase.