strcat 给我一个分段错误
strcat is giving me a segmentation fault error
在确认 strcat 是发生错误的地方后,我检查了作业中的前一个示例。在我之前的示例中,我使用 strcat(实际上是 strncat)的方式与我在以下代码中使用的方式相同。我不太确定。
我的程序的目的是遍历 "string" 并从字符串中删除任何出现的字符 'c'。
main.c:
char string[100]={0}, c[3];
printf("Enter a String: ");
fgets(string, 100, stdin);
if (string[98] == '\n' && string[99] == '[=10=]') { 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]);
header:
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]);
}
}
}
char *word[100];
它将在您的程序中保存一个字符串,因此请使用:
char word[100];
即char
的数组,而不是char *
的数组。
然后 strcat
连接到一个字符串,但 word
未初始化。使它成为一个字符串:
word[0] = '[=12=]';
那么 string[i]
是一个字符,但是 strcat
需要指向字符参数的指针:要使用指针,请使用 &string[i]
.
最后,你的 rmchr
函数中的问题是它必须 return 一些东西,要么通过参数,要么通过 return 语句,但它没有。
这里要提的不止一点,比如
rmchr()
定义应该有一个 return 类型,也许 void
如果你没有 returning 任何东西。
[FWIW,在那种情况下,我想知道你将如何使用局部变量 word
]
在rmchr()
中,word
需要是一个char
数组,而不是char
指针。您需要将 char * word[100]
更改为 char word[100]
。
在strcat()
中,两个参数都需要是一个指针。在这种情况下,您需要使用 &string[i]
。
以下内容似乎可以正常编译,但您的代码并没有完全按照您的要求执行,"The purpose of my program is to loop through "string" 并从字符串中删除任何出现的字符 'c'。"。该函数不会删除字符或 return 排除字符的字符串副本。我写了一个函数,在删除字符和指向它的 returns 指针后复制字符串。下面是你的代码稍微修改一下,下面是我的函数
//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] == '[=10=]') {
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] != '[=11=]' && 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;
}
在确认 strcat 是发生错误的地方后,我检查了作业中的前一个示例。在我之前的示例中,我使用 strcat(实际上是 strncat)的方式与我在以下代码中使用的方式相同。我不太确定。
我的程序的目的是遍历 "string" 并从字符串中删除任何出现的字符 'c'。
main.c:
char string[100]={0}, c[3];
printf("Enter a String: ");
fgets(string, 100, stdin);
if (string[98] == '\n' && string[99] == '[=10=]') { 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]);
header:
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]);
}
}
}
char *word[100];
它将在您的程序中保存一个字符串,因此请使用:
char word[100];
即char
的数组,而不是char *
的数组。
然后 strcat
连接到一个字符串,但 word
未初始化。使它成为一个字符串:
word[0] = '[=12=]';
那么 string[i]
是一个字符,但是 strcat
需要指向字符参数的指针:要使用指针,请使用 &string[i]
.
最后,你的 rmchr
函数中的问题是它必须 return 一些东西,要么通过参数,要么通过 return 语句,但它没有。
这里要提的不止一点,比如
rmchr()
定义应该有一个 return 类型,也许void
如果你没有 returning 任何东西。[FWIW,在那种情况下,我想知道你将如何使用局部变量
word
]在
rmchr()
中,word
需要是一个char
数组,而不是char
指针。您需要将char * word[100]
更改为char word[100]
。在
strcat()
中,两个参数都需要是一个指针。在这种情况下,您需要使用&string[i]
。
以下内容似乎可以正常编译,但您的代码并没有完全按照您的要求执行,"The purpose of my program is to loop through "string" 并从字符串中删除任何出现的字符 'c'。"。该函数不会删除字符或 return 排除字符的字符串副本。我写了一个函数,在删除字符和指向它的 returns 指针后复制字符串。下面是你的代码稍微修改一下,下面是我的函数
//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] == '[=10=]') {
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] != '[=11=]' && 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;
}