通过动态内存分配计算字符串中的字符

时间:2018-10-02 17:11:38

标签: c

我正在编写一个C程序,其中我编写了一个函数以计算函数中的字符数。我必须使用动态内存分配为一个数组分配内存,然后将该数组复制到固定大小的另一个数组中。我为此编写了以下代码:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int count_insensitive(char *str, char ch){
    int n = 0;
    int i;
    for (i=0;i<strlen(str);i++){
        if (tolower(*(str+i))== tolower(ch)){
            n++;
        }
    }
    return n;
}
int main(){
    char *a,ch;
    int i,n;
    n=50;
    a = (char*) malloc(sizeof(char) * n);
    if (a==NULL){
        exit(1);
    }
    fgets(a,sizeof(a),stdin);
    char str[strlen(a)];
    strcpy(str,a);
    free(a);
    char c[] = {'b','H','8','u','$'};
    for (i=0;i<5;i++){
        ch = c[i];
        printf("The character '%c' occurs %d times.\n",c[i],count_insensitive(str,ch));
    }
    return 0;
}

该程序运行,但只使用字符串的前3个字符并打印位置。你能帮我做错什么吗?

1 个答案:

答案 0 :(得分:2)

来自fgets()

  

从流中读取字符并将它们作为C字符串存储到str中,直到已读取(num-1)个字符或到达换行符或到达文件末尾为止,以先到者为准。

其中num是传递给fgets()的第二个参数。

在您的代码中,您将sizeof(a)作为第二个参数传递给fgets()

fgets(a,sizeof(a),stdin);

并且achar指针。

在32位系统上,指针的大小为4字节,在64位系统上,指针的大小为8

似乎您的计算机是32位系统,并且您必须输入超过4个字符,这就是fgets()仅读取给定输入的前3个字符的原因。 / p>

由于您正在将n个字符的内存分配给指针a,因此应将n作为第二个参数传递给fgets()

fgets(a, n, stdin);

此外,strlen()返回空终止字符串的长度,而不包括空终止字符本身。因此,应在1上添加strlen(a),以确保str足够长以容纳空终止符:

char str[strlen(a)+1];
                  ^^