微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将Char指针设为C

如何解决将Char指针设为C

我正在尝试编写一个反转字符串的函数。基本算法有效,但是我无法影响在单元测试中调用时传递的输入参数。我不相信这是重复的,因为我遇到了新的问题。

strings_test.c

char *test_reverse_string()
{
    char rv1[512];  // these are not changing below but should
    char rv2[512];  // (yet the first test is passing just length is failing)
    char str1[] = "hello world";
    char str2[] = "a man a plan a canal panama";

    mu_assert(check_strings(reverse_string(rv1,str1),"dlrow olleh") == 0,"Your reverse_string function did not correctly reverse a string.");
    reverse_string(rv1,str1);
    printf(":::::%s:::::;;;;;%i;;;;;",rv1,strlen(rv1)); // I added this line for debugging. It alerted me to fact it wasn't being copied

// This next is the first test that fails 
        mu_assert(strlen(rv1) == 11,"Your reversed string does not have the same length as the original string.");
        mu_assert(check_strings(reverse_string(rv2,str2),"amanap lanac a nalp a nam a") == 0,"Your reverse_string function did not correctly reverse a string.");
        mu_assert(strlen(rv2) == 27,"Your reversed string does not have the same length as the original string.");
    
        return NULL;
    }

从运行printf(),我注意到rv1和rv2保持为空。我相信这是因为调用函数时正在堆栈上进行复制,并且我必须创建一个指向指针的指针,这是我尝试过的,但是却给我带来了错误。我一直在尝试实施此建议here

函数定义是按原样提供给我们的,但是我相应地修改了它们(使用额外的星号)。我不知道他们期望学生采取什么方法。我的方法可能有所不同并且更复杂,但是我认为它应该可以正常工作。顺便说一句,这是一门关于编码训练营模块的存档课程,我也毕业了,如果可能的话,我想坚持我的攻击路线,所以我不在这里

我的代码

strings.h

#ifndef strings_h
#define strings_h

int string_length(char s[]);

char *reverse_string(char rv[],char s[]);

#endif

strings.c

char *reverse_string(char **rv,char *s) // Note this deFinition was given,but with only one '*' next to rv. I added second
{
    int length = string_length(s);
    int temp;
    *rv = s;  // I likewise added all the *'s here and below

    for (int g = 0; g < length / 2; g++)
    {
        temp = *rv[length - g - 1];
        *rv[length - g - 1] = *rv[g];
        *rv[g] = temp;
        // s[length] = "\0";
    }
    return s; // have to return this. Returning rv is wrong type. Return doesn't matter
}

尝试其他S/O post linked above的建议后,我认为它会开始起作用。相反,当然,因为h文件中的定义不同,所以我知道必须更改它,因为出现了此错误

strings.c:29:7: error: conflicting types for ‘reverse_string’    29 | char *reverse_string(char **rv,char *s)
      |       ^~~~~~~~~~~~~~ In file included from /usr/include/string.h:431,from strings.c:3: ./strings.h:6:7: note: prevIoUs declaration of ‘reverse_string’ was here
    6 | char *reverse_string(char rv,char s[]);
      |       ^~~~~~~~~~~~~~ make: *** [<builtin>: strings.o] Error 1

当我将.h文件更改为以下内容时:

char *reverse_string(char **rv,char s[]);

我收到细分错误(核心转储)错误,我一直在阅读,这就是我遇到的问题。

根据建议,我尝试使用参考代替

char *reverse_string(char *&rv,char *s) 

但我知道

error: expected ‘;’,‘,’ or ‘)’ before ‘&’ token

编辑:我在程序中找到另一个通过了测试的人。我不知道为什么他的作品和我的作品没有。当我先运行Make然后再运行./strings时,我的机器就会工作,但是当我运行“ make tests”时,我的机器就不会工作。换句话说,我在调试时得到了预期的结果,但是当我在测试中实际运行它时,它失败了。我是新手,这种测试方式令我感到困惑。我仍然不完全了解发生了什么。我发现输出日志中有一个混乱的根源,它提供了一些误导性数据。

这是另一个家伙有效并通过的功能的完整输出

tests/strings_tests.c:26:31: warning: format ‘%i’ expects argument of type ‘int’,but argument 3 has type ‘size_t’ {aka ‘long unsigned int’} [-Wformat=]
   26 |     printf(":::::%s:::::;;;;;%i;;;;;",strlen(rv1));
      |                              ~^             ~~~~~~~~~~~
      |                               |             |
      |                               int           size_t {aka long unsigned int}
      |                              %li
In file included from tests/strings_tests.c:2:
tests/strings_tests.c: In function ‘main’:
tests/../../utils/minunit.h:17:38: warning: parameter ‘argc’ set but not used [-Wunused-but-set-parameter]
   17 | #define RUN_TESTS(name) int main(int argc,char *argv[]) {\
      |                                  ~~~~^~~~
tests/strings_tests.c:44:1: note: in expansion of macro ‘RUN_TESTS’
   44 | RUN_TESTS(all_tests);
      | ^~~~~~~~~
sh ./tests/runtests.sh
Running unit tests:
-----
RUNNING: ./tests/strings_tests
:::::dlrow olleh:::::;;;;;11;;;;;ALL TESTS PASSED
Tests run: 2
tests/strings_tests PASS

注意第一行printf(第三行)。我添加了这个。这会引发错误,但是下面的同一行并且测试通过。我将printf行插入测试文件以进行调试,因为测试失败时它会中止,我想看看是否有问题。当我运行我的代码时,它因此中止了。我看到他也有相同的空行:::::: ;;;;-换句话说,因为我不知道该怎么读,所以我得到了错误的否定,或者被误导了。好吧,这和这里的另一篇文章1都谈到了如何必须有一个指向超参数的指针的指针,所以这很有意义,但现在不再适用。

关于我的算法失败的原因,我不确定,因为当我运行main时它可以在我的make文件中使用。我看到的唯一区别是,他用他们说的'/ 0'终止了字符串,但我认为将其更改为适当位置将保留该字符。当我尝试手动添加它时,我总是收到错误消息。我很困惑为什么它讨厌我的做事方式

// Tests pass on this copied algorithm
char *reverse_string(char *rv,char *s)
{

    int rslength = string_length(s);
    int index = 0;

    for (int i = rslength - 1; i >=0; i--) {
      rv[index] = s[i];
      index = index + 1;
    }
    rv[index] = '\0';
    return rv;

}

//tests fail. properly reverses string but doesn't get right length
char *reverse_string(char *rv,char *s) 
{
    int length = string_length(s);
    int temp;
    (rv) = s;
    int g;

    for (g = 0; g < (length / 2); g++)
    {
        temp = (rv)[length - g - 1];
        (rv)[length - g - 1] = (rv)[g];
        (rv)[g] = temp;

    }
    // rv[length] = '\0';  // Whether I add this line or not I get the error below 
    return rv;
}

错误

[错误](tests / strings_tests.c:27:errno:无)您反转的字符串与原始字符串的长度不同。 make:*** [../mainbuild.mk:47:tests2]错误1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。