我正在编写一个读取字符列表的代码(使用重定向),但我存储字符的字符串的大小为41。字符数与数组的大小不接近,因此我需要使用malloc()来获得确切的数组大小。当我在不使用malloc函数的情况下打印数组时,is会将符号和其他胡言乱语与字符串一起打印。我需要对字符串进行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: %sn", r1);
return 0;
}
输出:
The string is TR[!.DFQ▒ ▒ ▒ 這
这里有几个混淆点。
-
您的代码打印胡言乱语的原因并不是因为固定长度与可变长度。切换到malloc()并不能解决这个问题。确保字符串末尾有一个空终止符(
' '
):while(scanf("%c", &c) != EOF) { ... } r1[a] = ' ';
-
您的原始代码混合了数组和指针语法。对于单个字符串,应该使用
char[]
或char*
,但不能同时使用两者。对于固定大小的字符串,将其声明为:
char string[40+1];
对于可变长度的字符串,执行:
char *string = malloc(length + 1); if (string == NULL) { fprintf(stderr, "malloc failedn"); exit(EXIT_FAILURE); } // memory allocation successful
char *string[40+1];
这将string
定义为指向char
的41个指针的数组。如果你想让它容纳一个字符串,你会想把它定义为:
char string[40+1];
如果您知道(在运行时,但不在编译时)字符串的长度,则可以使用malloc
,但您需要将结果分配给类型为char*
:的单个指针
char *s = malloc(len + 1);
if (s == NULL) {
/* malloc failed, handle the error */
}
这使得CCD_ 8指向CCD_ 9的阵列的第一个(第0个)元素。该数组尚未初始化,因此您需要将一些数据复制到其中
完成后,假设内容正确地以null结尾,然后您可以使用打印字符串的值
printf("The string is: "%s"n", string);
comp.lang.cFAQ是这类事情的一个很好的资源。