while()循环让程序崩溃,但没有语法错误或其他任何东西

时间:2016-10-13 09:21:49

标签: c eclipse mingw

我需要编写一个程序,让用户输入一个字符串,然后用islowerisupperisdigit检查单个字符,但是在第一个循环中,它总是崩溃,并在第二次转弯后一次给printfs

有人可以帮忙吗?

#include <stdio.h>
#include <string.h>
#ifndef MAIN_H_
#include "main.h"
#endif

int main()
{
    char cString[MAX];      //alle Felder auf NULL gesetzt für spätere Überprüfung ob Entertaste gedrückt wurde
    char cUebergabe[MAX];
    int iLauf=0;
    int iNULL=0;

    while(iLauf<MAX)
    {
        cString[iLauf]=iNULL;
        iLauf++;
    }
    iLauf=0;

    printf("geben sie maximal 20 Zahlen zur auswertung des String ein, bei der Eingabe von Enter ohne ein Symbol wird das Einlesen abgebrochen\n");

    while(iLauf<MAX)
    {
        printf("Geben Sie nun das %d . Zeichen ein\n",iLauf+1);

        scanf("%c",&cString[iLauf]);
        iLauf++;

        if(cString[iLauf-1]==iNULL)
        {
            iLauf=MAX;
        }
        else
            ;
    }
    strcpy(cUebergabe,cString);

    VerarbeitungAusgabe(cUebergabe, iNULL);

    return 0;
}

1 个答案:

答案 0 :(得分:0)

问题是%c格式说明符会禁止跳过前导空白字符。在读取数字后,在下一次迭代中读取新行(当用户按下 Enter 时)。

从手册页:

  

匹配长度由最大字段宽度指定的字符序列(默认值为1);下一个指针必须是指向char的指针,并且必须有足够的空间容纳所有字符(不添加终止空字节)。通常跳过前导空格被抑制。要先跳过空格,请在格式中使用显式空格。

所以只需要一个空格:

scanf(" %c", &cString[iLauf]);

另请注意,您可以使用memset轻松填充内存。所以你可以替换它:

while (iLauf < MAX) {
  cString[iLauf] = iNULL;
  iLauf++;
}
iLauf = 0;

用这个:

memset(cString, 0, sizeof(cString));

甚至是这样:

char cString[MAX] = {0};