问题是取三个名字作为输入,检查第四个输入是否是这三个名字之一的第一个字母。 *它只需要是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数组中存储多个字符串的方法是什么?
答案 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)
当输入大于fgets()第二个参数中提供的整数n时,会出现第一个问题。当缓冲区中的输入大于n时,它将剥离前n个字符并为其分配char指针,该指针可能是char数组。但剩下的角色呢?它们仍在输入缓冲区中,并将分配给下一个fgets()。弄乱了。
第二个问题是,当输入小于int n-1时,每次将新换行符分配给char序列的末尾。
但是如果我们考虑一下fgets()的问题可以用一个简单的技巧解决。
以下是一个例子:
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;
}