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

时间:2016-10-29 11:38:40

标签: c string c-strings

所以我需要创建一个字符串大写+从中删除空格。然而它不起作用,如果字符串包含数字,最后的打印将打印一些非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);
}

4 个答案:

答案 0 :(得分:2)

这里有几个问题。首先,您只需在i语句中前进if,因此一旦遇到空格,您的问题就会陷入一个endlees循环中。 其次,您假设源和目标字符串中的索引是相同的 - 这不是真的,因为您正在跳过空格。这将导致目标字符串保持单元化内存 - 在某些平台上可能是\0,而在其他平台上可能只是随机垃圾。相反,您应该维护两个索引计数器,一个用于源,一个用于目标,并在您完成时在目标末尾显式设置\0

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] = '\0'; /* Handle the string termination */
printf("%s\n", c);

答案 1 :(得分:1)

1 - 您不需要创建另一个字符串。 2-toupper()函数不会将数字转换为其他内容。 3 - 如果你找到一个空间,你只需要拉出其余部分。

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

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

}

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

return 0;

答案 2 :(得分:0)

while循环后,添加c[i] = '\0';

这会将字符数组转换为字符串(根据定义,它必须以\0作为终结符。)

答案 3 :(得分:0)

为什么不使用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] = '\0';

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

    return 0;
}