C 如何修复我的代码,将字符串大小减少到“0”;“有效尺寸”;

C 如何修复我的代码,将字符串大小减少到“0”;“有效尺寸”;,c,scanf,fgets,c-strings,strlen,C,Scanf,Fgets,C Strings,Strlen,我想做一个代码,读取一个字符串,然后把这个字符串转换成一个新的字符串,长度等于原始字符串的有效长度,也就是说 old string = stringi new string = stringii newstring[strlen(stringi)+1] (where +1 is for the terminator '\0' 我对两个字符串(字符串1和字符串2)执行此操作,最后打印‍strlen(string1),strlen(string2),并打印string11和str

我想做一个代码,读取一个字符串,然后把这个字符串转换成一个新的字符串,长度等于原始字符串的有效长度,也就是说

old string = stringi      

new string = stringii

newstring[strlen(stringi)+1]  (where +1 is for the terminator '\0'
我对两个字符串(字符串1和字符串2)执行此操作,最后打印‍
strlen(string1)
strlen(string2)
,并打印string11和
string22
(以查看其是否工作)

嗯,有什么问题吗?程序编译正确

但如果我为字符串1键入“sugar”,为字符串2键入“sugara”,它将返回: 糖 苏格拉

或者,如果我键入batata和cenoura,它将返回: 巴塔塔' 塞诺拉

或者,如果我键入cenoura和batata,它将返回: 塞诺拉 巴塔塔'

我不知道这个问题的动机是什么。如果有人能帮我搜索代码中的bug(或者建议另一种解决问题的方法)

#包括
#包括
#包括
int main()
{
//这里我创建了两个大小为100的字符串
字符string1[100],string2[100];
//在这里,我要求用户键入两个短语,并使用gets存储它们
printf(“键入两个短语):\n”);
获取(string1);
获取(string2);
//在这里,我创建了两个新字符串,其大小由strlen(stringi)+1给出
字符串11[strlen(string1)+1];
字符串22[strlen(string2)+1];
//对于字符串1,我将原始字符串的所有值分配给新字符串,直到“\0”
对于(int i=0;string1[i]!='\0';i++)
{
string11[i]=string1[i];
}
//这里我用终止符表示新字符串的最后一个位置
string11[strlen(string1)+1]='\0';
//我对字符串2也这样做
对于(int i=0;string2[i]!='\0';i++)
{
string22[i]=string2[i];
}
string22[strlen(string2)+1]='\0';
//我打印原始字符串和新字符串的长度
printf(“长度字符串1=%d长度字符串2=%d\n”、strlen(string1)、strlen(string2));
printf(“%s\n%s\n”,string11,string22);
系统(“暂停”);
返回0;
}
这些语句

string11[strlen(string1)+1] = '\0';
tring22 [strlen(string2)+1] = '\0';
你错了

你必须写作

string11[strlen(string1)] = '\0';
tring22 [strlen(string2)] = '\0';
printf("length string 1 = %zu  length string 2 = %zu\n", strlen(string1), strlen(string2));
这个电话也错了

printf("length string 1 = %d  length string 2 = %d\n", strlen(string1), strlen(string2));
你必须写作

string11[strlen(string1)] = '\0';
tring22 [strlen(string2)] = '\0';
printf("length string 1 = %zu  length string 2 = %zu\n", strlen(string1), strlen(string2));
请注意,函数
get
不再是标准的C函数。改用
fgets

比如说

fgets( string1, sizeof( string1 ), stdin );
string1[ strcspn( string1, "\n" ) ] = '\0';
这些声明

string11[strlen(string1)+1] = '\0';
tring22 [strlen(string2)+1] = '\0';
你错了

你必须写作

string11[strlen(string1)] = '\0';
tring22 [strlen(string2)] = '\0';
printf("length string 1 = %zu  length string 2 = %zu\n", strlen(string1), strlen(string2));
这个电话也错了

printf("length string 1 = %d  length string 2 = %d\n", strlen(string1), strlen(string2));
你必须写作

string11[strlen(string1)] = '\0';
tring22 [strlen(string2)] = '\0';
printf("length string 1 = %zu  length string 2 = %zu\n", strlen(string1), strlen(string2));
请注意,函数
get
不再是标准的C函数。改用
fgets

比如说

fgets( string1, sizeof( string1 ), stdin );
string1[ strcspn( string1, "\n" ) ] = '\0';

您好,在表长度初始化时,您不需要用1递增

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    //Here I create two strings with size 100
    char string1[100], string2[100];
    //Here I ask for the user to type two phrases and store them using         gets
    printf("Type two phrases):\n");
    gets(string1);
    gets(string2);
    //Here I create two new strings with size given by strlen(stringi)+1
    char string11[strlen(string1)];
    char string22[strlen(string2)];
    //For string 1, I atrribute all the values of the original string to the new string, until '\0'
    for (int i = 0; string1[i] != '\0'; i++)
    {
        string11[i] = string1[i];
    }
    //Here I denote the last position of the new string with the terminator
    string11[strlen(string1)] = '\0';
    //I do the same for string 2
    for (int i = 0; string2[i] != '\0'; i++)
    {
        string22[i] = string2[i];
    }
    string22 [strlen(string2)] = '\0';
    //I print the length of the original strings and the new strings
    printf("length string 1 = %d  length string 2 = %d\n", strlen(string1), strlen(string2));
    printf("%s\n%s\n", string11, string22);

    system("pause");
    return 0;
}
#包括
#包括
#包括
int main(){
//这里我创建了两个大小为100的字符串
字符string1[100],string2[100];
//在这里,我要求用户键入两个短语,并使用gets存储它们
printf(“键入两个短语):\n”);
获取(string1);
获取(string2);
//在这里,我创建了两个新字符串,其大小由strlen(stringi)+1给出
字符串11[strlen(string1)];
char string22[strlen(string2)];
//对于字符串1,我将原始字符串的所有值分配给新字符串,直到“\0”
对于(int i=0;string1[i]!='\0';i++)
{
string11[i]=string1[i];
}
//这里我用终止符表示新字符串的最后一个位置
string11[strlen(string1)]='\0';
//我对字符串2也这样做
对于(int i=0;string2[i]!='\0';i++)
{
string22[i]=string2[i];
}
string22[strlen(string2)]='\0';
//我打印原始字符串和新字符串的长度
printf(“长度字符串1=%d长度字符串2=%d\n”、strlen(string1)、strlen(string2));
printf(“%s\n%s\n”,string11,string22);
系统(“暂停”);
返回0;
}

