程序在 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
类型才能正确检测 EOF
。 fgetc()
的 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;
}
我正在尝试使用 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
类型才能正确检测EOF
。fgetc()
的 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;
}