[英]Removing a character from a string in C
所以我正在做一個關於函數/字符/指針的紙質問題。 我在代碼中遇到問題,需要幫助來理解它。
更具體地說,我在問題B)ii)中遇到問題,這要求我從字符串中刪除冒號。
我的想法是取字符串,做一個指針並直接指向冒號,然后用繼續它的下一個字符替換此冒號。 然后用冒號前面的字符替換冒號后面的其他字符,直到達到NULL。
在編譯時,它可以編譯,但是給我分段錯誤:11。這是怎么回事? 我怎樣才能解決這個問題? 有我不明白的東西嗎? 謝謝。
#include <stdio.h>
#include <stdlib.h>
int locate_colon(char* x) //Question B) i)
{
int i = 0;
while(*x != '\0')
{
if(*x == ':')
{
return i;
}
i++;
x++;
}
return -1;
}
char* remove_colon(char* x) //Question B) ii)
{
int y,i,j;
y = locate_colon(x);
i =0;
j =1;
while(*x != '\0')
{
x[y+i] = x[y+j];
i++;
j++;
}
return x;
}
int main() //Testing if functions work by running through compiler
{
int x;
char colon[] = "Colon: 123";
char* colonptr;
colonptr = colon;
x = locate_colon(colonptr);
printf("%d",x);
//B) ii)
char* y;
y = remove_colon(colonptr);
while(y != '\0')
{
printf("%s",y);
y++;
}
return 0;
}
您在remove_colon()
循環應為:
while(x[y+i] != '\0')
{
x[y+i] = x[y+j];
i++;
j++;
}
x[y+i]= '\0';
和
while(y != '\0')
{
printf("%s",y);
y++;
}
應該只是:
printf("%s",y);
或其他選擇:
printf("%s",colonptr);
@Giorgi在他現在刪除的答案中指出了您的代碼片段,該片段是有效的C語言,但還是很錯誤的:
while(y != '\0')
{
printf("%s",y);
y++;
}
變量y
是指向char
的指針,因此while (y != '\\0')
等效於while (y != NULL)
,有些人希望將其寫為while (y)
。 C沒有定義增加非null指針將產生null指針的任何方式,因此,如果以其他方式定義了良好的行為,則此循環將永遠不會退出。
但是,實際上,循環的主體取消了y
的引用(間接通過printf()
)並對其進行遞增。 在進行太多迭代之前, y
會指向分配給它最初指向的對象的內存之外,此后,解引用該對象的行為是不確定的。 分割錯誤是這種特定類型的UB的常見觀察結果。
我懷疑您打算寫while(*y != '\\0')
,但這仍然很奇怪,因為您最終將打印出字符串的尾部序列,而似乎只想打印一個字符串。 在那種情況下,我不清楚您為什么在這里使用循環。 簡單有什么問題
printf("%s",y);
?
當然,正如注釋中指出的那樣,這並不是代碼唯一的問題,但它可能解釋了作為實際問題主題的分段錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.