如何用指针读取并打印数字与字符串?C语言程序报错求助
解决指针读取打印字符串时的段错误问题
嘿,我来帮你排查这个问题!你的代码里数字能正常打印,但字符串触发段错误,核心原因是指针类型不匹配加上printf参数使用错误,咱们一步步拆解:
问题1:指针类型不匹配
你定义的ptr2是int *类型(和ptr一样),但string是char[20]数组。当你写ptr2 = &string;时,&string的类型是char (*)[20](指向长度为20的char数组的指针),把它赋值给int *类型的变量,会导致指针的地址解析完全错误——因为int和char的内存大小、类型语义都不一样,后续访问这个指针时必然出问题。
问题2:printf的%s参数错误
printf("%s")要求传入的是char类型的指针(指向字符串首地址),但你写的是*ptr2,这是取ptr2指向的内存的值(因为ptr2是int*,所以取的是一个int大小的值),把这个int值当成内存地址去访问,操作系统会直接触发段错误(因为这个地址大概率是无效的)。
修正后的代码
/*Reading a number and string and printing on screen using pointers*/ #include <stdio.h> // main函数规范返回int类型 int main() { int number, *ptr; // 把ptr2改成char*类型,匹配字符串的指针类型 char string[20], *ptr2; ptr = &number; // 数组名本身就是首元素的地址,直接赋值给char*即可,不用& ptr2 = string; printf("Enter a number: "); scanf("%d", &number); printf("Enter a string: "); scanf("%s", string); printf("Your number is: %d\n", *ptr); // 直接传ptr2(char*)给%s,不用解引用*ptr2 printf("String is %s \n", ptr2); // main函数返回0表示正常结束 return 0; }
额外的小建议
- 记得给
main函数指定int返回类型,这是C标准的要求,旧的隐式int写法已经被废弃了。 - 使用
scanf("%s")时要注意输入的字符串长度不要超过数组的大小(这里是20),避免缓冲区溢出,可以改成scanf("%19s", string)来限制输入长度,更安全。
内容的提问来源于stack exchange,提问作者Anudeepsyamprasad
相关产品推荐
相关产品推荐

