c - 如果包含数字,如何使整个字符串大写?
c - How to make whole string uppercase, if it contains numbers?
所以我需要将字符串设为大写 + 从中删除空格。但是它不起作用,如果字符串包含数字,最终打印将打印一些非 ascii 字符。我应该如何让它工作?我试着用函数 isalpha()
和 isdigit()
来做,但结果是一样的。
#include <stdio.h>
#include <ctype.h>
int main(){
int i = 0;
char c[100];
char str[] = "Hello8 world";
while(str[i]){
if (str[i]!=' '){
if (str[i] >= '0' && str[i] <= '9'){
c[i]=str[i];
}
else{
c[i]=(toupper(str[i]));
}
i++;
}
}
printf("%s", c);
return(0);
}
在while
循环之后,添加c[i] = '[=11=]';
.
这会将字符数组转换为字符串(根据定义,字符串必须以 [=12=]
作为终止符)。
这里有几处错误。首先,你只在if
语句中推进i
,所以一旦遇到space,你的问题就会陷入死循环。
其次,您假设源字符串和目标字符串中的索引相同——这是不正确的,因为您跳过了 spaces。这将导致目标字符串保留未初始化的内存——在某些平台上可能是 [=13=]
,而在其他平台上可能只是随机垃圾。相反,您应该维护两个索引计数器,一个用于源,一个用于目标,并在完成后在目标末尾显式设置 [=13=]
:
int i = 0;
int j = 0; /* Target string index */
char c[100];
char str[] = "Hello8 world";
while(str[i]){
if (str[i]!=' '){
if (str[i] >= '0' && str[i] <= '9'){
c[i]=str[i];
}
else{
c[j]=(toupper(str[i]));
}
j++; /* Target index advance only when it's used */
}
i++; /* Source index advanced regardless */
}
c[j] = '[=10=]'; /* Handle the string termination */
printf("%s\n", c);
为什么不使用 for 循环,像这样:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAXCHAR 100
int
main(void) {
char str[] = "Hello8 world";
char upper[MAXCHAR];
int str_pos = 0, i;
for (i = 0; str[i]; i++) {
if (!isspace(str[i])) {
upper[str_pos++] = toupper(str[i]);
}
}
upper[str_pos] = '[=10=]';
printf("%s\n", upper);
return 0;
}
1-您不需要创建另一个字符串。
2-toupper() 函数不会将数字转换为其他内容。
3-如果您找到 space,您只需要拉动其余的字符串即可。
int i = 0, j;
char str[] = "Hello8 world";
while(str[i]!='[=10=]')
{
if(str[i]==' ')
{
for(j=i;str[j]!='[=10=]';j++)
{
str[j]=str[j+1];
}
}
else
{
str[i]=toupper(str[i]);
i++;
}
}
printf("%s\n", str);
return 0;
所以我需要将字符串设为大写 + 从中删除空格。但是它不起作用,如果字符串包含数字,最终打印将打印一些非 ascii 字符。我应该如何让它工作?我试着用函数 isalpha()
和 isdigit()
来做,但结果是一样的。
#include <stdio.h>
#include <ctype.h>
int main(){
int i = 0;
char c[100];
char str[] = "Hello8 world";
while(str[i]){
if (str[i]!=' '){
if (str[i] >= '0' && str[i] <= '9'){
c[i]=str[i];
}
else{
c[i]=(toupper(str[i]));
}
i++;
}
}
printf("%s", c);
return(0);
}
在while
循环之后,添加c[i] = '[=11=]';
.
这会将字符数组转换为字符串(根据定义,字符串必须以 [=12=]
作为终止符)。
这里有几处错误。首先,你只在if
语句中推进i
,所以一旦遇到space,你的问题就会陷入死循环。
其次,您假设源字符串和目标字符串中的索引相同——这是不正确的,因为您跳过了 spaces。这将导致目标字符串保留未初始化的内存——在某些平台上可能是 [=13=]
,而在其他平台上可能只是随机垃圾。相反,您应该维护两个索引计数器,一个用于源,一个用于目标,并在完成后在目标末尾显式设置 [=13=]
:
int i = 0;
int j = 0; /* Target string index */
char c[100];
char str[] = "Hello8 world";
while(str[i]){
if (str[i]!=' '){
if (str[i] >= '0' && str[i] <= '9'){
c[i]=str[i];
}
else{
c[j]=(toupper(str[i]));
}
j++; /* Target index advance only when it's used */
}
i++; /* Source index advanced regardless */
}
c[j] = '[=10=]'; /* Handle the string termination */
printf("%s\n", c);
为什么不使用 for 循环,像这样:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAXCHAR 100
int
main(void) {
char str[] = "Hello8 world";
char upper[MAXCHAR];
int str_pos = 0, i;
for (i = 0; str[i]; i++) {
if (!isspace(str[i])) {
upper[str_pos++] = toupper(str[i]);
}
}
upper[str_pos] = '[=10=]';
printf("%s\n", upper);
return 0;
}
1-您不需要创建另一个字符串。 2-toupper() 函数不会将数字转换为其他内容。 3-如果您找到 space,您只需要拉动其余的字符串即可。
int i = 0, j;
char str[] = "Hello8 world";
while(str[i]!='[=10=]')
{
if(str[i]==' ')
{
for(j=i;str[j]!='[=10=]';j++)
{
str[j]=str[j+1];
}
}
else
{
str[i]=toupper(str[i]);
i++;
}
}
printf("%s\n", str);
return 0;