使用scanf()得到一个int和一些字符串?

时间:2013-12-13 06:42:33

标签: c string scanf

我使用scanf读取整数n然后读取n个字符串。但它似乎不起作用。这是程序:

#include <stdio.h>
#include <string.h>

#define MAX 1000
#define MAX_LEN 81

char str[MAX][MAX_LEN];
int a,i;


int main()
{
        scanf("%d", &a);
        for (i=0; i<a; ++i) {
                scanf("%[^\n]", str[i]);
        }

        for (i=0; i<a; ++i)
                printf("%s\n", str[i]);

}

使用%[^\n]我希望将一个句子转换为单个字符串。 有什么问题?

更新:  我想这样输入:

 4
 one 
 two
 THREE three
 FOUR four

但实际上,当我输入“4”时,程序会输出4个空白行然后退出。

[walle@centos64 ~]$ ./a.out
4
_
_
_
_

我期望的输出是这样的:

[walle@centos64 ~]$ ./a.out
4
one
two
THREE three
FOUR four

thans。

3 个答案:

答案 0 :(得分:1)

使用fgets以外的scanf获取输入行。在输入整数getchar之后,额外的n会消耗新行。

scanf("%d", &a);
getchar();
for (i=0; i<a; ++i) {
        fgets(str[i], sizeof(str[i]), stdin);
}

for (i=0; i<a; ++i)
        printf("%s", str[i]);

请注意,fgets也会将新行存储在字符串中。如果您不需要,请将其删除。

答案 1 :(得分:1)

您只需在scanf中的说明符之前添加空格。它将消耗stdin中剩余的\n并使你能够提供第二个输入,依此类推。

更改为scanf(" %[^\n]", str[i]);printf(" %s\n", str[i]);

注意scanf中的空格。

答案 2 :(得分:0)

#include <stdio.h>
#include <string.h>

#define MAX 1000
#define MAX_LEN 81

char str[MAX][MAX_LEN];
int a,i;


int main()
{
        scanf("%d", &a);
        for (i=0; i<a; ++i) {
                scanf("%s[^\n]", str[i]);
                /* scanf("%s", str[i]);*/        /*this line is also OK */
        }

        for (i=0; i<a; ++i)
                printf("%s\n", str[i]);

}


$ gcc -g t.c
$ ./a.out 
2
one
two
one
two

你在“[^ \ n]”之前错过了“%s [^ \ n]”中的's'。