【问题标题】:parsing a string using pointer pointing to a string without using strdup and strtok functions使用指向字符串的指针解析字符串,而不使用 strdup 和 strtok 函数
【发布时间】:2013-05-07 09:38:42
【问题描述】:

我正在编写一个代码,我想在其中解析传入的字符串(基本上这是用于嵌入式项目,但我想先在 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 当指向输入字符串时,它指向输入字符串 [0] 并将在其中复制整个字符串,而不是仅复制前 12 个字符。我们如何限制这一点?

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

【问题讨论】:

    标签: c string parsing pointers gps


    【解决方案1】:

    这个:

    char *ptr[12];
    

    是一个由 12 个字符指针组成的数组,但您似乎希望它是一个由 12 个字符组成的数组。去掉星号:

    char ptr[12];
    

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

    char tmp[12];
    

    然后确保终止它,并为终止符留出空间:

    char tmp[13];
    
    strlcpy(tmp, inputstring, sizeof tmp);
    

    【讨论】:

    • 谢谢,它有效。我们当然也可以使用 strcpy。而且我知道如果我们使用 *ptr,ptr[0] 将指向整个 inputstring[],这就是为什么更早我正在将整个输入字符串复制到 ptr。
    【解决方案2】:
    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 char 数组的大小上添加 1 个元素

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

    【讨论】:

      猜你喜欢
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 2020-10-03
      • 2015-10-10
      • 2020-07-16
      • 1970-01-01
      • 2020-10-30
      相关资源
      最近更新 更多