无法从 scanf 获取字符串的正确输入(作为数组的字符)
Cannot take proper input from scanf for string (as a character of arrays)
Roy 想提高编程比赛的打字速度。所以,他的朋友建议他反复打出“The quick brown fox jumps over the lazy dog”这句话,因为这是一个拼音。 (Pangrams 是通过使用字母表中的每个字母至少一次来构造的句子。)
这句话敲了好几遍,罗伊就厌倦了。于是他开始寻找其他的pangram
给定一个句子 s,告诉 Roy 它是否是 pangram。
输入格式 输入由包含 s 的行组成。
约束条件
s的长度最多为103(1≤|s|≤103),可以包含空格、大小写字母。字母的小写和大写实例被认为是相同的。
输出格式如果s是pangram则输出包含pangram的一行,否则不输出pangram。
void panagram(char s[])
{
int num1[26]={0};
int num2[26]={0};
int len=strlen(s);
int count=0,j,i;
for(i=0;i<len;i++)
{
if(s[i]>=97&&s[i]<=122)
{
num1[s[i]-97]++;
}
if(s[i]>=65&&s[i]<=90)
{
num2[s[i]-65]++;
}
}
for(j=0;j<26;j++)
{
if(num1[j]>=1||num2[j]>=1)
{ printf("%d\t\t%d\n",num1[j],num2[j]);
count++;
}
}
printf("%d\t",count);
if(count>=26)
printf("panagram");
else
printf("not panagram");
}
int main() {
char s[1000];
scanf("%s",s);
panagram(s);
return 0;
}
该代码适用于没有空格的字符串,例如“Wepromptlyjudgedantiqueivorybucklesforthenextprize”,但不适用于有空格的字符串——“我们及时判断了下一个奖项的古董象牙扣”
谁能告诉我哪里出错了?
我是不是输入错误了?
而不是 scanf()
使用
fgets(s,sizeof(s),stdin);
阅读时使用scanf()
绝对不是一个好主意strings.So我建议你使用fgets()
PS:fgets()
自带换行符,抑制换行符
根据 C11 标准,
7.21.6.2 The fscanf function
[...]
- The conversion specifiers and their meanings are:
[...]
s. Matches a sequence of non-white-space characters. 286
[...]
你有
scanf("%s",s);
征求意见。 %s
将停止扫描输入,直到遇到 whitespace character。根据 C11 标准,space 是一个白色 space 字符:
6.4 Lexical elements
[...]
- [...]
Preprocessing tokens can be separated by white space; this consists of comments (described later), or white-space characters (space, horizontal tab, new-line, vertical tab, and form-feed), or both
[...]
因此,当 %s
看到第一个单词后的 space 时,它会停止扫描。
使用 fgets
解决问题,如 所示,或者如果您需要使用 scanf
,请使用
scanf("%[^\n]",s);
上面的scanf
读取所有内容,直到遇到换行符。更好的方法是限制 scanf
读取的字符数量(在您的情况下最多为 999)以防止 buffer overflows 并检查 return 的值 scanf
查看是否成功(如果 scanf
成功,return 值将为 1)。
注意:与 fgets
不同,上述修复将在标准输入流 (stdin
) 中保留换行符。
Roy 想提高编程比赛的打字速度。所以,他的朋友建议他反复打出“The quick brown fox jumps over the lazy dog”这句话,因为这是一个拼音。 (Pangrams 是通过使用字母表中的每个字母至少一次来构造的句子。)
这句话敲了好几遍,罗伊就厌倦了。于是他开始寻找其他的pangram
给定一个句子 s,告诉 Roy 它是否是 pangram。
输入格式 输入由包含 s 的行组成。
约束条件 s的长度最多为103(1≤|s|≤103),可以包含空格、大小写字母。字母的小写和大写实例被认为是相同的。
输出格式如果s是pangram则输出包含pangram的一行,否则不输出pangram。
void panagram(char s[])
{
int num1[26]={0};
int num2[26]={0};
int len=strlen(s);
int count=0,j,i;
for(i=0;i<len;i++)
{
if(s[i]>=97&&s[i]<=122)
{
num1[s[i]-97]++;
}
if(s[i]>=65&&s[i]<=90)
{
num2[s[i]-65]++;
}
}
for(j=0;j<26;j++)
{
if(num1[j]>=1||num2[j]>=1)
{ printf("%d\t\t%d\n",num1[j],num2[j]);
count++;
}
}
printf("%d\t",count);
if(count>=26)
printf("panagram");
else
printf("not panagram");
}
int main() {
char s[1000];
scanf("%s",s);
panagram(s);
return 0;
}
该代码适用于没有空格的字符串,例如“Wepromptlyjudgedantiqueivorybucklesforthenextprize”,但不适用于有空格的字符串——“我们及时判断了下一个奖项的古董象牙扣” 谁能告诉我哪里出错了? 我是不是输入错误了?
而不是 scanf()
使用
fgets(s,sizeof(s),stdin);
阅读时使用scanf()
绝对不是一个好主意strings.So我建议你使用fgets()
PS:fgets()
自带换行符,抑制换行符
根据 C11 标准,
7.21.6.2 The fscanf function
[...]
- The conversion specifiers and their meanings are:
[...]
s. Matches a sequence of non-white-space characters. 286
[...]
你有
scanf("%s",s);
征求意见。 %s
将停止扫描输入,直到遇到 whitespace character。根据 C11 标准,space 是一个白色 space 字符:
6.4 Lexical elements
[...]
- [...]
Preprocessing tokens can be separated by white space; this consists of comments (described later), or white-space characters (space, horizontal tab, new-line, vertical tab, and form-feed), or both
[...]
因此,当 %s
看到第一个单词后的 space 时,它会停止扫描。
使用
fgets
解决问题,如 scanf
,请使用
scanf("%[^\n]",s);
上面的scanf
读取所有内容,直到遇到换行符。更好的方法是限制 scanf
读取的字符数量(在您的情况下最多为 999)以防止 buffer overflows 并检查 return 的值 scanf
查看是否成功(如果 scanf
成功,return 值将为 1)。
注意:与 fgets
不同,上述修复将在标准输入流 (stdin
) 中保留换行符。