【问题标题】:while() loop lets program crash, but there are no syntax errors or anything elsewhile() 循环让程序崩溃,但没有语法错误或其他任何东西
【发布时间】:2017-02-22 08:14:11
【问题描述】:

我需要编写一个程序,让用户输入一个字符串,然后继续检查具有islower、isupper、isdigit 的单个字符,但在字符串的第一个循环中它总是崩溃并在第二回合后一次给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;
}

【问题讨论】:

  • 因为我们都有具有魔力的玻璃球,可以读取您未提供给我们的代码。编辑您的问题并添加您的代码。
  • 对不起,不知不觉就发了
  • #ifndef MAIN_H_
  • cString 似乎永远不会被终止,顺便说一句。如果那个 while 循环没有让你得到你,你就是在那个 strcpy(cUebergabe,cString) 上掷骰子,直到你真正从那个循环中中断时才会发生这种情况。您通过什么方式将一个空八位字节滑入您的输入流?
  • 在调试器中运行您的程序,以便您可以单步执行它并查看变量包含的内容。

标签: c eclipse mingw


【解决方案1】:

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

来自手册页:

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

所以只需在前面加一个空格:

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

另外请注意,您可以使用 memset 轻松地用零填充内存。所以你可以替换这个:

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

用这个:

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

甚至这个:

char cString[MAX] = {0};

【讨论】:

    猜你喜欢
    • 2018-03-02
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多