为什么我尝试运行此代码时代码块崩溃:
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。
答案 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的话来说,“字符串”是一个字符数组,或一个指向带有空字节终止符的字符数组的指针。
ch
是char *
,它是指向该数组第一个字符的指针-可以说是一个字符串。
*ch
是char
,该数组的第一个字符。
答案 2 :(得分:0)
在C语言中,当您要使用指针所指向的整个字符串时,不必取消对字符串的指针引用。此取消引用过程将导致各个字符串的第一个字符,这不是您想要的。
此外,如果转换说明符与相对参数的类型不匹配,则为undefined behavior。
因此
printf("%s\n",*ch);
是错误的。 *ch
是字符串中的第一个字符,在这种情况下为S
,类型为char
,但是%s
转换说明符期望的类型为*char
。 / p>
printf("%s\n",ch);
是正确的。根据转化说明者ch
的要求,*char
的类型为%s
。
因此,代码块显然会由于参数类型不匹配而导致“ 崩溃”。