字符串 C 中的奇怪字符

文檔Python

我正在編寫一個簡單的編譯器只是為了好玩,我希望每一行都有適當的縮進。

所以我寫了一個函數,它根據數字返回一個帶有一些空格的字符數組。

問題是在生成數組時,在文件中寫入或只是打印時,某些字符似乎是錯誤的。我認為它們是從帶有一些信息的內存位置中獲取的,因為我看到了文件路徑的片段。

我做了一個有同樣問題的示例代碼

int num = 0;
char *tabs;
for (; num < 20; num++)
{
    tabs = malloc(num);
    memset(tabs, '-', num);
    printf("%d | %sEND\n", num, tabs);
}

(我想這不是最好的代碼,但我是 C 的初學者)

輸出:

0 | Çc▬END
1 | -s▬END
2 | --▬END
3 | ---END
4 | ----END
5 | -----END
6 | ------END
7 | -------END
8 | --------P☺▬END
9 | ---------☺▬END
10 | ----------▬END
11 | -----------END
12 | ------------END
13 | -------------END
14 | --------------END
15 | ---------------END
16 | ----------------END
17 | -----------------END
18 | ------------------END
19 | -------------------END

每次運行程序時字符都不同。

如果我使用 for 循環而不是memset來設置每個字符,結果將是相同的。

我讀到 memset 可以解決問題,但我沒有。

來自莫斯科的弗拉德

使用memset後動態分配的字符數組tabs

tabs = malloc(num);
memset(tabs, '-', num);

不包含字符串。

因此%sprintf在對該數組的調用中使用轉換說明符會調用未定義的行為。

你可以寫

tabs = malloc(num + 1);
memset(tabs, '-', num);
tabs[num] = '\0';

另一種方法是通過以下方式更改調用 pf printf

printf("%d | %.*sEND\n", num, num, tabs);

請注意,for 循環會產生大量內存洩漏,因為循環每次迭代中分配的內存都沒有釋放。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章