Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用getchar输入字符串_C_String_While Loop_Getchar - Fatal编程技术网

使用getchar输入字符串

使用getchar输入字符串,c,string,while-loop,getchar,C,String,While Loop,Getchar,我试图将字符串读入一个字符数组,长度由用户选择。问题是getchar()直到用户根据我的代码按enter键手动输入换行符后才会停止读取。我读过别人的文章,我明白为什么我不能这样做,这与我的作业讲义完全矛盾 int chPrompt(int nchars); void strInput(char str[], int nchars); int main(void) { int nchars = chPrompt(nchars); char str[nchars]; st

我试图将字符串读入一个字符数组,长度由用户选择。问题是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));
}
这是讲义上说的:

使用我们讨论过的技巧从键盘(包括空格)输入字符串 关于(使用getchar()、not gets()、fgets()或scanf()时), 增加,以便输入任何数量,最多不超过80 人物。确保在输入后的正确位置有空值

我们在课堂上讨论的技术是while循环,将getchar赋值给char数组

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


在我发现的一些线程中,人们提到它可能依赖于操作系统。因此,如果这很重要,我使用的是Windows 8.1。

此代码可以在其他几个地方更正(例如,计算输入的字符数,以便允许用户输入不超过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));
}
#包括
#包括
虚线输入(字符str[],内部nchars);
内部主(空){
int-nchars=0;
printf(“需要输入多少字符?\n”);
scanf(“%d\n”、&nchars);
字符str[nchars+1];
横纹(str,nchars);
返回0;
}
void chPrompt(int-nchars){
}
虚线输入(字符str[],内部nchars){
int i=0;
字符c;
而((c=getchar())!='\n'和&iOp的代码很接近

“在用户通过按enter键手动输入换行符之前,getchar()不会停止读取”不正确。
典型的用户输入是行缓冲的。在Enter出现之前,不会向程序提供任何内容。此时,整行内容都会提供给程序。
getchar()
stdin
一次消耗1个
char

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

getchar()
返回一个
unsigned char
EOF
。这通常是257个不同的结果。将
getchar()
读入一个
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;
}

上面的答案没有什么变化,试试看,它不会给出任何“缓冲区已满错误”

#包括
#包括
void getinput(字符str1[],int s){
int i=0;
printf(“内部fn\n”);
字符c;

while((c=getchar())!=EOF&&i
charstr[nchars];
char str[nchars+1];
。您遗漏了空字符的空格。您所指的是“缓冲输入模式”。@grzegorzzpetkowski已处理完毕!感谢提醒。有没有办法绕过缓冲输入模式?或者我误解了讲义?“这与getchar的功能相矛盾,对吗?”--不,不正确。你似乎把getchar和fgets混在一起了。我不清楚你的教授在要求什么。如果他想从字面上理解“最多,但不超过80个字符”,那么就没有更多的字符可以是“身体上的”在控制台中键入,则无法在C中以可移植的方式执行。@GrzegorzSzpetkowski如果是这样的话,那么我相信这已经解决了:)谢谢。我应用了更改,但出于某种原因,程序在nchars提示后立即退出。唯一的输出是我用于故障排除的printf语句。它在没有其他操作时退出。请随意更改。好的,我认为它现在符合讲义上的标准。它将指定数量读取到string,但getchar仍在填充缓冲区,直到用户按enter键手动输入换行符。没有办法吗?感谢您的帮助:)出于某种原因,在输入nchars后,它输出我正在进行故障排除的printf,然后退出程序。我使用ctrl+z恢复到原始代码,现在我的代码正在运行g一样。不太确定出了什么问题:S@LukeFi:请注意,
scanf()
调用会在
stdin
中留下“孤立的”
'\n'
字符。使用
while(getchar()!='\n');
(为了清晰起见,您可以在单独的行中加上分号和缩进)来去除它。组合
scanf()并不难
即将推出的
getchar()
@LukeFi Grzegorz Szpetkowski是正确的。根据您的帖子,您似乎可以将长度80硬编码到代码中,而不是查询它。@LukeFi或者在读取数字后,
int ch;while((ch=getchar())!='\n'&ch!=EOF);
清除
chPrompt()
@GrzegorzSzpetkowski中剩余的
char
字符数小时以来,我一直为stdin中的那条新行感到头疼!不知道它是scanf留下的。我一直认为scanf之后的新行只是一个输出。谢谢。
printf("'%s' %d", str, (int) strlen(str));
  #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);
}