我正在编写一个读入字符列表的代码(使用重定向),但是我存储字符的字符串大小为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▒ ▒ ▒ 這
答案 0 :(得分:2)
这里混淆了几点混淆。
由于固定长度与可变长度,您的代码打印乱码的原因并非如此。切换到malloc()无法解决该问题。确保在字符串末尾有一个空终止符('\0'
):
while(scanf("%c", &c) != EOF) {
...
}
r1[a] = '\0';
您的原始代码混合数组和指针语法。对于单个字符串,您应该使用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是这种事情的绝佳资源。