我正在学习C语言,处理字符串和指针。一个练习要求删除字符串前面的所有前导字符(在本例中为“X”)。被调用的函数必须接受字符串,即字符的指针。我通过搜索找到了多种方法来做到这一点,但我不明白为什么下面的代码不起作用......我错过了什么概念?
//delete all leading X characters by passing pointer to a string
#include <stdio.h>
#include <string.h>
void delChar(char* str)
{
char* walker; //declare pointer
walker = str; //point to beginning of passed string
while(*walker == 'X') walker++; //move pointer past amy leading 'X'
printf("\nwalker string is now: %s", walker); //prints "Test" as expected
str = walker; //set str pointer to walker
printf("\nstr string is now: %s", str); //prints "Test" as expected
return;
}
int main()
{
char* myStr = "XXXXXXXXXXXXTest";
printf("Before function call: %s", myStr); //prints "XXXXXXXXXXXXTest" as expected
delChar(myStr); //pass pointer to the string
printf("\nAfter function call: %s", myStr); //WHY DOES THIS print "XXXXXXXXXXXXTest" ?
return 0;
}
3条答案
按热度按时间rslzwgfq1#
有多种方法可以从字符串中删除字符,但不清楚您需要哪种方法。
在C语言中,内存内容不能被“删除”。内存是由字节组成的,字节保存值。当我们有一个字符串时,它存在于内存中的某个地方,字符串的字节不能被删除。
从字符串中删除字符的三种方法是:
以下是示例实现:
另一种选择是在调用者提供的内存中或删除例程分配的内存中,为字符串的所需部分创建一个新副本。
piwo6bdm2#
对于初学者,函数应声明为
函数参数
str
是函数的局部变量,所以这个赋值不改变main中声明的指针
myStr
。这个指针是按值传递给函数的。也就是说,函数处理指针的副本。并且赋值不改变原始指针myStr
。它只改变它的局部变量str
,该变量是由指针myStr
的值的副本初始化的。你也不能改变字符串。任何改变字符串的尝试都会导致未定义的行为。但是你确实需要改变传递的字符串,至少要跟在你的赋值语句后面
在C中删除字符串前的前导字符
也就是说,任务不是找到指向第一个不等于
'X'
的字符的指针,而是需要从字符串中删除等于'X'
的前导字符。在main中,你需要声明一个字符数组,而不是一个指向字符串的指针,例如
函数本身可以通过以下方式定义
总的来说,这足以说明
这是一个演示程序
程序输出为
如果声明第二个参数来指定应该从字符串开头删除的字符,那么函数将更加灵活。
在这种情况下,函数的调用如下所示
0aydgbwb3#
函数
delChar
中字符串变量将在堆栈上创建,并存储您传递的地址,并将在函数返回时销毁在main中返回str后,它仍然指向字符串的开头.
您需要返回地址并存储
你可以使用counter跟踪计数并返回如下计数