gpt4 book ai didi

打印字符串的 C 程序行为异常

转载 作者:太空宇宙 更新时间:2023-11-04 05:16:55 24 4
gpt4 key购买 nike

我只是用这个 c 程序练习。但它的行为真的很奇怪。

这个程序假设随机打印出a-zA-Z0-9,长度取决于用户。

考虑以下代码。

int main(){

srand( (unsigned)time( NULL ) );

int length , i ;
char alph[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

do{

printf("How many character do you want to print? >>");
scanf("%d" , &length );

char* user_length = (char*)malloc( length );

printf("Strlen - %d\n" , strlen( user_length ) );

for( i = 0 ; i < length ; i++ ){

*( user_length + i ) = alph[ rand()%strlen( alph ) ];
}

printf("\nString - %s\n" , user_length );
printf("strlen - %d\n\n" , strlen( user_length ) );

free( user_length );

}while( 1 );

return 0;
}

This is the result I get. (click to view)

唯一的问题是 user_length 不包含元素的“长度”数

我无法找出错误。有人可以帮我解决这个问题吗?

最佳答案

这是一个完全未定义的行为:

    char* user_length = (char*)malloc( length );
printf("Strlen - %d\n" , strlen( user_length ) );

你只需要分配一个可以由任意字符填充的数组(RAM中剩余的一些数据),并要求这个数组中字符串的长度,这相当于找到第一个空字符('\0')在数组中。

既然我解释了 strlen 搜索第一个空字符,您必须理解字符串总是以 '\0' 结束。当您填写 user_length 字符数组时,您必须在末尾放置 '\0' 或简单地放置 0 以使其成为合法的字符串。

另外,user_length 是一个糟糕的字符串名称,人们会期望一个数字对应于某个长度。考虑到所有这些,我会这样做的:

int main(){

srand( time( NULL ) );

int length , i ;
char alph[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
int alph_length = strlen( alph );

do{
printf("How many character do you want to print? >>");
int num_scanned = scanf("%d" , &length );

if(num_scanned!=1 || length<=0 || length>alph_length) // if the user put some shit, exit
return -1;


char* user_string = (char*)malloc( length+1 );

for( i = 0 ; i < length ; i++ ){
user_string[i] = alph[ rand()%alph_length ];
}
user_string[length] = '\0';

printf("string - %s\n"
"strlen - %zu\n\n" , user_string, strlen( user_string ) );

free( user_string );

}while( 1 );

return 0;
}

请注意,我更正了其他多项内容;-)

关于打印字符串的 C 程序行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41266629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com