strcat给了我一个分段错误
在确认strcat是错误发生的地方之后,我检查了作业中的前一个示例。在我前面的示例中,我使用strcat(实际上是strncat)的方式与我在下面代码中使用的方式相同。我不太确定 我的程序的目的是在“字符串”中循环,并从字符串中删除字符“c”中出现的任何内容 主要条款c:strcat给了我一个分段错误,c,arrays,char,append,strcat,C,Arrays,Char,Append,Strcat,在确认strcat是错误发生的地方之后,我检查了作业中的前一个示例。在我前面的示例中,我使用strcat(实际上是strncat)的方式与我在下面代码中使用的方式相同。我不太确定 我的程序的目的是在“字符串”中循环,并从字符串中删除字符“c”中出现的任何内容 主要条款c: char string[100]={0}, c[3]; printf("Enter a String: "); fgets(string, 100, stdin); if (string[98] == '\n' &a
char string[100]={0}, c[3];
printf("Enter a String: ");
fgets(string, 100, stdin);
if (string[98] == '\n' && string[99] == '\0') { while ( (ch = fgetc(stdin)) != EOF && ch != '\n'); }
printf("Enter a Char: ");
fgets(c, 2, stdin);
while ( (ch = fgetc(stdin)) != EOF && ch != '\n');
rmchr(string, c[0]);
标题:
rmchr(char *string, char c)
{
int i=0;
char *word[100];
int s = strlen(string);
for(i=0; i<=(s-2); i++)
{
if(string[i] != c)
{
strcat(word, string[i]);
}
}
}
rmchr(字符*字符串,字符c)
{
int i=0;
字符*字[100];
int s=strlen(字符串);
对于(i=0;i
它将在您的程序中保存一个字符串,因此请使用:
char word[100];
也就是说,一个char
数组,而不是char*
数组
然后,strcat
连接到一个字符串,但word
未初始化。使用以下命令将其设置为字符串:
word[0] = '\0';
然后string[i]
是一个字符,但是strcat
需要指向字符参数的指针:要使用指针,请使用&string[i]
最后,rmchr
函数中的问题是它必须通过参数或返回语句返回某些内容,但它没有返回
rmchr()
[FWIW,在这种情况下,我想知道如何使用局部变量word
]
在rmchr()
内部,word
需要是char
s的数组,而不是char
指针。您需要将char*word[100]
更改为char-word[100]
在strcat()
中,两个参数都需要是指针。在这种情况下,您需要使用&string[i]
下面的代码似乎编译得很好,但您的代码并没有达到您所希望的效果,“我的程序的目的是循环遍历“string”,并从string中删除任何字符“c”出现的情况。”。函数不会删除字符或返回排除字符的字符串副本。我编写了一个函数,在删除字符后复制字符串并返回指向该字符串的指针。下面是您的代码,下面是我的函数
//Just a compilable version of your code, not sure if it does what u want
#include <stdio.h>
#include <string.h>
void rmchr(char *string, char c)
{
int i=0;
char word[100];
int s = (int)strlen(string);
for(i=0; i<=(s-2); i++)
{
if(string[i] != c)
{
strcat(word, (char *)(&string[i]));
}
}
}
int main(int argc, const char * argv[]) {
char string[100] = {0}, c[3];
char ch;
printf("Enter a String: ");
fgets(string, 100, stdin);
if (string[98] == '\n' && string[99] == '\0') {
while ( (ch = fgetc(stdin)) != EOF && ch != '\n');
}
printf("Enter a Char: ");
fgets(c, 2, stdin);
while ( (ch = fgetc(stdin)) != EOF && ch != '\n');
rmchr(string, c[0]);
return 0;
}
//只是代码的可编译版本,不确定它是否符合您的要求
#包括
#包括
void rmchr(字符*字符串,字符c)
{
int i=0;
字符字[100];
int s=(int)strlen(字符串);
对于(i=0;istrcat(字,字符串[i])
本应无法编译。GCC有时会将字符串函数声明为内部函数,即使程序员忘记了#包含。您的头文件中有rmchr函数?如果是这样,它应该移动到C文件中。顺便说一句,我会使用更少的幻数(如100)和更多的常量(如LONGESTWORD
或expressio)ns就像sizeof(array)
(但不是指针!)。@user2864740绝对是,但这是最基本的要求。否则,任何一个像样的编译器都会尖叫的。:)
//Just a compilable version of your code, not sure if it does what u want
#include <stdio.h>
#include <string.h>
void rmchr(char *string, char c)
{
int i=0;
char word[100];
int s = (int)strlen(string);
for(i=0; i<=(s-2); i++)
{
if(string[i] != c)
{
strcat(word, (char *)(&string[i]));
}
}
}
int main(int argc, const char * argv[]) {
char string[100] = {0}, c[3];
char ch;
printf("Enter a String: ");
fgets(string, 100, stdin);
if (string[98] == '\n' && string[99] == '\0') {
while ( (ch = fgetc(stdin)) != EOF && ch != '\n');
}
printf("Enter a Char: ");
fgets(c, 2, stdin);
while ( (ch = fgetc(stdin)) != EOF && ch != '\n');
rmchr(string, c[0]);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* rmchr(char *string, char ch)
{
int counter = 0;
int new_size = 0;
char corrected_string[100];
while (string[counter] != '\n' && string[counter] != '\0' && string[counter] != EOF) {
if (string[counter] != ch) {
corrected_string[new_size] = string[counter];
new_size++;
}
counter++;
}
char *new_string = (char *)malloc((new_size+1) * sizeof(char));
for (int j = 0; j <= new_size; j++) {
new_string[j] = corrected_string[j];
}
return new_string;
}
int main(int argc, const char * argv[]) {
char *s = "The char 'c' will be removed";
char *new = rmchr(s, 'c');
printf("%s", new);
return 0;
}