在我的代码中,我有一个包含4个选项的菜单:
1→我试图读取2个字符串,然后
2→算上'e'-s,
3→退出程序,或
4->打印两个字符串。
int add(char *str1, char *str2){
int res=0;
int index=0;
for(index=0;index<20;index++){
if( str1[index] == 'e'){
res++;
}
if( str2[index] == 'e'){
res++;
}
}
return res;
}
void fill(char *str1){
scanf("%[^\n]s", str1);
}
int main(int argc, const char * argv[]) {
char c='A';
int opt=0;
char s1[20]="The first string";
char s2[20]="The second string";
printf(""
"1. Set Strings\n"
"2. calc\n"
"3. ESC\n"
"");
while(c!=27){
scanf("%d", &opt);
switch(opt){
case 1:
fill(s1);
fill(s2);
break;
case 2:
printf("sumOf'e'=%d\n",add(s1,s2));
break;
case 3:
c=27;
break;
default:
printf("%s, %s", s1, s2);
break;
}
}
return 0;
}
问题在于阅读:
输出:
1. Set Strings 2. calc 3. ESC 1 hey hey hey hey hey 4 hey hey hey, The second string
所以问题是它只能读入第一个字符串。 有人能解决这个问题吗? 谢谢。
答案 0 :(得分:1)
scanf
的问题在于它的行为与人们通常认为的不同。 scanf
是一种“扫描格式化输入”功能,当输入具有常规格式时,它可以很好地工作。对于随机输入,scanf
不是最佳选择。看看这个:Why does everyone say not to use scanf? What should I use instead?
如何使用fgets
:
#include <stdio.h>
#include <string.h>
void cut_nl(char *str)
{
if(str == NULL)
return;
int idx = strlen(str);
if(str[idx-1] == '\n')
str[idx-1] = 0;
}
int add(char *str1, char *str2)
{
if(str1 == NULL)
str1 = "";
if(str2 == NULL)
str2 = "";
int counter = 0;
int i;
int len1 = strlen(str1);
int len2 = strlen(str2);
for(i = 0; i < len1; ++i)
if(str1[i] == 'e')
counter++;
for(i = 0; i < len2; ++i)
if(str2[i] == 'e')
counter++;
return counter;
}
int main(void)
{
// for simplicity's sake, let's assume that the user
// doesn't input more then 1023 characters
char line1[1024], line2[1024];
// here you should check if fgets returns NULL
fgets(line1, sizeof line1, stdin);
fgets(line2, sizeof line2, stdin);
cut_nl(line1);
cut_nl(line2);
printf("sumOf 'e': %d\n", add(line1, line2));
return 0;
}
答案 1 :(得分:0)
以下提议的代码:
main()
的正确签名scanf()
以确保通话成功现在建议的代码:
#include <stdio.h> // printf(), scanf()
#include <stdlib.h> // exit(), EXIT_FAILURE
#include <string.h> // strlen()
// prototypes
int add(char *str1, char *str2);
void fill(char *str1);
int add(char *str1, char *str2)
{
int res=0;
for( size_t index=0; index < strlen( str1 ); index++ )
{
if( str1[index] == 'e')
{
res++;
}
}
for( size_t index=0; index < strlen( str2 ); index++ )
{
if( str2[index] == 'e')
{
res++;
}
}
return res;
} // end of function: add
void fill(char *currentStr)
{
if ( 1 != scanf(" %19[^\n]", currentStr) )
{
fprintf( stderr, "scanf for string failed" );
exit( EXIT_FAILURE );
}
} // end of function: fill
int main( void )
{
char c='A';
int opt=0;
char s1[20]="";
char s2[20]="";
while(c!=27) // not 'esc' key
{
printf(""
"1. Set Strings\n"
"2. calc\n"
"3. quit\n");
if( 1 != scanf("%d", &opt) )
{
perror( "scanf for menu option failed" );
exit( EXIT_FAILURE );
}
switch(opt)
{
case 1:
printf( "Enter first string, max 19 chars: " );
fill(s1);
printf( "Enter second string, max 19 chars: " );
fill(s2);
break;
case 2:
printf("sumOf 'e'= %d\n",add(s1,s2));
break;
case 3:
c=27;
break;
default:
printf(" %d is an invalid selection\n", opt);
break;
}
}
return 0;
} // end function: main