【问题标题】:adding new string in the middle of another one - c在另一个字符串的中间添加新字符串 - c
【发布时间】:2016-10-08 22:56:55
【问题描述】:

我的任务是编写一个字符串,然后编写该字符串的一部分,该部分需要用另一个字符串替换。我设法让它工作,但如果被替换的字符串比需要替换的那部分字符串更长,它只会“吃掉”一些字母。我能在这个任务上得到一点帮助吗? 工作代码示例:

输入:

This is a beautiful day.
END

输入2:

a be

输入3:

not a bee

预期输出:

This is not a beeautiful day.

我的输出:

This is not a beeful day.

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX 1000

main(){
    char unos[MAX+1];
    int i = 0;
    char c;
    printf("Enter text. For end type END\n");
    while (1){
        scanf("%[^\n]%*c", unos, &c);
        i = strstr(unos, "END") - unos;
        if (i >= 0){
            unos[i] = '\0';
            break;
        }
    }
    char trazena_zamjena[MAX + 1] = "\0";
    char zamjena[MAX + 1];
    printf("Enter part that needs to be replaced : ");
    i = 0;
    do{
        scanf("%c", &trazena_zamjena[i]);
        if (trazena_zamjena[i] == '\n') {
            trazena_zamjena[i] = '\0';
            break;
        }
        i++;
    } while (trazena_zamjena[i] != '\n');
    printf("Enter replacing text : ");
    i = 0;
    do{
        scanf("%c", &zamjena[i]);
        if (zamjena[i] == '\n') {
            zamjena[i] = '\0';
            break;
        }
        i++;
    } while (zamjena[i] != '\n');
    int l = i;
    char *ptr;
    ptr = strstr(unos, trazena_zamjena);
    printf("pointer : %d %p", ptr, ptr);
    strncpy(ptr, zamjena, l);
    printf("%s\n", unos);
}

【问题讨论】:

  • 如果你想读一整行,不要使用scanf使用复杂的格式字符串,而是使用fgets
  • scanf("%[^\n]%*c", unos, &amp;c); 对我来说似乎是错误的
  • @Joachim Pileborg 输入的代码工作正常,进行更改的那个工作不正常。我们还没有在课堂上使用 fgets,所以我们不能使用它。
  • @AntonioGvardijan 所以你不能使用fgets (?!)。
  • 您正在用strncpy 覆盖字符串,因此您的程序的行为是正确的。如果您想插入 个字符,那么您必须通过进一步移动字符串的末尾来插入它们。拿一张纸,在替换前后画出unos 缓冲区的内容。

标签: c string append


【解决方案1】:

让我们忘记字节序。 在 C 中使用字符串时,会将一个以'\0' 结尾的字符序列放入内存中。

假设您有以下字符串char * str = "string";,其地址为str。 通过使用

ptr = strstr(str, "i");

ptr 的值将是str+3(字符'i' 的地址) 因此,假设您尝试将 'i' 替换为 "ae"

strncpy(ptr, "ae", 2);

会在ptr'i')指向的地址写入'a',在ptr + 1指向的地址写入'e'(这里是'n'的地址) 如果被替换的子串太小,你应该移动所有的followig字符。

您可以通过

修改代码的结尾
printf("pointer : %d %p", ptr, ptr);
int len_substr = strlen(trazena_zamjena);
if (l > len_substr)
  strncpy(ptr + l,  ptr + len_substr, strlen(ptr + len_substr));
strncpy(ptr, zamjena, l);

如果您添加的字符串小于要删除的子字符串,您也会遇到类似的问题。

【讨论】:

  • 这是评论而不是答案。
猜你喜欢
  • 1970-01-01
  • 2012-08-28
  • 2013-10-27
  • 2011-04-22
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 2019-12-23
  • 2015-04-04
相关资源
最近更新 更多