C函数删除字符串
C function to remove string
在几周内参加深入的 Objective-C 课程之前,这里的初学者试图围绕一些基本的 C 知识,所以如果这是行人,我深表歉意..
任务是创建一个接受三个参数的函数:一个源字符串、一个从该字符串开始删除的整数,以及另一个告诉函数要删除多少字符的整数。书中给出的示例是起始字符串 "the wrong son" 然后是 4 和 6,只剩下 "the son".
我的想法是根据第一个单词和第二个单词创建两个单独的字符串,然后将它们连接在一起。到目前为止,我只能提取 "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);
}
我很困惑。任何帮助将不胜感激。
恕我直言,为此目的创建单独的数组并不是最好的方法。相反,一个更好更清洁的方法是
- 接收数组,开始索引并跳过索引值。
- 使用
strlen()
计算数组的长度。
- 将(start index+skip index)位置的值放到start index位置。
- 将起始索引增加1。
- 继续第3步和第4步,直到数组长度用完,即最新的(start index+skip index)个点到数组中的最后一个元素。
这个函数
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);
}
有两个重要的问题,
您没有为 s2
或 s3
分配足够的 space。
你从不初始化i
或j
。
试试这个
void removeString (char *source, int offset, int length)
{
int i;
size_t source_length;
if (source == NULL)
return;
source_length = strlen(source);
if ((offset >= source_length) || (source_length - offset < length))
return;
printf("source = %s, offset = %d, length = %d\n", source, offset, length);
for (i = 0 ; i < offset ; ++i)
result[i] = source[i];
for (j = 0 ; source[j + offset] != '[=11=]' ; ++i)
result[j] = source[j + offset];
printf("s2 = %s\n", result);
}
这是一个更简单的实现:
#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;
}
在 C 中,字符串不是对象,它们只是内存中的字符数组。
对于您的情况,删除字符串的一部分可以通过简单的内存移动来完成:
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);
}
在几周内参加深入的 Objective-C 课程之前,这里的初学者试图围绕一些基本的 C 知识,所以如果这是行人,我深表歉意..
任务是创建一个接受三个参数的函数:一个源字符串、一个从该字符串开始删除的整数,以及另一个告诉函数要删除多少字符的整数。书中给出的示例是起始字符串 "the wrong son" 然后是 4 和 6,只剩下 "the son".
我的想法是根据第一个单词和第二个单词创建两个单独的字符串,然后将它们连接在一起。到目前为止,我只能提取 "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);
}
我很困惑。任何帮助将不胜感激。
恕我直言,为此目的创建单独的数组并不是最好的方法。相反,一个更好更清洁的方法是
- 接收数组,开始索引并跳过索引值。
- 使用
strlen()
计算数组的长度。 - 将(start index+skip index)位置的值放到start index位置。
- 将起始索引增加1。
- 继续第3步和第4步,直到数组长度用完,即最新的(start index+skip index)个点到数组中的最后一个元素。
这个函数
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);
}
有两个重要的问题,
您没有为
s2
或s3
分配足够的 space。你从不初始化
i
或j
。
试试这个
void removeString (char *source, int offset, int length)
{
int i;
size_t source_length;
if (source == NULL)
return;
source_length = strlen(source);
if ((offset >= source_length) || (source_length - offset < length))
return;
printf("source = %s, offset = %d, length = %d\n", source, offset, length);
for (i = 0 ; i < offset ; ++i)
result[i] = source[i];
for (j = 0 ; source[j + offset] != '[=11=]' ; ++i)
result[j] = source[j + offset];
printf("s2 = %s\n", result);
}
这是一个更简单的实现:
#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;
}
在 C 中,字符串不是对象,它们只是内存中的字符数组。
对于您的情况,删除字符串的一部分可以通过简单的内存移动来完成:
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);
}