Return 函数的值在 c 中有所不同
Return value from the function varies in c
我编写了一个程序来从一个文件中获取所有 phone 数字,该文件具有其他文本,如命令和来自其他子进程的其他错误。在这里,当我尝试使用用户定义的函数将字符串转换为整数时,我遇到了问题。存储在函数中的转换值没有正确返回到主程序,而是返回了一些不正常的值,而且每次执行似乎都是一样的。这让我很惊讶。有人可以给我建议吗。
#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)]!='[=11=]')
return -1;
//puts("Im in function");
while(str[i]!='[=11=]'){
//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 的值
shameerariff@shameerariff-Satellite-L450:~/Workinffolder/ivr/IVRReporting$ ./datadecoder
在函数中传递的字符串为 8939095683,整数值为 8939095683
在 Main 349161091 中是字符串 8939095683 的值
shameerariff@shameerariff-Satellite-L450:~/Workinffolder/ivr/IVRReporting$ ./datadecoder
在函数中传递的字符串为 8939095683,整数值为 8939095683
在 Main 349161091 中是字符串 8939095683 的值
需要您的宝贵意见,在此先感谢您的支持。
第1点你需要改变
int stringtoint(char str[])
到
unsigned long long stringtoint(char str[])
点 2. %lld
不是 unsigned long long
的正确格式说明符。使用 %llu
Can someone advice me.
是的。不要编写自己的函数,但如果您真的想对 char
数组进行操作,请使用 C 标准库中提供的 atoi
函数,或者使用 stoi
函数来处理 std::string
,或使用任何 C++ iostream
从字符串中读取整数。对于后者,你基本上可以只使用你在用C++的标准库打开ifstream
时直接得到的文件流。
编辑:我应该提一下你不应该使用 atoi
/stoi
,而是 atoll
/stroul
来实际反映你的数字可能更大的事实比 int
所能容纳的还要多。
此外,phone 数字是 不是 整数。在许多国家/地区,城市区号以 0 开头,您不能用任何数字类型表示它。事实上,telephone 号码 不是 号码,而是 数字序列 ,如果你问我的话。
我编写了一个程序来从一个文件中获取所有 phone 数字,该文件具有其他文本,如命令和来自其他子进程的其他错误。在这里,当我尝试使用用户定义的函数将字符串转换为整数时,我遇到了问题。存储在函数中的转换值没有正确返回到主程序,而是返回了一些不正常的值,而且每次执行似乎都是一样的。这让我很惊讶。有人可以给我建议吗。
#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)]!='[=11=]')
return -1;
//puts("Im in function");
while(str[i]!='[=11=]'){
//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 的值
shameerariff@shameerariff-Satellite-L450:~/Workinffolder/ivr/IVRReporting$ ./datadecoder
在函数中传递的字符串为 8939095683,整数值为 8939095683 在 Main 349161091 中是字符串 8939095683 的值
shameerariff@shameerariff-Satellite-L450:~/Workinffolder/ivr/IVRReporting$ ./datadecoder
在函数中传递的字符串为 8939095683,整数值为 8939095683 在 Main 349161091 中是字符串 8939095683 的值
需要您的宝贵意见,在此先感谢您的支持。
第1点你需要改变
int stringtoint(char str[])
到
unsigned long long stringtoint(char str[])
点 2. %lld
不是 unsigned long long
的正确格式说明符。使用 %llu
Can someone advice me.
是的。不要编写自己的函数,但如果您真的想对 char
数组进行操作,请使用 C 标准库中提供的 atoi
函数,或者使用 stoi
函数来处理 std::string
,或使用任何 C++ iostream
从字符串中读取整数。对于后者,你基本上可以只使用你在用C++的标准库打开ifstream
时直接得到的文件流。
编辑:我应该提一下你不应该使用 atoi
/stoi
,而是 atoll
/stroul
来实际反映你的数字可能更大的事实比 int
所能容纳的还要多。
此外,phone 数字是 不是 整数。在许多国家/地区,城市区号以 0 开头,您不能用任何数字类型表示它。事实上,telephone 号码 不是 号码,而是 数字序列 ,如果你问我的话。