程序在 for 循环处停止

Program stops at for loop

我正在尝试使用 C 并尝试通过创建一个程序来适应内存和字符串的东西,该程序以单词的形式获取标准输入,处理单词,将它们吐出并尝试更改单词的大写和小写。

但是,程序似乎没有执行超出 strcpy(key, word) 的任何内容。它在 for 循环处停止,循环后甚至不执行打印语句。

到目前为止,我已经尝试了 while 循环和 for 循环来改变大小写。我通过在 for 循环上方的行上打印它来确保正确复制了密钥。我什至注释掉 for 循环并看到 tolower() 调用两行有效并打印出更新的密钥。 for 循环有点问题,我不知道是什么。

我该如何修复它?

int main(void)
{
    char ch; 
    char *word;
    word = (char *)malloc(60 * sizeof(char)); 
    int ind = 0; 
    int cap = 60; 
    while (ch = getchar()) { 
        if (isalnum(ch)) {
            if (ind >= cap) {
                word = (char *)realloc(word, (ind + 1) * sizeof(char));
                cap++; 
            }
            word[ind] = ch; 
            ind++; 
        } else {
            word[ind] = '[=10=]'; 
            int size = strlen(word); 
            char key[size]; 
            strcpy(key, word); 
            for (int i = 0; i < size; i++) {
                if (i = 0) {
                    key[i] = toupper(key[i]);
                } else {
                    key[i] = tolower(key[i]);
                }
            }
            fprintf(stdout, "%s\n", key);
            key[0] = tolower(key[0]);
            fprintf(stdout, "%s\n", key);
            ind = 0; 
            memset(word, 0, sizeof word);
            putchar(ch); 
            putchar('\n');
        }
    }
}

您的代码中存在多个问题:

  • ch 必须定义为 int 类型才能正确检测 EOFfgetc() 的 return 值可以是字节值(所有 unsigned char 类型的值)或特殊的负值 EOF。转换为类型 char 会丢失信息。

  • while (ch = getchar()) 无法检测文件结尾,它只检测从文件读取的字节是否为非零。你应该写 while ((ch = getchar()) != EOF).

  • 您没有为空终止符分配 space。更准确地说,在测试目标缓冲区的重新分配时,您应该允许 2 个额外的字节。

  • 重新分配数组时,应将 cap 增加 1 以上,以避免为需要存储的每个额外字节重新分配。

  • int size = strlen(word);可以换成int size = ind;.

  • char key[size]; 不正确:您应该通过分配一个额外的字节来允许空终止符。

  • isalnum()toupper()tolower()<ctype.h> 中的其他函数仅针对所有值 return 定义getchar()。不同于 EOF 的负参数值会导致未定义的行为,必须将 char 参数强制转换为 (unsigned char) 以避免在默认情况下签署 char 的体系结构上出现未定义的行为。

  • memset(word, 0, sizeof word);没用

  • 您没有测试分配失败。

  • 你永远没有自由word

这是修改后的版本:

#include <ctype.h>
#include <stdio.h>

int main(void) {
    int ch; 
    int ind = 0; 
    int cap = 60;
    char *word = malloc(60); 

    if (word == NULL) {
        fprintf(stderr, "allocation failure\n");
        return 1;
    }
    while ((ch = getchar()) != EOF) { 
        if (isalnum(ch)) {
            if (ind >= cap) {
                cap += cap / 2;
                word = realloc(word, cap);
                if (word == NULL) {
                    fprintf(stderr, "allocation failure\n");
                    return 1;
                }
            }
            word[ind] = ch; 
            ind++; 
        } else {
            word[ind] = '[=10=]'; 
            char key[ind]; 
            strcpy(key, word);
            if (ind > 0) {
                key[0] = toupper((unsigned char)key[0]);
                for (int i = 1; i < ind; i++) {
                    key[i] = tolower((unsigned char)key[i]);
                }
            }
            printf("%s\n", key);
            key[0] = tolower((unsigned char)key[0]);
            printf("%s\n", key);
            ind = 0;
            putchar(ch); 
            putchar('\n');
        }
    }
    free(word);
    return 0;
}