多行字符串输入

时间:2018-08-02 19:14:45

标签: c input

var secondRow = document.querySelector("#mySecondRow");

嗨,我的代码有问题,我需要输入3行并计算输入中“ $”的数量。输入法未注释“ scanf(”%[] s“,&userInput);” 是我发现采用全部3行输入的唯一方法,但我无法中断输入循环并继续执行我的程序。

任何帮助将不胜感激

5 个答案:

答案 0 :(得分:2)

要阅读繁琐的scanf()中的3条,代码需要查找'$''\n'EOF。其余输入将被丢弃。

int count = 0;
int line = 0;
while (line < 3) {
  scanf("%*[^$\n]");  // Scan for any amount of characters that are not $ nor \n,
                      // "*" implies - do not save. 
  char ch;
  if (scanf("%c", &ch) != 1) {  // Read next character.
    break;
  }
  if (ch == '$') count++;
  else line++;
}

printf("$ count %d\n", count);

答案 1 :(得分:2)

正如@chux所建议的那样,使用Partial Class MedicaidBillingAdmin_medicaidbillingadmin Inherits BasePage Dim ChildGridUniqueID As String = String.Empty Dim ChildGridEditIndex As Integer = -1 Dim NursingChildGridUniqueID As String = String.Empty Dim NursingChildGridEditIndex As Integer = -1 Dim MedicaidDataGridUniqueID As String = String.Empty Dim MedicaidDataGridEditIndex As Integer = -1 Dim MedicaidDataReadyToBillGridUniqueID As String = String.Empty Dim MedicaidDataReadyToBillGridEditIndex As String = -1 Dim remoteDirectory As String = "//FromUHIN//" Dim localDirectory As String = "C:\test\" Dim port As Int32 = 22 Public ExpandLink As StringBuilder = New System.Text.StringBuilder("") Public ExpandLink_Nursing As StringBuilder = New System.Text.StringBuilder("") Public Class Medicaid_Students Public Property strSchool_ID As String Public Property strCat As String Public Property strStudentID As String Public Property strStudentDistID As String Public Property strLastName As String Public Property strFirstName As String Public Property strDOB As String Public Property strMedicaidID As String Public Property strBillingCode As String Public Property strIEPDueDate As String Public Property intGrade As Int16 End Class 进行读取提供了一种简便的方法来防止缓冲区溢出和 ,而无需在fgets转换说明符中硬编码字段宽度修饰符。

在这里,如果您需要做的就是计算在输入中发现的scanf个字符的数量(无论行数如何),则可以简单地读取固定大小的数据块中的所有输入。 '$'就是这样做的。输入一行还是一百万行都没关系。输入行是一个字符还是一百万个字符也没有关系。您只需读取每一行,并计算每个读取的数据块中找到的fgets的数量,就可以保留找到的总数。

您可以对任何字符执行此操作。如果您还想计算行数,则只需检查'$'个字符并在其中保持总数即可。用'\n'计算行数时唯一的特殊情况是确保您免受非POSIX 文件结尾的影响(这意味着最后一个没有fgets的文件字符)。有两种方法可以解决此问题。检查最后读取的字符是'\n'和其他字符一样好。

将各个部分放在一起,并防止出现非POSIX错误,您可以执行以下操作,该操作简单地读取'\n'上的所有可用数据,并输出最终的stdin和行数:

'$'

仔细检查一下,如果还有其他问题,请告诉我。

答案 2 :(得分:1)

int readMatrix() {

char userInput[100][3];    //Store user input
int j = 0, m = 0;

for(m = 0; m < 3; m++){
    scanf("%s", &userInput[j][m]); //This takes input (Ex: 22 *(enter)* 33$ *(enter)* 66$ *(enter)*
    j++; //increase the column
}



int i =0,count =0;
m = 0;
//Loop through the user input, if the character is '$', the integer count will be incremented
for (i = 0; i < 100; i++){
    for(m = 0; m < 3; m++){
        if (userInput[i][m] == '$'){
            count++;
        }
    }
}
printf("%d", count);
return 0;
}

答案 3 :(得分:1)

  

scanf(“%[] s”,&userInput);“是我唯一发现接受全部3行输入的代码,但是我无法中断输入循环并继续执行我的程序。

"%[]"是无效的scanf()指定符。可能会发生任何事情,这是未定义的行为,包括将所有行都收起而不返回。

此处的's'格式无用,将其删除。


是的,fgets()是最好的,但是让我们滥用scanf() 来阅读3行并寻找'$'

char line[3][100] = {0};
//                 v--------- Consume all leading whitespace 
//                 | vv ----- limit input to 99 characters as scan() appends a \0
//                 | || v-v-- Look for "not \n" 
#define FMT_1LINE " %99[^\n]"

// Let the compiler concatenate the 3 formats into 1 string for scanf
int scan_count = scanf(FMT_1LINE FMT_1LINE FMT_1LINE, line[0], line[1], line[2]);
// Check return value
if (scan_count == 3) {
  // Successfully read 3 lines
  int count = 0;
  for (int line_index = 0; line_index < 3; line_index++) {
    char *s = line[line_index];
    while (*s) {  // no need for strlen(), just loop until the null character
      count += *s == '$';
      s++;
    }
  }
  printf("$ count %d\n", count);
}

答案 4 :(得分:1)

您写:

scanf("%[]s", &userInput); //This takes input but doesnt leave input loop

,但评论充其量是误导的。您的格式字符串格式错误,因此scanf调用的行为未定义。空扫描集(格式为[]之间)没有意义,因为结果字段永远不会匹配任何内容。因此,在扫描集的开头]之后立即出现的]被解释为文字字符而不是结束定界符。因此,您的扫描集未终止。

也请注意,%[是它自己的字段类型,与%s分开。扫描集的结束]之后的's'不是此类字段描述符的一部分,而是要匹配的普通字符。

使用scanf执行此操作的一种简单方法是通过%c字段一次循环读取一个字符。这可能不是练习所要查找的内容,并且为此目的而使用scanf()而非getchar()是一种技巧,但是也许可以:

int nl_count = 0;
int dollar_count = 0;

do {
    char c;
    int result = scanf("%c", &c);

    if (result != 1) {
        break;
    }
    switch (c) {
        case '\n':
            nl_count++;
            break;
        case '$':
            dollar_count++;
            break;
    }
} while (nl_count < 3);

恐怕要使用%[字段一次安全地读取多个字符会变得很多,而且没有安全的方法来读取所有三行一次scanf调用中,除非您可以依靠输入行不超过您知道的行长限制。