C++ 在函数中填充和比较字符*

C++ 在函数中填充和比较字符*,c++,pointers,arduino,C++,Pointers,Arduino,我编写了函数readChar(),该函数用于逐个读取我的WiFi模块发送的字符(function works已公布),并将它们传递到一个不断增大的字符缓冲区。当检测到char*endChar(多个字符)或timedRead()返回的字符数超过size\u t length时,该函数应停止 我有几个问题: 1/。我不理解语法(在Arduino流库中找到): 你能解释一下数组缓冲区是如何填满的吗? 为什么buffer[index]=(char)c在这里不起作用 2/。我想比较循环中的buffer和e

我编写了函数
readChar()
,该函数用于逐个读取我的WiFi模块发送的字符(function works已公布),并将它们传递到一个不断增大的字符缓冲区。当检测到
char*endChar
(多个字符)或
timedRead()
返回的字符数超过
size\u t length
时,该函数应停止

我有几个问题:

1/。我不理解语法(在Arduino流库中找到):

你能解释一下数组
缓冲区
是如何填满的吗?
为什么
buffer[index]=(char)c在这里不起作用

2/。我想比较循环中的
buffer
endChar
,可能使用
strcmp(buffer,endChar)
(可能有更好的方法)。但这似乎不起作用。事实上,当打印my
char*buffer
的ASCII值时,似乎从缓冲区的末尾开始递增。例如。: 那么,进行这种比较的最佳方式是什么

插入到循环中的代码:

_dbgSerial->println("buffer");
for (int i = 0; i < 32; i++){
    _dbgSerial->print(buffer[i], DEC);
    _dbgSerial->print(",");
    }
_dbgSerial->println("");
首先将c的值写入缓冲区当前指向的对象。 然后它增加缓冲区

这也是循环到打印缓冲区不起作用的原因。 您从刚填充的位置开始打印

这也是你的strcmp不能工作的原因。它实际上并没有比较你在缓冲区中填充了什么。它比较已填充内容以外的内容

如果希望打印代码正常工作,则应在循环之前保存缓冲区的初始值

const char*buffer\u start=buffer;
然后在打印代码中使用它,而不是缓冲区。

正如Rickard所解释的,
*buffer++=(char)c是指针指向的内存分配字符,然后递增指针的方式

但是,您的函数有很多问题-您一直在将未设置的内存与
*endChar
进行比较。我建议:

size_t Debugwifi::readChar(const char * const endStr, // const pointer to const.
                           char * const buffer, const size_t length) {
    if (length < 1) return 0;
    const size_t endLen = strlen(endStr);
    for (size_t index = 0; index < length; index++) {
        const int c = timedRead();
        if (c < 0 ) break;
        buffer[index] = (char)c;

        // Debug
        _dbgSerial->println("buffer");
        for (size_t i = 0; i < length; i++){  // Better to use size_t here, 
                                              // and compare against length not 32
            _dbgSerial->print(buffer[i], DEC);
            _dbgSerial->print(",");
        }
        _dbgSerial->println("");

        // Finished?
        if (index >= endLen) {
            if (memcmp(&buffer[index-endLen], endStr, endLen)==0) {
                _dbgSerial->println("brk"); // Must do this *before* "break"!
                break;
            }
        }
    }
    return index;
}
size\t Debugwifi::readChar(const char*const endStr,//指向const的const指针。
字符*常量缓冲区,常量大小(长度){
如果(长度<1)返回0;
const size_t endLen=strlen(endStr);
对于(大小索引=0;索引<长度;索引++){
const int c=时间恐惧();
如果(c<0)断裂;
缓冲区[索引]=(字符)c;
//调试
_dbgSerial->println(“缓冲区”);
对于(size\u t i=0;iprint(缓冲区[i],DEC);
_DBG序列->打印(“,”);
}
_dbgSerial->println(“”);
//完成了?
如果(索引>=endLen){
if(memcmp(&buffer[index endLen],endStr,endLen)==0){
_dbgSerial->println(“brk”);//必须在“中断”之前*执行此操作!
打破
}
}
}
收益指数;
}
我添加了很多
const
s。吃太多很难

重要的一点是,一旦您读取了足够多的字符,就可以开始比较最后读取的字符和结束标记

请注意,此函数不会删除结束标记,如果传递一个32字节的零填充数组并读取32个字符,则结果不会以零结尾


最后,我把参数名改为“代码> EntrStry<代码>,因为我曾期望 EngChar < /Cord>是一个指向单个字符的指针,而不是一个NUL终止的字符串。它们是不同的语言,正确的方法在这两种语言中完全不同。另外, STRCMP 是用来比较字符串的内容,而不是检查是否到达缓冲区的末端。@ DavidSvurd:它是C++——这是一个成员函数。为什么,这个标记的C?因为很多人认为它们是同一种语言。VReBOSS -请删除C标签。我从ARDUIO DOC中了解到它是基于C++的C++功能。但那是我的理解力差。请随时纠正/编辑我的帖子。与strcmp相同,我知道以null结尾的字符*本质上是字符串,可以进行比较。我知道-因此

int I
不应该在
0
处初始化,但缓冲区是初始指向的。如何获得该值或值是什么?:
for(int i=???
我更新了我的答案。最好只将缓冲区的初始值保存在另一个变量中。例如const char*start=buffer;我不确定我是否可以执行
const char*buffer\u start=buffer;
因为
buffer
需要在函数中更新,更新后的值随后会在我的代码中使用。是的,但是你可以打印时仅使用start。缓冲区仍在所有其他位置使用,并将继续像以前一样工作。将地址复制到另一个变量不会改变原始变量的使用方式。请欣赏详细答案。
索引应在for循环之外声明,以便可以返回,不是吗?
size_t Debugwifi::readChar(char *endChar, char *buffer, size_t length) {
if (length < 1) return 0;
size_t index = 0;
while (index < length) {
    int c = timedRead();
    if (c < 0 ) break;
    //buffer[index] = (char)c;
    *buffer++ = (char)c;
    _dbgSerial->println("buffer");
    for (int i = 0; i < 32; i++){
        _dbgSerial->print(buffer[i], DEC);
        _dbgSerial->print(",");
    }
    _dbgSerial->println("");
    if (strcmp(buffer,endChar)==0) {
        break;
        _dbgSerial->println("brk");}
    index++;
    }
return index;
}
*buffer++ = (char) c;
size_t Debugwifi::readChar(const char * const endStr, // const pointer to const.
                           char * const buffer, const size_t length) {
    if (length < 1) return 0;
    const size_t endLen = strlen(endStr);
    for (size_t index = 0; index < length; index++) {
        const int c = timedRead();
        if (c < 0 ) break;
        buffer[index] = (char)c;

        // Debug
        _dbgSerial->println("buffer");
        for (size_t i = 0; i < length; i++){  // Better to use size_t here, 
                                              // and compare against length not 32
            _dbgSerial->print(buffer[i], DEC);
            _dbgSerial->print(",");
        }
        _dbgSerial->println("");

        // Finished?
        if (index >= endLen) {
            if (memcmp(&buffer[index-endLen], endStr, endLen)==0) {
                _dbgSerial->println("brk"); // Must do this *before* "break"!
                break;
            }
        }
    }
    return index;
}