使用toupper函数的C程序的奇怪输出

使用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]

这里是我的程序,以大写字母输入所有从标准输入。但有些输出非常奇怪。例如,如果输入为“lorem ipsum”,输出为“lorem ipsum?”。如果输入为单个字符,如“m”,则输出为“MZ#X?”。“S?”和“Z#X?”不应该在这里,但它们会附加到输出中

为什么会发生这种情况

#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上不必要的处理操作。谢谢。真的很有帮助!谢谢。真的很有帮助!