Я немного неопытен с C, но я опытный программист C ++. Я столкнулся с проблемой в функции, которую наш инструктор предоставил нам для назначения, и я просмотрел информацию о спецификаторах формата и sscanf в целом и не нашел ошибку.
Проблема в этой части функции, хотя я также добавлю объявления для соответствующих строк:
char label[MAXLINELENGTH], opcode[MAXLINELENGTH], arg0[MAXLINELENGTH],
arg1[MAXLINELENGTH], arg2[MAXLINELENGTH];
А потом внутри функции:
int readAndParse(FILE *inFilePtr, char *label, char *opcode, char *arg0,
char *arg1, char *arg2)
{
char line[MAXLINELENGTH];
char *ptr = line;
/* delete prior values */
label[0] = opcode[0] = arg0[0] = arg1[0] = arg2[0] = '\0';
/* read the line from the assembly-language file */
if (fgets(line, MAXLINELENGTH, inFilePtr) == NULL) {
/* reached end of file */
return(0);
}
/* check for line too long (by looking for a \n) */
if (strchr(line, '\n') == NULL) {
/* line too long */
printf("error: line too long\n");
exit(1);
}
/* is there a label? */
ptr = line;
if (sscanf(ptr, "%[^\t\n ]", label)) {
/* successfully read label; advance pointer over the label */
ptr += strlen(label);
}
/*
* Parse the rest of the line. Would be nice to have real regular
* expressions, but scanf will suffice.
*/
**sscanf(ptr, "%*[\t\n ]%[^\t\n ]%*[\t\n ]%[^\t\n ]%*[\t\n ]%[^\t\n ]%*[\t\n ]%\
[^\t\n ]", opcode, arg0, arg1, arg2);**
Это еще не все, но проблема заключается в жирной функции. После этого я распечатал все переменные, которые должны были быть извлечены (плюс метка, которая была прочитана выше), и только метка и код операции прочитали. Arg0, arg1 и arg2 - все очень маленькие отрицательные значения. Если это помогает, arg1 на 8 меньше, чем arg0, а arg 2 на 8 меньше, чем arg1. Эти значения одинаковы для каждой строки, которую я анализирую (всего около 10 строк).
Все переменные arg равны "\ 0" до того, как произойдет sscanf. Я проверил.
Кто-нибудь знает, почему это происходит?