C函数删除字符串
在几周内参加一个深入的Objective-C课程之前,这里的初学者正在努力学习一些基本的C语言知识,所以如果这是一个普通的问题,我很抱歉 赋值是创建一个包含三个参数的函数:一个源字符串,一个从该字符串开始删除的整数,以及另一个告诉函数要删除多少个字符的整数。书中给出的例子是起始字符串“TheErrorSon”,然后是4和6,只留下“TheSon” 我的想法是基于第一个单词和第二个单词创建两个单独的字符串,然后将它们连接在一起。到目前为止,我只能提取“the”,而我的第二个for循环显然什么也没做。这就是我到目前为止所做的:C函数删除字符串,c,arrays,string,char,C,Arrays,String,Char,在几周内参加一个深入的Objective-C课程之前,这里的初学者正在努力学习一些基本的C语言知识,所以如果这是一个普通的问题,我很抱歉 赋值是创建一个包含三个参数的函数:一个源字符串,一个从该字符串开始删除的整数,以及另一个告诉函数要删除多少个字符的整数。书中给出的例子是起始字符串“TheErrorSon”,然后是4和6,只留下“TheSon” 我的想法是基于第一个单词和第二个单词创建两个单独的字符串,然后将它们连接在一起。到目前为止,我只能提取“the”,而我的第二个for循环显然什么也没做
#include<stdio.h>
int main (void)
{
char text[]="the wrong son";
void removeString (char[], int, int);
int s, l;
printf("Enter starting point for removal: ");
scanf("%d",&s);
printf("\nEnter lenght of removal: ");
scanf("%d",&l);
removeString(text, s, l);
printf("\nString after removal = %s",text);
return 0;
}
void removeString (char s1[], int s, int l)
{
printf("s1 = %s, s=%d, l=%d\n", s1, s, l);
char s2[]="";
char s3[]="";
int i,j;
for (; i<s; ++i)
{
s2[i]=s1[i];
}
printf("\n");
for (; j>l; ++j)
{
s3[j]=s1[j];
}
printf("s2 = %s, s3 = %s", s2, s3);
}
#包括
内部主(空)
{
char text[]=“错误的儿子”;
无效再投资(字符[],整数,整数);
int s,l;
printf(“输入删除的起始点:”);
scanf(“%d”和“&s”);
printf(“\n输入删除长度:”);
scanf(“%d”和“&l”);
再投资(文本、s、l);
printf(“\n删除后字符串=%s”,文本);
返回0;
}
无效重新投资(字符s1[],整数s,整数l)
{
printf(“s1=%s,s=%d,l=%d\n”,s1,s,l);
字符s2[]=“”;
字符s3[]=“”;
int i,j;
对于(;il;++j)
{
s3[j]=s1[j];
}
printf(“s2=%s,s3=%s”,s2,s3);
}
我完全糊涂了。任何帮助都将不胜感激。为此目的创建单独的阵列不是最好的方法,IMHO。相反,一个更好更干净的方法将是
strlen()
计算数组的长度void removeString (char s1[], int s, int l)
{
printf("s1 = %s, s=%d, l=%d\n", s1, s, l);
char s2[]="";
char s3[]="";
int i,j;
for (; i<s; ++i)
{
s2[i]=s1[i];
}
printf("\n");
for (; j>l; ++j)
{
s3[j]=s1[j];
}
printf("s2 = %s, s3 = %s", s2, s3);
}
下面是一个更简单的实现:
#include <stdio.h>
#include <string.h>
void removeString (char text[], int start, int length) {
int n = strlen(text), i;
for (i = start+length; i <= n; i++) {
text[i-length] = text[i];
}
}
int main (void) {
char text[] = "the wrong son";
int start, length;
printf("Original text: \"%s\"\n", text);
printf("Enter starting point for deletion: ");
scanf("%d", &start);
printf("\nEnter number of characters to delete: ");
scanf("%d", &length);
removeString(text, start, length);
printf("After deletion: \"%s\"\n", text);
return 0;
}
#包括
#包括
无效重新投资(字符文本[],整数开始,整数长度){
int n=strlen(文本),i;
对于C中的(i=start+length;i),字符串不是对象,它们只是内存中的字符数组
在您的情况下,删除字符串的一部分可以通过简单的内存移动来完成:
void removeString (char string[], int start, int length)
{
int from = start + length;
// You should do some verifications here, like start < string length, etc.
while (string[from] != 0)
string[start++] = string[from++];
string[start] = 0;
}
void重新投资(字符字符串[],整数开始,整数长度)
{
int from=开始+长度;
//您应该在这里进行一些验证,比如开始<字符串长度,等等。
while(字符串[from]!=0)
string[start++]=string[from++];
字符串[开始]=0;
}
//这将在位编辑字符串s1
无效重新投资(字符*s1,整数s,整数l)
{
int len=strlen(s1);
//如果起始位置超出字符串末尾,或无需删除,则中止
如果(s>=len | l<1)
返回;
//在位置s处终止原始字符串
s1[s]=0;
//如果s+l超出字符串末尾,则结束
如果(s+l>=len)
返回;
//否则,在第1部分停止
strcat(s1,s1+s+l);
}
您需要初始化i
和j
像inti;for(i=…;i
。请对变量使用描述性名称,因为您的代码很难理解。您没有将s2
和s3
设置得足够大。如果您没有指定数组的大小,并用字符串初始化数组,则数组的大小刚好可以容纳该字符串。因此char s2[]=”;
相当于char s2[1]=”
谢谢各位,非常感谢各位的回复
void removeString (char string[], int start, int length)
{
int from = start + length;
// You should do some verifications here, like start < string length, etc.
while (string[from] != 0)
string[start++] = string[from++];
string[start] = 0;
}
// This will edit string s1 in place
void removeString(char *s1, int s, int l)
{
int len = strlen(s1);
// Abort if start pos beyond end of string, or nothing to remove
if (s >= len || l < 1)
return;
// Terminate original string at pos s
s1[s] = 0;
// Finished if s+l beyond end of string
if (s+l >= len)
return;
// Otherwise concat rest to 1st part
strcat(s1, s1+s+l);
}