如何编辑流式字符串数组中的元素

时间:2014-11-18 14:17:19

标签: c++ arrays

我有来自fgets(使用popen()的web数据而不是文件)的记录,这些记录是const char *数组格式。

const char * cstr = buff;

第3项是字符串,需要删除或更改为零。 如何以增量5?

访问const char *数组流中的第3个元素
1
2
string
4
5
1
2
string
4
5

代码:

while(fgets(buff, sizeof buff, fp) != NULL)
{
        const char * cstr2 = buff;
        for(int i = 0; i < 5; ++i){
                if(i == 3){
                        if (!strcmp(cstr2, "Buy\n")) {
                                printf("Found One!\n");
                                cstr2[2] = 0;
                        }
                        if (!strcmp(cstr2, "Sell\n")) {
                                printf("Found Two!\n");
                                cstr2[2] = 0;
                        }
                }
        }
}

预期产出:

1
2
0
4
5
1
2
0
4
5

错误: 没有匹配和: 错误:分配只读位置'*(cstr2 + 2u)'

如何正确访问char流式字符串数组中的第3个元素?

2 个答案:

答案 0 :(得分:0)

从示例代码中不清楚预期输出。它是一个整数数组吗?格式化的文本字符串?一个字节数组?我们无法知道。

假设您有一个文本格式的输入并想要一个文本格式的输出,一个简单的解决方案是编写一个具有正确值的新字符串,而不是尝试修改您的输入缓冲区。

如果您知道输入记录的确切格式,则可以使用fscanf进行解析而不是手动执行。您可以使用ssprintf来格式化输出字符串。

正如其他人所指出的那样,如果您可以使用C ++,那么您可以拥有更安全/更简单的选项。请评论您是否愿意使用C ++。

答案 1 :(得分:0)

此解决方案之前由匿名发布:

char* getmyData()
{
    char buff[BUFSIZ];
    FILE *fp = popen("php getMyorders.php 155", "r");
    if (fp == NULL) perror ("Error opening file");
    size_t size = 1000;
    char* data = (char*)malloc(size);
    char* ptr = data;
    std::string::size_type sz;
    int i=0;
    while(fgets(buff, sizeof(buff), fp) != NULL)
    {
            const char * cstr2 = buff;
            const char* test = ptr;
            //for(int i = 0; i < 5; ++i)
            {
                    if(i == 2){
                            if (!strcmp(cstr2, "Buy\n")) {
                                    printf("Found One!\n");
                                    strcpy(ptr,"0\n");
                                    //ptr+=2;
                            }
                            else
                            if (!strcmp(cstr2, "Sell\n")) {
                                    printf("Found Two!\n");
                                    strcpy(ptr,"0\n");
                                    //ptr+=2;
                            }
                            else
                            {
                                strcpy(ptr,cstr2);
                                ptr+=strlen(cstr2);
                            }
                    }
                    else
                    {
                        strcpy(ptr,cstr2);
                        ptr+=strlen(cstr2);
                    }

                    try
                    {
                        int nc = std::stod (test,&sz);
                        std::cout << "Test: " << 1+nc << "\n";
                    }
                    catch(...)
                    {
                    }

                    i++;
                    if (i==5)
                        i=0;


            }

            if (ptr-data+100>=size)
            {
                int ofs = ptr-data;
                size*=2;
                data = (char*)realloc(data,size);
                ptr = data+ofs;
            }
        }
    return data; // DONT FORGET TO call free() on it
}