c - 如何在 C 中创建我自己的字符串函数?

标签 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;
}

最佳答案

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

a = (char *) malloc(sizeof(char));//sizeof (char) 始终 1,因为 sizeof (type) 告诉您 type 有多少个字符。 malloc返回什么类型?没有必要转换void *char * ,因为该转换是由 C: a = malloc(1); 隐式提供的如果您的错误在转换时消失,则说明您缺少 #include <stdlib.h>这是 malloc/realloc 发挥作用所必需的。

b = getchar();//getchar 返回哪种类型? b 的类型是什么?这些类型应该是相同的,但在您的示例中它们不是。 getchar 返回一个 int,成功后将是一个 unsigned 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”处。如果您尝试使用未初始化的值,则会调用未定义的行为,并且您的程序可能会崩溃。

关于c - 如何在 C 中创建我自己的字符串函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14948932/

相关文章:

c - 指针和cstring初学者的烦恼

c - 二叉树遇到问题

c++ - 是否总是会有一个与您构建的 .dll 关联的 .lib(导入库)?

python - 在字符串中找到左半部分的计数(符号)=右半部分的计数(符号)的索引?

c - 如何释放一个字符指针数组?

c - 不访问结构体指针作为另一个函数中的参数

c - 为什么会出现“被调用对象0不是函数错误”的情况?

c - 在c中打印垃圾值而不是数组中的最大值

c++ - 将字符串解析为数字或数字和百分号

java - 如何在 JTabbedPane JComponent 面板中创建新行?