gpt4 book ai didi

c - 如何在C中将字符附加到字符串数组

转载 作者:行者123 更新时间:2023-11-30 18:15:57 27 4
gpt4 key购买 nike

我对 C 非常陌生,我正在尝试编写一个程序来检查字符串是否包含大写字母,如果包含,则将其打印出来。我正在使用https://www.onlinegdb.com/online_c_compiler#作为我的编译器(因为我现在无法访问我的个人计算机),经过测试运行后,结果是(ps我知道 gets 不安全):

main.c:16:5: warning: ‘gets’ is deprecated [-Wdeprecated-declarations]
/usr/include/stdio.h:638:14: note: declared here
main.c:(.text+0x26): warning: the `gets' function is dangerous and should not be used.
sTrInG
Contains Uppercase!
Uppercase Letters:0

...Program finished with exit code 0
Press ENTER to exit console.

在这种情况下,我期望输出如下:

Contains Uppercase!
Uppercase Letters: TIG

我的脚本:

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

int main()
{
char str[100];
gets(str);
int containsUpper = 0;
char upperLetters[100] = {0};
for (int i=0; i < strlen(str); i++) {
if (islower(str[i])) {
continue;
} else {
containsUpper = 1;
upperLetters[i] = str[i]; // is this the bad line?
}
}
if (containsUpper) {
printf("Contains Uppercase!\n");
printf("Uppercase Letters:");
printf("%zu\n", strlen(upperLetters)); // prints 0 so upperLetters is empty..?
for (int i=0; i < strlen(upperLetters); i++) {
printf("%c", upperLetters[i]);
}
} else {
printf("Does not contain Uppercase!");
}
return 0;
}

最佳答案

这个循环

for (int i=0; i < strlen(str); i++) {
if (islower(str[i])) {
continue;
} else {
containsUpper = 1;
upperLetters[i] = str[i]; // is this the bad line?
}
}

1) 不正确,2) 编程风格不好。

您应该将大写字母附加到字符数组upperLetters
始终如一地认为你没有做。此外,如果字符不是小写字符,并不意味着该字符是大写字符。例如,一般来说它可以是数字或标点符号。

也无需调用函数strlen。函数调用的参数应转换为 unsigned char。否则,函数的调用可能会引发未定义的行为。

循环中带有 continue 语句的部分是多余的。

循环可以如下所示:

for ( size_t i = 0, j = 0; str[i] != '\0'; i++ ) 
{
if ( isupper( ( unsigned char )str[i] ) )
{
upperLetters[j++] = str[i];
}
}

containsUpper = upperLetters[0] != '\0';

如果您需要程序其他部分中大写字母的数量,则循环可以如下所示

size_t n = 0;
for ( size_t i = 0; str[i] != '\0'; i++ )
{
if ( isupper( ( unsigned char )str[i] ) )
{
upperLetters[n++] = str[i];
}
}

if ( n )
{
printf( "Contains Uppercase!\n" );
printf( "Uppercase Letters: " );
printf("%zu\n", n );
for ( size_t i = 0; i < n; i++ )
{
printf( "%c", upperLetters[i] );
}
//…

或者代替循环

    for ( size_t i = 0; i < n; i++ ) 
{
printf( "%c", upperLetters[i] );
}

你可以直接写

printf( "%s\n", upperLetters );

因为数组是零初始化的,因此它包含一个字符串。

正如编译器报告的那样,函数 gets 是不安全的,并且不受 C 标准支持。请改用函数 fgets

例如

fgets( str, sizeof( str ), stdin );

关于c - 如何在C中将字符附加到字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59648189/

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