用getchar输入字符串

时间:2014-11-17 00:15:30

标签: c string while-loop getchar

我正在尝试将字符串读入一个char数组,其长度由用户选择。问题是getchar()不会停止读取,直到用户根据我的代码按Enter键手动输入换行符。我已经阅读了其他人的帖子,我理解为什么我不能这样做,这与我的任务分发完全矛盾。

int chPrompt(int nchars);
void strInput(char str[], int nchars);

int main(void) {
    int nchars = chPrompt(nchars);
    char str[nchars];

    strInput(str, nchars);

    return 0;
}

int chPrompt(int nchars) {
    printf("How many chars do you need to input? >");

    return scanf("%i", &nchars);
}

void strInput(char str[], int nchars) {
    int i = 0;

    while((str[i] = getchar()) != '\n') {
        if(i > nchars-1)
            break;
        i++;
    }
    str[i] = '\0';

    //Troubleshooting
    printf("%s %d", str, strlen(str));
}

这就是讲义说:

使用我们谈到的技术从键盘输入一个字符串(包括空格) about(使用getchar()时,不是gets(),fgets()或scanf()), 增加,以便输入任何数量,但不超过80 字符。输入后确保在正确的位置有空值。

我们在课堂上谈到的技术是将getchar赋值给char数组的while循环。

我的问题: 我的教授对他的指示非常坚定。在这篇讲义中,他特意告诉我输入任何金额,但不超过80.这与getchar的功能相矛盾,对吗?有没有办法限制字符串的长度,使用这种技术'?

在我发现的一些主题上,人们提到它可能与操作系统有关。所以,如果重要的话,我在Windows 8.1上。

3 个答案:

答案 0 :(得分:4)

Op的代码很接近。

“getchar()不会停止阅读,直到用户通过按Enter键手动输入换行符”是不正确的 典型的用户输入是行缓冲。在 Enter 发生之前,程序没有任何内容。那时整条线都交给了程序。 getchar() char一次stdin消耗1 int

1)需要分配足够的缓冲内存@Grzegorz Szpetkowski
2)将输入读作scanf()并根据需要读取额外内容 3)不要将char的值作为要读取的数量返回 4)在读取要读取的getchar()的数量后读取剩余的行。 @Grzegorz Szpetkowski

unsigned char会返回EOFgetchar()。这通常是257个不同的结果。将char读入void strInput(char str[], int nchars) { int i = 0; int ch; while((ch = getchar()) != '\n' && ch != EOF ) { if (i < nchars) { str[i++] = ch; } } str[i] = '\0'; } int main(void) { int nchars = chPrompt(nchars); char str[nchars + 1]; // + 1 strInput(str, nchars); //Troubleshooting printf("'%s' %zu", str, strlen(str)); return 0; } int chPrompt(int nchars) { printf("How many chars do you need to input? >"); if (scanf("%i", &nchars) != 1) { printf("Unable to read #\n"); exit(-1); } // Consume remaining text in the line int ch; while((ch = getchar()) != '\n' && ch != EOF ); return nchars; } 会失去这种区别。

strlen()

注意:size_t会返回int类型,而不是"%zu",这可能/您的平台上可能不一样,最好使用正确的格式说明符strlen() printf("'%s' %d", str, (int) strlen(str)); 。或者使用:

{{1}}

答案 1 :(得分:0)

此代码可以在更多地方更正(例如,计算输入的字符,以便您允许用户输入不超过80个字符等),但这会指向正确的方向:

#include <stdio.h>
#include <string.h>

void strInput(char str[], int nchars);

int main(void) {
    int nchars = 0;

    printf("How many chars do you need to input?\n");
    scanf("%d\n", &nchars);

    char str[nchars+1];

    strInput(str, nchars);

    return 0;
}

void chPrompt(int nchars) {
}

void strInput(char str[], int nchars) {
    int i = 0;

        char c;
    while((c = getchar()) != '\n' && i <= (nchars-1)) {
            str[i] = c;
            i++;
    }
    str[i] = '\0';

    printf("%s %d\n", str, (int)strlen(str));
}

答案 2 :(得分:0)

对以上答案的更改很小,尝试此操作不会产生任何“缓冲区已满错误”

  #include<stdio.h>
#include<string.h>
void getinput(char str1[],int s){
    int i=0;
    printf("inside fn\n");
    char c;
    while((c=getchar())!=EOF && i<=(s-1))
    { str1[i++]=c;
    }
    str1[i]='\0';}
void main()
{ int size;
    printf("enter the no. of characters \n");
    scanf("%d", &size);
    char str1[size+1];
    getinput(str1,size);
    printf("%s \n",str1);
}