0

我正在尝试创建自己的字符串函数,但我似乎被困在了这一点上。下面是我到目前为止制作一个字符串并打印它并返回大小的内容。但是我需要创建一个函数,将指针传递给一个字符字符串以及一个字符,并返回该字符在字符串中出现的次数。我正在尝试从此函数调用函数 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;
}
4

2 回答 2

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;

}
于 2013-02-19T03:06:48.263 回答
1

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

a = (char *) malloc(sizeof(char));// sizeof(char)始终为1,因为 sizeof(type) 告诉你 type 中有多少个字符。malloc 返回哪种类型?没有必要强制转换void *char *,因为该转换是由 C 隐式提供的:a = malloc(1);如果您在转换时遇到错误消失,那么您就缺少了#include <stdlib.h>malloc/realloc 运行所必需的 a 。

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

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

int char_in_string (char *line, char c) { make_string(*line); }// 你的return语句在哪里?make_string 需要 a char **,但表达式的*line计算结果为 a char。线的类型是什么?&线呢?这在使用时肯定会导致段错误。

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

于 2013-02-19T03:50:55.573 回答