Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 大写一个单词的所有副本:为什么这个代码在它自己的功能中失败?_C_String_C Strings - Fatal编程技术网

C 大写一个单词的所有副本:为什么这个代码在它自己的功能中失败?

C 大写一个单词的所有副本:为什么这个代码在它自己的功能中失败?,c,string,c-strings,C,String,C Strings,我有两个C样式的字符串: char st[100] = "to be or not to be "; char sub_s[100] = "be"; 我需要找到带strstrst,sub_的be的开头,并将其改为大写字母。新字符串必须是“to be or not be” 我在不使用以下功能的情况下完成了此操作: void main() { char st[100] = "to be or not to be "; char sub_s[100] = "be"; ch

我有两个C样式的字符串:

char st[100] = "to be  or not to be ";
char sub_s[100] = "be";
我需要找到带strstrst,sub_的be的开头,并将其改为大写字母。新字符串必须是“to be or not be”

我在不使用以下功能的情况下完成了此操作:

void main()
{
    char st[100] = "to be  or not to be ";
    char sub_s[100] = "be";
    char* p;
    int i;

    while (p = strstr(st, sub_s))
    { 
        for (i = 0; i < strlen(sub_s); i++)
        {
            p[i] -= 32;
        }
    }

    printf("%s\n", st);
}
但当我将此代码放入其自身的函数中时,它不再工作:

void main()
{
    char st[100] = "to be  or not to be ";
    char sub_s[100] = "be";
    replaceSubstring(st, sub_s);
}

void replaceSubstring(char* str, char* substr)
{
    int* p;
    int i;

    while (p = strstr(str, substr))
    { 
        for (i = 0; i < strlen(substr); i++)
        {
            p[i] -= 32;
        }
    }

    printf("%s\n", st);
}

这是怎么回事?

在您编写的函数中,您将p的类型设置为int*,而不是char*。这意味着当你写作的时候

p[i] -= 32;
编译器将假定p指向的每个元素都是int,因此在内存中采取大小为sizeofint的步骤,而不是在内存中采取大小为1的步骤。换句话说,代码被解释为

Start at the location pointed at by p.
Jump forward i * sizeof(int) bytes.
Read an integer value from that location.
Subtract 32 from it.
Write it back
而不是

Start at the location pointed at by p.
Find the character i steps down from there.
Subtract 32 from that character.
要解决此问题,请将p的类型更改为char*,而不是int*

如果将编译器警告级别调到最大,则很容易检测到这种错误。我强烈建议您在学习编写代码时这样做,然后在不理解警告时询问有关警告的问题

其他一些零散的注释:

main的返回类型应该是int,而不是void。 不是从每个字符中减去32,而是在单词中最清楚的东西,考虑从标题中使用ToWar函数。 如果您正在搜索的子字符串仅由非字母字符组成,例如,:-,则此代码可能导致无限循环。你明白为什么吗?想一想你该怎么解决它。
代码和输出不应在图像中,您需要将代码和输出作为正确格式的文本放入问题中。您在函数示例中使用int*p。为什么?请不要发布图片,除非它们是绝对正确的necessary@RandomDavis非常感谢。我下次再做@16吨,因为据我所知,我想指出是不是在感谢你,我现在明白了/但是我们没有学会的tolower.为什么会是无限循环?我的while循环说:尝试在str中找到子字符串,如果是,那么做一些事情。如果不是,他将继续到字符'/0',否?如果使用tolower而不是减法32,那么如果尝试将字符串中:-的所有副本的大小写降低,会发生什么?玩一下这个,看看你发现了什么。如果你不确定是怎么回事,再发一个问题@哈哈哈,最近做太多的C++了。templatetypedef我仍然不明白,如果正在搜索的子字符串仅由非字母字符组成,为什么会有无限循环,比如说:-@templatetypedef,它不会,因为函数将返回NULL,NULL与false一样好。