“在这个任务中,您需要创建一个共享的动态库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 linux-8:~/lab1$ gcc -o解决方案.c -c解决方案.c:在函数‘main’:solution.c:19:38:警告:传递参数3的‘stringStat’的参数3使指针从整数不加转换打印(“%d”,stringStat("hello",2,2));^ solution.c:12:5:注意:预期的‘int *’但参数类型为‘int’int stringStat(const *string,int乘子,int *count){
没有第18-21行的错误:
我使用-c选项进行编译,它可以工作,但由于某些原因,当您试图启动时,它会报告“权限被拒绝”,并更正了chmod,现在如下所示:
parallels @debian linux-8:~/ labs / lab1 $./解决方案bash:./解决方案:无法执行二进制文件: Exec格式错误
我在这里读了很多信息,我理解指针和声明的问题,但是我不知道下一步该做什么。有点难,请给我举几个例子。
发布于 2017-02-16 22:18:07
我希望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发布于 2017-02-16 16:26:23
作为指针,您正在传递2。2是一个整数,而不是指向该整数的指针。
把这个:
int k = 2;
stringStat("hello", 2, &k);在上面的代码中,k是一个整数,等于2,&k是变量k的地址,所以在stringStat函数中,计数指针开始指向k。
https://stackoverflow.com/questions/42279430
复制相似问题