0

小文字の文を大文字に変換するプログラムを書いています。紐の長さも欲しいです。私は(両方の)配列とポインタでそれをやっています。プログラムは次のとおりです。

/* Program to convert the lower case sentence in upper case sentence and also calculate the length of the string */
#include<stdio.h>
main()
{
    char fac='a'-'A',ch[20],*ptr,a[20];int i=0,count=0;
    ptr=ch;

    /* Changing case and printing length by using pointers */
    printf("Enter the required string");
    gets(ptr);
    while(*ptr!='\0')
    {
        *ptr+=fac;   // LINE #1
        ptr++;
        count++;
    }
    puts(ptr);
    printf("%d",count);

    /* Changing case by using arrays */
    printf("Enter the required string");
    gets(ch);
    while(ch[i]!='\0')
    {
        ch[i]+=fac;
        i++;
    }
    puts(ch);
return 0;
}

このプログラムは、長さの出力 (ポインター部分) と大文字と小文字の変更 (配列部分) で完全に機能します。問題は、ポインターによる大文字と小文字の変換です。LINE#1 は、ポインター「ptr」に格納されている値を必要な数 ( 32 ) だけインクリメントするという印象を受けています。しかし、画面には何も起こっていません。なぜこうなった?助けてください。

4

3 に答える 3

2

ループ内の文字列の末尾まで ptr をインクリメントし、ptr を使用して文字列を出力します。これは文字列の末尾にあるため、何も得られません。puts(ch) に変更するとうまくいくと思います。そうそう-小文字から大文字への変換には+=ではなく-=が必要だと思います。

ところで、インクリメントする前に、文字が正しい入力範囲内にあることを確認したい場合があります。

于 2013-01-14T20:14:30.787 に答える
0

あなたのループを見てください:

while(*ptr!='\0')
{
    ...
    ptr++;
    ...
}
puts(ptr);

ptrその値がnulターミネータのアドレスになるまでインクリメントしました!つまり、印刷しているのは空の文字列だけです。

代わりにptr、ループの前のどこかにの初期値を格納します。

char *initial_ptr;
...
initial_ptr = ptr;
while(*ptr!='\0')
{
    ...
    ptr++;
    ...
}
puts(initial_ptr);
于 2013-01-14T20:26:09.873 に答える
0

ポインタはメモリアドレスを指しています。アドレス自体ではなく、アドレスの文字を読み取る必要があります。もちろん、ポインターを介して作成された char 変数の大文字と小文字を変更すると、メモリ内の実際の文字が変更されます。これが望ましくない場合は、temp char 配列または文字列を作成する必要があります。

于 2013-01-14T20:15:27.833 に答える