如何在C中创建自己的String函数?

时间:2013-02-19 02:42:09

标签: c string pointers

我正在尝试创建自己的字符串函数,而我似乎陷入了困境。下面是我到目前为止制作一个字符串并打印它并返回大小。但我需要创建一个函数,将指针传递给字符串以及字符串,并返回字符串中该字符串的出现次数。我试图从这个函数调用函数make_string但无法让它工作。 .h文件只具有预先列出的功能。任何帮助都将不胜感激。谢谢!

#include "readLineUtilities.h"

int make_string(char **line)
{
char *a,b;
int i,size=0;
a = (char *) malloc(sizeof(char));
b = getchar();
while( b != '\n' && size < MAX)
{       
    *(a+size) = b;  //remember at this point size = 0
    size++;
    b = getchar();
    a = realloc(a,size+1);
}
*(a+size) = '\0';  //end of string marker so no need to return the size directly
*line = a;
return size;    

}

int char_in_string (char *line, char c) {

make_string(*line);

}

void print_string(char *line, int size){
char *a;
int i;
a = line;
for (i=0;i<size;i++)
    printf("%c",*(a+i)); //no end of line
printf("\n");
}


int length_string(char *line){
int size = 0;
char *c,b;
c = line;
if ( c == NULL){ 
    printf("line is null\n");
    return size;
}
while (*(c + size) != '\0'){
    size++;
}
return size;
}

2 个答案:

答案 0 :(得分:1)

以下内容可行。

int char_in_string (char *line, char c) {

    int len = make_string(&line);
    int i, cnt = 0;
    for ( i = 0; i < len; ++i )
    {
        if ( line[i] == c ) ++cnt;
    }
    return cnt;

}

答案 1 :(得分:1)

通过查看此代码中显示的错误集合,很容易形成使用此代码的程序可能无法按预期运行的原因。

a = (char *) malloc(sizeof(char)); // sizeof(char)始终 1,因为sizeof(type)会告诉您类型中有多少个字符。 malloc返回哪种类型?没有必要将void *转换为char *,因为转换是由C隐式提供的:a = malloc(1);如果您在投射时有错误消失,则错过{{1}这是malloc / realloc运行所必需的。

#include <stdlib.h> // getchar返回哪种类型? b的类型是什么?这些类型应该是相同的,但在你的例子中它们不是。 getchar返回一个int,成功时将是unsigned char值。失败后,getchar将返回一个负值,该值与任何可能的成功值不同。我建议将getchar()的返回值存储到int中,并在继续之前验证它是否为正数。否则,当getchar()返回与'\ n'值不同的错误时,您的程序可能会挂起和bogart资源。

b = getchar(); //如果realloc返回NULL会发生什么?您的程序泄漏了旧的分配。我建议将返回值分配给a = realloc(a,size+1);,并在覆盖之前检查是否成功。如果你不解决这个问题,你的程序可能会偶尔发生段错误。

char *temp //您的int char_in_string (char *line, char c) { make_string(*line); }声明在哪里? make_string需要return,但表达式char **的结果为*line。线的类型是什么? &amp; line怎么样?这肯定会在使用时导致段错误。

我假设您在make_string中的字符串末尾放置一个'\ 0',以确定字符串结束的位置。我建议你在print_string实现中停在'\ 0'。如果您尝试使用未初始化的值,则表示您正在调用未定义的行为,并且您的程序可能会崩溃。