我的代码
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
void getData(short int *number, char *string)
{
printf("\nPlease enter a number greater than zero: ");
scanf("%hd", number);
printf("Please enter a character string: ");
scanf("%s", string);
}
void echoPair(short int *number, char *string)
{
printf("Number: %hd Character(s): %s\n", *number, string);
}
int main()
{
short int *number = 0;
char string[32] = {0};
printf("This program will ask you to enter a number greater than zero and \na character string with less than 32 characters \ninput.");
getData(&number, &string);
echoPair(&number, &string);
return(0);
}
代码工作正常,但我收到这些编译器警告
warning: passing argument 1 of ‘getData’ from incompatible pointer type
warning: passing argument 2 of ‘getData’ from incompatible pointer type
warning: passing argument 1 of ‘echoPair’ from incompatible pointer type
warning: passing argument 2 of ‘echoPair’ from incompatible pointer type
如果这样做
getData(number, string);
echoPair(number, string);
警告消失,但在我输入getData函数中的第一个数字后,程序会出现“Segmentation fault:11”。
任何人都知道如何删除警告并保持程序正常运行?
由于
答案 0 :(得分:5)
这里有很多问题。
首先,行:
short int *number = 0;
应该是:
short int number = 0;
因为你使用了前者,所以它给你一个指向short
的空指针。这是不你想要的东西,因为第一次取消引用该野兽可能会使你的代码崩溃(或者更糟糕的是,不使你的代码崩溃但导致奇怪的行为)。
其次,你不需要传入字符串的地址,它们会自动衰减到一个地址,所以改变:
getData (&number, &string);
echoPair (&number, &string);
为:
getData (&number, string);
echoPair (&number, string); // but see last point below.
而且,最后,您不需要传递地址只是为了打印它,您只需传入值,因此:
echoPair (&number, &string);
变为:
echoPair (number, string);
总的来说,我认为你想要的是:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
void getData(short int *number, char *string) {
printf("\nPlease enter a number greater than zero: ");
scanf("%hd", number);
printf("Please enter a character string: ");
scanf("%s", string);
}
void echoPair(short int number, char *string) {
printf("Number: %hd Character(s): %s\n", number, string);
}
int main (void) {
short int number = 0;
char string[32] = {0};
printf("Blah blah ...");
getData(&number, string);
echoPair(number, string);
return(0);
}
顺便说一句,你曾希望看到无限的字符串扫描,如:
scanf ("%s", string);
生产就绪代码。这是一个等待发生的缓冲区溢出漏洞,因为您无法控制用户输入的内容。在您的特定情况下,输入超过(大约)30个字符的用户可能会导致各种奇怪的行为。
scanf
函数用于扫描带格式的文本,并且未格式化的内容并不比用户输入的多:<)>
如果您需要强大的用户输入功能,请参阅here。
答案 1 :(得分:1)
您将局部变量number
声明为指向short int的指针。然后,将指针传递给getData
和echoPair
。所以你传递一个指向指针的指针,这是一个错误的类型。您可能希望将number声明为short int而不是指针。