0

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

这是我现在拥有的代码:

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

4 回答 4

4

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

如果你想读一整行,你通常想使用fgets(scanf也可以完成这项工作,但它有点棘手,并且使用了许多人不知道的功能,因此他们经常觉得难以理解)。

于 2012-06-25T23:41:32.817 回答
1

你不明白 scanf 是如何工作的。http://www.cplusplus.com/reference/clibrary/cstdio/scanf/ %s只会读取一个字符串,以空格结尾。如果要继续读取字符串或读取一行,则必须继续使用 scanf 直到其中一个字符串以新行或 EOF 结尾,或者使用另一个函数,例如fgets.

于 2012-06-25T23:42:21.423 回答
0

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


1:每次scanf后调用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
于 2012-06-26T16:11:52.077 回答
0

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

于 2012-06-25T23:52:18.217 回答