首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将char类型'0'-'9‘转换为int类型,并用C语言打印到stdout

将char类型'0'-'9‘转换为int类型,并用C语言打印到stdout
EN

Stack Overflow用户
提问于 2012-10-26 23:32:29
回答 2查看 3.1K关注 0票数 2

我编写了一个程序来接收用户输入,并将其打印到屏幕上。

示例输入是abc 12 34

示例输出为abc 12 34,但1234应作为整数输入。

对于样例输入,我的程序总是输出为abc 122 344。我已经研究了很长一段时间了,但我还是想不通。能帮我检查一下代码吗?谢谢。

我的gcc版本是4.1.2。

代码语言:javascript
运行
复制
#include<stdio.h>
#include<stdlib.h>
int main()
{
    char c;
    char *str = NULL;
    str = (char *)malloc(20*sizeof(char)); /*just sample code, not robust*/
    memset(str,'\0',20*sizeof(char)); 

    if(str == NULL)
    {
        fprintf(stderr,"Error: failed to allocate memory.\n"); fflush(stderr);
        return 0;
    }

    /*store user input*/
    int index = 0;
    while((c=getchar()) != '\n')
    {
        *(str+index) = c;
        index++;
    }

    int digit = 0;
    for(index = 0; *(str+index)>0; index++)
    {
        if((*(str+index)>='a') &&( *(str+index)<='z'))
        {
            fprintf(stdout,"%c",*(str+index)); fflush(stdout);
        }

        else if((*(str+index)>='0') &&( *(str+index)<='9'))
        {
            /*handling the case that a number with more than one digit*/
                    if(*(str+index+1)>='0' && *(str+index+1)<='9')
            {
                digit=10*(digit+atoi(str+index));
            }
            else
            {
                digit += atoi(str+index);   
                fprintf(stdout,"%d",digit); fflush(stdout);
                digit = 0;
            }           
        }

        else
        {   
            fprintf(stdout,"%c",*(str+index)); fflush(stdout);
        }
    }
    printf("\n");
    free(str);
    return 0;
}
EN

回答 2

Stack Overflow用户

发布于 2012-10-26 23:40:37

您不应该使用atoi:它将字符串转换为int,而不是单个char

下面是发生的事情:当您看到一个两位数,比如34,第一次迭代将两位数都传递给atoi,获取34,然后将其乘以10,生成340。下面的迭代获取4,并愉快地将其添加到340中,作为344的累积结果。

如果要将表示数字的单个char转换为int,请使用减法:

代码语言:javascript
运行
复制
digit = *str - '0';

此外,您用于处理多位数的代码是非正统的,这使得它很难理解。当您看到下一个字符是一个数字时,不应该将当前值乘以十,而应该在看到一个数字时将前一个值乘以十。这甚至适用于第一个数字,当先前的值为0时,因为十乘以零仍然是零。

您应该删除if(((*str+index+1)>='0') && (*str+index+1)<='9')及其then分支,并修改其else分支,如下所示:

代码语言:javascript
运行
复制
digit = 10*digit + *(str+index) - '0';
if (((*str+index+1)<'0') || (*str+index+1)>'9') {
    fprintf(stdout,"%d",digit); fflush(stdout);
    digit = 0;
}
票数 3
EN

Stack Overflow用户

发布于 2012-10-26 23:37:53

那么直接使用sscanf如何呢?如下所示:

代码语言:javascript
运行
复制
sscanf(str, "%s %d %d", str1, &num1, &num2);

如果由于某些原因不能使用sscanf,那么至少应该使用isalpha()isdigit()分别检查字符和数字。

因此,不要使用这个:

代码语言:javascript
运行
复制
if((*(str+index)>='a') &&( *(str+index)<='z')) {
    .....
}

使用以下命令:

代码语言:javascript
运行
复制
if (isalpha(*str+index)) {
    .....
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13089953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档