【问题标题】:Parse a String in C在 C 中解析字符串
【发布时间】:2009-05-29 08:23:43
【问题描述】:

只使用 C

我想解析一个字符串并且:

  1. 统计字符串中某个字符的出现次数(例如,统计传入字符串中的所有'e's)
  2. 计数后(甚至在我计数时)将 e 替换为 3

【问题讨论】:

  • 听起来像是功课。您应该尝试自己解决问题 - 这很容易 - 如果遇到具体问题,请在此处提问。
  • Homework 认为我。我会使用某种迭代机制(可能是循环)在字符串中移动,在传递时检查每个字符,如果它是我想要的字符,则增加计数,并在同一操作中将其替换为。
  • @qrdl,在假设它是家庭作业之前问一下可能会很好。
  • @Walter,如果这确实是家庭作业并且您不想要解决方案,请将其标记为这样。从长远来看,获得解决方案不会对您有所帮助。而且你至少应该先尝试一下,这样你会得到更多帮助(并且学得更快)。
  • 即使它在技术上不是家庭作业,它也需要家庭作业框架 - 伪代码和想法,而不是直接说明答案。

标签: c string parsing str-replace


【解决方案1】:

好吧,你要么是懒惰,要么是卡住了,假设卡住了。

你需要一个带有类似签名的函数

int ReplaceCharInString(char* string, char charToFind, char charThatReplaces)
{

}

你需要的函数里面

  1. 声明一个整数来计数 发生次数
  2. 从开头移动的循环 字符串到它的结尾
  3. 在循环内部,一个 if 语句 检查是当前字符 charToFind,
  4. 增加计数的语句 发生并执行 替换
  5. 循环后,需要返回 出现次数

【讨论】:

    【解决方案2】:

    此函数将接受一个字符串,将每个 'e' 替换为 '3',并返回它执行替换的次数。安全、干净、快速。

    int e_to_three(char *s)
    {
        char *p;
        int count = 0;
        for (p = s; *p; ++p) {
            if (*p == 'e') {
                *p = '3';
                count++;
            }
        }
        return count;
    }
    

    【讨论】:

    • 因为它是家庭作业问题的解决方案,我猜(不,我不是反对者)。为家庭作业发布实际有效的代码解决方案只会鼓励部分懒惰的人做出不良行为:)
    • 赞成,因为作业标签不在原始问题中,它是由其他人添加的。
    • 作业标签是否存在,对任何人(包括提问者)回答这些“post da codez pleez”类型的问题都没有帮助。
    • 另外,解决方案是错误的我想传递的字符串是 char * s = "Name";在这种情况下,*p=3 将作为“名称”字符串常量给出错误
    • 回复 let-them-c: char * s = "Name";除非您关闭错误,否则编译器应将其标记为错误。
    【解决方案3】:

    这是一个帮助您入门的 shell。如果您需要任何帮助,请在此处询问。

    #include <string.h>
    #include <stdio.h>
    
    int main(){
        const char* string = "hello world";
        char buffer[256];
        int e_count = 0;
        char* walker;
    
        // Copy the string into a workable buffer
        strcpy(buffer,string);
    
        // Do the operations
        for(walker=buffer;*walker;++walker){
            // Use *walker to read and write the current character
        }
    
        // Print it out
        printf("String was %s\nNew string is %s\nThere were %d e's\n",string,buffer,e_count);
    }
    

    【讨论】:

      【解决方案4】:

      一般来说,最好使用标准库函数,而不是自己编写。而且,碰巧的是,有一个标准库函数可以在字符串中搜索一个字符并返回一个指向它的指针。 (它处理一个字符串,所以请查看具有前缀“str”的函数)(库函数几乎肯定会被优化为使用专门的 CPU 操作码来执行任务,而手写代码不会)

      1. 设置一个临时指针(比如“ptr”)指向字符串的开头。

        • 在循环中,以ptr为参数调用上述函数,并将其设置为返回值。

        • 增加一个计数器。

        • 当找不到'e'时,将指针处的字符设置为“3”中断。

      【讨论】:

        【解决方案5】:

        你们中的一些人从中间开始。

        一个更好的开始会是

        char *string = "hello world";
        Assert(ReplaceCharInString(string, 'e', '3') == 1);
        Assert(strcmp(string, "h3llo world") == 0);
        

        【讨论】:

        • 这大概是建议先写测试吧。这很有趣,但我不确定它是否是用 C 语言编写大量指针代码的最佳技术,因为不完整代码的不可预测和不可重复的影响。
        • @Edmund 我很想知道为什么会这样。至少测试指定例程要做什么,并确认它这样做
        • 我认为测试很有用,但我认为在 C 语言中编写它们并让它们从头开始工作的痛苦比在非指针语言中更多,因此 TDD 的好处被削弱了。如果它以非优雅的方式失败,则很难知道原因。如果它通过了,它可能仍然会干扰其他测试。
        • 我不能说这是我的经验,但也许这取决于正在编写什么样的代码
        • 我已经用 C 语言完成了一些 TDD,它工作得非常好。我认为,如果您使用过 C 语言,您将学会小心使用 NULL 和未初始化的局部变量。你会在你的测试中做很多“AssertNotNull()”。然后你主要担心无限循环和离开缓冲区的末端。前者以任何语言锁定您的测试套件;后者是 C 中的崩溃而不是异常,但并不常见。
        猜你喜欢
        • 2010-10-11
        • 2023-03-18
        • 2018-09-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多