为什么scanf会跳过字符串输入?

时间:2017-11-14 05:11:54

标签: c char scanf getchar

我试图将多个单词输入和多行输入到一个数组中。但某些地方代码跳过获取输入并跳过结束程序。我已经尝试在'%s'(或'%s')之前和之后添加空格但是它不起作用(也许是因为它在循环中?)。非常感谢任何人的帮助!如果我输入超过两三个字,它也会开始变得怪异:( 我的目标是找到特定字母在所有这些单词和行中出现的次数。

#include <stdio.h> //include standard library

int main(){
  int lineCount, occuranceCount;
  printf("How many lines are you going to enter?");
  scanf("%d", &lineCount);

  char input[lineCount][100], searchChar;

  for(int i=0; i<lineCount; i++){
    printf("Please enter line #%d (100 characters of less):",i+1);
    scanf("%s", &input[i]);
  }

  printf("What letter do you want to check the frequence in those lines? ");
  scanf("%c", &searchChar);

  for(int j=0; j<lineCount; j++){
    for(int k=0; k<100; k++){
      if(input[j][k] != '\0'){
        if(input[j][k]==searchChar)
          occuranceCount++;
      }
    }
  }

  printf("The letter occurs for %d time", occuranceCount);

  return 0;
}

3 个答案:

答案 0 :(得分:7)

  scanf(" %c", &searchChar);
         ^

您需要此处的空格来使用\n中的任何stdin

同样scanf()会读出一个单词而不是一行(空格分隔的单词)。

最好还是使用strlen(input[j])来了解您应该阅读的内容。

另一件事,在循环中使用size_t而不是int

occuranceCount初始化为0

另外,要避免buffer overrun漏洞攻击,请在代码中使用scanf("%99s", input[i]);

为了阅读一行,您可以使用fgets()

答案 1 :(得分:4)

1)改变

  scanf("%c", &searchChar); -->   scanf(" %c", &searchChar);

从前一个\n

中删除输入缓冲区中剩余的scanf

2)改变

for(int k=0; k<100; k++){ --> for(int k=0; k<strlen(input[j]); k++){

避免阅读超出实际用户输入。

除此之外:

永远不要scanf("%s", &input[i]);,因为用户可能会溢出输入缓冲区。至少将其更改为:scanf("%99s", &input[i]);,但请考虑使用fgets代替

使用fgets您的程序可能是:

#include <stdio.h> 

int main(){
  size_t lineCount = 0, occuranceCount = 0;
  printf("How many lines are you going to enter?");
  scanf("%zu ", &lineCount);
  if (lineCount == 0) return 0;  // Input error

  char input[lineCount][100], searchChar;

  for(size_t i=0; i<lineCount; i++){
    printf("Please enter line #%zu (100 characters of less):",i+1);
    fgets(input[i], 100, stdin);
  }

  printf("What letter do you want to check the frequence in those lines? ");
  scanf("%c", &searchChar);

  for(size_t j=0; j<lineCount; j++){
    for(size_t k=0; k<strlen(input[j]); k++){
        if(input[j][k]==searchChar) occuranceCount++;
    }
  }

  printf("The letter occurs for %zu time", occuranceCount);

  return 0;
}

答案 2 :(得分:2)

使用%s的scanf始终读取,直到遇到''(空白)或'\ n'(新行),因此您始终只能使用scanf(“%s”,s1)读取一个单词...

如果你想阅读你必须使用的空格或新行字符,或fgets(比获取更安全)