C语言 我正在尝试做一个函数来接受回文的用户输入,为什么在我输入一个数组后,它会自动输入其余的数组?

yzxexxkh  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(102)
#include<stdio.h>
#include<string.h>
#define ROWS 6
#define LENGTH 30

int main (void)
{

    int wordcount[ROWS]; // Incraments word count. i.e. Word 1, Word 2, Word 3...
    char word[LENGTH]; // Stores users string

    for(int i = 1; i < ROWS; i++)
    {
        if(i == 1)
        {
            printf("Word %d: ", i);
            scanf("%d %s", &wordcount[i], &word[0]); // Input ends here. Prints out the rest of the array with "no" values.
            i++;
        }
        if(i == 2)
        {
            printf("Word %d: ", i);
            scanf("%d %s", &wordcount[i], &word[1]);
            i++;
        }
        if(i == 3)
        {
            printf("Word %d: ", i);
            scanf("%d %s", &wordcount[i], &word[2]);
            i++;
        }
        if(i == 4)
        {
            printf("Word %d: ", i);
            scanf("%d %s", &wordcount[i], &word[3]);
            i++;
        }
        if(i == 5)
        {
            printf("Word %d: ", i);
            scanf("%d %s", &wordcount[i], &word[4]);
        }
        break;

    }

return 0;

}

我尝试了多次循环,改变了语法和位置,但是没有任何东西对我有意义。除了scanf()printf()fgets()strlen()之外,我不允许使用指针、全局变量或任何其他库函数。我必须创建多个函数来获取用户输入,反转字符串,看看它是不是回文...但我好像过不了第一部分。

ippsafx7

ippsafx71#

几个问题...
1.索引应从0开始,* 而不是 * 1

  1. word数组必须是2D(* 而不是 * 1D)
    1.也就是说,您需要一个单词 * 数组 *,其中包含ROWS个单词,每个单词最多可以包含LENGTH个字符。
    1.一个简单的循环可以获取所有单词,而不需要任何if语句
    1.最好使用fgetsstrlen,而不是scanf来进行输入,您可以 * 提示 * 用户
    下面是重构后的代码:
#include <stdio.h>
#include <string.h>

#define ROWS        5
#define LENGTH      100

int
main(void)
{

    // length of each word
    int wordcount[ROWS];

    // Stores users string
    char word[ROWS][LENGTH];

    for (int i = 0; i < ROWS; i++) {
        // prompt the user
        printf("Word %d: ", i + 1);
        fflush(stdout);

        // get the line with the word
        if (fgets(word[i],LENGTH,stdin) == NULL)
            break;

        // get the word length
        size_t len = strlen(word[i]);

        // strip newline
        if ((len > 0) && (word[i][len - 1] == '\n')) {
            word[i][len - 1] = 0;
            --len;
        }

        // save the length
        wordcount[i] = len;
    }

    // print the words
    for (int i = 0;  i < ROWS;  ++i)
        printf("Word %d is %d bytes: '%s'\n",i + 1,wordcount[i],word[i]);

    return 0;
}
5sxhfpxr

5sxhfpxr2#

我可以通过不输入整数而只输入字符串来重现这个问题。这意味着scanf()在第一次和随后的尝试中都会失败。下面是一个简化的程序版本,带有错误检查功能:

#include <stdio.h>
#define ROWS 6
#define LENGTH 29

#define str(s) str2(s)
#define str2(s) #s

int main (void) {
    int wordcount[ROWS];
    char word[LENGTH+1];
    for(int i = 0; i < ROWS; i++) {
        printf("Word %d: ", i + 1);
        int n = scanf(" %d %" str(LENGTH) "s", wordcount + i, word + i);
        if(n != 2) {
            printf("scanf failed\n");
            break;
        }
    }
}

和运行示例:

Word 1: 1 abcd
Word 2: cd
scanf failed

从问题描述中不清楚您试图对word执行什么操作,但可能是不正确的,因为您将字符串写入word的位置0,然后将下一个word 2写入位置1(覆盖部分word 1),等等。您实际上是指单词计数还是单词中的字母计数?对于后者,请使用strlen()

相关问题