我正在尝试编写代码来计算字符串在另一个字符串中重复的次数。 (如果有更简单的方法,请告诉我。)
以下是我现在的代码:
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 ”
发生了什么事?
答案 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种方法可以解决这个问题:
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()
并非在每个系统上都可用。
do
scanf("%s", somestring);
while (getchar() != '\n');
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