获取多个字符串作为输入

时间:2017-07-04 17:54:18

标签: c string char scanf

问题是取三个名字作为输入,检查第四个输入是否是这三个名字之一的第一个字母。 *它只需要是alpha类型而不是其他类型。

示例输入:

@ON SNOW
ARYA STARK
HODOR
@ 

输出:

NO

我的代码:

#include <stdio.h>
#include <ctype.h>
int main(){
    char s1[100],s2[100],s3[100];
    char ch[1];
    scanf("%[^\n]s",s1);
    scanf("%[^\n]s",s2);
    scanf("%[^\n]s",s3);
    scanf("%s",ch);
    if(isalpha(ch[0]) && (s1[0]==ch[0] || s2[0]==ch[0] || s3[0]==ch[0]))
        printf("yes");
    else
        printf("no");
}

当我发现gets()不再有效时,我尝试了scanf("%s",s1);。 但由于它没有在空格" "之后存储calude,我尝试了scanf("%[^\n]s",s1);。但扫描以名字本身停止。

John Player
NO

在不使用循环且只使用分支的情况下,在char数组中存储多个字符串的方法是什么?

3 个答案:

答案 0 :(得分:0)

尝试fgets。

fgets(s1,100,stdin);
fgets(s2,100,stdin);
fgets(s3,100,stdin);

答案 1 :(得分:0)

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(<App />, document.getElementById('root'));

答案 2 :(得分:0)

在达到指定问题之前,让我们看看实际问题是什么:

  • scanf()

    的问题

    scanf()的问题在于它在管理溢出方面非常糟糕。并且在字符或字符序列的情况下,在后续扫描中按下输入键时读取换行符。关于这个问题,SO上有很多例子。 scanf() leaves the new line char in buffer?Problems with scanf

  • gets()

    的问题

    最大的缺点是,你需要事先知道输入的大小。如果你非常了解你的输入,你可以使用它(我还是不推荐)。 Why is the gets function so dangerous that it should not be used?

  • fgets()

    的问题

    fgets()

    有两个非常常见的问题

    fgets()的语法是:

          char *fgets(char *restrict s, int n, FILE *restrict stream);`
    

    通常用于

          fgets(char_array,100,stdin)
    
    1. 当输入大于fgets()第二个参数中提供的整数n时,会出现第一个问题。当缓冲区中的输入大于n时,它将剥离前n个字符并为其分配char指针,该指针可能是char数组。但剩下的角色呢?它们仍在输入缓冲区中,并将分配给下一个fgets()。弄乱了。

    2. 第二个问题是,当输入小于int n-1时,每次将新换行符分配给char序列的末尾。

但是如果我们考虑一下fgets()的问题可以用一个简单的技巧解决。

  • 只检查char序列中最近分配的最后一个字符。如果是新行,请将其替换为 NULL 。另外我们知道输入不仅仅是fgets()中提供的 int 。所以我们要做的就是吃掉输入缓冲区中剩余的字符。

以下是一个例子:

   char str1[5];
   char str2[5];
   fgets(str1,5,stdin);

   if(strlen(str1)>0){//to avoid Undefined Behavior in case of null byte input

       if(str1[strlen(str1)-1]=='\n'){

           str1[strlen(str1)-1]='\0';
       }
       else{

           while((getchar())!='\n');//eating the remaing chars in the buffer
       } 
   }

   fgets(str2,5,stdin);


   if(strlen(str2)>0){

      if(str2[strlen(str2)-1]=='\n'){

         str2[strlen(str2)-1]='\0';

      }
      else{

         while((getchar())!='\n');
      }

   }
   printf("\n1.%s\n2.%s",str1,str2);

您甚至可以将使用fgets转换的字符串转换为使用strol或sscanf之类的浮点数和整数,但提防它们可能无法显示独立行为。

现在回到你的问题的解决方案:

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

int main(){
    char s1[100],s2[100],s3[100];
    char ch[2];//make ch atleast 2 char wide

    fgets(s1,100,stdin);
     if(strlen(s1)>0){

          if(s1[strlen(s1)-1]=='\n'){

             s1[strlen(s1)-1]='\0';

          }
          else{

             while((getchar())!='\n');
          }

    }

   fgets(s2,100,stdin);
     if(strlen(s2)>0){

          if(s2[strlen(s2)-1]=='\n'){

             s2[strlen(s2)-1]='\0';

          }
          else{

             while((getchar())!='\n');
          }

    }

   fgets(s3,100,stdin);
     if(strlen(s3)>0){

          if(s3[strlen(s3)-1]=='\n'){

             s3[strlen(s3)-1]='\0';

          }
          else{

             while((getchar())!='\n');
          }

    }    

    fgets(ch,2,stdin);
      if(strlen(ch)>0){

          if(ch[strlen(ch)-1]=='\n'){

              ch[strlen(ch)-1]='\0';

          }
          else{

              while((getchar())!='\n');
          }

     }

    if(isalpha(ch[0]) && (s1[0]==ch[0] || s2[0]==ch[0] || s3[0]==ch[0]))
        printf("yes");
    else
        printf("no");

        return 0;
}