如何解决程序在 for 循环处停止
我正在试验 C 并尝试通过创建一个程序来习惯内存和字符串的内容,该程序以单词的形式接受 stdin、处理单词、将它们吐出并尝试更改单词的大小写.
然而,程序似乎不会执行除 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] = '\0';
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,key);
ind = 0;
memset(word,sizeof word);
putchar(ch);
putchar('\n');
}
}
}
解决方法
您的代码中存在多个问题:
-
ch
必须定义为类型int
才能正确检测EOF
。fgetc()
的返回值可以是字节值(unsigned char
类型的所有值)或特殊负值EOF
。转换为char
类型会丢失信息。 -
while (ch = getchar())
无法检测文件结尾,它仅测试从文件读取的字节是否为非零。你应该写while ((ch = getchar()) != EOF)
。 -
您没有为空终止符分配空间。更准确地说,在测试目标缓冲区的重新分配时,您应该允许 2 个额外的字节。
-
在重新分配数组时,您应该将
cap
增加 1 以上,以避免为您需要存储的每个额外字节重新分配。 -
int size = strlen(word);
可以替换为int size = ind;
。 -
char key[size];
不正确:您应该通过分配一个额外字节来允许空终止符。 -
isalnum()
、toupper()
、tolower()
和<ctype.h>
中的其他函数仅针对getchar()
返回的所有值定义。与EOF
不同的负参数值会导致未定义的行为,必须将char
参数强制转换为(unsigned char)
以避免在char
默认签名的架构上出现未定义的行为。 -
memset(word,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] = '\0';
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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。