为什么printf不接受指针作为参数

时间:2020-03-10 09:51:21

标签: c string pointers printf

为什么我尝试运行此代码时代码块崩溃:

vals = iter(['f1','f2','f3','f4'])
with open(os.path.join(file),'r') as fh:
        for line in fh:
            if "stackoverflow" in line:
                line= re.sub('stackoverflow',next(vals), line)

但是当我在printf中删除* ch并用这样的ch替换它时,它工作得很好

#include <stdio.h>
#include <stdlib.h>

void main(void)
{
    char *ch= "Sam smith";
    printf("%s\n",*ch);
}

不应* ch表示由字符串本身组成的 ch 所指向地址的内容,而 ch 则表示字符串中第一个元素的地址?所以我期望相反!

我在Windows 8.1上使用代码块17.12,gcc版本5.1.0。

3 个答案:

答案 0 :(得分:3)

*ch 取消引用指针以产生其指向的数据。这是字符串的第一个字符。

printf提供错误的说明符是未定义的行为(在printf需要指针的地方传递值)

printf("%c\n",*c);

将打印第一个字符,而不会崩溃。如果要使用%c(或使用putchar)打印所有字符串,请循环输入字符。但这就是%s的作用。

请注意,最好使用const来引用文字字符串,这样就可以避免尝试修改它们:

const char *ch= "Sam smith";

答案 1 :(得分:2)

为什么我尝试运行此代码时代码块崩溃:

char *ch= "Sam smith";
printf("%s\n",*ch);

ch的类型为char *

%s转换说明符期望char *

您传递*ch,它是取消引用的 ch,即类型char

如果转换说明符与参数的类型不匹配,则会发生不良情况(不确定的行为)。

不应*ch表示ch所指向的地址的内容,即字符串本身

C中没有数据类型“字符串”,因此没有“指向字符串的指针”。

用C的话来说,“字符串”是一个字符数组,或一个指向带有空字节终止符的字符数组的指针。

chchar *,它是指向该数组第一个字符的指针-可以说是一个字符串。

*chchar,该数组的第一个字符。

答案 2 :(得分:0)

在C语言中,当您要使用指针所指向的整个字符串时,不必取消对字符串的指针引用。此取消引用过程将导致各个字符串的第一个字符,这不是您想要的。

此外,如果转换说明符与相对参数的类型不匹配,则为undefined behavior


因此

printf("%s\n",*ch);

是错误的。 *ch是字符串中的第一个字符,在这种情况下为S,类型为char,但是%s转换说明符期望的类型为*char。 / p>

printf("%s\n",ch);

是正确的。根据转化说明者ch的要求,*char的类型为%s

因此,代码块显然会由于参数类型不匹配而导致“ 崩溃”。

相关问题