如何检查C字符串中的第一个字符?尝试使用strtok但失败

s4chpxco  于 2023-04-05  发布在  其他
关注(0)|答案(2)|浏览(100)

我正在写一个C程序,它读取一个作为输入的文件。我应该创建一个计算器,文件的每一行都是这样组成的:

*2
+6
-8
+33
.......

我试着用strtok把操作和数字分开。我的问题是strtok不像它应该的那样工作。为什么我的程序总是输入所有的if?

typedef struct{
    long result;
    long number;
    char done;
}shm_data;

void create_operation(char* buffer,shm_data* data){

    char* add,*sottr,* molt;
    long number=0;

    if(((add=strtok(buffer,"+"))!=NULL))
    {
        printf("add: %s\n",add);
    }
     
    if(((sottr=strtok(buffer,"-"))!=NULL))
    {
        printf("sottr: %s\n",sottr);
    }
    
    if(((molt=strtok(buffer,"*"))!=NULL))
    {
        printf("molt: %s\n",molt);
    }

}

void child_mng(shm_data* data,int sem_id,char* path){
    
    FILE* r_stream;
    char tmp[DIM];

    if((r_stream=fopen(path,"r"))==NULL)
    {
        perror("fopen");
        exit(1);
    }

    while(fgets(tmp,DIM,r_stream))
    {
        if(tmp[strlen(tmp)-1]=='\n')
            tmp[strlen(tmp)-1]='\0';

        printf("read file: %s\n",tmp);
        create_operation(tmp,data);

    }

    exit(0);

}

es.
假设文件只包含一行:
+80
这是我的输出:

./calculator list.txt 
read file: +80
add: 80
sottr: +80
molt: +80

但是输出应该是这样的:

./calculator list.txt 
read file: +80
add: 80

为什么会这样?我能用不同的方法吗?

42fyovps

42fyovps1#

如果格式***保证***总是像<op><number>,其中

  • <op>'+''-''*''/';然后呢
  • <number>是有效整数;然后呢
  • <op><number>之间没有任何空间;然后呢
  • <op>是字符串中的第一个字符

那么简单的switch (buffer[0])就可以正常工作,使用&buffer[1]作为数字的字符串也可以工作。
例如:

const char *number = &buffer[1];
switch (buffer[0])
{
case '+':
    printf("Add %s\n", number);
    break;
// Etc. for '-', '*' and '/'

default:
    printf("Invalid operator\n");
    break;
}

如果需要整数值,则使用例如strtol来转换它:

long number = strtol(&buffer[1], NULL, 10);
printf("The number is %ld\n", number);

请注意,如果不能保证输入遵循上面列表中列出的规则,这将不起作用。还要注意,您确实需要添加输入验证和错误检查,以防止不遵循规则的输入。

gajydyqb

gajydyqb2#

我同意strtok不适合这个任务。
这里可以使用sscanfsscanf的格式字符串可以包含文字字符;然后sscanf将检查它们是否匹配,如果匹配,则执行其剩余的工作(如果不匹配,则报告失败)。

int number;

if (sscanf(buffer, "+%d", &number) == 1)
    printf("Let's add\n");
else if (sscanf(buffer, "-%d", &number) == 1)
    printf("Let's subtract\n");
else if (sscanf(buffer, "*%d", &number) == 1)
    printf("Let's multiply\n");
else
    printf("Error!\n");
printf("The number we are going to manipulate is: %d\n", number);

相关问题