如何读取C中空格后的下一个字符?

时间:2017-04-17 12:56:30

标签: c scanf space

所以我必须编写一个输入为:

的程序

Spring Miles独立谎言自我

结果将是: SMILE

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

这就是我使用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;
}

3 个答案:

答案 0 :(得分:1)

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

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 :(得分:1)

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

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中的一个函数。您可以使用它来管理主存。

答案 2 :(得分:0)

如果您的输入真的未知,并且您不知道它将包含多少空格,则需要动态内存分配 - 这意味着您可以根据需要分配内存而不是尝试将其添加到固定大小的内存块在堆栈上。有几种方法,但我认为简单的链表是最干净的。以下应该做你需要的:

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来说有点新,所以我强烈建议你把它画出去,以确保你理解它是如何工作的。