Как я могу разбить строки на разные типы (int для числовых значений и char для букв)? - PullRequest
1 голос
/ 23 августа 2010

Например, у меня есть эта строка: SMUL 9 A B? Как я могу получить 9 (тип int) A (символ) и B (символ). Возможная строка может быть SMUL 12 A C, что означает, что их позиции в строке не постоянны.

Дальнейшее объяснение: это строка, введенная пользователем для моей программы матричного калькулятора. Ввод SMUL «скаляр», «матрица-1», «матрица-2» означает, что матричная операция - это скалярное умножение с «скалярным» в качестве числа, которое нужно умножить на матрицу, «матрица-1» - это матрица, на которую нужно умножить скаляр, а «матрица-2» - это матрица, в которой будут отображаться результаты. Надеюсь, вы могли бы помочь мне. Мой проект сейчас через 2 дня.

Ответы [ 3 ]

1 голос
/ 23 августа 2010

strtok не является реентерабельным и переходит на пустые токены.sscanf будет работать и может определить для вас числовой или строковый столбец.

#include <stdio.h>

typedef struct {
char op[20];
union {int arg1num;char arg1str[20];} arg1;
char arg2[20],arg3[20];
} Value;

main()
{
  Value v;
  char withNumber[]="SMUL 9 A B ";
  char withoutNumber[]="SMUL \"scalar\" \"matrix-1\" \"matrix-2\" ";

  if( 4==sscanf(withNumber,"%[^ ]%d %[^ ] %[^ ]",v.op,&v.arg1.arg1num,v.arg2,v.arg3) )
    printf("wN:%s %d %s %s\n",v.op,v.arg1.arg1num,v.arg2,v.arg3);
  if( 4==sscanf(withoutNumber,"%[^ ] %[^ 0-9] %[^ ] %[^ ]",v.op,v.arg1.arg1str,v.arg2,v.arg3) )
    printf("woN:%s %s %s %s\n",v.op,v.arg1.arg1str,v.arg2,v.arg3);
  if( 4==sscanf(withoutNumber,"%[^ ]%d %[^ ] %[^ ]",v.op,&v.arg1.arg1num,v.arg2,v.arg3) )
    printf("wN:%s %d %s %s\n",v.op,v.arg1.arg1num,v.arg2,v.arg3);
  if( 4==sscanf(withNumber,"%[^ ] %[^ 0-9] %[^ ] %[^ ]",v.op,v.arg1.arg1str,v.arg2,v.arg3) )
    printf("woN:%s %s %s %s\n",v.op,v.arg1.arg1str,v.arg2,v.arg3);
  return 0;
}
0 голосов
/ 23 августа 2010

Звучит так, как вы хотите sscanf .

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

int main(int argc, char *argv[])
{
  char buffer[1024];
  char matrix1;
  char matrix2;
  int scalar;

  /* read a line of input */
  fgets(buffer, sizeof(buffer), stdin);

  /* determine the operation */
  if (strncmp(buffer, "SMUL ", 5) == 0)
  {
    if (sscanf(buffer, "%*s %d %c %c", &scalar, &matrix1, &matrix2) != 3)
    {
      printf("Unexpected Input: %s\n", buffer);

      /* handle error */
      return EXIT_FAILURE;
    }

    /* perform multiplication */
    printf("Using scalar %d on matrices %c and %c.\n",
      scalar, matrix1, matrix2);
  }

  return EXIT_SUCCESS;
}
0 голосов
/ 23 августа 2010

Вы можете токенизировать вашу строку, используя такие функции, как strtok .

/* strtok example */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main ()
{
  char str[] ="SMUL 9 A B";
  char * pch;
  char * operation;
  int number;
  pch = strtok (str," ");
  while (pch != NULL)
  {
    if (is_operation(pch)) {
      operation = strdup(pch);
    }
    else if (is_number(pch)) {
      number = atoi(pch);
    }
    else {
      add_operand(pch);
    }
    pch = strtok (NULL, " ");
  }

  /* your processing */

  return 0;
}

Конечно, в вашем случае вам необходимо определить, является ли строка оператором, числом или матричным идентификатором. Поэтому на каждой итерации вы можете проверить, является ли строка известной операцией (например, с помощью strcmp), числом (с использованием функций ctype, таких как isnum) или чем-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...