【发布时间】:2020-03-19 20:30:48
【问题描述】:
我有一个非常奇怪的错误。如果我写的名称包含超过 4 个字符,printf 将只输出前 4 个字符。
重要提示:我不允许使用 stdio.h 以外的任何其他库,并且我不允许使用 除了 scanf 输入和 printf 输出之外的任何东西。此外,我不允许修改函数的参数列表,我必须使用 const char。代码在 unix 系统上通过 ssh 在 putty 上运行。
我的代码和输入/输出如下。另外,while 循环也有 bug ._.
#include <stdio.h>
int searchCharacters(const char*, char);
int getLength(const char*);
int main() {
char yesNo;
int end = 0;
const char name[] = {""};
printf("please enter a name: ");
scanf("%s", name);
int length = getLength(name);
printf("\n%s has a length of %i", name, length);
fflush(stdin);
while(end != 1) {
printf("\n\nWould you like to search a character in %s (y / n)?", name);
scanf(" %c", &yesNo);
switch(yesNo) {
case 'y':
printf("\nPlease enter a character: ");
char searchingCharacter;
scanf("%c", &searchingCharacter);
int numberOfCharacters = searchCharacter(name, searchingCharacter);
printf("\nThe letter %c is %i-times", searchingCharacter, numberOfCharacters);
break;
case 'n':
printf("\nGood bye!");
end++;
break;
}
}
return 0;
}
int searchCharacter(const char s[], char c) {
int numberOfIterations = getLength(s);
int numberOfCharacters = 0;
int i;
for (int i = 0; i < numberOfIterations; i++) {
if (s[i] == c) {
numberOfCharacters++;
}
}
return numberOfCharacters;
}
int getLength(const char s[]) {
int i = 0;
while(s[i++]);
return (i - 1);
}
Input/Output:
please enter a name: abcdefg
abcd has a length of 7 characters.
Would you like to search a character in abcd (y / n)? y
<-------------- AUTOMATIC/BUG WHILE LOOP --------------------------->
Please enter a character:
The letter
is 0-times.
</--------------AUTOMATIC/BUG WHILE LOOP---------------------------->
Would you like to search a character in abcd (y / n)? n
Good bye!
【问题讨论】:
-
scanf("%c", &yesNo);-->scanf(" %c", &yesNo); -
还是一样的结果。 “that too it is const”是什么意思?
-
如果不是因为 name 是 const 并且根本不应该被修改,那么您将在这些行中出现缓冲区溢出
const char name[] = {""}; printf("please enter a name: "); scanf("%s", name);。我会先修复这些错误,然后然后担心程序无法按预期运行。 -
是的,我正在尝试,但我完全不知道如何......我是 c 新手,我的教授说我们必须使用 const char(或者我听错了吗?)。至少他说参数列表必须有 const char
-
进一步了解@TanveerBadar 所写的内容,您的编译器应该就第一行代码向您发出警告。不要忽略编译器警告,而是将它们全部修复。如果您的编译器没有警告您,那么您需要调高警告级别。