使用指向字符串的指针解析字符串而不使用strdup和strtok函数

时间:2013-05-07 09:38:43

标签: c string parsing pointers gps

我正在编写一个代码,我想解析一个传入的字符串(基本上这是用于嵌入式项目,但我想先用C测试它。)字符串可以是GPS输出,基本上是NMEA字符串。甚至虽然我已经使用strdup和strtok函数进行了解析,但是当我使用指向该字符串的字符串和指针进行解析时,我感到筋疲力尽。

#include<stdio.h>

int main()
{int i;
char inputstring[100]; //i assumed it to be input string, in this case enter by user.
char *ptr[12];

printf("Enter the string to be printed now.: \n");
scanf("%s",inputstring);

printf("the input string being received from the user is = \n %s \n", inputstring);

for(i=0;i<12;i++)   /*used this for loop to get first 12 characters from inputstring copied into ptr[i] */
{
ptr[i] = &inputstring[i];
}
printf("value of store is = %s \n",*ptr);
return 0;


}

但是这个输出是完整的输入字符串,而不是前12个字符。我进一步挖掘它并发现* ptr指向inputstring时,它指向inputtring [0]  并将整个字符串复制到其中而不是只复制前12个字符。我们如何限制它?

需要帮助。我有另一种方法,但需要帮助来挖掘我的这段代码。

2 个答案:

答案 0 :(得分:1)

此:

char *ptr[12];

是一个包含12个字符指针的数组,但您似乎希望它是一个包含12个字符的数组。删除星号:

char ptr[12];

并重新命名,因为ptr是一个糟糕的名字:

char tmp[12];

然后确保你终止它,并为终结者留出空间:

char tmp[13];

strlcpy(tmp, inputstring, sizeof tmp);

答案 1 :(得分:1)

char ptr[12];

而不是

char *ptr[12];

char ptr[12]:是一个字符数组,大小= 12个字符元素。数组中每个元素的大小= char的大小(1个字节)。

char *ptr[12]:是一个指针数组,其大小= 12个指针元素。数组中每个元素的大小=指针的大小(32位系统为4个字节,64位系统为8个字节)。数组中的每个指针都可以指向一个字符串(char数组)。

您应该使用以下代码

for(i=0;i<12;i++)
{
ptr[i] = inputstring[i];
}

或更简单

memcpy(ptr, inputstring, 12);

,在打印ptr字符串之前,必须在ptr字符串的末尾添加空字符。

所以你必须在ptr字符数组

的大小中添加1个元素
char ptr[13];

memcpy(ptr, inputstring, 12);
ptr[12] = '\0';
printf("value of store is = %s \n",ptr);