【问题标题】:run time error: debug assertion failed运行时错误:调试断言失败
【发布时间】:2015-06-27 19:10:22
【问题描述】:

我正在编写一个在 cmd 上工作的计算器。我已经完成了 +,-,/,* 操作和两个数字,但我有这个错误。我寻找这个错误,但所有的文件都是关于文件功能的。我不使用文件功能。但我仍然收到此错误:

调试断言失败! 程序: ...所有 studio2012 .... 文件:f:\dd\vctools\crt_bld\self_x86\crt\srt\strtol.c 行:94

表达式:nptr !=NULL

代码是:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

char define(char input[]);
float math(int sayi[], char operation);

void main()
{
int sayi[100];
char input[100];
char inputCpy[100];
const char functions[] = "+,-,/,*";
char *token;
char operation;
float result;
int i=1;

printf("welcome to my simple cmd calculator!\n what do you want to know?\n");
scanf("%s", input);
strcpy(inputCpy,input);
token = strtok(input, functions);
sayi[0]=atoi(token);
while( token != NULL ) 
{
    token = strtok(NULL, functions);
    sayi[i]=atoi(token);
    i++;
}
printf ("sayi1=%d sayi2=%d", sayi[0], sayi[1]);
operation = define(inputCpy);
printf("operation = %c\n", operation);
result = math(sayi,operation);
printf ("result = %.2f\n", result);
system("pause");
}

char define(char input[])
{
char operation;
for (int i=0; i<strlen(input); i++)
{
    if(!isdigit(input[i]))
    {
        operation = input[i];
        break;
    }
}
return operation;
}

float math(int sayi[], char operation)
{
float result=0;
switch(operation)
        {
        case '+':
            result = sayi[0]+sayi[1];
            break;

        case '-':
            result = sayi[0]-sayi[1];
            break;

        case '*':
            result = sayi[0]*sayi[1];
            break;

        case '/':
            if(sayi[1]!='0')
                {
                result = sayi[0]/sayi[1];
                }
            else
                {
                printf ("wtf!! you can't divide by 0!");
                }
            break;
        default:
            printf("did you mean \"i don't know maths\"");
        }
return result;
}

【问题讨论】:

    标签: c visual-studio-2012


    【解决方案1】:

    在调用atoi(token)之前需要检查token是否为NULL

    换行:

    token = strtok(input, functions);
    sayi[0]=atoi(token);
    while( token != NULL ) 
    {
        token = strtok(NULL, functions);
        sayi[i]=atoi(token); // token will eventually be NULL
                             // and you run into a problem here.
        i++;
    }
    

    到:

    token = strtok(input, functions);
    i = 0;
    while( token != NULL ) 
    {
       sayi[i]=atoi(token);
       token = strtok(NULL, functions);
       i++;
    }
    

    【讨论】:

    • 谢谢它的工作,但仍然有问题。我得到了 number[0] 正确但 number[1] 是错误的,为什么?
    • @osumatu,您可以在while循环中添加行以打印tokensayi[i]以诊断问题。
    【解决方案2】:
    token = strtok(input, functions);
    

    您需要检查strtok 的返回值,否则您可能会将空指针传递给atoi。稍后在您的代码中使用token = strtok(NULL, functions);

    【讨论】:

    • stroke 返回字符串,不是吗?我应该检查什么?你的意思是:if ((strtok(input, functions)!=NULL) ?
    • @osumatu 查看strtok 的手册页,如果strtok 找不到令牌会怎样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多