【问题标题】:Reading and printing strings in C在 C 中读取和打印字符串
【发布时间】:2015-06-13 13:41:15
【问题描述】:

我想在一个循环中一个接一个地扫描和打印两个字符串。但我做不到。如果我使用循环,只有一个字符串被扫描和打印。如果我尝试在没有循环的情况下打印,那么两个“得到()" 工作正常。

#include <stdio.h>

int main()
{
int T,i,j;
char name1[100];
char name2[100];
scanf("%d",&T);
for(i=0; i<T; i++)
{
    printf("Case %d: ",i+1);
    //scanf("%[^\n]s",name1);        
    gets(name1);
    /*for(j=0; j<strlen(name1); j++)
    {
        printf("%c",name1[j]);
    }*/
    puts(name1);
    //scanf("%[^\n]s",name2);
    gets(name2);
    /*for(j=0; j<strlen(name2); j++)
    {
        printf("%c",name2[j]);
    }*/
    puts(name2);
}
}

【问题讨论】:

  • 请输入输出案例!
  • first scanf or gets()- read-qwerty ytrewq print-qwerty ytrewq second scanf or gets()- read-asd dsa print-asd dsa 我想要这个输出
  • gets一个接一个接着puts一个接一个。
  • 数字的scanf() 在输入流中留下一个换行符,第一个gets() 读取。

标签: c string gets puts


【解决方案1】:

给你。使用fflush(stdin)。它将接受两个输入并一个接一个地打印它们。

#include<stdio.h>

int main()
{
int T,i,j;
char name1[100];
char name2[100];
scanf("%d",&T);
for(i=0; i<T; i++)
{
    printf("Case %d: ",i+1);
    fflush(stdin);
    gets(name1);

    gets(name2);

    puts(name1);

    puts(name2);
}
return 0;
}

编辑:正如下面评论中所建议的,如果您不知道要阅读的字符数,则不建议使用 gets()。

【讨论】:

  • 建议尽可能不要使用gets。不是每个人都知道getsconsidered extremely unsafe
  • 请参阅Using fflush(stdin),了解使用fflush(stdin) 的(缺点)优点。
  • 那我一般应该怎么复制粘贴字符串呢? @Jonhware
  • @saqibshafin 查看 cmets 中的链接。此处发布的链接通常会解释出现问题的原因以及如何纠正错误。
  • @saqibshafin 任何可以限制要复制的字符数的字符串复制例程通常比gets 等未经检查的例程安全很多。缓冲区溢出很讨厌
【解决方案2】:

从用户处获取测试用例后,下一行gets() 函数将获取'\n',您必须忽略该场景。

这是这个问题的一个棘手的解决方案。只需在 scanf 函数中的%d 之后使用'\n'scanf("%d\n",&amp;T);

#include <stdio.h>

int main(void) {
    char s1[100],s2[100];
    int i,T;
    scanf("%d\n",&T);
    for(i = 0; i < T; i++){
        printf("Case %d: ",i+1);
        gets(s1);
        puts(s1);
        gets(s2);
        puts(s2);
    }
    return 0;
}

【讨论】:

    【解决方案3】:

    您不会终止打印。 标准输出被缓冲。 仅在“\n”或显式刷新之后执行打印。 尝试一下:

    #include <stdio.h>
    
    int main()
    {
        int T,i,j;
        char name1[100];
        char name2[100];
        scanf("%d",&T);
        for(i=0; i<T; i++)
        {
    #ifdef BAD_CODE
            printf("Case %d: ",i+1);
            gets(name1);
            puts(name1);
            gets(name2);
            puts(name2);
            putchar("\n");
    #else //better code
            fgets(name1, sizeof(name1)-1, stdin);
            fgets(name2, sizeof(name2)-1, stdin);
            printf("Case %d: '%s' '%s'\n",i+1, name1, name2);
    #endif
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-20
      • 2019-06-05
      • 2013-11-23
      • 1970-01-01
      相关资源
      最近更新 更多