如何对char字符串/数组使用malloc()函数?

时间:2013-11-20 21:19:48

标签: c arrays string pointers malloc

我正在编写一个读入字符列表的代码(使用重定向),但是我存储字符的字符串大小为41.字符数不接近于数组,因此我需要使用malloc()来获得确切的数组大小。当我在不使用malloc函数的情况下打印数组时,会打印符号和其他乱码以及字符串。我需要malloc字符串,所以不包括符号和乱码。

代码:

#include <stdio.h>
#include <stdlib.h>

int main() {

    char c;
    char r1[41];
    int a = 0;

    while(scanf("%c", &c) != EOF) {
        if(c >= 'A' && c <= 'Z' || c == '[' || c == '.' || c == '!') {
        r1[a] = c;
        a++;
        }
    }

    printf("\nThe string is: %s\n", r1);

return 0;
}

输出:

The string is TR[!.DFQ▒ ▒ ▒ 這

2 个答案:

答案 0 :(得分:2)

这里混淆了几点混淆。

  1. 由于固定长度与可变长度,您的代码打印乱码的原因并非如此。切换到malloc()无法解决该问题。确保在字符串末尾有一个空终止符('\0'):

    while(scanf("%c", &c) != EOF) {
        ...
    }
    
    r1[a] = '\0';
    
  2. 您的原始代码混合数组和指针语法。对于单个字符串,您应该使用char[]char*,但不能同时使用两者。

    对于固定大小的字符串,请将其声明为:

    char string[40+1];
    

    对于可变长度字符串,请执行:

    char *string = malloc(length + 1);
    
    if (string == NULL) {
        fprintf(stderr, "malloc failed\n");
        exit(EXIT_FAILURE);
    }
    
    // memory allocation successful
    

答案 1 :(得分:1)

char *string[40+1];

这将string定义为41个指向char的数组。如果您希望它包含字符串,您需要将其定义为:

char string[40+1];

如果您知道(在运行时,但不是在编译时)字符串将持续多长时间,您可以使用malloc - 但是您需要将结果分配给类型为{的单个指针{1}}:

char*

这会导致char *s = malloc(len + 1); if (s == NULL) { /* malloc failed, handle the error */ } 指向s数组的第一个(第0个)元素。该数组未初始化,因此您需要将一些数据复制到其中。

完成后,假设内容正确地以空值终止,然后您可以使用以下方式打印字符串的值:

char

comp.lang.c FAQ是这种事情的绝佳资源。