我正在嘗試將整數添加到字串中。當我除錯我的代碼時,一切正常,但是當我正常運行它時,在字串的開頭會列印兩個不需要的字符。我該如何避免這種情況?
int number_of_ints = 5;
char s[number_of_ints*2];
char suffix[4];
for(int i = 1; i <= number_of_ints; i ){
snprintf(suffix, number_of_ints, "%d*", i);
strncat(s, suffix, 2);
printf("%s\n", s);
}
這是正常構建和運行代碼時的輸出。
`?1*
`?1*2*
`?1*2*3*
`?1*2*3*4*
`?1*2*3*4*5*
uj5u.com熱心網友回復:
C 中的字串是一系列非零位元組,后跟一個值為 0 的終止位元組(空終止位元組,'\0')。
您必須調整緩沖區的大小以獲得額外的空間,以保證此空終止位元組的空間。
您還必須確保緩沖區的內容包含有效的字串。您可以通過將緩沖區的第一個元素設定為空終止位元組來執行此操作,從而創建一個長度為零的字串。
未能初始化緩沖區的內容意味著它將包含不確定的值,并且將這樣的緩沖區傳遞給期望有效字串的函式將呼叫未定義的行為。
的第二個引數snprintf最多應該是目標緩沖區的大小。
最后,size_t在適用時考慮使用,因為它是處理記憶體大小的適當型別(例如,調整可變長度陣列的大小;sizeof運算子決議為這種型別;snprintf期望這種型別作為其第二個引數)。
#include <stdio.h>
#include <string.h>
int main(void) {
size_t number_of_ints = 5;
char s[number_of_ints * 2 1];
char suffix[4];
s[0] = '\0';
for (size_t i = 1; i <= number_of_ints; i ) {
snprintf(suffix, sizeof suffix, "%zu*", i);
strncat(s, suffix, 2);
printf("%s\n", s);
}
}
uj5u.com熱心網友回復:
您的緩沖區的初始化和大小存在一些問題。
- 緩沖區的大小太短了 0 終止所需的 1 個位元組。添加最后一個數字會導致緩沖區溢位和未定義的行為。
- 此外,只要計算出的大小就足夠了,
number_of_ints<10因為它只允許單個數字。 - 該緩沖區未初始化,我們很可能沒有保存空字串。訪問它(通過
strcat等)呼叫未定義的行為。 - 您提供
snprintf的大小與緩沖區的大小無關。
您應該應用這些更改:
#include <stdio.h>
#include <string.h>
int main(void)
{
int number_of_ints = 5;
char s[number_of_ints*2 1];
char suffix[4];
s[0] = 0;
for(int i = 1; i <= number_of_ints; i ){
snprintf(suffix, sizeof(suffix), "%d*", i);
strncat(s, suffix, 2);
printf("%s\n", s);
}
uj5u.com熱心網友回復:
你可以試試這段代碼:
#include <iostream>
#include <string.h>
using namespace std;
int main(void){
int number_of_ints = 5;
char s[number_of_ints*2];
char suffix[4];
for(int i = 1; i <= number_of_ints; i ){
snprintf(suffix, number_of_ints, "%d*", i);
printf("");
strncat(s, suffix, 2);
printf("%s\n", s);
}
system("PAUSE");
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/410356.html
標籤:
上一篇:為什么/何時會/應該使用__attribute__((noreturn))?[復制]
下一篇:在C中實作可變引數函式
