【问题标题】:C program giving weird outputC程序给出奇怪的输出
【发布时间】:2011-11-03 17:09:28
【问题描述】:

我正在尝试将字符串的某些部分复制到其他新字符串中,但是当我尝试这样做并打印结果时,它给了我奇怪的输出。我真的希望有人能提供帮助。我有一种感觉,这与缺少指针有关。这是我的来源;

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

【问题讨论】:

  • 什么是“奇怪的输出”?
  • 这不是你的问题的原因,但不是getData(&amp;barcode, &amp;warehouse, &amp;product, &amp;qualifier);,而是写getData(barcode, warehouse, product, qualifier);更常见
  • 对不起,我没有想清楚。我现在将添加奇怪的输出!

标签: c arrays function pointers


【解决方案1】:

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

ware[4] = "\0";

试试:

ware[3] = 0;

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

【讨论】:

  • 感谢大家的帮助。我终于把它修好了..再次感谢
  • 最好解释一下为什么这是正确答案,以便其他人和发布问题的人了解它。您需要使用 ware[3] = 0;因为 0 充当字符串结尾字符,并且始终记住数组从 0 位置开始,这就是它的索引 3 而不是 4 的原因。另一个问题,对 getData() 函数的调用是错误的,因为您需要传递指针到它并且 char[] 声明了一个指向 char 数组的指针,所以 '&' 是无用的。
【解决方案2】:

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

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

【讨论】:

  • 更不用说他没有写空终止符,他正在写一个包含空终止符的字符串的地址。
  • 如何编写空终止符?
  • x = \0 是正确的,x = "\0" 不是。
  • @MarcB 我认为您的意思是x = '\0'x = 0,它们是等效的。 x = \0 会导致编译错误。
【解决方案3】:

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

例如,代替

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

你想要的:

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

【讨论】:

    【解决方案4】:
    getData(&barcode, &warehouse, &product, &qualifier);
    

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

    你应该使用

    getData(barcode, warehouse, product, qualifier);
    

    【讨论】:

    • 但同时,这不是问题的原因,只是风格问题。
    • @PascalCuoq:这不是“风格问题”,因为它是类型错误。然而你是对的,它不会导致 OP 的问题。
    【解决方案5】:

    main() 中字符串的大小不包括哨兵的位置。

    你需要:

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

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

    【讨论】:

      【解决方案6】:

      我想我会做一些不同的事情。特别是,strncpy几乎从来没有真正有用过(我有理由确定它是为原始 Unix FS 中的文件名发明的,虽然它非常符合他们的特定要求,但这些要求已经足够不寻常的是它很少对其他任何东西都有好处)。

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

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

      【讨论】:

        猜你喜欢
        • 2015-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-12
        • 2021-07-13
        • 2014-02-04
        • 2020-05-14
        • 1970-01-01
        相关资源
        最近更新 更多