#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
то, где это не задание.