2015-12-02 67 views
0

我正在编写一个程序,它接受一个字符串作为输入,例如, 35x40x12。然后我想使用一个int指针将这些数字存储为单独的元素。到目前为止,我已经设法做到这一点,使单个数字的数字工作,即3x4x6的作品,但如果我把两个数字的数字,如35x40x12,35将存储在第一个位置,但在第二个位置,它也将从35中存储5个,它对于位置3和4也是40个。我如何消除这种重复?将字符指针转换为字符串指针,消除重复

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int present(int l, int w, int h); 
int *stringC (char *z); 


    int main(int argc, char *argv[]) 
{ 

    char *d = "53x23x4";//input 
    printf("%d", *(stringC(d)+2));//whatever's stored in pointer position 

    return 0; 
} 

int *stringC (char *z) 
    { 

    int i; 
    int *k = malloc(sizeof(int)*20); 
    int j = 0; 

for(i=0; z[i] !='\0';i++) 
    { 
    if(z[i]!= 'x') 
    { 
     k[j]=atoi(&z[i]); 
     j++;} 
    } 


    return k; 

} 
+0

您想了解如何起诉调试器,以便能够浏览您的代码并查看究竟发生了什么。这里还有一些有用的提示:http://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – alk

+1

“atoi”之后,您必须前进到下一个“x”或字符串终止符,但'i'仍然索引你刚刚转换的数字的一部分。这就是为什么它只适用于单位数字。更好的是,前进到下一个非数字,以便您的算法可以处理不同的算术运算符。 –

+0

C没有特定的'string'类型。 – Olaf

回答

0

正如其他人所建议的,学会调试。这将是值得的!


看看strtok。从man strtok

strtok()函数将字符串解析为一系列令牌。

这些标记除以分隔符,如"x"。因此,为了解析号码,使用这样的:

char d[] = "53x23x4"; 

int array[3]; 

char* it = strtok(d, "x"); 

for (size_t i = 0; i < sizeof(array)/sizeof(*array) && it; ++i, it = strtok(NULL, "x")) 
    array[i] = atoi(it); 

注意d点到自动和可写的字符串。 strtok修改字符串的内容,由于字符串文字修改产生未定义的行为,因此您需要在可写位置分配字符串。

而不是array使用一些动态内存分配机制,你有它。这使您摆脱了您目前使用的不便之处。


注:

  • 停止使用char*指向字符串文字。改为使用const char*。这可以防止在您尝试修改字符串文字(未定义的行为)时出现细微的错误。
+0

谢谢!我不确定你会如何在C中使用分隔符。 – condog