c + linux的练习

时间:2017-02-16 16:23:46

标签: c linux string

"在此任务中,您需要创建一个共享动态库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。

2 个答案:

答案 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整数类型,保证能够保存任何数组索引(因此适用于此使用)。我还想将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中的值都会递增。

#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