2016-01-24 32 views
0

我正尝试读取其大小我在一个变量L预先存储关于用C的scanf

因此,举例来说,如果尺寸为3个字符的字符串,那么我想这个阅读:

fscanf(read,"%.3s",pointer); 

但在这种情况下,我不会知道字符串的大小,正如我前面所说,我存储在一个变量中的大小。

我试过没用过任何东西(因为我没有意识如何做到这一点)。我不能因为某些原因而发布这个问题,如果我不写这个,我认为如此忽略这个句子,或者如果你能告诉我我做错了什么,那么继续。然后我该怎么做?如何将“%.3s”中的“3”更改为包含该值的变量?

+2

您可以使用fgets –

回答

1

你可以做,使用与fgets:

char *fgets(char *s, int size, FILE *stream); 

据人:

与fgets()最多有一个小于大小的字符从流 并将它们存储读取到缓冲区中指出通过。读取- 在EOF或换行符后停止。如果读取换行符,则将其存储到缓冲区中。终止空字节('\ 0') 存储在缓冲区中的最后一个字符之后。

代码示例:

#include <stdio.h> 

int main(void){ 

     int length = 0; 

     puts("Length of the string : "); 
     scanf("%d ", &length); 

     char string[length]; 

     fgets(string,length,stdin); 

     puts(string); 

return 0; 

} 

,或者您可以使用malloc:

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

int main(void){ 

     int length = 0; 
     char *string = NULL; 

     puts("Length of the string : "); 
     scanf("%d ", &length); 

     string = malloc((length+1) * sizeof *string); 

     fgets(string,length,stdin); 

     puts(string); 

     free(string); 

return 0; 

} 
+0

谢谢,我现在明白了怎么做 – killezio

+0

@ killezio请,接受两个答案之一,如果我们帮助你,也可以点击向上按钮:) –

+0

我该怎么做接受? – killezio

1

可以动态地生成您传递给fscanf格式字符串。例如:

sprintf(fmt, "%%.%ds", n); 

如果n是3,则fmt将包含%.3s例如。然后,您可以将fmt作为格式参数传递给fscanf。当然,您需要为fmt分配空间,但对于需要的空间量设置一个上限应该很简单。

+0

感谢您的帮助 – killezio