我尝试编写一个函数来将字符串转换为int
:
int convert(char *str, int *n){
int i;
if (str == NULL) return 0;
for (i = 0; i < strlen(str); i++)
if ((isdigit(*(str+i))) == 0) return 0;
*n = *str;
return 1;
}
我的代码出了什么问题?
答案 0 :(得分:1)
*n = *str
表示:
将n
指向的4个字节的内存设置为str
指向的1字节内存。这很好,但可能不是你的意图。
为什么要首先将char *转换为int *?如果您只是需要进行转换并使编译器满意,那么您可以int *foo = (int*)bar
bar
char*
。{/ p>
很抱歉,我没有声誉来发表评论。
答案 1 :(得分:0)
该功能肯定无法按预期运行。
以下是一些问题:
您应该<ctype.h>
包含isdigit()
才能正确定义。
isdigit(*(str+i))
包含负str
值,则 char
具有未定义的行为。你应该抛出这个论点:
isdigit((unsigned char)str[i])
如果字符串中有任何非数字字符,则函数返回0
。那么"-1"
和"+2"
怎么样? atoi
和strtol
对非数字字符更宽松,它们会跳过初始空格,处理可选符号和后续数字,停在第一个非数字处。
测试for (i = 0; i < strlen(str); i++)
非常低效:可以为字符串中的每个字符调用strlen
,其中 O(N 2 )强烈的>时间复杂性。请改用:
for (i = 0; str[i] != '\0'; i++)
*n = *str
不会转换 str
中数字所代表的数字,它只会将第一个字符的值存储到n
中,例如'0'
将在ASCII系统上转换到48
。您应该处理字符串中的每个数字,将到目前为止转换的值乘以10
,并将数字表示的值与str[i] - '0'
相加。
以下是具有限制性语义的更正版本:
int convert(const char *str, int *n) {
int value = 0;
if (str == NULL)
return 0;
while (*str) {
if (isdigit((unsigned char)*str)) {
value = value * 10 + *str++ - '0';
} else {
return 0;
}
}
*n = value;
return 1;
}
答案 2 :(得分:-1)
将char *指针转换为int *
#include
main()的
{
char c ,*cc;
int i, *ii;
float f,*ff;
c = 'A'; /* ascii value of A gets
stored in c */
i=25;
f=3.14;
cc =&c;
ii=&i;
ff=&f;
printf("\n Address contained
in cc =%u",cc);
printf("\n Address contained
in ii =%u",ii);
printf(:\n Address contained
in ff=%u",ff);
printf(\n value of c= %c",
*cc);
printf(\n value of i=%d",
**ii);
printf(\n value of f=%f",
**ff);
}