我在 c 中創建一個函式,如果 char 陣列中有空格,它將洗掉它并列印陣列。我遇到的問題是,當我點擊一個空格時,該函式停止將陣列的其余部分復制到最終字串。
這是代碼:
void removeSpace(char *str) {
char *temp = malloc(1000 * sizeof(char));
strcpy(temp, str);
str = malloc(1000 * sizeof(char));
for (int i = 0; i < strlen(temp); i ) {
while (temp[i] == ' ') {
i ;
}
str[i] = temp[i];
printf("str i: %c, temp i: %c\n", str[i], temp[i]);
}
printf("str: %s\n", str);
}
這是在“main”函式中:
int main(main) {
char *test = malloc(1000 * sizeof(char));
strcpy(test, "hello world");
removeSpace(test);
我得到的結果是這樣的:
str i: h, temp i: h
str i: e, temp i: e
str i: l, temp i: l
str i: l, temp i: l
str i: o, temp i: o
str i: w, temp i: w
str i: o, temp i: o
str i: r, temp i: r
str i: l, temp i: l
str i: d, temp i: d
str: hello
如果有人可以幫助我將不勝感激!!!
uj5u.com熱心網友回復:
你這里有幾個問題。先說一些小問題。
你做的第一件事是malloc一些記憶體,但不要這樣做free,所以它會泄漏。作為旁注,您不需要str在開始時復制引數,因為無論如何您都在制作它的副本。
我假設這只是一個練習,因此您只是猜測字串少于 1000 個字符的事實并不重要,但即便如此,您也可以使用 first 的長度來分配正確的大小的記憶。
由于 C 字串的作業方式,strlen()通過從頭開始掃描直到找到一個'\0'字符來查找長度,因此for (...; i < strlen(temp); ...)每次回圈都會掃描整個字串。源長度不會改變,因此將其保存在const變數中并與回圈中的進行比較。
這個問題的根源是,你使用相同的索引i的str作為temp。當您跳過 中的字符時temp,您希望使用str不遞增的不同索引。這樣的事情可能會奏效(我還沒有測驗過):
void removeSpace(char *str) {
const size_t str_len = strlen(str);
const size_t str_size = str_len 1; // include '\0'
char *temp = malloc(str_size * sizeof(char));
// Copy str to temp but skip ' '.
int temp_idx = 0;
for (int i = 0; i < str_size; i ) {
while (str[i] == ' ') {
i ;
}
temp[temp_idx] = str[i];
temp_idx ;
printf("temp i: %c, str i: %c\n", str[i], temp[i]);
}
printf("temp: %s\n", temp);
free(temp);
}
uj5u.com熱心網友回復:
它將洗掉它并列印陣列。
替代方案:如果可以更改輸入字串
走繩子并將非繩子部分復制回自身。
void filter_out_spaces_and_print(char *src) {
char *origin = src;
char *dest = src;
while (*src) {
if (*src != ' ') {
*dest = *src;
}
src ;
}
*dest = '\0';
printf("%s", origin);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/355580.html
下一篇:將每個陣列項變成鍵值對
