用于循环不终止与Null终结符

时间:2018-04-12 12:29:43

标签: c arrays string

我正在处理机器问题,并且负责输入'n'数组,然后我必须“合并排序”。

然而,当我执行并输入单词时,它不会停在'nth'字处,并且即使我使用空终止符也会要求我输入更多字符。 / p>

非常感谢任何帮助。

export LC_ALL=C

2 个答案:

答案 0 :(得分:1)

由于输入空字符对于最终用户来说可能很棘手,我建议您更改行以检查其他字符,如转义字符或 ESC 键,其值为27,并且更容易型

while (check != 27 && y < 16)

答案 1 :(得分:0)

您无法通过键盘输入'\0'个字符,该字符与值00x0相同。因此,你的循环不会以这种方式终止。

通常,当通过键盘输入时,您将通过按“enter”来终止单个字符串,然后由新行字符'\n'表示。 您可以进一步增强程序,一旦输入“空”字,即停止扫描单词,即单词的长度为0。 请参阅以下程序,该程序使用fgets读取字符串,直到下一个新行字符+用于删除新行字符本身的公共代码:

void get_words(int n, char words[][16])
{
    for(int x = 0; x < n; x++)
    {
        if (fgets(words[x],16,stdin)){
            words[x][strcspn(words[x],"\n")] = '\0';  // remove new line (if any)
        }
        else{
            words[x][0] = '\0';  // othwise, set it to an empty string
            break;
        }
        if (words[x][0] == '\0')  // empty string entered (or end-of-file reached)
            break;
    }

}

void print_words(int n, char words[][16])
{
    for(int x=0; x < n && words[x][0] != '\0'; x++)  {
        printf("%s\n",words[x]);
    }
}

int main()
{
    int n;

    printf("\n");

    printf("Input n: ");
    scanf("%d\n", &n);
    n += 1;

    char words[n][16];

    get_words(n, words);

    print_words(n, words);

    printf("\n");
}

进一步注意,initialize - 函数不会终止字符串;一旦您访问字符串然后使用printf

,这将导致未定义的行为

建议:

void initialize(int n, char words[][16])
{  
    for (int x=0; x < n; x++)
    {
        for(int y=0; y < 16; y++)
        {
            words[x][y] = ' ';
        }
        words[x][16-1] = '\0';
    }
}