【问题标题】:Scanf doesnt take more than 4 characters in a const char array - CScanf 在 const char 数组中不占用超过 4 个字符 - C
【发布时间】: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", &amp;yesNo); --> scanf(" %c", &amp;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 所写的内容,您的编译器应该就第一行代码向您发出警告。不要忽略编译器警告,而是将它们全部修复。如果您的编译器没有警告您,那么您需要调高警告级别。

标签: c arrays scanf constants


【解决方案1】:

所以,这里有一个可能的答案:

“将const char name[] 更改为char name[100]”(来自@kaylum)

“更改scanf("%c", &amp;searchingCharacter) --&gt; scanf(" %c", %searchingCharacters) 以在输入流中使用新行”(来自@user3121023)

这里是完整的代码:

#include <stdio.h>

int searchCharacters(const char*, char);
int getLength(const char*);

int main() {

    char yesNo;
    int end = 0;
    char name[100]; <-- Changed -->

    printf("please enter a name: ");
    scanf("%99s", name);
    fflush(stdin);
    int length = getLength(name);
    printf("\n%s has a length of %i", name, length);

    while(end != 1) {
        printf("\n\nWould you like to search a character in %s (y / n)?", name);
        scanf("%c", &yesNo); <-- Changed -->

        switch(yesNo) {
            case 'y':
                printf("\nPlease enter a character: ");
                char searchingCharacter;
                scanf(" %c", &searchingCharacter); <-- Changed -->
                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

    abcdefg has a length of 7 characters. <-- Working/Changed -->

    Would you like to search a character in abcd (y / n)? y

    Please enter a character: a <-- Working/Changed -->

    The letter a is 1-times. <-- Working/Changed -->

    Would you like to search a character in abcdefg (y / n)? n

    Good bye!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 2022-01-10
    • 2017-12-03
    • 2021-08-21
    • 2018-07-12
    • 1970-01-01
    相关资源
    最近更新 更多