【问题标题】:How to read the next character after space in C?如何在C中读取空格后的下一个字符?
【发布时间】:2017-09-13 02:23:44
【问题描述】:

所以我必须写一个程序,输入是:

Spring Miles Indie Lie Ego

结果将是: 微笑

但是我的输入有一些问题。我不知道输入的长度,所以它可以是任何长度。

这就是我使用 scanf 读取每个字符的原因。我计算空格以了解要保存所需字符的数组的大小。

所以在这些之后,我的主要问题是: 如果我找到一个空格,我应该保存从 scanf 读取的下一个字符,但我该怎么做呢? 或者你们知道解决这个问题的其他方法吗?

到目前为止,这是我的代码:

int main()
{

    char ch;
    int i = 0, count= 0;

    while(scanf("%c", &ch) != EOF)
    {
        if(ch == '\n')
            count = 0;

        if(ch == ' ')
            count++;

        char array[count+1];

        if(ch == ' ')
         array[i++] = ch + 1; // I tried this, but it doesn't work.
    }
    return 0;
}

【问题讨论】:

  • 您必须阅读下一个字符。因为你已经知道如何阅读一个字符......我不明白问题出在哪里。
  • 您必须将array 声明移出循环。按照您的方式,它将在第一次迭代时创建为一个元素为零的数组,除非字符是空格。
  • 我知道了,但是如果我声明退出循环,我怎么知道大小?因为不知道要等多久。这就是为什么我使用计数器来声明数组的完美大小以保存每个空格后的第一个字符。
  • 必要时分两步。您可以遍历文本、计算空格并相应地设置数组大小。但在这种情况下,由于您知道数组需要包含的所有内容,您甚至可以将其创建为 char array[6]; 额外元素,以便为 NULL 终止符腾出空间。
  • 只是说另一种编写程序的方法就是过滤以保留大写字母。那么你就不用担心与空白相关的位置

标签: c scanf space


【解决方案1】:

如果在 while 循环中定义 char 数组,则该数组将永远不可用。如果 while 循环运行 10 次,您的代码将定义 10 个 char 数组,但在 while 循环完成后有一个可用。下面是我的代码

int main() {
    char ch;
    char array[1024];
    int i = 0, count= 0;
    int status = 1;
    while(scanf("%c", &ch) != EOF) {
        if(ch == '\n') {
            break;
        }
        if(ch == ' ') {
            status = 1;
            continue;
        }
        if (status == 1) {
            status = 0;
            array[i++] = ch;
        }
     }
     array[i++] = ' ';
     printf("%s", array);
     return 0;
}

我的代码是基于数组长度不会超过 1024 的假设。在其他人输入之前我们无法知道输入的长度。所以 malloc 可能会帮助你。 malloc 是 C 语言中的一个函数。你可以用它来管理你的主内存。

【讨论】:

  • 1) 你想要array[i++] = '\0';吗? 2) while(i < 1023 && scanf("%c", &ch) != EOF) { 防止代码利用。
  • 循环后为什么要给数组加空格?
【解决方案2】:

chchar。在这里将数字1 添加到字符“空格”是没有意义的。相反,您必须从字符串中读取下一个字符。你可以这样做:

int main()
{

    char ch;
    bool had_space;
    int i = 0, count= 0;

    had_space = true;

    while(scanf("%c", &ch) != EOF)
    {
        if(ch == '\n')
            count = 0;

        if(ch == ' ')
            count++;

        char array[count+1];

        if(ch == ' ')
            had_space = true;
        else if (had_space)
            array[i++] = ch;
    }
    return 0;
}

我猜你还必须在循环之外定义数组。

【讨论】:

  • 您不能将数字 1 添加到字符“空格” - 当然可以。
  • 那么这个操作的结果是什么?编辑:好吧,我猜你会得到下一个 ASCII 字符。我应该写“这没有意义”——我会改变它。
  • @Pharaoh 这很有意义,您在评论中进行了解释。 ASCII 图表是确定性的。
  • 是的,如果这是您需要的,那是有道理的 - 但您没有得到您读取字符的字符串的下一个字符,即该问题的含义。 Kyntha 的做法没有意义。
【解决方案3】:

如果您的输入确实一开始就未知,并且您不知道它将包含多少个空格,那么您需要动态内存分配 - 这意味着您可以根据需要分配内存,而不是试图将其粘贴在堆栈上固定大小的一块内存。有几种方法可以解决这个问题,但我认为简单的链表是最干净的。以下应该可以满足您的需要:

typedef struct linkedListNode {
     char                ch;
     struct linkedList * next;
} linkedListNode_t;

linkedListNode_t *pHead = NULL;
linkedListNode_t **ppNext = &pHead; 

// pHead points to the first node in the list
// ppNext points to the pointer to the next element in the list


while(scanf("%c", &ch) != EOF) {
    if (ch == ' ') {
        // scan next character, and add to linked list:
        if (scanf("%c", &ch) == EOF)
             break;   // exit loop if we've hit end of input
        // ch is ok -- add to list:
        // allocate a new pNode to store the information
        linkedListNode_t *pNode = malloc(sizeof(linkedListNode_t);
        if (pNode == NULL) {
             printf("Out of memory -- aborting");
             exit (-1);  // if allocation failed, abort program
        }
        pNode->ch = ch;
        pNode->next = NULL;
        *ppNext = pNode;        // make previous node point to this one.
        ppNext = &pNode->next;  // update ppNext
    }
    else if (ch == '\n') {
        // special handling of newline -- did you want to print the
        // string and dump memory here?        
    }
} // end wile loop

// at this point we have a linked list with all characters that 
// follow spaces -- print it out:
linkedListNode *pNode = pHead;

while (pNode != NULL) {
    printf("%c", pNode->ch);
    pNode = pNode->next;
}
printf("\n");      

// free list:
pNode = pHead;
linkedListNode *pNext;
while (pNode) {
    pNext = pNode->pNext;
    free(pNode);
    pNode = pNext;
}

免责声明:我没有测试上述内容,所以我可能犯了语法错误。无论如何,您看起来对 C 有点陌生,因此我强烈建议您将其画出来以确保您了解它的工作原理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    相关资源
    最近更新 更多