使用toupper函数的C程序的奇怪输出
这里是我的程序,以大写字母输入所有从标准输入。但有些输出非常奇怪。例如,如果输入为“lorem ipsum”,输出为“lorem ipsum?”。如果输入为单个字符,如“m”,则输出为“MZ#X?”。“S?”和“Z#X?”不应该在这里,但它们会附加到输出中 为什么会发生这种情况使用toupper函数的C程序的奇怪输出,c,toupper,C,Toupper,这里是我的程序,以大写字母输入所有从标准输入。但有些输出非常奇怪。例如,如果输入为“lorem ipsum”,输出为“lorem ipsum?”。如果输入为单个字符,如“m”,则输出为“MZ#X?”。“S?”和“Z#X?”不应该在这里,但它们会附加到输出中 为什么会发生这种情况 #include <stdio.h> #include <ctype.h> int main(void){ char input; char upper[100]
#include <stdio.h>
#include <ctype.h>
int main(void){
char input;
char upper[100];
int count = 0;
while((input = getchar())){
if(input == '\n')
break;
if(input >= 'a' && input <= 'z')
input = toupper(input);
*(upper + count) = input;
count++;
}
printf("%s\n", upper);
return 0;
}
#包括
#包括
内部主(空){
字符输入;
上半焦[100];
整数计数=0;
而((input=getchar()){
如果(输入=='\n')
打破
如果(input>='a'&&input,您可能希望将数组中的所有元素设置为0(ASCII NUL),因为我们不知道上部的数组中是什么
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main(void){
char input;
char upper[100];
int count = 0;
memset(upper, 0, 100);
while((input = getchar())){
if(input == '\n')
break;
if(input >= 'a' && input <= 'z')
input = toupper(input);
*(upper + count) = input;
count++;
}
printf("%s\n", upper);
return 0;
}
#包括
#包括
#包括
内部主(空){
字符输入;
上半焦[100];
整数计数=0;
memset(上,0,100);
而((input=getchar()){
如果(输入=='\n')
打破
如果(input>='a'&&input='a'&&input,您可能希望将数组中的所有元素设置为0(ASCII NUL),因为我们不知道上部的数组中是什么
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main(void){
char input;
char upper[100];
int count = 0;
memset(upper, 0, 100);
while((input = getchar())){
if(input == '\n')
break;
if(input >= 'a' && input <= 'z')
input = toupper(input);
*(upper + count) = input;
count++;
}
printf("%s\n", upper);
return 0;
}
#包括
#包括
#包括
内部主(空){
字符输入;
上半焦[100];
整数计数=0;
memset(上,0,100);
而((input=getchar()){
如果(输入=='\n')
打破
如果(输入>='a'&&input='a'&&input您的代码对我有效。
唯一的一件事是,但这是意料之中的,您会在字符串后得到垃圾,因为您的char数组的长度为100。您应该在字符串的末尾放置一个0,以告诉printf您的字符串在那里结束。放置
*(upper + count) = 0;
就在printf之前。您的代码对我有效。
唯一的一件事是,但这是意料之中的,您会在字符串后得到垃圾,因为您的char数组的长度为100。您应该在字符串的末尾放置一个0,以告诉printf您的字符串在那里结束。放置
*(upper + count) = 0;
就在printf之前。您的代码有一些问题:
- 空终止符未添加到字符串的末尾
- 没有对超出已分配数组边界的索引进行任何检查
- 用户可以中断输入,而不用换行符使程序永远循环
- getchar返回一个int
您可以尝试以下修复:
#include <stdio.h>
#include <ctype.h>
const int MAX_CHAR = 101;
int main() {
int input;
char upper[MAX_CHAR];
int count = 0;
while( count < MAX_CHAR - 1 ) {
input = getchar();
if ( input == EOF || input == '\n' || input == '\r' )
break;
if ( input >= 'a' && input <= 'z' )
input = toupper(input);
upper[count] = input;
count++;
}
// add the null terminator
upper[count] = '\0';
printf("%s\n", upper);
return 0;
}
#包括
#包括
常量int MAX_CHAR=101;
int main(){
int输入;
字符上限[最大字符];
整数计数=0;
while(计数<最大字符数-1){
input=getchar();
如果(输入==EOF | |输入=='\n'| |输入=='\r')
打破
如果(输入>='a'&&input您的代码存在一些问题:
- 空终止符未添加到字符串的末尾
- 没有对超出已分配数组边界的索引进行任何检查
- 用户可以中断输入,而不用换行符使程序永远循环
- getchar返回一个int
您可以尝试以下修复:
#include <stdio.h>
#include <ctype.h>
const int MAX_CHAR = 101;
int main() {
int input;
char upper[MAX_CHAR];
int count = 0;
while( count < MAX_CHAR - 1 ) {
input = getchar();
if ( input == EOF || input == '\n' || input == '\r' )
break;
if ( input >= 'a' && input <= 'z' )
input = toupper(input);
upper[count] = input;
count++;
}
// add the null terminator
upper[count] = '\0';
printf("%s\n", upper);
return 0;
}
#包括
#包括
常量int MAX_CHAR=101;
int main(){
int输入;
字符上限[最大字符];
整数计数=0;
while(计数<最大字符数-1){
input=getchar();
如果(输入==EOF | |输入=='\n'| |输入=='\r')
打破
if(input>='a'&&input)您没有使用null终止字符串。C中的字符串需要一个结束标记才能正确打印。同样值得注意的是,在文件结尾返回EOF(如果在那里完成,则包括终端输入)。因此,没有换行符(例如,从带有单个非换行符终止字符串的文件重定向,或有人在终端键盘上按ctrlz/d)这将永远循环。不确定裁决者对此的要求有多严格,但您可能希望解决这一问题。您没有使用null终止字符串。C中的字符串需要一个结束标记才能正确打印。同样值得注意的是,在文件结尾返回EOF(如果在那里完成,则包括终端输入)。因此,没有换行符(例如,从带有单个非换行符终止字符串的文件重定向,或有人在终端键盘上按ctrlz/d)这将永远循环。不确定这一点的裁决人会有多严格,但您可能希望解决这一问题。实际使用或需要计数吗?是否有理由不使用upper[count]=0;
在while循环之后,而不是在只需要一个nullchar的内存区域上爆炸,并且您已经知道它所属的位置了?OP使用count来索引回上部的数组。
将这99个“0”字节卖掉,以获得丰厚的回报。其中一个工作得足够好;)@WhozCraig,我的想法完全正确。对那个评论+1。将所有内容设为空是没有意义的。这只是CPU上不必要的处理操作。实际使用或需要计数吗?有什么理由不使用upper[count]=0;
在while循环之后,而不是在只需要一个nullchar的内存区域上爆炸,并且您已经知道它所属的位置了?OP使用count来索引回上部的数组。
将这99个“0”字节卖掉,以获得丰厚的回报。其中一个工作得足够好;)@WhozCraig,我的想法完全正确。对那个评论+1。将所有内容设为空是没有意义的。这只是CPU上不必要的处理操作。谢谢。真的很有帮助!谢谢。真的很有帮助!