我正在编写使用 ASCII 将小写字符转换为大写字符的 C 函数,但输出不正确

I am writing C function that convert lowercase char to upper case char with using ASCII but Output is not correct

好的,所以我开始研究这个,我有下面的代码;

+我也有 strlen("any string here") func 那 return 任何 str 的 len 十进制只是记住你的想法。

我举一个情人的例子,假设 a,然后 a 将等于 ASCII 中的某个十进制数 table 然后我减去 32 得到 A。

遗憾的是这不起作用,对此有什么想法吗? 感谢您的所有帮助和宝贵时间!

int uppercase(char sent[]) {
    
 for(int i=0; i <= strlen(sent); ++i) {
        if(sent[i]>='a' && sent[i]<='z')
            sent[i] -= 32;
}
/*
Parsing the string, then making the letters to uppercase.
*/

#include <stdio.h>
#include <limits.h>



int strlen(char s[]){ //String length function
    int i;
    for (i = 0; s[i] != '[=10=]'; i++);
    return i;
}

void uppercase(char sent[]) {
    for(int i=0; i < strlen(sent); ++i) {
        if(sent[i]>='a' && sent[i]<='z')
            sent[i] += 32;
    }

 printf("%s", sent);
}

这是我全部作品的一个完整标签。当我尝试大写时(“你好世界”);它给我核心转储控制台问题。

该函数被声明为 return 类型 int 但 return 什么都没有。

int uppercase(char sent[]) {
    
 for(int i=0; i <= strlen(sent); ++i) {
        if(sent[i]>='a' && sent[i]<='z')
            sent[i] -= 32;

}

一般来说,对于处理字符串的函数,for 循环的条件至少应该类似于

 for(int i=0; i < strlen(sent); ++i) {

虽然最好把循环写成

 for( size_t i = 0, n = strlen(sent); i < n; ++i ) {

然而在函数uppercase中使用函数strlen并没有太大的意义。它的调用是多余的。

注意不能更改字符串字面量。任何更改字符串文字的尝试都会导致未定义的行为。

来自 C 标准(6.4.5 字符串文字)

7 It is unspecified whether these arrays are distinct provided their elements have the appropriate values. If the program attempts to modify such an array, the behavior is undefined.

另外最好不要使用幻数32

函数可以这样写,如下面的演示程序所示。

#include <stdio.h>

char * uppercase( char *s )
{
    for ( char *p = s; *p; ++p )
    {
        if ( 'a' <= *p && *p <= 'z' ) *p = *p & ~' ';
    }
    
    return s;
}

int main(void) 
{
    char s[] = "hello world!";
    
    puts( s );
    puts( uppercase( s ) );
    
    return 0;
}

程序输出为

hello world!
HELLO WORLD!

至于函数strlen那么最好给函数起个别的名字,因为它会和标准的C函数strlen冲突。而函数本身可以这样定义

size_t string_len( const char *s )
{
    const char *p = s;

    while ( *p ) ++p;

    return p - s;
}

这个会起作用:

#include <stdio.h>
#include <string.h>

void uppercase(char sent[]) {
    for (int i = 0; i < (int)strlen(sent); i++) {
        if (sent[i] >= 'a' && sent[i] <= 'z') {
            sent[i] -= 32;
        }
    }
}

int main(int argc, char* argv[]) {
    if (argc > 1){
        uppercase(argv[1]);
        puts(argv[1]);
    }

    return 0;
}

编译时没有任何错误和警告(使用 clang),即使有选项 -pedantic -Wall -Wextra.

这段代码可以帮到你

#include <stdio.h>
#include <string.h>

void uppercase(char T[],int k)
{
      int i=0;
      while(i<k)
      {
           if(T[i]>='a'&&T[i]<='z')
           {
                 T[i]=(char)((int)T[i]-32);
           }
         i++;
      }
      i=0;
      while(i<k)
      {
            printf("%c",T[i]);
            i++;
      }
      printf("\n");
}

int main()
{
      char T[]="good morning !";
      int k=sizeof(T);
      uppercase(T,k);
}