c - 如果包含数字,如何使整个字符串大写?

c - How to make whole string uppercase, if it contains numbers?

所以我需要将字符串设为大写 ​​+ 从中删除空格。但是它不起作用,如果字符串包含数字,最终打印将打印一些非 ascii 字符。我应该如何让它工作?我试着用函数 isalpha()isdigit() 来做,但结果是一样的。

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

int main(){
    int i = 0;
    char c[100];
    char str[] = "Hello8 world";

    while(str[i]){
        if (str[i]!=' '){
            if (str[i] >= '0' && str[i] <= '9'){
                c[i]=str[i];
            }
            else{
                c[i]=(toupper(str[i]));
            }
        i++;
        }
   }
   printf("%s", c);

   return(0);
}

while循环之后,添加c[i] = '[=11=]';.

这会将字符数组转换为字符串(根据定义,字符串必须以 [=12=] 作为终止符)。

这里有几处错误。首先,你只在if语句中推进i,所以一旦遇到space,你的问题就会陷入死循环。 其次,您假设源字符串和目标字符串中的索引相同——这是不正确的,因为您跳过了 spaces。这将导致目标字符串保留未初始化的内存——在某些平台上可能是 [=13=],而在其他平台上可能只是随机垃圾。相反,您应该维护两个索引计数器,一个用于源,一个用于目标,并在完成后在目标末尾显式设置 [=13=]

int i = 0;
int j = 0; /* Target string index */
char c[100];
char str[] = "Hello8 world";

while(str[i]){
    if (str[i]!=' '){ 
        if (str[i] >= '0' && str[i] <= '9'){
            c[i]=str[i];
        }
        else{
            c[j]=(toupper(str[i]));
        }
        j++; /* Target index advance only when it's used */
    }
    i++; /* Source index advanced regardless */
}
c[j] = '[=10=]'; /* Handle the string termination */
printf("%s\n", c);

为什么不使用 for 循环,像这样:

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

#define MAXCHAR 100

int
main(void) {
    char str[] = "Hello8 world";
    char upper[MAXCHAR];
    int str_pos = 0, i;

    for (i = 0; str[i]; i++) {
        if (!isspace(str[i])) {
            upper[str_pos++] = toupper(str[i]);
        }
    }
    upper[str_pos] = '[=10=]';

    printf("%s\n", upper);

    return 0;
}

1-您不需要创建另一个字符串。 2-toupper() 函数不会将数字转换为其他内容。 3-如果您找到 space,您只需要拉动其余的字符串即可。

int i = 0, j;
char str[] = "Hello8 world";

while(str[i]!='[=10=]')
{
    if(str[i]==' ')
    {   
        for(j=i;str[j]!='[=10=]';j++)
        {
            str[j]=str[j+1];
        }
    }
    else
    {
        str[i]=toupper(str[i]);
        i++;
    }

}

printf("%s\n", str);

return 0;