[英]C program giving weird output
我正在嘗試將字符串的某些部分復制到其他新字符串中,但是當我嘗試這樣做並打印結果時,它給我的輸出很奇怪。我真的希望有人可以提供幫助。 我感覺這與丟失指針有關。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void getData(char code[], char ware[], char prod[], char qual[])
{
printf("Bar code: %s\n", code);
/* Copy warehouse name from barcode */
strncpy(ware, &code[0], 3);
ware[4] = "\0";
strncpy(prod, &code[3], 4);
prod[5] = "\0";
strncpy(qual, &code[7], 3);
qual[4] = "\0";
}
int main(){
/* allocate and initialize strings */
char barcode[] = "ATL1203S14";
char warehouse[4];
char product[5];
char qualifier[4];
getData(&barcode, &warehouse, &product, &qualifier);
/* print it */
printf("Warehouse: %s\nID: %s\nQualifier: %s", warehouse, product, qualifier);
return 0;
}
編輯:
奇怪的輸出是:
Bar code: ATL1203S14
Warehouse: ATL
ID: ♫203(♫>
Qualifier: S14u♫203(♫>
我認為您的意思是'\\0'
而不是"\\0"
和3
而不是4
:
ware[4] = "\0";
嘗試:
ware[3] = 0;
另外, &
在getData(&barcode, &warehouse...)
是無用的。 只需使用getData(barcode, warehouse...);
。
您正在寫getData()函數中字符的末尾。 您已經定義了char product[5]
,它分配了5個字節的內存。 這樣就可以得到數組索引0、1、2、3、4。 在getData中,將產品的空終止符寫入到產品末尾的索引5,並將覆蓋下一個var的第一個字符。
裸碼,倉庫和限定符也是如此。
C和C ++中的數組是從零開始的。 最后一個索引比長度小一個。 您要在數組后的內存中為每個數組ware, prod
和qual
設置一個值。
例如,代替
char warehouse[4];
ware[4] = "\0";
您想要:
char warehouse[4];
ware[3] = "\0";
getData(&barcode, &warehouse, &product, &qualifier);
這不是應該調用getData
的方式。 getData
指針,數組自動轉換為指針,因此無需使用地址運算符&
。
你應該用
getData(barcode, warehouse, product, qualifier);
main()中字符串的大小不包含標記的位置。
您需要具備:
char warehouse[5];
char product[6];
char qualifier[5];
另外,您正在將指向字符串“ \\ 0”的指針分配給一個字符,而您應該在其中分配字符'\\ 0'本身。
我想我做的事情會有所不同。 特別是, strncpy
幾乎從來沒有真正有用(我可以肯定地說,它是為原始Unix FS中的文件名發明的,雖然它非常適合其特定要求,但這些要求非常不尋常,因此很少有很多用途其他)。
相反,我將使用sscanf: sscanf(code, "%4c%5c%4c", ware, prod, qual);
你的問題沒有說清楚,這是否真的是正確的。 正如其他人指出的那樣,您正在寫的內容已超出分配空間的末端。 上面,我假設您指定了要復制的字符數,因此您必須將每個分配擴展一個字符,以便為終止符騰出空間。 或者,如果您已經為終止符留出空間並希望少復制一個字符,則必須將上述每個長度都減少一個,以便格式字符串為“%3c%4c%3c”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.