C语言数组,字符串的问题

题目描述:
clipboard.png

运行结果:

clipboard.png

为什么下面的代码提交上去是Wrong Answer?望指教!

#include <stdio.h>
#include <string.h>
#include <math.h>

typedef struct data
{
    char first[4];
    char second[4];
}data;
char atoDigit( char[] );
int ctoD( char X);
int strtoNum( char[] );

int main() {
    char str[10];
    int number;

    while( gets(str) )  
    {
        number = strtoNum( str );
        if( number == 0 )
            break;
        printf("%d\n",number);
    }

    return 0;
}

char atoDigit( char *str)
{
    char digital;

    if( strcmp( str, "zero") == 0 )
        digital = '0';
    if( strcmp( str, "one") == 0 )
        digital = '1';
    if( strcmp( str, "two") == 0 )
        digital = '2';
    if( strcmp( str, "three") == 0 )
        digital = '3';
    if( strcmp( str, "four") == 0 )
        digital = '4';
    if( strcmp( str, "five") == 0 )
        digital = '5';
    if( strcmp( str, "six") == 0 )
        digital = '6';
    if( strcmp( str, "seven") == 0 )
        digital = '7';
    if( strcmp( str, "eight") == 0 )
        digital = '8';
    if( strcmp( str, "nine") == 0 )
        digital = '9';

    return digital;
}

int strtoNum( char *str )
{
    data ret;
    int i, firstNum, secondNum;
    char tmpStr[6], *ptrToDigita;

    i = 0;
    ptrToDigita = ret.first;

    while( *str != '\0')
    {
        if( *str == '+' )
        {
            memset( tmpStr,0,sizeof(tmpStr) );
            i = 0;
            *ptrToDigita = '\0';
            ptrToDigita = ret.second;
            str += 2;
        }
        if( *str == '=')
        {
            *ptrToDigita = '\0';
            break;
        }
        if( *str != ' ')
        {
            tmpStr[i] = *str;
            i++;
        }
        else
        {
            if( strlen( tmpStr  ) > 0 )
            {
                tmpStr[i] = '\0';
                *ptrToDigita = atoDigit( tmpStr );
                ptrToDigita++;
                memset( tmpStr,0,sizeof(tmpStr) );
                i = 0;
            }
        }
        str++;
    }

    firstNum = secondNum = 0;
    for(i = 0; i < strlen(ret.first); i++)
    {
        firstNum += ctoD(ret.first[i]) * pow(10,strlen(ret.first)-1-i);
    }

    for(i = 0; i < strlen(ret.second); i++)
    {
        secondNum += ctoD(ret.second[i]) * pow(10,strlen(ret.second)-1-i);
    }

    return firstNum + secondNum;
}

int ctoD( char X )
{
    if( X >= '0' && X <= '9')
        return X - 48;
}
阅读 2.6k
3 个回答

char str[10]; 真的够用吗

加 -Wall 编译,你就知道了:别用 gets 函数

你给它的缓冲区太小,它访问越界了。这种情况下的行为是未定义的,编译器可能给出任何结果(通常受版本、操作系统和优化级别的影响;包括看上去是对的那个)。

第一行 include 写错

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进