Ошибка «Невозможно прочитать память» возникает каждый раз, когда я использую функцию ниже,

#c #visual-studio

Вопрос:

Я попытался написать функцию, аналогичную sscanf, которая пересылает указатель на входную строку, чтобы ее можно было использовать как scanf для сканирования нескольких строк одна за другой. когда я попытался использовать функцию, возникло исключение, поэтому я запустил ее в режиме отладки, и она не смогла прочитать значение входных строк.

  int scanStrAndMove(char **readString, char* formatString, char * writeString){
      int forwardBy = 0;
      while(isspace(*readString[forwardBy])){
          forwardBy  ;
      }
      int retVal = sscanf(*readString,formatString,writeString);
      forwardBy  = strlen(writeString)   strlen(formatString) - 2;
      if(retVal > 0) *readString  = forwardBy;
      return retVal;
}
 

скриншот проблемы

вызов функции(строка имеет тип char*)

редактировать: Я попытался заменить ReadString другим символом, но это не решило проблему, спасибо за все ответы.

правка: Я увидел комментарии и попытался привести минимальный воспроизводимый пример, попробуйте запустить это с помощью функции выше:

 #include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
  char inputStr[10] = "  cde fg";
  char outputSrt[10];
  scanStrAndMove(amp;inputStr,"%s",outputSrt);
  printf("%s",outputSrt);
  scanStrAndMove(amp;inputStr,"%s",outputSrt);
  printf("%s",outputSrt)
   
}
 

Комментарии:

1. Добро пожаловать в SO. Как вы вызываете эту функцию и как вы создаете пареметры, которые вы передаете?

2. isspace(*readString[forwardBy]) … вы имеете в виду readString[0][forwardBy] или readString[forwardBy][0] ? Если сомневаетесь … используйте круглые скобки: isspace((*readString)[forwardBy]) или isspace(*(readString[forwardBy])) … или синтаксис массива 🙂

3. Я вызываю его в основной функции. Я передаю адрес строки и двух других строк

4. Прочитайте: en.cppreference.com/w/c/language/operator_precedence и выясните, что происходит, когда вы это делаете: *p[i] это *(p[i]) или это (*p)[i]

5. OT: Ваш код был бы намного проще (и, по крайней мере, одна ошибка исчезла бы), если бы вы начали с выполнения: char* rsP = *readString; и заменили *readString на rsP то, где это не задание.