情況如下:在第一行輸入一個字串,接下來的幾行是'command'。'p' 和 's' 兩種命令,'p' 表示列印字串,'s' 表示替換。例如輸入一個字串 aaabbbcccqwerdd 然后輸入 sbqwerbkkk(s 表示替換,b 作為分隔符,因此它表示用 kkk 替換字串中的 qwer) 預期結果應該是 aaabbbccckkkdd,但我得到了 aaabbbccckkkrdd 有什么幫助嗎?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 1023
int main() {
char str[MAXLEN];
scanf("%s", str);
char command[MAXLEN];
while (scanf("%s", command) != EOF) {
if (command[0] == 'p') {
printf("%s\n", str); }
else if (command[0] == 's') {
char delimiter[] = {"0"};
strncpy(delimiter, command 1, 1);
char *a = command;
a = strtok(command, delimiter);
a = strtok(NULL, delimiter);
char *b = command;
b = strtok(NULL, delimiter);
int alength = strlen(a);
int blength = strlen(b);
char *bereplaced = strstr(str, a);
if (bereplaced == NULL) {
continue; }
int aindex = bereplaced - str;
strncpy(str aindex, b, blength);
}
}
return 0;
}
uj5u.com熱心網友回復:
這里有很多事情可能會出錯,但主要問題是從源字串復制到自身,可能存在記憶體重疊。而是為查找/替換操作的結果宣告一個新緩沖區。
您可以定義一個單獨的find_replace函式,如下所示:
char* find_replace(const char* src, const char* find, const char* replace)
{
if (!src) return NULL;
char* find_ptr = strstr(src, find); if (!find_ptr) return NULL;
int find_start = find_ptr - src;
int find_length = strlen(find);
char* result = malloc(strlen(src) strlen(replace) 1);
strncpy(result, src, find_start);
strcpy(result find_start, replace);
strcat(result, find_ptr find_length);
return result;
}
int main()
{
char source[] = "aaabbbcccqwerdd";
char command[] = "sbqwerbkkk";
if (command[0] != 's') return 0;
char delimiter[] = { "0" };
delimiter[0] = command[1];
char* find = strtok(command, delimiter); if (!find) return 0;
find = strtok(NULL, delimiter); if (!find) return 0;
char* replace = strtok(NULL, delimiter); if (!replace) return 0;
char* result = find_replace(source, find, replace);
if (!result) return 0;
printf("%s\n", result);
free(result);
return 0;
}
uj5u.com熱心網友回復:
這是另一種解決方案。它通過以下方式直接替換輸入字串:
使用
memmove的原單串的后部分移動到其最終位置使用
strncpy以替代子復制到其最終位置
喜歡:
#include <stdio.h>
#include <string.h>
#define MAXLEN 1023
int main(void)
{
char str[MAXLEN] = "aaabbbcccqwerdd";
char command[MAXLEN] = "sbqwerbkkk";
printf("COMMAND : %s\n", command);
printf("TEXT BEFORE : %s\n", str);
char* pfind = command 2; // skip initial sb
char* psub = strchr(pfind, 'b'); // find delimiter
*psub = '\0'; // terminate replace string
psub; // point to substitute substring
size_t flen = strlen(pfind); // calculate length
size_t slen = strlen(psub); // calculate length
char* p = strstr(str, pfind); // find location of replace string
size_t sc = strlen(p); // calculate length
memmove(p slen, p flen, sc - flen 1); // Move trailing part
strncpy(p, psub, slen); // Put in substitute substring
printf("TEXT AFTER : %s\n", str);
return 0;
}
輸出:
COMMAND : sbqwerbkkk
TEXT BEFORE : aaabbbcccqwerdd
TEXT AFTER : aaabbbccckkkdd
免責宣告
為了保持代碼示例的簡短,上面的代碼盲目地相信命令和原始字串形成了合法的替換,并且結果有足夠的記憶體。
在實際代碼中,您需要檢查它。例如檢查strchr和strstr不回傳NULL。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/367113.html
