0

我已经搜索过这个,但我真的找不到任何让我满意的答案。因此,当字符串是控制台中的完整类型行时,我的疑问与 C 中的字符串输入有关。到目前为止,我习惯于做这样的事情:

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

int main() {

    int bar;
    char foo[30];

    scanf( "%d", &bar );

    fflush( stdin ); // prevent buffer "issue"
    gets( foo );
    fflush( stdin ); // I usually put this here too,
                     // but in most of times it is not
                     // necessary

    printf( "%d\n", bar );
    printf( "%s\n", foo );

    return 0;

}

但是阅读此C++ Reference (gets)后,我意识到该gets函数现在已从 C 规范 (2011) 中删除。所以我搜索了另一种形式来做同样的事情,我在 SO 中找到了一个帖子(我不记得链接,抱歉),这样做的一种方法是使用该fgets功能。所以,我的代码将是这样的:

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

int main() {

    int bar;
    char foo[30];

    scanf( "%d", &bar );

    fflush( stdin );
    fgets( foo, sizeof foo, stdin );
    fflush( stdin );

    printf( "%d\n", bar );
    printf( "%s test\n", foo );

    return 0;

}

它工作正常,只需一个细节。该fgets函数也读取新行字符,我不想要这个。假设,如果我输入这句话“一二”,程序的第一个版本会将其存储在 c 字符串中:

'o'| 'n'| 'e'| ' '| 't'| 'w'| 'o'|'\0'

但第二个版本将存储这个:

'o'| 'n'| 'e'| ' '| 't'| 'w'| 'o'| '\n'|'\0'

而且我不想要这个,因为其中一个问题可能是字符串比较,因为我也需要将字符串与新行 char 进行比较,这将是一个问题,例如,在 windows 和 linux 之间,因为它们使用换行的不同模式(分别为 \r\n 和 \n )。

所以,我的问题是:如何仅使用标准函数读取 c 字符串?我的疑问出现了,因为我是巴西一所联邦学院的老师,我从事介绍性编程学科的工作,我想要一些简单但效果很好的东西,但有些学科使用 C 作为编程语言。当然,一种方法是替换新行char,但我不能这样做!我需要一条简单的线来完成这项工作,没有惯用的结构。我与极端“低水平”的学生一起工作......

4

2 回答 2

1

fflush(stdin);是未定义的行为,不要这样做。


否则,解决方案很简单:在 之后fgets(buf, sizeof(buf), stdin),用 0 终止符替换换行符:

char *p;

p = strchr(buf, '\r');
if (p) *p = 0;

p = strchr(buf, '\n');
if (p) *p = 0;
于 2013-07-27T15:38:48.367 回答
0

也许最好的方法是通过阅读fgets

char line[BUFSIZ] = "";

while (line = fgets(line, sizeof line, stdin)) {
    size_t len = strlen(line); 
    /* Remove newline */ 
    if (line[len - 1] == '\n') {
        line[len - 1] = '\0'; 
    } 
    /* process line */
}
于 2013-07-27T15:45:26.727 回答