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