【问题标题】:The code isn't running successfully nor showing any errors代码未成功运行,未显示任何错误
【发布时间】:2022-09-27 15:58:39
【问题描述】:

用名称字符串替换 {{name}}。

代码正在运行,只是没有显示任何输出。

我使用 vs code 和 mingw 编译器

我无法弄清楚为什么会发生这种情况,我只是想研究自己的逻辑而不是查看解决方案,如果我使用的逻辑完全错误,请指导我

#include <stdio.h>
#include <conio.h>
#include <string.h>


void func(char *string, char *name, char *outlet, char *item)
{
    for (int i = 0; i < strlen(string); i++)
    {
        if (string[i] == \'{\')
        {
            if (string[i + 2] == \'n\')
            {
                int n = i;
                for (int k = 0; k < strlen(name) - 8; k++)
                {
                    for (int l = strlen(string); l >= 15; l--)
                    {
                        string[l + 1] = string[l];
                    }
                }

                for (int j = 0; j < strlen(name); j++)
                {
                    string[n] = name[j];
                    n++;
                }
                i = i + strlen(name);
                continue;
            }

            if (string[i + 2] == \'i\')
            {
                continue;
            }

            if (string[i + 2] == \'o\')
            {
                continue;
            }
        }
    }
}

int main()
{
    FILE *ptr = NULL;
    char string[80] = \"thanks {{name}} for purchasing {{item}} from our outlet {{outlet}}\";
    char name[50] = \"tushar\";
    char item[80] = \"laptop\";
    char outlet[50] = \"meerut\";
    /*ptr = fopen(\"file.txt\",\"r+\");
    fscanf(ptr,\"%[^\\n]s\",string);
    printf(\"the content of this file has %s\\n\",string);*/
    func(string, name, outlet, item);
    printf(\"%s\\n\", string);
    // fputs(str,ptr);
    // fclose(ptr);
    return 0;
}

Just showing some blank spaces

  • 我认为您最好根据您的模板字符串创建一个新字符串,因为字符串的长度可能会发生变化,因为您的所有标记都长于 6 个字符,这是您要插入的字符串的长度。只需逐个字符地复制字符串,直到找到 { 然后在找到时替换并恢复复制 }
  • 该代码有几个实例未定义的行为其索引为string[i + 2] 等,可以超出string 的范围。
  • 避免包含conio.h(您的代码不需要它)。当你包含古老的 DOS 头 conio.h 时,你的代码 100% 不可移植到 DOS/windows 以外的任何地方(当然在这里,它可以简单地删除)
  • @AndersK 是的,让我试试。谢谢哥们!
  • @WeatherVane 但它只会在 string[i] == \'{\' 时触发,您能否详细说明或更正我的代码,这意味着很多。

标签: c


【解决方案1】:

代码中有几个错误,我将建议修复这些错误的代码,并让程序产生您期望的输出。也就是说,我会建议进行一些更改,以使您的代码更具可读性和可靠性。

让它工作

这些循环的目的

for (int k = 0; k < strlen(name) - 8; k++)
{
    for (int l = strlen(string); l >= 15; l--)
    {
        string[l + 1] = string[l];
    }
}

是缩短或延长输入字符串以适应名称比您的关键字{{name}} 更短或更长的情况。但是,它只处理一种情况,即加长。你的名字tushar 比关键字短,所以最后的字符串需要是缩短。

用这个:

for (int k = 0; k < 8 - strlen(name); k++)  // number chars to delete from 'string'
{
    for (int l = 14; l <= strlen(string); l++)  // also copy null-terminator
    {
        string[l-1] = string[l];
    }
}

一些建议

使用 VS Code 中的调试器来帮助您在变量更改值时跟踪它们,这样您就可以查看您的字符串和数组访问是否“越界”。您还可以使用在线调试器,例如onlinegdb,这是我用来验证我添加的循环更改的工具。 您的代码相当 brittle,这意味着它仅适用于非常具体且表现良好的输入数据,并且代码很难更改。例如,您实际上并未测试{{name}},而只是测试第一个{n。因此,如果您希望输入字符串同时包含{{name}}{{number}}(以及类似的),那么您就有麻烦了。此外,您遍历或检查字符串的一些地方可能会超出字符串的结尾。这在 C 中通常是不允许的。这些问题和风险中的许多都可以通过使用库函数来避免。

使用标准C 库, 具有已经完成您想要实现的部分功能的函数,例如 sprintf() 将字符串打印到缓冲区中,或 strchr() 查找字符串中的字符,或 strstr() 查找字符串中的字符串.

【讨论】:

    猜你喜欢
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多