【问题标题】:setting char array inside a function在函数内设置字符数组
【发布时间】:2015-07-28 14:00:05
【问题描述】:

我在 64 位 Linux 上运行我的 C 程序。 我写了两个小函数,我将向它们传递一个 char 数组,它会被函数填充并返回。

我在使用第一个函数 func1() 时遇到了一些问题。

功能是 功能1:

void func1(char *str1)
{
    short optiony = 0;

    printf("\tfunc1: str1 at %u\n", str1);

    printf("\tProvide the option:\n");
    scanf("%d", &optiony);

    if(optiony== 1)
    {
        strcpy(str1, "168.98.173.44");
    }

    printf("\tfunc1: str1 at %u is %s\n", str1, str1);
}

函数2:

void func2(char *str2)
{
    short optiony= 0;

    printf("\tfunc2: str2 at %u\n", str2);

    printf("Provide the option:\n");
    scanf("%d",&optiony);

    if(optiony== 1)
    {
        strcpy(str2, "168.97.176.146");
    }

    printf("\tfunc2: str2 at %u is = %s\n", str2, str2);
}

主要:

main(int argc, char* argv[])
{
    char str1[10] = "\0";
    char str2[10] = "\0";

    printf("main: str1 at %u\n", &str1);
    func1(str1);
    printf("main: str1 at %u is %s\n\n", &str1, str1);

    printf("main: str2 at %u\n", &str2);
    func2(str2);
    printf("main: str2 at %u is %s\n", &str2, str2);

    return(0);
}

输出是:

main: str1 at 4149951616
        func1: str1 at 4149951616
        Provide the option:
1
        func1: str1 at 4149951616 is 168.98.173.44
main: str1 at 4149936112 is 
                   ^
                   |
                    --------------------------------note the change of address

main: str2 at 4149936096
        func2: str2 at 4149936096
        Provide the option:
1
        func2: str2 at 4149936096 is = 168.97.176.146
main: str2 at 4149936096 is 168.97.176.146

出现的问题是在调用从 func1() 返回后,在主程序中传递给它的变量的地址看起来发生了变化。 因此,函数内部设置的值不会反映在 main.h 中。 func2() 中没有出现此问题。

这段代码有什么错误?

【问题讨论】:

  • printf 地址与%p 格式说明符。并且不要使用%d 扫描短裤,而是使用int
  • 字符串比char []s长。
  • 提高您的警告级别,您会发现由于使用了错误的格式说明符而导致的大量警告,从而导致未定义的行为
  • @CoolGuy 他可能使用 Turbo C++,它不会警告错误的格式说明符。
  • @MichaelWalz 如果有人可以让 Turbo C++ 在 64 位 linux 上运行,他们可能知道格式说明符 :)

标签: c function


【解决方案1】:
 char str1[10] = "\0";
 char str2[10] = "\0";

str1str2 的范围从 09 ,因此两者都只能容纳 9 字符,最后一个为空。

strcpy(str1, "168.98.173.44");// storing more than 10 characters
strcpy(str2, "168.97.176.146");// storing more than 10 characters

加号-

printf("main: str1 at %u is %s\n\n", &str1, str1);
                       ^this specifier is to print unsigned int .

要打印地址,请使用%p

【讨论】:

  • 别忘了空终止符。
  • 感谢 ameycu 和 EOF 的回复。我尝试将大小更改为 50 并添加了 strcat(str1, "\0");。但问题依然存在。
  • @RupeshKumar:好吧,你为什么不修复你的scanf()格式字符串呢? %d 需要一个指向 int 的指针,你传递一个指向 short 的指针,所以格式应该是 %hd
  • @RupeshKumar 好吧,我没有任何理由它不会给出正确的选项,因为 EOF SIR 也指出了简短的说明符。
  • 感谢 EOF 和艾米。将格式更正为“hd”或将变量的数据类型更改为 int 可以解决此问题。所以在错误数据类型中很短,即 2 个字节,而我通过 %d 格式说明符填充 4 个字节,因此结果未定义并且它曾经用于段错误。
【解决方案2】:

对于这个问题。您应该使用%p 打印指针的地址,而不是%u

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    相关资源
    最近更新 更多