我试图编写一个代码,用来替换用户选择的字符串中的字符。例如,如果用户选择london
和o
,则字符串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的原始代码的所有者 - 提前谢谢你)。任何帮助将不胜感激!
答案 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;
}