2013-02-19 73 views
0

我想创建我自己的字符串函数,我似乎被卡在这一点。以下是我迄今为止制作一个字符串并打印并返回大小的内容。但我需要做一个函数,该函数将指针传递给一个字符串以及一个char,并返回该字符串中该char的出现次数。我试图从这个函数调用函数make_string,但不能让它工作。 .h文件只有预先列出的功能。任何帮助,这将不胜感激。谢谢!如何在C中创建自己的字符串函数?

#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; 
} 
+0

你能解释一下为什么你试图这样做吗?它不能避免使用内置的字符串函数,因为你使用'printf()'和'getchar()'。它不可能是性能,因为的realloc的'数()'叫你'make_string使()'是荒谬的。那么你想要做什么? – 2013-02-19 03:06:53

回答

1

通过查看该代码给出错误的收集,很容易形成的原因是预计使用该代码的程序可能无法正常工作。

a = (char *) malloc(sizeof(char)); //的sizeof(char)的是总是 1,因为的sizeof(型)告诉你有多少个字符的类型。 malloc返回哪种类型?没有必要将void *转换为char *,因为该转换由C隐式提供:a = malloc(1);如果在执行投影时错误消失,则会丢失malloc/realloc函数所需的#include <stdlib.h>

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

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

int char_in_string (char *line, char c) { make_string(*line); } //您的return声明在哪里? make_string预计为char **,但表达式*line的计算结果为char。线路的类型是什么?那么&行呢?这在使用时肯定会导致段错误。

我相信你在字符串的结束make_string确定,其中字符串结尾的目的,放置一个“\ 0”。我建议在print_string实现中停止'\ 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; 

} 
相关问题