C程序给出奇怪的输出

时间:2011-11-03 17:09:28

标签: c arrays function pointers

我正在尝试将字符串的某些部分复制到其他新字符串中,但是当我尝试执行此操作并打印结果时,它会给我一些奇怪的输出。我真的希望有人可以提供帮助。我有一种感觉,它是缺少指针的东西。这是我的来源;

#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(♫>

6 个答案:

答案 0 :(得分:6)

我认为您的意思是'\0'而不是"\0"3而不是4

ware[4] = "\0";

尝试:

ware[3] = 0;

&中的getData(&barcode, &warehouse...)也没用。只需使用getData(barcode, warehouse...);

答案 1 :(得分:2)

你在getData()函数中写过字符的结尾。你已经定义了char product[5],它分配了5个字节的内存。这给你数组索引0,1,2,3,4。在getData中,将产品的null终止符写入索引5,该索引将超过产品的末尾,并将覆盖下一个var的第一个字符。

同样适用于裸码,仓库和限定符。

答案 2 :(得分:1)

C和C ++中的数组是从零开始的。最后一个索引比长度少一个。您在数组后的内存中为每个数组ware, prodqual设置了一个值。

例如,而不是

 char warehouse[4];
 ware[4] = "\0";

你想要:

 char warehouse[4];
 ware[3] = "\0";

答案 3 :(得分:0)

getData(&barcode, &warehouse, &product, &qualifier);

这不是您应该致电getData的方式。 getData接受指针,数组自动转换为指针,因此不需要使用地址运算符&

你应该使用

getData(barcode, warehouse, product, qualifier);

答案 4 :(得分:0)

main()内的字符串大小不包括标记的位置。

你需要:

char warehouse[5];
char product[6];
char qualifier[5];

此外,您正在将一个指向字符串“\ 0”的指针指定给一个字符,您应该在其中指定字符'\ 0'本身。

答案 5 :(得分:0)

我想我的做法有点不同。特别是,strncpy 几乎从未真正有用(我有理由相信它是为原始Unix FS中的文件名而发明的,虽然它非常符合他们的特定要求,但这些要求非常不寻常,以至于其他任何东西都很少有好处。)

相反,我会使用sscanf:sscanf(code, "%4c%5c%4c", ware, prod, qual);

您的问题明确这是否真的正确无误。正如其他人所指出的那样,你写的是你已经分配的空间的末尾。上面,我假设您指定了要复制的字符数,因此您必须将每个分配扩展一个字符,以便为终结符腾出空间。或者,如果您已经为终结器留出了空间并且希望复制的字符少一个,那么您必须将每个长度减少一个,因此格式字符串将是“%3c%4c%3c”。