如何将字符串拆分为不同的类型(int表示数值,char表示字母)?

时间:2010-08-23 10:11:29

标签: c string casting types

例如,我有这个字符串:SMUL 9 A B?如何获得9(int类型)A(char)和B(char)。可能的字符串可能是SMUL 12 A C,因此这意味着它们在字符串中的位置不是常量。

进一步说明:这是用户为我的矩阵计算器程序输入的字符串。输入SMUL“标量”“矩阵-1”“矩阵-2”意味着矩阵运算是标量乘法,其中“标量”作为要乘以矩阵的数字,“矩阵-1”是要乘以的矩阵标量和“矩阵-2”是显示结果的矩阵。希望你能帮助我。我的项目现在将在2天后到期。

3 个答案:

答案 0 :(得分:1)

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;
}

答案 1 :(得分:0)

您可以使用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),数字(使用类似isnum的ctype函数)或其他任何内容。

答案 2 :(得分:0)

听起来像你想要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;
}