【问题标题】:Return value from the function varies in c函数的返回值在 c 中有所不同
【发布时间】:2015-02-24 14:37:31
【问题描述】:

我编写了一个程序来从一个文件中获取所有电话号码,该文件具有其他文本,例如 at 命令和来自其他子进程的其他错误。在这里,当我尝试使用用户定义的函数将字符串转换为整数时,我遇到了问题。存储在函数中的转换值没有正确返回到主程序,而是返回一些不寻常的值,并且每次执行似乎都是相同的。这让我很惊讶。谁能给我建议。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char lic[128];
unsigned long long sum=0ULL;

unsigned long long stringtoint(char str[])
{
    int i=0;
    sum=0;
    if(str[strlen(str)]!='\0')
        return -1;
        //puts("Im in function");
    while(str[i]!='\0'){
        //printf("- %c -\n",str[i]);
         if(str[i] >= 48 && str[i] <= 57){
             sum = sum*10 + (str[i] - 48);
             //printf("%c and %llu\n",str[i],sum);
         }
         i++;
    }
    if(sum>0)
    printf("\nIn function passed string is %s and integer value is %llu\n",str,sum);
    return sum;
}


FILE *file;     
int main(){
        //long long int inte;
        int64_t inte;        file = fopen("receive","r"); 
        if(file!=NULL)
                while(fscanf(file,"%s",lic)!=EOF){
                        inte = 0;
                        inte=stringtoint(lic);
                        if(inte !=0){
                                printf("In Main %llu is the value of the string %s",inte,lic);
                        if(inte==sum)
                                printf("\n%llu and %llu are same\n",inte,sum);
                }
        }
        printf("\n");
        fclose(file);
        return 0;
}

我在这个程序中得到的结果如下所示。

在函数中传递的字符串是 8939095683 和整数值是 8939095683 在 Main 349161091 中是字符串 8939095683 的值

shadeerariff@shameerariff-Satellite-L450:~/Workinffolder/ivr/IVRReporting$ ./datadecoder

在函数中传递的字符串是 8939095683 和整数值是 8939095683 在 Main 349161091 中是字符串 8939095683 的值

shadeerariff@shameerariff-Satellite-L450:~/Workinffolder/ivr/IVRReporting$ ./datadecoder

在函数中传递的字符串是 8939095683 和整数值是 8939095683 在 Main 349161091 中是字符串 8939095683 的值

需要您的宝贵意见,提前感谢您的支持。

【问题讨论】:

  • 欢迎来到 StackOverflow。请提供一个最小的测试用例,这是一个程序,您可以在其中删除不会造成问题的所有内容。这将有助于人们查看您的问题并节省他们的时间。
  • 你求和一个long long,但返回一个int,你为什么不返回一个long long
  • 感谢 Alter Mann 它现在可以工作了这是我的一个愚蠢的错误,我没有注意到。
  • @Shameerariff:想一想:这里的愚蠢错误是您尝试将电话号码解析为整数。例如,如果您在汉堡拨打德国号码,则电话号码为0049 40 6776776;整数转换的结果将是49406776776,它看起来与本地号码完全一样。不要那样做!只需按原样坚持使用 char 字符串即可;它甚至不会使用那么多内存(即使应用了固定长度)。
  • @MarcusMüller:您是否假设国际访问前缀是 00 ?如果你想强调毫无根据的假设的危险,你应该小心。您的意思是 +49 40 6776776 吗?但是,是的,电话号码最好作为字符串处理。甚至不要假设它们都是数字,如@9​​87654329@ 所示。

标签: c c++11 int64 uint64


【解决方案1】:

第 1 点。你需要改变

int stringtoint(char str[])

unsigned long long stringtoint(char str[])

第 2 点。 %lld 不是 unsigned long long 的正确格式说明符。使用%llu

【讨论】:

  • 感谢 Sourav Ghosh,它现在可以工作了,这是我的一个愚蠢的错误,我没有注意到。
【解决方案2】:

谁能给我建议。

是的。不要编写自己的函数,如果你真的想对char数组进行操作,请使用C标准库中提供的atoi函数,或者使用stoi函数对std::string进行操作,或者使用任何C++ iostream 从你的字符串中读取整数。使用后者,基本上可以直接使用用C++标准库打开ifstream时直接得到的文件流。

编辑:我应该提到你不应该使用atoi/stoi,但atoll/stroul实际上反映了你的数字可能大于int可以容纳的事实。

此外,电话号码不是整数。在许多国家/地区,城市区号以 0 开头,您无法以任何数字类型表示。事实上,电话号码不是数字,而是数字序列,如果你问我的话。

【讨论】:

  • 不要使用atoi,它不会提供错误,请阅读parashift.com/c++-faq/convert-string-to-num.html
  • @MichaWiedenmann:我同意,我认为我们可能在同一时刻得出了相同的结论,所以我添加了评论。你喜欢这个编辑吗?
  • 我不是特别喜欢你的编辑,但我会撤销我的反对票。我个人认为应该遵循链接的常见问题解答的答案,但您可以随意忽略该建议。感谢您的努力。
  • 其实问题很糟糕,马库斯的建议是正确的 -- 电话号码不是整数,没有人喜欢为此对电话号码 +1 进行算术运算
  • @MichaWiedenmann 感谢您的反馈 :) 实际上,您的批评激励我退后一步,并推荐完全不做转换的方法。
猜你喜欢
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多