用白色空格扫描一系列字符串

时间:2017-03-25 16:43:39

标签: c

我的代码用于读取字符串的输入,而换行符用作分隔符。但是我的代码没有正确读取输入,输出与输入不同。在我的代码中,我使用%* [\ n] c来读取任何存在的换行符并跳过它,以便在读取下一个字符串时不包括它。

  #include<stdio.h>
  main()
  {
     char s[100],s1[100],s2[100];
     scanf("%[^\n]s%*[\n]c%[^\n]s%*[\n]c%[^\n]s%*[\n]c",s,s1,s2);
     printf("%s%s%s",s,s1,s2);
     return 0;
  }

我对此计划的投入如下:

this is 1st line
this is 2nd line
this is 3rd line

我的输出是

this is 1st line.N=ö

有人可以更正我的代码。谢谢。

2 个答案:

答案 0 :(得分:1)

在发布的代码中,存在缓冲区溢出的风险,因为没有为输入缓冲区指定最大宽度。应始终为安全代码指定此类宽度;记得为终止字符串的空字符留空间。

scanf(" %99[^\n] %99[^\n] %99[^\n]", s, s1, s2);

fgets()函数更适合读取输入行。请注意,fgets()在读取输入行时会保留换行符,因此您可能希望在某些情况下删除换行符。此外,如果用户输入的字符数多于指定缓冲区中的字符数,则换行符和某些字符将保留在输入流中。但这与使用scanf()没有什么不同,因为在IO操作之后,必须始终注意输入流中可能留下的内容。无论如何,使用fgets()通常比使用scanf()更不容易出错,并且将用户输入存储在字符串中是有好处的。 sscanf()函数始终可以在使用fgets()获得的字符串上使用,但在这种情况下,您仍然可以在调用sscanf()后使用输入字符串。

另请注意,OP代码中的函数签名必须是以下之一:

int main(void)

int main(int argc, char **argv)

int main(int argc, char *argv[])

以下是使用fgets()读取然后显示输入行的示例:

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

#define MAXLINES  25
#define BUF_LEN   1000

int main(void)
{
    char lines[MAXLINES][BUF_LEN];
    size_t num_lines = 0;

    puts("Enter some lines of text (empty line to quit):");

    for(num_lines = 0; num_lines < MAXLINES; num_lines++) {
        if (fgets(lines[num_lines], BUF_LEN, stdin) == NULL) {
            fprintf(stderr, "Error in fgets\n");
            exit(EXIT_FAILURE);
        }
        if (lines[num_lines][0] == '\n') {
                break;
        }
    }

    for (size_t i = 0; i < num_lines; i++) {
        printf("%s",lines[i]);
    }

    return 0;
}

答案 1 :(得分:-1)

#include<stdio.h>
main()
{
    char s[100], s1[100], s2[100];
    scanf("%[^\n] %[^\n] %[^\n]", s, s1, s2);
    printf("%s\n%s\n%s\n", s, s1, s2);
}