【问题标题】:copying an substring to string将子字符串复制到字符串
【发布时间】:2019-12-29 17:16:10
【问题描述】:

我正在尝试从用户那里获取 2 个字符串,第二个将是“针”复制到第一个字符串 例如: 字符串1(用户输入):八高运费 字符串 2(用户输入):八个 输出:八高fREIGHT

for example i want to print: toDAY is a good DAY

在堆栈中复制多个针时遇到问题 我曾尝试使用 while (*str) {其余函数与 str++} 我想要一些解释

  #define _CRT_SECURE_NO_WARNINGS
    #define N 101
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <conio.h>

    void replaceSubstring(char* str, char* substr);
    void main() {
        int flag = 1;
        char str[N], substr[N];
        //char* str_ptr = &str, * substr_ptr = &substr; //creating pointer for the sake of while

        while (flag) {
            printf("\nEnter main text: ");
            gets_s(str,N);
            if (!str)
                flag = 0;
            printf("\nEnter sub-text: ");
            gets_s(substr,N);
            if (!str)
                flag = 0;
            replaceSubstring(str, substr);
            printf("%s",str);
            }
        printf("\nExited. (press any key to exit)");    
    }
    void replaceSubstring(char* str, char* substr) {
        int lensbstr;
        str = strstr(str, substr);
        _strupr(substr); //cnvrt to UPPERCASE
        lensbstr = strlen(substr); //length of the mutual string
        if (str)
            strncpy(str, substr, lensbstr);
    }

【问题讨论】:

  • str = strstr(str, substr); 行中,您将获得子字符串的第一次出现(如果存在)。只要你得到一个不为空的str,你就可以建立一个循环......
  • strncpy(str, substr, lensbstr); 不会以 nul 结尾的结果字符串。
  • @wildplasser 你能解释一下吗?你是什​​么意思不会空终止? :
  • 我错了。您对 stncpy() 的使用等同于具有相同参数的 memcpy()。顺便说一句:您是否意识到如果未找到子字符串,strstr() 将返回 NULL?

标签: c string


【解决方案1】:

这看起来像是一个编程练习,所以我不会只给你答案。不过,我会给你一些提示。

两个大问题:

  • 您没有可以替换第二个和以后的实例的循环。
  • 您将子字符串大写...不是子字符串的副本。第二次通过 replaceSubstring 只会匹配子字符串的大写版本。

几个小问题/样式cmets:

  • str 是一个数组,所以它的值总是非零,所以“if(!str)”永远不会为真。
  • strncpy 几乎从来都不是正确的答案。它可以在这里工作,但你不应该养成使用它的习惯。它的行为是微妙的,很少是你想要的。在这里使用 memcpy 会更快更明显。
  • 您将子字符串大写并测量其长度,即使您没有找到它,因此不需要这些结果。
  • 虽然使用 int 作为标志是可行的并且是传统方式,但新版本的语言具有 stdbool.h、“bool”类型以及“true”和“false”常量。使用这些几乎总是更好。
  • 您似乎打算在用户为第一个字符串输入空字符串时停止。那么在这种情况下你为什么要第二个字符串呢?似乎您想要一个无限循环和中间的“中断”。

【讨论】:

  • 感谢您的提示!你是对的,这是一个练习:) 很抱歉没有给出任何上下文——我只能拥有包含的库。如果用户输入一个字符串而不是另一个,则程序应该退出,(我最初使用 while (*str_ptr && *substr_ptr) 但它不适合练习)在函数中我试图制作一个 while 循环来检查下一次出现 while (*str){ 函数的其余部分,同时将 str 增加 substr 的长度。 } 我要过去了,我真的不知道该怎么做。再次,谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-08-03
  • 2011-11-01
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
  • 2016-03-03
相关资源
最近更新 更多