【问题标题】:String Check not returning a value字符串检查不返回值
【发布时间】: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 字符串的末尾加上星号,我猜是...

标签: c string substring


【解决方案1】:

您还需要用 * 终止第二个字符串 - 然后事情就会正确匹配。事实上,您的代码一直匹配“一个字符太多” - 它在不匹配的 b 字符串末尾找到了 '\0'。

如果你不想在你的 b 字符串的末尾有一个星号,你不能编写期望它的代码......你可以修改你的代码如下(我输入了充足的 printf 语句,所以你可以看到发生了什么)。注意 - 我将修复留给gets 作为练习。真的,请。修复它。

include <stdio.h>

int search(char a[], char b[]);

int main()
{
    char a[100], b[40];
    int loc;

    printf("Enter the main string terminated with '*':");
    gets(a); // please don't...

    printf("Enter the search string :");
    gets(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 = 0, j = 0, lenB, firstOcc;

    for(lenB=0; b[lenB]!='\0';lenB++);

    printf("a is %s\n", a);
    while (a[i] != '*')
    {
        printf("i = %d\n", i);
        while (a[i] != b[0] && a[i] != '*')
            i++;
        if (a[i] == '*')
            return (-1);
        printf("matching a[i]=%c and b[0]=%c\n", a[i], b[0]);

        firstOcc = i;

        while (a[i] == b[j] && a[i] != '*' && j < lenB)
        {
            printf("a[%d] matches b[%d]\n", i, j);
            i++;
            j++;
        }

        if (j == lenB)
            return (firstOcc);
        if (a[i] == '*')
            return (-1);

        i = firstOcc + 1;
        j = 0;
        printf("going to take another look with i=%d and j=%d\n", i, j);
    }
}

【讨论】:

  • 如果可行,您可以考虑接受答案(问题旁边有复选标记)。
猜你喜欢
  • 2018-05-26
  • 2012-11-23
  • 1970-01-01
  • 2022-10-26
  • 2013-10-17
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多