C语言 程序在使用通配符 (*) 作为第一个输入时给出隔离错误


/*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() 标记输入字符串。这是更好的选择。

相关内容

  • 没有找到相关文章

最新更新