C应用程序跳过我的scanf调用

时间:2012-06-25 23:36:33

标签: c scanf

我正在尝试编写代码来计算字符串在另一个字符串中重复的次数。 (如果有更简单的方法,请告诉我。)

以下是我现在的代码:

int getStringLenght (char str[]) {
    int lenghtOfTheString;
    int i;
    for (i = 0; i < 100; i++) {
        if(str[i] == '\0') {
            lenghtOfTheString = i;
            break;
        }
    }
    return lenghtOfTheString;
}
int main()
{
    printf("Type a string: ");
    char T[1024];
    scanf("%s",&T);
    char P[100];
    printf("Type a substring: ");
    scanf("%s",&P);
    printf("%s",P);
    int stringSize = getStringLenght (P);
    int occurences = 0;
    int i;
    for (i = 0; i < 10; i++) {
        int j;

        if(T[i] == P[0]) {
            for (j = 0;j<10;j++) {
                char c1 = T[i+j];
                char c2 = P[j];
                if(c1 != c2) {

                    break;
                }
                if(j == stringSize-1) {
                    occurences++;
                    //printf("string iguais em i = %d",i);
                }
            }
        }
    }
    printf("\nThe substring %s was found %d times", P, occurences);

    return 0;
}

该应用程序编译。当我输入“banana”时,例如,在第一个scanf上,然后在第二个上输入“na”,应用程序会输出正确的答案。 但是,如果我在第一个scanf上键入“香蕉和牛奶”,它会自动将第二个scanf解释为“和”,即使我没有输入任何内容“香蕉和牛奶 ENTER

发生了什么事?

4 个答案:

答案 0 :(得分:4)

scanf的“%s”转换只会在遇到空格(例如空格,换行符或制表符)之前读取字符。当您输入多个单词时,它会读取第一个单词。第二个调用读取第二个,依此类推。

如果你想阅读整行,你通常想要使用fgets代替scanf也可以做这项工作,但它有点棘手,并且使用了许多属性的功能不知道,所以他们经常发现很难理解。)

答案 1 :(得分:1)

您不明白scanf的工作原理。 http://www.cplusplus.com/reference/clibrary/cstdio/scanf/ %s只读取一个字符串,以空格结尾。如果你想继续阅读字符串或读一行,你必须继续使用scanf,直到你的一个字符串以新行或EOF结尾,或使用其他函数,如fgets

答案 2 :(得分:0)

您必须记住许多功能已经实现。这就是为什么你的getStringLength(你的名字中有拼写错误)是不必要的。您可以使用strlen中的string.h函数检查字符串的长度。更重要的是,当您导入此文件时,您还可以访问strstr函数,该函数查找字符串中第一次出现的给定子字符串。尝试使用它们而不是重新发明轮子;)

答案 3 :(得分:0)

这是scanf的标准问题。有3种方法可以解决这个问题:


1:每次扫描后调用fflush:

scanf("%s", some_string); // you don't need to write &some_string because giving a array to a function automatically converts it to a pointer
fflush(stdin);

fflush()并非在每个系统上都可用。


2:将scanf置于循环中:

do
    scanf("%s", somestring);
while (getchar() != '\n');

3:不要使用scanf!使用fgets和sscanf!

char buffer[100]; // buffer for fgets()
fgets(buffer, 100, stdin); // read a line from stdin (standart input) into buffer
sscanf(buffer, "%s", some_string); // convert buffer in any format you want