祝您好运。

您好,在表格长度初始化时,您不需要用1递增

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    //Here I create two strings with size 100
    char string1[100], string2[100];
    //Here I ask for the user to type two phrases and store them using         gets
    printf("Type two phrases):\n");
    gets(string1);
    gets(string2);
    //Here I create two new strings with size given by strlen(stringi)+1
    char string11[strlen(string1)];
    char string22[strlen(string2)];
    //For string 1, I atrribute all the values of the original string to the new string, until '\0'
    for (int i = 0; string1[i] != '\0'; i++)
    {
        string11[i] = string1[i];
    }
    //Here I denote the last position of the new string with the terminator
    string11[strlen(string1)] = '\0';
    //I do the same for string 2
    for (int i = 0; string2[i] != '\0'; i++)
    {
        string22[i] = string2[i];
    }
    string22 [strlen(string2)] = '\0';
    //I print the length of the original strings and the new strings
    printf("length string 1 = %d  length string 2 = %d\n", strlen(string1), strlen(string2));
    printf("%s\n%s\n", string11, string22);

    system("pause");
    return 0;
}
#包括
#包括
#包括
int main(){
//这里我创建了两个大小为100的字符串
字符string1[100],string2[100];
//在这里,我要求用户键入两个短语,并使用gets存储它们
printf(“键入两个短语):\n”);
获取(string1);
获取(string2);
//在这里,我创建了两个新字符串,其大小由strlen(stringi)+1给出
字符串11[strlen(string1)];
char string22[strlen(string2)];
//对于字符串1,我将原始字符串的所有值分配给新字符串,直到“\0”
对于(int i=0;string1[i]!='\0';i++)
{
string11[i]=string1[i];
}
//这里我用终止符表示新字符串的最后一个位置
string11[strlen(string1)]='\0';
//我对字符串2也这样做
对于(int i=0;string2[i]!='\0';i++)
{
string22[i]=string2[i];
}
string22[strlen(string2)]='\0';
//我打印原始字符串和新字符串的长度
printf(“长度字符串1=%d长度字符串2=%d\n”、strlen(string1)、strlen(string2));
printf(“%s\n%s\n”,string11,string22);
系统(“暂停”);
返回0;
}

祝你好运。

你把字符串终止符写错了位置,一个接一个。它应该是
string11[strlen(string1)]='\0'那么问题是什么?我没有阅读完整的问题,但基本上您希望按照字符串的原始长度存储字符串。好好使用。你把字符串终止符写错了位置,一个接一个。它应该是
string11[strlen(string1)]='\0'那么问题是什么?我没有阅读完整的问题,但基本上您希望按照字符串的原始长度存储字符串。很好用。非常感谢,它起作用了!但老实说,我不明白它的逻辑。如果strlen返回“\0”之前的组件数,那么我将使用strlen(原始字符串)+1个组件创建一个新字符串。但是为什么在复制时,我要将属性“\0”复制到strlen'th组件,而不是组件