C / C ++一次读取行

时间:2014-06-21 04:17:56

标签: c++ c carriage-return

我试图解决某个网站的编程问题,而且这个问题有以下说法:

读取一个字符串并将其解析为数字,char' l'可以被认为是1号和字符' o'和' O'可被视为数字0,逗号和空格将在输入中被接受但被忽略,如果找到任何其他字符则输出错误...

所以...因为行中可以有空格,我使用了gets(文档说它删除了新行并放置了一个终结符)...

我的IF测试序列,如果它是一个数字,那么如果它是一个可接受的字母,那么检查它是不是逗号或空格......而且我发现它几乎总是进入最后的IF甚至虽然没有任何字符可以引导它,所以我改变了里面的printf来打印

 printf("%d error", st[k]);

它输出13:回车...我尝试了这个编译器here

#include <cstdio>
#include <cstring>
#include <cstdlib>

int main()
{
     char st[100];
     char buf[100];
     int k, i;

     long long int num;

ops:     while(gets(st))
         {      
            for(k = i = 0; st[k]; k++)
                if(st[k] >= '0' && st[k] <= '9')
                    buf[i++] = st[k];
                else if(st[k] == 'o' || st[k] == 'O')
                    buf[i++] = '0';
                else if(st[k] == 'l')
                    buf[i++] = '1';
                else if(st[k] != ',' && st[k] != ' ')
                {
                    printf("error\n");
                    goto ops;
                }
 // remaining code comes here...

}   

输入样本具有以下lilnes:

10 6个 234657

喜 ,,,,, 5,5,4

22亿

00

我应该使用其他功能来阅读吗?

关于如何避免这个该死的回程的任何建议?

如果您想了解更多细节,可以查看here问题的状态 感谢

编辑:

我问这个问题是因为我使用的编译器与网站使用的编译器之间似乎存在差异,一旦我提交的代码没有生成正确的输出我认为代码是正确的......它通过了。然后在我之后,我在linux虚拟机上尝试了代码并且也正确但是我在Windows上的gcc失败了......一些角色完全远离它们应该在哪里

事情是:

1 个答案:

答案 0 :(得分:0)

线路输入的首选方法是getline。如果您事先不知道输入的宽度,如果将缓冲区指针设置为getlineNULL将为您分配空间。

由于您表明您在C中有一些经验,下面将向您展示如何单步执行输入字符串并以您想要的方式解析它。虽然有很多方法可以处理解析字符串,但很难分配指向字符串开头的指针,然后向前推进字符串,直到到达空终止字符(unsigned 0或{{1} })。如果您在查看后有任何疑问,请询问:

char '\0'

输出:

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[]) {

    char *buffer = NULL;
    size_t n = 0;
    ssize_t len;
    char *ptr = NULL;
    char *output = NULL;
    int idx = 0;

    printf ("\nEnter your string below:     ([ctrl + d] on blank line to end)\n");

    while ((len = getline (&buffer, &n, stdin)) != -1) {
        ptr = buffer;
        idx = 0;
        output = malloc (sizeof (char) * len);

        while (*ptr != 0) {
            if (*ptr >= 48 && *ptr <= 57) output [idx++] = *ptr;
            if (*ptr == 'I') output [idx++] = '1';
            if (*ptr == 'o' || *ptr == 'O') output [idx++] = '0';
            ptr++;
        }

        output [idx] = 0;

        printf ("\n  valid output: %s\n\n", output);

        free (output);
    }


    return 0;
}