如何替换C中的某个字符

如何替换C中的某个字符,c,C,我正在编写一个程序,用C语言替换用户输入的字符,但我不知道如何替换某些字符。有没有一种C语言的方法可以替换字符串中的字符?如果您了解python,那么我希望python中有点类似这样的内容: string.replace('certain_character','replacement_character') 类似的东西,除了C,而不是python。 这是我迄今为止编写的代码: #include <stdio.h> int main(){ char str[BUFSIZ]; p

我正在编写一个程序,用C语言替换用户输入的字符,但我不知道如何替换某些字符。有没有一种C语言的方法可以替换字符串中的字符?如果您了解python,那么我希望python中有点类似这样的内容:

string.replace('certain_character','replacement_character')
类似的东西,除了C,而不是python。 这是我迄今为止编写的代码:

#include <stdio.h>

int main(){
char str[BUFSIZ];

printf("Welcome To My Secret Language encoder!Enter some text: \n");
scanf("%s",str);

/* 
    Where I want to replace certain characters
*/

printf("Here is your text in secret language mode: %s \n",str);
}


我写这段代码是为了进一步学习C语言,这就是为什么我不使用python这样的高级语言。那么,如何替换字符串中的某些字符呢?

在C语言中没有类似的内容。您必须自己扫描字符串:

#include <string.h>

char str[] = "I love cats";
int i;

for(i = 0; i < strlen(str); i++)
{
    if(str[i] == 'c')
        str[i] = 'b';
}

现在,如果您正在寻找一个子字符串,您将需要类似strstr的东西。

假设您要替换:a为z,b为X

char *replace(char *src, int replaceme, int newchar)  
{
    int len=strlen(src);
    char *p;
    for(p=src; *p ; p++)
    {
       if(*p==replaceme) 
           *p=newchar;
    }
    return src;
}
用法:

 replace(string, 'A', 'z');
 replace(string, 'b', 'X');
这只是执行此操作的逻辑,您需要在代码中包含更多语句。

strchr在字符串中查找给定字符,或返回NULL

int main() {
    int c;
    while ( ( c = getchar() ) != EOF ) {
        char const * found, * source = "abc", * dest = "xyz";
        if ( ( found = strchr( "abc", c ) ) != NULL ) {
            putchar( dest[ found - source ] );
        } else {
            putchar( c );
        }
    }
    return 0;
}

如果您有许多字符要替换为其他字符,如凯撒密码,您可以按如下方式为自己构建查找:

#include <string.h>

char plain[] = "Hello there good people";
char encoder[26] = "ghijklmnopqrstuvwxyzabcdef";
char secret[100]; // long enough

int n = strlen(plain);

for(ii = 0; ii < n; ++ii) {
  secret[ii] = encoder[(tolower(plain[ii]) - 'a')%26];
}
secret[n] = '\0';

没有这样的函数,您必须使用strstr编写一个函数。
如果可以使用std::string,则可以使用string.replace

BUFSIZ是指stdio使用的I/O缓冲区大小。它依赖于实现,并不总是准确的。你应该指定你自己的缓冲区大小,或者更好地,使用一个循环。如果你愿意使用STL,如果你正在学习C++,那么强烈建议你在StActOpjs:嗨,吉姆,这样的问题。在以下示例中,调用replace时出现总线错误:char*string=aAbBcC;替换字符串'A','z';跟进。。。声明并初始化字符字符串[7]=aAbBcC;避免错误。我的错。C1x告诉我们修改这样的字符串将导致未定义的行为。你的代码是可靠的。干杯。你可以用char*something=我的字符串;作为一个真正的const char…-指向只读内存。你已经明白了。你为什么要用int而不是char来向函数传递字符?是因为堆栈上的参数已经对齐了吗?@Floris是的。您可能已经注意到std C库的头执行相同的ex:ctypes.h:int\u EXFUNisalnum,int\u C;gcc 4.8.2中,参数仍然保持一致。
#include <string.h>
char plain[] = "Hello there good people";
char encoder[26] = "ghijklmnopqrstuvwxyzabcdef";
char secret[100]; // long enough

int n = strlen(plain);

for(ii = 0; ii < n; ++ii) {
  if(plain[ii] >= 'a' && plain[ii] <= 'z') {
    secret[ii] = encoder[plain[ii] - 'a'];
  }
  else {
    secret[ii] = plain[ii];
  }
}
secret[n] = '\0';