2014-09-12 95 views
1

我正在学习如何为char数组赋值,并且我需要执行一个操作,将一个数字和字符串拆分为不同的变量并将其打印出来。我相信我很接近,但在打印出应该是我的号码时,我会得到疯狂的数字。这是int的地址吗?任何意见是极大的赞赏!我的代码和输入/输出:strtok和int vs char char C

#include <stdio.h> 

    int main() { 
     setbuf(stdout, NULL); 
     char name[10]; 
     printf("Enter in this format, integer:name\n"); 
     fgets(name, 10, stdin);       //my input was 2:brandon 
     char *n = strtok(name, ":"); 
     int num = (int)n; 
     char * order = strtok(NULL, ":"); 
     printf("%d,%s", num,order);      //my output was 7846332,brandon 
     return (0); 
    } 

回答

3

这条线是不正确的:

int num = (int)n; 

这是地址为int?

不,这是在您的整数的字符表示存储位置,重新解释为int(即它可能是一个截断地址的字符缓冲区的地址,使得它几乎无意义数)。

您可以将通过解析值,或使用atoi它来诠释之一:

int num = atoi(n); 

Demo.

+0

一般'与strtol()'比'atoi将更好的选择()'因为与strtol更灵活,并且atoi对错误报告不屑一顾。 – 2014-09-12 13:35:33

+0

甜,我现在得到它,非常感谢! – Branbron 2014-09-12 13:52:54

+0

@John Hascall同意'strtol()'比'atoi()'更好,因为它具有良好的错误处理能力。但是,这可能涉及诸如'errno = 0; char * endptr; long tmp = strtol(n,&endptr,10); if(endptr == n)Handle_NoConversion(); if(errno || tmp INT_MAX)Handle_Overflow(); n =(int)tmp;' – chux 2014-09-12 15:18:08

3

如果您提供"123:foobar"作为输入,指针n指向字符串"123"。当您将指针转换为整数时,整数的值是变量n的值,它是由strtok返回的字符串所在的内存中位置的地址。

如果您想将包含数字的字符串转换为实际的数字,您应该使用例如该strtol功能:

int num = strtol(n, NULL, 10);