簡體   English   中英

C程序給出奇怪的輸出

[英]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, prodqual設置一個值。

例如,代替

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM