标签: printf

SIGSEGV,(貌似)由 printf 引起

首先,对于任何交叉发布,我们深表歉意。希望我不会在这里重复问题,但我无法在其他地方找到它(通过 Google 和 Stack Overflow)。

这是错误的要点。如果我打电话printf,sprintf或者fprintf我的代码中的任何位置,显示浮动,我得到一个SIGSEGV (EXC_BAD_ACCESS)错误。让我举个例子吧。

以下抛出错误:

float f = 0.5f;
printf("%f\n",f);
Run Code Online (Sandbox Code Playgroud)

此代码不会:

float f = 0.5f;
printf("%d\n",f);
Run Code Online (Sandbox Code Playgroud)

我意识到那里有一个隐式转换,但我并不关心。我只是无法理解为什么打印浮点数与打印整数会引发错误。

注意:部分代码用于malloc创建一些非常大的多维数组。但是,这些打印语句没有以任何方式引用这些数组。这是我如何声明这些数组的示例。

#define X_LEN 20
#define XDOT_LEN 20
#define THETA_LEN 20
#define THETADOT_LEN 20
#define NUM_STATES (X_LEN+1) * (XDOT_LEN+1) * (THETA_LEN+1) * (THETADOT_LEN+1)
#define NUM_ACTS 100

float *states = (float *)malloc(NUM_STATES * sizeof(float));
// as opposed to float states[NUM_STATES] (more memory effecient)


float **q = (float**)malloc(NUM_STATES * sizeof(float*)); …
Run Code Online (Sandbox Code Playgroud)

c malloc printf segmentation-fault

4
推荐指数
1
解决办法
4483
查看次数

JavaScript,正则表达式,将前导零添加到字符串中包含的所有数字

这个 Perl 脚本是我想在 JavaScript 中实现的(源代码):

s/([0-9]+)/sprintf('%04d',$1)/ge;
Run Code Online (Sandbox Code Playgroud)

显然sprintf在 JavaScript 中不可用,但我知道您可以构建一个直接处理关注数量的函数,但是在我的情况下,我有一个长字符串,其中可能包含多个数字,可以将这样的字符串转换为abc8 23 123:(abc000008 000023 000123使用以 6 位为例)。

所以它要么是我没有得到的一些聪明的正则表达式,要么以某种方式找到某种方法将长字符串分成不同的字符串和数字的数组,并且只对数字一个一个地进行操作。

我真的想避免后一种方法,因为 1) 在这种情况下速度是一个问题,并且 2) 在正确的位置拆分字符串所涉及的正则表达式似乎比在这一点上添加前导零更难。

最后,还有其他方法可以使用 JavaScript 的正则表达式吗?

javascript regex printf

4
推荐指数
1
解决办法
7900
查看次数

为什么“printf()”的这种模棱两可的行为?

我故意强迫printf()打印celsius为int(使用%8d格式说明符)。我知道这是打印的原因0(在标题下Celsius Scale)。

但我只想知道为什么fahr要0.0在整个表格中打印。

我用过 GCC 编译器。

这是摄氏度到华氏度转换的代码:

#define LOWER 0.0F
#define UPPER 300.0F
#define STEP 20.0F

#include <stdio.h>

void main() {
    float celsius, fahr;
    printf("*Conversion from Celsius to Fahrenheit*\n");
    printf("Celsius Scale \t   Fahrenheit Scale\n");
    for (celsius = LOWER; celsius <= UPPER; celsius = celsius + STEP) {
        fahr = (9.0f * celsius / 5.0f) + 32.0f; 
        printf("%8d\t\t%5.1f\n", celsius, fahr);
    }
}
Run Code Online (Sandbox Code Playgroud)

下表是上述代码的 …

c floating-point printf

4
推荐指数
1
解决办法
233
查看次数

在for循环中声明int数组并在C中更改其元素

我是 C 新手,目前正在学习数组。我有这个代码:

#include <stdio.h>
int main()
{   
    int available[6];
    for(int o=1; o<=3; o++){
        available[o]=20;
        printf("%d\n",&available[o]);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

哪个应该输出(以我的理解):

20
20
20
Run Code Online (Sandbox Code Playgroud)

现在的问题是它输出:

2293300
2293304
2293308
Run Code Online (Sandbox Code Playgroud)

我是否错过了一个关键部分并犯了一些愚蠢的错误?任何帮助将不胜感激。

c printf address-operator

4
推荐指数
1
解决办法
57
查看次数

如何使用格式说明符设置字符串的字段宽度?

printf("%5s\n", "#");
Run Code Online (Sandbox Code Playgroud)

给出:

    #
Run Code Online (Sandbox Code Playgroud)

他们是否可以使用整数格式说明符设置此字符串的字段宽度?

像这样的东西,

printf("%%ds\n", 5, "#");
Run Code Online (Sandbox Code Playgroud)

c printf string-formatting format-specifiers

4
推荐指数
1
解决办法
207
查看次数

为什么在包含 iostream 时可以使用 printf()?

这段代码即使在 C++11 标准下使用 minGW 编译器也能正常工作:

#include <iostream>

int main(int argc, char const *argv[])
{
    printf("haha");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么要这样做?我没有包括,stdio.h但我可以使用像printf()and 之类的函数rand()。他们包括在iostream? 至少我没有发现它们包括在内。如果你说它包含在 中iostream,请给我看证据。

c++ printf iostream

4
推荐指数
1
解决办法
568
查看次数

C %p 打印 16 个字节而不是 8 个字节

我需要打印一个指针的地址。这是我的代码?

float arr[5] = {1.2 , 2.3 , 5 , 7.1 , 9.6};
float *ptrarr;
ptrarr = &arr[0];

printf("Address of ptrarr+2=%p,%p \n\n",ptrarr+2,&arr[2]);
Run Code Online (Sandbox Code Playgroud)

我知道指针地址有 8 个字节,但我的输出总是 16 个字节。这是输出

Address od ptarr+2=000000000061FDE8,000000000061FDE8
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?

c printf pointers

4
推荐指数
1
解决办法
162
查看次数

C 如何在没有编译器警告的情况下将地址打印为十进制值(不是十六进制)

我有一个int指向另一个地址的指针int。

当使用格式说明符打印指针时%p(如 Stack Overflow 上的许多答案所建议的那样),它以十六进制表示形式打印。

如何用十进制表示打印指针的值?


代码示例

我想出了一个可以%zu从这个答案中使用的人。

int i = 1;
int *p = &i;
printf("Printing p: %%p = %p, %%zu = %zu\n", p, p);
Run Code Online (Sandbox Code Playgroud)

当我使用https://onlinegdb.com/EBienCIJnm运行该代码时

  • 它实际上以十进制打印正确的值
  • 但它也会输出编译器警告
warning: format ‘%zu’ expects argument of type ‘size_t’, but argument 3 has type ‘int *’ [-Wformat=]                                                                 
Printing p: %p = 0x7ffee623d8c4, %zu = 140732759529668
Run Code Online (Sandbox Code Playgroud)

有没有办法printf使用十进制表示的指针值,而没有编译器警告?

c printf pointers memory-address format-string

4
推荐指数
1
解决办法
102
查看次数

在 C 程序中使用 0 而不是 '\0'

为什么我的程序没有进入无限循环。我没有用'\0'while 循环测试字符串结尾,而是使用0. 是否'\0'与0同在C 2

如果是,那么如果0在字符串的中间,那么printf应该在那里结束打印字符串。例如 printf("%s", "hello how0 are you") 应该打印 'hello how'

int main( )
{
    char s[ ] = "No two viruses work similarly" ;
    int i = 0 ;
    while ( s[i] != 0 )
    {
        printf ( "%c", s[i]) ;
        i++ ;
    }
}
Run Code Online (Sandbox Code Playgroud)

c printf c-strings char while-loop

4
推荐指数
10
解决办法
279
查看次数

Bash printf 列中 arg 中的多行

我已经摆弄这个好几个小时了,但无法让它工作,所以也许我的方法是错误的。

我想漂亮地显示消息的多行,因此“标题”位于左侧,然后消息与列中的消息对齐,例如,如下所示:

WARNING: The quick brown fox jumped over the lazy dog.
         Sphinx of black quartz, judge my vow.
         How quickly daft jumping zebras vex!
Run Code Online (Sandbox Code Playgroud)

或者

NOTE: This happened.
      Foo bar.
Run Code Online (Sandbox Code Playgroud)

等等。

我试图根据我能找到的一些答案来做到这一点printf,column但正如我所说,也许这种方法永远行不通?

目前,我有第一个字符串作为printf“标题”,然后其余的参数是与之对齐的消息,如下所示:

#!/bin/bash

warn() {
  printf '%s+%s\n' 'WARNING:' "${@}" | column --table --separator '+'
}

warn "The quick brown fox jumped over the lazy dog." \
     "+Sphinx of black quartz, judge my vow." \
     "+How quickly daft jumping zebras vex!"
Run Code Online (Sandbox Code Playgroud)

这可以类似地完成吗?或者最好的方法/其他方法是什么?

实际输出: …

bash printf

4
推荐指数
2
解决办法
168
查看次数