繁体   English   中英

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

[英]How to create my own String functions in C?

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

像下面这样的东西会起作用。

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;

}

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

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

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

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

int char_in_string (char *line, char c) { make_string(*line); } int char_in_string (char *line, char c) { make_string(*line); } //哪里是你的return说法? make_string需要char ** ,但表达式*line计算为char 线的类型是什么? 和线路怎么样? 这肯定会在使用时导致段错误。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM