/*Input string argument can be up to 3 integer numbers,
separated by spaces. A wild card value, represented by a *
character can replace any one of the integer numbers.*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
void parse(char *data);
int program = 0, version = 0, process = 0;
unsigned char flags = 0;
#define GOT_PROG 0x01
#define GOT_VERS 0x02
#define GOT_PROC 0x04
int main()
{
char data[] = " * 10 7 ";
parse(data);
system("PAUSE");
return 0;
}
void parse(char *data)
{
char *tmp = NULL;
/* advance past whitespace */
while(isspace((int)*data)) data++;
if(*data != '*')
{
program = strtoul(data,&tmp,0);
flags|=GOT_PROG;
printf("%d 11n",program );
}
if(*tmp == ' ') return;
data=++tmp;
if(*data != '*')
{
version = strtoul(data,&tmp,0);
flags|=GOT_VERS;
printf("%d 22n",version);
}
else
{
tmp++;
}
if(*tmp == ' ') return;
data=++tmp;
if(*data != '*')
{
process = strtoul(data,&tmp,0);
flags|=GOT_PROC;
printf("%d 33n",process);
}
}
当我的输入是 3 个整数时,它运行良好。当我的输入是两个整数和一个*
它运行良好时,除非我用 *
替换第一个整数,不确定我哪里出错了!!有什么建议吗?
此块中的逻辑错误:
char *tmp = NULL;
/* advance past whitespace */
while(isspace((int)*data)) data++;
// If *data == '*', you are skipping the code inside the if block.
// tmp continues to be NULL.
if(*data != '*')
{
program = strtoul(data,&tmp,0);
flags|=GOT_PROG;
printf("%d 11n",program );
}
// Now you are dereferencing a NULL pointer
// and then setting the value of data to 'NULL + 1'.
if(*tmp == ' ') return;
data=++tmp;
我没有遵循您的函数的整个逻辑,但是您必须添加处理*data == '*'
情况的代码。
在你的parse()
里,你正在做
char *tmp = NULL;
然后,在 *data
等于 *
的情况下,(请记住,错误的大小写输入以 *
开头)而不更改tmp
,您正在做
if(*tmp == ' ')
即,取消引用无效指针,这反过来又调用未定义的行为。
您需要注意对tmp
的访问,以防输入具有前导*
。
FWIW 在这方面,data=++tmp;
也是无效的。
:看到你的逻辑后,我建议使用 strtok()
标记输入字符串。这是更好的选择。