我正在写一个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
为什么会这样?我能用不同的方法吗?
2条答案
按热度按时间42fyovps1#
如果格式***保证***总是像
<op><number>
,其中<op>
为'+'
、'-'
、'*'
或'/'
;然后呢<number>
是有效整数;然后呢<op>
和<number>
之间没有任何空间;然后呢<op>
是字符串中的第一个字符那么简单的
switch (buffer[0])
就可以正常工作,使用&buffer[1]
作为数字的字符串也可以工作。例如:
如果需要整数值,则使用例如
strtol
来转换它:请注意,如果不能保证输入遵循上面列表中列出的规则,这将不起作用。还要注意,您确实需要添加输入验证和错误检查,以防止不遵循规则的输入。
gajydyqb2#
我同意
strtok
不适合这个任务。这里可以使用
sscanf
。sscanf
的格式字符串可以包含文字字符;然后sscanf
将检查它们是否匹配,如果匹配,则执行其剩余的工作(如果不匹配,则报告失败)。