"在此任务中,您需要创建一个共享动态库libsolution.so,它使用以下原型实现一个函数:
int stringStat (const char * string, size_t multiplier, int * count);
该函数返回字符串值的长度乘以乘数,并增加值1,表示计数。"
我的代码:
#include <stdio.h>
unsigned strln(const char *str)
{
unsigned int len = 0;
while(*str!='\0')
{
str++;
len++;
}
return len;
}
int stringStat(const char *string, int multiplier, int *count)
{
*count = *count+1;
return strln(string)*multiplier;
}
int main(void) {
printf("%d", stringStat("hello", 2, 2));
return 0;
}
第18-21行的错误:
parallels @ debian-gnu-linux-8:〜/ labs / lab1 $ gcc -o solution solution.c -c solution.c:在函数'main'中: solution.c:19:38:警告:传递'stringStat'的参数3使得整数指针没有强制转换 printf(&#34;%d&#34;,stringStat(&#34; hello&#34;,2,2)); ^ solution.c:12:5:注意:期望'int *'但参数类型为'int' int stringStat(const char * string,int multiplier,int * count){
没有第18-21行的错误:
我使用-c选项进行编译,它正常工作,但出于某种原因,当你尝试启动./solution时,报告&#34;权限被拒绝&#34;,更正了chmod,现在在这里:
parallels @ debian-gnu-linux-8:〜/ labs / lab1 $ ./solution bash: ./solution:无法执行二进制文件:exec格式错误
我在这里阅读了很多信息,我理解指针和声明的问题,但我不知道接下来该做什么。 它有点难,请在答案中给我一些例子,pz。
答案 0 :(得分:1)
你传递2作为指针。 2是整数,而不是指向整数的指针。
把这个:
int k = 2;
stringStat("hello", 2, &k);
在上面的代码中,k
是一个等于2
的整数,&k
是变量k
的地址,所以在stringStat
函数中,计数指针开始指向k
。
答案 1 :(得分:0)
我希望stringStat()
的返回值为size_t
。但是,正如你所说,任务需要遵守函数原型:
int stringStat (const char * string, size_t multiplier, int * count);
这就是我们将要使用的。值得注意的是,标准库函数strlen()
的返回类型为size_t
,这是一个unsigned
整数类型,保证能够保存任何数组索引(因此适用于此使用)。我还想将len
和count
更改为size_t
和size_t *
,但我们会将其保留为int
和int *
以匹配功能原型。
现在,您提供的规范说明了stringStat()
函数:
该函数返回字符串值的长度乘以乘数,并增加值1,表示计数。
我将此解释为意味着函数的返回值是字符串的长度,它是输入字符串的multiplier
倍。我原本以为要存储在地址count
的值应该是字符数组的大小,它是保存这样一个字符串,也就是字符串加倍的长度加上\0
终止符的空格。这没有多大意义,但保持stringStat()
被调用的次数的计数器也没有多大意义,所以我将遵从你的代码,它似乎在后一种意义上保留了一个计数器。
综上所述,strln()
函数看起来不错,但在其他情况下我建议使用size_t
代替int
。 stringStat()
函数看起来很好。我更改了main()
中的代码,以便更清楚地了解不同变量的情况。特别是,您将整数常量2
作为第三个参数传递给stringStat()
,这导致了原始错误。您需要在此处传递指向int
的指针。所以我声明了int
变量main_counter
,将其初始化为零。 main_counter
的地址是指向int
的指针,并传递给函数。在stringStat()
函数内部,存储在count
所持有的地址处的值(存储在main_counter
中的值)递增,然后返回相乘的字符串长度。每次调用stringStat()
时,main_counter
中的值都会递增。
#include <stdio.h>
int strln(const char *str)
{
int len = 0;
while(*str != '\0') {
str++;
len++;
}
return len;
}
int stringStat(const char *string, int multiplier, int *count)
{
int new_len = multiplier * strln(string);
*count = *count + 1;
return new_len;
}
int main(void)
{
int main_counter = 0;
char *str = "hello";
size_t mult = 2;
int newstr_len = stringStat(str, mult, &main_counter);
printf("Original string: %s --- length: %d\n",
str, strln(str));
printf("String length multiplied by %zu\n", mult);
printf("New string length: %d\n", newstr_len);
printf("Times stringStat() called: %d\n", main_counter);
return 0;
}
节目输出:
Original string: hello --- length: 5
String length multiplied by 2
New string length: 10
Times stringStat() called: 1