问题描述
我正在尝试编写一个反转字符串的函数。基本算法有效,但是我无法影响在单元测试中调用时传递的输入参数。我不相信这是重复的,因为我遇到了新的问题。
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
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 (将#修改为@)