0

コードの何が問題なのか知りたいです。ユーザーが指定した 2 つの単語を交換することになっていますが、何もしません。少しの助けがいいでしょう。

#include <stdio.h>

void changeW(char *ptab1, char *ptab2){
char tmp;
tmp = *ptab1;
*ptab1 = *ptab2;
*ptab2 = tmp;
printf("%s %s",ptab1,ptab2);
return;
}
int main(void) {

char tab1[25];
char tab2[25];

printf("type two words");
scanf("%s %s",tab1,tab2);
changeW(tab1,tab2);
return 0;
}

コードを修正しましたが、まだ問題があります! 小さな単語を入れ替えることはできますが、単語が長くなると、端末に ���� などの変な文字が表示されます。

void changeW(char *ptab1, char *ptab2){
int l;
if(length(ptab1)<length(ptab2)){
l = length(ptab2);
}
else {l=length(ptab1);}
for(int i=0; i<l;i++){
char tmp;
tmp =ptab1[i];
ptab1[i] =ptab2[i];
ptab2[i]=tmp;
}
printf("%s %s",ptab1,ptab2);
return;
}
int main(void) {

char tab1[25];
char tab2[25];

printf("type two words");
scanf("%s %s",tab1,tab2);
changeW(tab1,tab2);
return 0;
}

わかりました、解決策を見つけました。ご協力いただきありがとうございます。あなたがしなければならないのは、changeWで、

printf("%s\t%s",ptab1,ptab2);

単一のスペースでは両方の単語を区切るのに十分ではないようです。タブで十分です。

最終編集 : 実際、tab1 と tab2 は両方とも 25 文字の長さであるため、最も長いテーブルを検索しても意味がありません。

for(int i=0; i<25;i++)

正常に動作します。

4

2 に答える 2

1

最初の 2 文字を入れ替えているだけです。文字列を交換するには、ループを使用する必要があります。

#include <stdlib.h>
#include <string.h>

void changeW(char *p1, char *p2, size_t p1_len)
{
    char *tmp = malloc (p1_len); /* or [C99] char tmp[p1_len]; */
    strcpy (tmp, p1);
    strcpy (p1, p2);
    strcpy (p2, tmp);
}

別の可能性は、ポインターを交換することです。

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

void swap_strings(char **p1, char **p2)
{
    char *tmp = *p1;
    *p1 = *p2;
    *p2 = tmp;
}

int main (void)
{
    char s1[] = "hello";
    char s2[] = "word";

    char *p1 = s1;
    char *p2 = s2;

    puts(p1);
    puts(p2);

    swap_strings(&p1, &p2);

    puts(p1);
    puts(p2);

    return 0;
}
于 2012-12-16T10:39:18.963 に答える
0
void changeW(char *ptab1, char *ptab2)
{
    size_t l1 = strlen(ptab1), l2 = strlen(ptab2);
    size_t l = l1 > l2 ? l1 : l2;
    size_t i;
    for (i = 0; i <= l; i++) {
        char tmp = ptab1[i];
        ptab1[i] = ptab2[i];
        ptab2[i] = tmp;
    }
}

一時バッファ変数なしで 2 つの単語を交換するには、ちょっとしたトリックを行う必要があります。

void changeW(char *ptab1, char *ptab2)
{
    size_t l1 = strlen(ptab1), l2 = strlen(ptab2);
    size_t l = l1 > l2 ? l1 : l2;
    size_t i;
    for (i = 0; i <= l; i++) {
        ptab1[i] ^= ptab2[i];
        ptab2[i] ^= ptab1[i];
        ptab1[i] ^= ptab2[i];
    }
}

演算子は、ビットごとの^XOR ブール演算です。

0^0=0
0^1=1
1^0=1
1^1=0

これを機能させるトリックは、(a^b) ^ a=band b^(a^b)=afor any aandbです。したがって、交換部分は次のとおりです。

new_p2 = p2 ^ (p1 ^ p2) = p1
new_p1 = (p1 ^ p2) ^ new_p2 = (p1 ^ p2) ^ p1 = p2
于 2012-12-16T10:56:17.803 に答える