C中的字符替换和替换

时间:2016-11-13 12:59:54

标签: c string replace character

我试图编写一个代码,用来替换用户选择的字符串中的字符。例如,如果用户选择londono,则字符串a,则输出应为landan

以下是代码:

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

#define MAXLEN 100

int function2(char str[], char drop, char sub) {
    int i = 0; int num = 0;
    while (str != NULL) {
        if (str[i] == drop) {
            str[i] = sub;
            num++;
        }
        i++;
    }
    return num;
}

int main() {
    char d, s;
    char my_string[MAXLEN];

    printf("Input your string\n");
    scanf("%s", &my_string);
    printf("Input character you want to drop\n");
    scanf(" %c", &d);
    printf("Now character you want to substitute\n");
    scanf(" %c", &s);
    function2(my_string, d, s);
    printf("The string is %s\n", my_string);
    return EXIT_SUCCESS;
}

直到您实际打印更改后的字符串为止。我得到的只是Segmentation fault (core dumped).请注意,函数的代码不是我的(我在某个网站上找到它,所以函数2的原始代码的所有者 - 提前谢谢你)。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:1)

首先,您应该避免使用scanf。如果您对原因和替代方案感兴趣,请点击here

但回到你的问题

while(str != NULL)

是一个无限循环,因为指针不会变为NULL

while(str[i] != '\0')

应该做的伎俩。如果您已经到达字符串的末尾,它会每次检查。

答案 1 :(得分:0)

#!/usr/bin/env python3.5
# -*- coding: utf-8 -*-
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.clock import Clock

gui = '''
GridLayout
    cols: 1

    Label
        text: button.name

    MyButton
        id: button
        name: ''
'''


class MyButton(Button):

    def send_signal(self, dt):
        self.name = str(dt)

    def on_press(self):
        Clock.schedule_interval(self.send_signal, 0)

    def on_release(self):
        Clock.unschedule(self.send_signal)


class Test(App):

    def build(self):
        return Builder.load_string(gui)

Test().run()

str是一个char数组,使用 if (str != null){ while(str[i] != '\0'){ if (str[i] == drop){ str[i] = sub; num++; } i++; } } ,检查数组是否指向有效的内存地址。 使用while循环和i ++,可以循环播放数组中的所有字符,因为字符串以&#39; \ 0&#39;结尾,您需要使用str != NULL停止循环。

答案 2 :(得分:0)

您的函数运行无限循环,因为str永远不会变为NULL,但由于i递增,str[i]最终将访问超出字符串末尾的内存,并且某些点无效内存导致Segmentation fault

另请注意,告诉scanf()要读入my_string的最大字符数并不容易。使用fgets()更安全,并允许替换整个短语。

以下是更正后的版本:

#include <stdio.h>
#include <stdlib.h>

#define MAXLEN 100

int function2(char str[], char drop, char sub) {
    int num = 0;
    for (int i = 0; str[i] != '\0'; i++) {
        if (str[i] == drop) {
            str[i] = sub;
            num++;
        }
    }
    return num;
}

int main(void) {
    char d, s;
    char my_string[MAXLEN];

    printf("Input your string\n");
    if (!fgets(my_string, MAXLEN, stdin))
        return EXIT_FAILURE;
    printf("Input character you want to drop\n");
    if (scanf(" %c", &d) != 1)
        return EXIT_FAILURE;
    printf("Now character you want to substitute\n");
    if (scanf(" %c", &s) != 1)
        return EXIT_FAILURE;
    function2(my_string, d, s);
    printf("The modified string is %s", my_string);
    return EXIT_SUCCESS;
}