#c
#c #указатели
Вопрос:
Я погуглил это и вижу много ответов, но ни один из них не подходит для моей ситуации. Это мой основной ():
char * cString;
puts("Please enter data you want to encrypt.");
cString = getInput(cString, amp;iStringSize);
printf("The message is: %snn", cString);
char * strEncrypt;
strEncrypt = encrypt(cString, offset);
printf("The encrypted message is: %snn", strEncrypt);
return 0;
Эта программа в основном считывает произвольные входные данные, а затем шифрует их. Это функция GetInput:
char * getInput(char *cString, int * iStringSize)
{
puts("Begin reading input.");
char buffer[CHUNK];
int iBufferSize;
while(fgets(buffer, CHUNK - 1, stdin) != NULL)
{
iBufferSize = strlen(buffer);
*iStringSize = iBufferSize;
cString = realloc(cString, sizeof(char) * (*iStringSize 1));
strcat(cString, buffer);
}
printf("String size is: %dn", *iStringSize);
puts("Reading successful");
return cString;
}
Как показано выше, CString — это указатель на символ. Функция GetInput также возвращает указатель на символ. Тем не менее, я продолжаю получать сообщение: присваивание создает указатель из целого числа без приведения [включено по умолчанию]
Это происходит, когда я компилирую код.
То же самое происходит с этой функцией
char * encrypt(char *str, int offset)
{
puts("Begin encryption.");
char * strEncrypt = malloc(sizeof(char) * (strlen(str) 1));
int i;
for(i = 0; i < strlen(str); i )
{
//substitution algorithm using int offset variable.
//I accessed str and strEncrypt using pointer arithmetic
}
puts("Encryption success!");
return strEncrypt;
}
Пожалуйста, никаких предложений по обработке ошибок realloc.
Комментарии:
1. Объявлена ли ваша функция GetInput перед ее использованием? Если нет, компилятор подумает, что возвращает значение int.
2. в какой строке вы получаете предупреждение?
3. Пожалуйста, укажите номер строки, в которой вы получаете ошибку. И обратите внимание, что в
getInput()
функции вы увеличиваетеiStringSize
значение, перед этим оно должно быть инициализировано нулем.4. Я получаю предупреждения в этих строках: CString = GetInput(CString, amp;iStringSize); strEncrypt = encrypt(CString, offset); поэтому, когда я присваиваю результат функций указателю.
5. Погуглив точное сообщение об ошибке в названии, почти половина многих ответов соответствует вашей конкретной ситуации, поэтому я не понимаю, почему вы думаете иначе. И это не единственная проблема в вашем коде. Вы передаете неопределенный указатель
cString
наgetInput
, вызывающий неопределенное поведение. Отправка его вrealloc
просто закрепляет это неправильное действие. Инициализируйте его значением NULL или действительным результатом выделения перед вызовомgetInput
.
Ответ №1:
Объявите getInpyt и зашифруйте функцию перед их первым использованием, в противном случае компилятор предполагает, что эти функции возвращают int и принимают переменное количество параметров.
Вы можете объявить их, используя любой из 3 способов, приведенных ниже.
- Включите соответствующие заголовочные файлы, содержащие их объявления.
- Включите объявления вручную в глобальную или локальную область перед первым обращением к ним.
- Переместите определение этих функций перед первым обращением к ним.