【发布时间】:2013-10-24 00:35:40
【问题描述】:
程序应该读取用户想要的任何输入(在这种情况下只是 a 和 b 的字符串)以“*”结尾,然后它会提示用户输入他们希望搜索的子字符串(在这种情况下是“baab ”)。如果找到子字符串,则程序指示是,如果未找到,则指示否。我不允许使用内置的匹配实用程序,它必须一次读取一个字符。
我刚刚用 scanf 替换了gets(),现在当我输入我的子字符串并且我确定它匹配时它仍然说不?
#include<stdio.h>
#include<string.h>
int search(char[], char[]);
int main()
{
char a[100], b[40];
int loc;
printf("Enter the main string :");
scanf("%s", a);
printf("Enter the search string :");
scanf("%s", b);
loc = search(a, b);
if (loc == -1)
printf("No");
else
printf("Yes %d", loc + 1);
return (0);
}
int search(char a[], char b[])
{
int i, j, firstOcc;
i = 0, j = 0;
while (a[i] != '*')
{
while (a[i] != b[0] && a[i] != '*')
i++;
if (a[i] == '*')
return (-1);
firstOcc = i;
while (a[i] == b[j] && a[i] != '*' && b[j] != '*')
{
i++;
j++;
}
if (b[j] == '*')
return (firstOcc);
if (a[i] == '*')
return (-1);
i = firstOcc + 1;
j = 0;
}
}
【问题讨论】:
-
在
printf字符串的末尾添加一个\n(例如、printf("No\n");)。然后你会看到输出。您可能会得到“否”,但它是在您的提示下发生的。仔细看。 :) -
请不要使用
gets。这是非常危险的。你会得到缓冲区溢出。fgets更安全一些(您可以指定读取的最大字节数),getline更好(它将调整输入缓冲区以匹配读取的字符)。gets早就应该从语言中删除了。 -
我在编译时实际上收到了关于 gets() 的警告。您应该使用 -W 标记进行编译并修复所有警告。他们在那里是有原因的。
-
哇。我刚刚编译了你的代码。当我运行它时,输出是
"warning: this program uses gets, which is unsafe"。在它给出实际提示“输入主字符串”之前。不开玩笑。gcc在 Mac 上...我从未见过那个警告——因为我已经好几年没用过gets了。注意 - 警告是在我运行代码时发生的......而不是在我编译时。 -
问题是你没有在
b字符串的末尾加上星号,我猜是...