在C语言中有运行时错误

在C语言中有运行时错误,c,algorithm,C,Algorithm,我和我的朋友通过从互联网上捕获算法为C编写了一个代码。我们的程序运行良好,但在某些情况下,我们的长代码会出现运行时错误。你能帮我把代码缩短一点吗? 此代码捕获带有大写和小写字母的名称,并将单词的第一个字母转换为大写,将其他字母转换为小写。首先,我们应该给出我们想要输入的名字的编号 #include <stdio.h> #include <ctype.h> int ch, i,n,tool[100]; int main() { int k, j , i;

我和我的朋友通过从互联网上捕获算法为C编写了一个代码。我们的程序运行良好,但在某些情况下,我们的长代码会出现运行时错误。你能帮我把代码缩短一点吗? 此代码捕获带有大写和小写字母的名称,并将单词的第一个字母转换为大写,将其他字母转换为小写。首先,我们应该给出我们想要输入的名字的编号

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

int ch, i,n,tool[100];
int main()
{
    int k, j , i;
    char sentence[100][100];
    scanf("%d",&n);
    for(k=0;k<n+1;k++) {
        for (i = 0; (sentence[k][i] = getchar()) != '\n'; i++) {
            ;
        }
        sentence[k][i] = '\0';
        tool[k]=i;
        ch=toupper(sentence[k][0]);
        sentence[k][0]=ch;
        for (j = 1; j < i; j++) {
            if(sentence[k][j-1]==' ')
                ch=toupper(sentence[k][j]);
            else
                ch=tolower(sentence[k][j]);
                sentence[k][j]=ch; 
        }
    }

    for(i=0;i<n+1;i++) {
        for(j=0;j<tool[i];j++) {
            ch=sentence[i][j];
            putchar(ch);
        }

        printf("\n");
    }

    return 0;
}
#包括
#包括
int ch,i,n,tool[100];
int main()
{
int k,j,i;
字句[100][100];
scanf(“%d”和“&n”);

对于(k=0;k,这里有一个可测量地更短的函数。并且以方便的函数形式:

#include <stdio.h>

/** convert string to sentence case.
*  returns string with initial cap and single i converted to uppercase.
*/
char *str2sentence (char *str)
{
    if (!str) return NULL;

    char *p = str;
    if ('a' <= *p && *p <= 'z')    /* convert first to upper */
        *p -= 32;
    p++;

    for ( ; *p; p++)    /* convert remaining to lower, except a single 'i' to upper 'I' */
    {
        if (*(p - 1) == 0x20 && *(p + 1) == 0x20)
        {
            if (*p == 'i')
                *p -= 32;
            else
                if ('A' <= *p && *p <= 'Z' && *p != 'I')
                    *p += 32;
        }
        else
            if ('A' <= *p && *p <= 'Z')
                *p += 32;
    }

    return str;
}

int main (void) {

    char *str = NULL;

    printf ("\n Enter a string to convert to sentence case ([enter] to quit)\n");

    while (printf ("\n  input : ") && scanf ("%m[^\n]%*c", &str) == 1)
        printf ("  result: %s\n", str2sentence (str));

    return 0;
}
你可以试试这个

#include<stdio.h> 
#include<stdlib.h>
#include<string.h>
main()
{
    char *array[100],*p;
    int i=0,j,n,k;
    scanf("%d",&n);
    for (n=n+1 ; n > 0 ; n--) { p=(char *)malloc(100);
            array[i++]=p;   
            for (k=0; (*p=getchar()) != '\n' && *p !=EOF ;p++, k++); *p='\0';       

            for ( p=p-k; *p !='\0'; p++) {  
                    if (isspace(*p) )
                            continue;
                    *p=toupper(*p); p++;
                    for( ; *p!=' ' && *p!='\0' ;p++ )
                            *p=tolower(*p);
                    if ( *p=='\0' ) p--;
            }
    }               

    for (j=0;  j<i ; j++)
            printf("%s\n",array[j]);
 } 
#包括
#包括
#包括
main()
{
字符*数组[100],*p;
int i=0,j,n,k;
scanf(“%d”和“&n”);
对于(n=n+1;n>0;n--){p=(char*)malloc(100);
数组[i++]=p;
对于(k=0;(*p=getchar())!='\n'&&&&&*p!=EOF;p++,k++);*p='\0';
对于(p=p-k;*p!='\0';p++){
如果(isspace(*p))
继续;
*p=toupper(*p);p++;
对于(;*p!=''&&*p!='\0';p++)
*p=耐受力(*p);
如果(*p=='\0')p--;
}
}               
对于(j=0;j试试这个.)

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
char *name,*backup_addr, **name_array;
int i,n,j;
main()
{
     char c;
    scanf("%d",&n);
    name_array=malloc(sizeof(char)*1000);
    for(i=0;i<n;i++)
    {
            name_array[i]=malloc(sizeof(char));
            backup_addr=name=malloc(sizeof(char*));
            while(isspace(c=getchar()));
            if(isalpha(c))
            {
                    *name++=toupper(c);
                    for(j=0;(isalpha(c=getchar()))!='\n'&&c!='\n';j++,name++)
                                            *name=tolower(c);
            }
            *name='\0';
            name=backup_addr;
            name_array[i]=name;
    }
    for(i=0;i<n;i++)
            printf("%s\n",name_array[i]);
}
#包括
#包括
#包括
字符*名称,*备份地址,**名称\数组;
int i,n,j;
main()
{
字符c;
scanf(“%d”和“&n”);
name_array=malloc(sizeof(char)*1000);

对于(i=0;i)程序失败的某些输入是什么?我不知道,因为我们必须将此代码上传到服务器中,它会对其进行测试并给我们评分,但它有一些测试用例存在运行时错误,因此它会降低我们的评分,并且不会说明哪些测试用例存在运行时错误(可能输入行超过100个字符?或者可能输入行超过100个?我认为他们的代码不超过100个字符。我必须缩短此代码,但输出相同。您能帮忙吗?非常感谢您的帮助。但我们不能在此代码中使用string.h。您能再次更改它吗?您可以将其用于我已经把它改成了ctype.h,它成功了。非常感谢Karthikeyan.R.S。我也是亚洲人。我们可以成为朋友吗?这里我们不能有友谊。请把我加入facebook。facebook.com/lordmh
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
char *name,*backup_addr, **name_array;
int i,n,j;
main()
{
     char c;
    scanf("%d",&n);
    name_array=malloc(sizeof(char)*1000);
    for(i=0;i<n;i++)
    {
            name_array[i]=malloc(sizeof(char));
            backup_addr=name=malloc(sizeof(char*));
            while(isspace(c=getchar()));
            if(isalpha(c))
            {
                    *name++=toupper(c);
                    for(j=0;(isalpha(c=getchar()))!='\n'&&c!='\n';j++,name++)
                                            *name=tolower(c);
            }
            *name='\0';
            name=backup_addr;
            name_array[i]=name;
    }
    for(i=0;i<n;i++)
            printf("%s\n",name_array[i]);
}