String reading issue using scanf
Now i read somehwere:
The scanf() conversion %[\n] will match a newline character, while %[^\n] will match all characters up to a newline.
But in the following code:
#include<stdio.h>
int main() {
printf("Enter Something: ");
char name[100];
scanf("%99[help]", name);
printf("%s",name);
}
I face no problem when i enter help me
as the printed word is help
. However when i enter I need help
it prints garbage. Please help how to fix this problem?
My target is to match the word help
entered anywhere along the input, e.g.,
"This is a test, i need help in this"
Should detect h开发者_开发技巧elp
.
You need to check the result of scanf
. If it fails to match, the pointer you pass in is not modified. In your specific case, name
would then contain arbitrary data.
Once you check the output of scanf
, you'll see it's failing to match on that string. scanf
is not a regular expression parser. It will only attempt a match on the first "item" it sees on the input stream.
The match specifier %99[help]
means "i want to match anything that contains the letters h, e, l, p in any order, up to 99 chars long". That's all. So it fails on the very first letter of your input ("T"), which is not in the set.
If you want to look for a string inside another string, use strstr
for example. To read a whole line, if your environment has it, the easiest is to use getline
.
You need the scanset to recognize all the characters you might enter. You also need to check the return from scanf()
to see whether it succeeded.
#include <stdio.h>
int main()
{
printf("Enter Something: ");
char name[100];
if (scanf("%99[Indhelp ]", name) != 1)
fprintf(stderr, "scanf() failed\n");
else
printf("%s",name);
return 0;
}
That will recognize "I need help" and many other phrases. The C standard says:
If a - character is in the scanlist and is not the first, nor the second where the first character is a ^, nor the last character, the behavior is implementation-defined.
In many implementations, you can use a notation such as %[a-zA-Z ]
to pick up a string of letters or spaces. However, that is implementation-defined behaviour. That means it could do anything the implementation chooses, but the implementation must document what it does mean.
The reliable way to write the scanset is:
%[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ]
Of course, that leaves you with some issues around punctuation, not to mention accented characters; you can add both to the scanset if you wish.
精彩评论