如何声明一个字符串,以便用户在c中给出它的长度?

时间:2014-01-11 14:51:34

标签: c string

所以我被要求这样做,我这样做了:

    #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, 我想知道是否有另一种/更好的方法来做到这一点。 提前致谢。

4 个答案:

答案 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)
  • 数组索引从C中的0开始。将i初始化为0而不是1,并将上限设置为i < N。将您的for循环更改为
for (int i = 0; i < N; i++)  
{
     str[i] = scanf(" %c");
} 
str[N] = '\0';
  • 根据H2CO3的建议,请勿使用scanf,尤其是grtchar。 请改用fgets

答案 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';