所以我需要创建一个字符串大写+从中删除空格。然而它不起作用,如果字符串包含数字,最后的打印将打印一些非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);
}
答案 0 :(得分:2)
这里有几个问题。首先,您只需在i
语句中前进if
,因此一旦遇到空格,您的问题就会陷入一个endlees循环中。
其次,您假设源和目标字符串中的索引是相同的 - 这不是真的,因为您正在跳过空格。这将导致目标字符串保持单元化内存 - 在某些平台上可能是\0
,而在其他平台上可能只是随机垃圾。相反,您应该维护两个索引计数器,一个用于源,一个用于目标,并在您完成时在目标末尾显式设置\0
:
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] = '\0'; /* Handle the string termination */
printf("%s\n", c);
答案 1 :(得分:1)
1 - 您不需要创建另一个字符串。 2-toupper()函数不会将数字转换为其他内容。 3 - 如果你找到一个空间,你只需要拉出其余部分。
int i = 0, j;
char str[] = "Hello8 world";
while(str[i]!='\0')
{
if(str[i]==' ')
{
for(j=i;str[j]!='\0';j++)
{
str[j]=str[j+1];
}
}
else
{
str[i]=toupper(str[i]);
i++;
}
}
printf("%s\n", str);
return 0;
答案 2 :(得分:0)
在while
循环后,添加c[i] = '\0';
。
这会将字符数组转换为字符串(根据定义,它必须以\0
作为终结符。)
答案 3 :(得分:0)
为什么不使用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] = '\0';
printf("%s\n", upper);
return 0;
}