首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C+ linux的练习

C+ linux的练习
EN

Stack Overflow用户
提问于 2017-02-16 16:23:46
回答 2查看 154关注 0票数 0

“在这个任务中,您需要创建一个共享的动态库libsolution.so,它用以下原型实现一个函数:

代码语言:javascript
复制
int stringStat (const char * string, size_t multiplier, int * count);

函数返回字符串值的长度乘以乘数,并增加1的值,这表示要计数。“

我的代码:

代码语言:javascript
复制
#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格式错误

我在这里读了很多信息,我理解指针和声明的问题,但是我不知道下一步该做什么。有点难,请给我举几个例子。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-16 22:18:07

我希望stringStat()的返回值是size_t。但是,正如您所说的,任务需要遵循函数原型:

代码语言:javascript
复制
int stringStat (const char * string, size_t multiplier, int * count);

这就是我们要用的。值得注意的是,标准库函数strlen()有一个返回类型size_t,它是一个保证能够容纳任何数组索引的unsigned整数类型(因此适合这种使用)。我还想将lencount更改为size_tsize_t *,但我们将把它们保留为intint *,以匹配函数原型。

现在,您提供的规范说明了stringStat()函数:

函数返回字符串值的长度乘以乘数,并将1的值增加,这表示要计数。

我将此解释为函数的返回值是字符串的长度,该字符串的长度是输入字符串的multiplier倍。我最初认为,要存储在地址count中的值应该是字符数组的大小,该字符数组包含这样一个字符串,即字符串的乘以长度加上\0终止符的空间。这不太有意义,但保持stringStat()被调用次数的计数器也没有多大意义,所以我将遵从您的代码,它似乎在后面的意义上保持计数器。

综上所述,strln()函数看起来很好,只是在其他情况下,我建议在这里使用size_t而不是intstringStat()函数看起来很好。我修改了main()中的代码,以便更清楚地了解不同变量发生了什么。特别是,您将整数常量2作为第三个参数传递给stringStat(),这将导致原始错误。您需要在这里传递指向int的指针。因此,我声明了int变量main_counter,并将其初始化为零。main_counter的地址是指向int的指针,并传递给函数。在stringStat()函数中,存储在count保持的地址(存储在main_counter中的值)的值在返回乘以的字符串长度之前是递增的。每次调用stringStat()时,main_counter中的值都会增加。

代码语言:javascript
复制
#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;
}

程序输出:

代码语言:javascript
复制
Original string: hello  ---  length: 5
String length multiplied by 2
New string length: 10
Times stringStat() called: 1
票数 0
EN

Stack Overflow用户

发布于 2017-02-16 16:26:23

作为指针,您正在传递2。2是一个整数,而不是指向该整数的指针。

把这个:

代码语言:javascript
复制
int k = 2;
stringStat("hello", 2, &k);

在上面的代码中,k是一个整数,等于2&k是变量k的地址,所以在stringStat函数中,计数指针开始指向k

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42279430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档