所以我被要求这样做,我这样做了:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int N,i;
printf("Give the number of char's you want to input.\n");
scanf("%d",&N);
char *str = (char*) malloc(N);
//this segment inputs the char's to the string.
printf("Input the char's.\n");
for (i=0;i<N;i++)
{
str[i] = getchar();
}
str[N] = '\0';
}
因为我是c的novince, 我想知道是否有另一种/更好的方法来做到这一点。 提前致谢。
答案 0 :(得分:3)
我相信使用诸如malloc()
之类的动态内存分配可以更好地解决您的问题,这意味着代替
char str[N+1];
你应该做
char *str = malloc(N+1);
在完成使用后,不要忘记free(str);
释放内存。
答案 1 :(得分:2)
使用variable length arrays(C99和后者允许)或使用dynamic memory allocation。您的方法是使用VLA。您也可以动态执行此操作:
int N;
printf("Give the number of char's you want to input.\n");
scanf("%d",&N);
char *str = malloc(N+1);
附注:
main
更改为正确的签名int main(void)
。 0
开始。将i
初始化为0
而不是1
,并将上限设置为i < N
。将您的for
循环更改为for (int i = 0; i < N; i++) { str[i] = scanf(" %c"); } str[N] = '\0';
答案 2 :(得分:2)
C99 http://en.wikipedia.org/wiki/Variable-length_array支持您正在尝试做的事情。 GCC从C90支持这一点。
但实际上这是实施事情的坏方法。这些数组在堆栈上分配。这可能非常有用,因为它们的分配和解除分配很快,但这种方法可能会导致例如堆栈溢出。
通常使用动态分配来实现此类任务。请参阅malloc http://linux.die.net/man/3/malloc和免费http://linux.die.net/man/3/free的文档。可以找到包含示例的更完整文档here
答案 3 :(得分:2)
更好的方法是使用fgets()
并建议测试用户输入结果。
printf("Give the number of char's you want to input.\n");
buf[40];
if (fgets(buf, sizeof(buf), stdin) == NULL) {
Handle_EOForIOError();
}
int n; // Suggest lower case 'n'
if (sscanf(buf, "%d", &n) != 1) Handle_SyntaxError();
char str[n+2]; // OP's VLA
if (fgets(str, sizeof(str), stdin) == NULL) {
Handle_EOForIOError();
}
// Trim the \n if needed
size_t len = strlen(str);
if (len > 0 && str[len-1] == '\n') str[--len] = '\0';