【发布时间】:2016-02-06 21:32:14
【问题描述】:
我对 C 非常陌生,想编写一个函数来安全地提示用户输入字符串并返回它。虽然我认为我已经处理了安全部分,但我无法将字符串返回到 main 方法并将其打印出来。这是我的代码
//Method to safely read user input
char * getFileName(char* fileName) {
char* str[50];
int isValid = 0;
while (isValid == 0) {
isValid = 1;
printf("Enter file name: ");
fgets(str, 50, stdin);
if (strlen(str) == 49 && str[48] != '\n') { //http://stackoverflow.com/questions/21691843/how-to-correctly-input-a-string-in-c
isValid = 0;
if (strlen(str) > 0 && str[strlen(str) - 1] != '\n') {//http://stackoverflow.com/questions/35136026/simple-loops-and-string-length-in-c?noredirect=1#comment58000759_35136026
printf("Error! String is too long\n\n");
do {
fgets(str, 50, stdin);
} while (strlen(str) > 0 && str[strlen(str) - 1] != '\n');
}
}
for (int i = 0; i < strlen(str); i++) {
if (str[i] == '%') {
printf("Error: Attempted string format attack\n\n");
isValid = 0;
}
}
}
for (int i = 0; i < strlen(str); i++) {
fileName[i] = str[i];
}
return fileName;
}
int main()
{
//Opening text file
char fileName[50];
getFileName(fileName);
printf(fileName);
printf("Press Enter to continue...");
getchar();
//
return 0;
}
运行此代码会打印此结果
我不知道为什么。任何帮助将不胜感激!
【问题讨论】:
-
strlen()迭代它的参数以计算它的长度、存储它的值并使用它而不是一遍又一遍地调用它。 -
你想做什么?这段代码看起来不必要地复杂。
-
C 不支持方法,只支持函数。并且从不
printf直接使用外部提供的字符串(即没有像"%s"这样的格式字符串)。 -
@kaylum 看看
if (str[i] == '%')好像是故意printf(fileName)。 -
@iharob:大体上同意,但是一个好的编译器会知道纯函数并正确标记库(或使用像 glibc 这样的库)。