我有来自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个元素?
答案 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
}