c 中如何在首位给字符串添加一个字母
时间: 2024-03-27 13:38:11 浏览: 82
可以使用字符数组和字符串函数来在首位添加一个字母。具体可以参考下面的代码:
```c
#include <stdio.h>
#include <string.h>
int main() {
char str[20] = "world"; // 初始化字符串
char ch = 'h'; // 要添加的字母
int len = strlen(str); // 获取字符串长度
// 在字符串首位添加字母
for (int i = len; i >= 0; i--) {
str[i+1] = str[i];
}
str[0] = ch;
printf("%s\n", str); // 输出结果
return 0;
}
```
在上面的代码中,我们首先定义了一个字符数组 `str`,并初始化为 "world",然后定义了一个字符 `ch`,表示要添加的字母。接下来,我们使用字符串函数 `strlen` 获取字符串长度,然后使用循环将字符串中的每个字符向后移动一位,最后在首位添加要添加的字母。最后,我们使用 `printf` 输出结果。
相关问题
用汇编语言 从键盘输入一个长度不超过30的字符串,其中包含自己的班级名称+学号+姓名的拼音(班级和姓名的首字母大写),以"$"符号结束,之后完成以下任务(要求使用子程序): 屏幕显示输出该字符串; 将该字符串的奇数位置字符提取出来,组合成一个字符串显示输出; 将该字符串中的所有数字字符剔除,然后显示输出; 将该字符串中的英文大写字母变成小写字母,小写字母变成大写字母,显示输出; 统计该字符串中的大写字母、小写字母和数字的个数,保存在内存变量中,并在屏幕上显示; 将该字符串中的数字进行累加,将累加结果显示输出。
以下是汇编语言的代码实现:
```
.model small
.stack 100h
.data
inputStr db 31 dup('$')
outputStr db 31 dup('$')
numCount dw 0
upperCount dw 0
lowerCount dw 0
sum dw 0
.code
main proc
mov ax, @data
mov ds, ax
; 获取字符串输入
call getStringInput
; 显示原始字符串
mov ah, 09h
mov dx, offset inputStr
int 21h
; 获取奇数位字符
call getOddChars
; 显示奇数位字符
mov ah, 09h
mov dx, offset outputStr
int 21h
; 剔除数字字符
call removeNums
; 显示剔除数字后的字符串
mov ah, 09h
mov dx, offset inputStr
int 21h
; 大小写字母转换
call convertCase
; 显示大小写转换后的字符串
mov ah, 09h
mov dx, offset inputStr
int 21h
; 统计字符个数
call countChars
; 显示字符个数统计结果
mov ah, 09h
mov dx, offset outputStr
int 21h
; 累加数字
call sumNums
; 显示数字累加结果
mov ah, 09h
mov dx, offset outputStr
int 21h
mov ah, 4ch
int 21h
main endp
; 获取字符串输入
getStringInput proc
mov si, 0
mov cx, 30
inputLoop:
; 从键盘读取一个字符
mov ah, 01h
int 21h
; 如果是回车键,结束输入
cmp al, 0dh
je inputEnd
; 如果已经达到最大长度,结束输入
cmp si, 30
je inputEnd
; 将字符存入字符串中
mov [inputStr+si], al
inc si
jmp inputLoop
inputEnd:
; 在字符串末尾添加 "$" 符号
mov [inputStr+si], '$'
ret
getStringInput endp
; 获取奇数位字符
getOddChars proc
mov si, 1
mov di, 0
oddLoop:
; 如果已经到达字符串末尾,结束循环
cmp byte ptr [inputStr+si], '$'
je oddEnd
; 将奇数位字符存入输出字符串中
mov al, [inputStr+si]
mov [outputStr+di], al
inc di
; 跳过偶数位字符
add si, 2
jmp oddLoop
oddEnd:
; 在输出字符串末尾添加 "$" 符号
mov [outputStr+di], '$'
ret
getOddChars endp
; 剔除数字字符
removeNums proc
mov si, 0
mov di, 0
removeLoop:
; 如果已经到达字符串末尾,结束循环
cmp byte ptr [inputStr+si], '$'
je removeEnd
; 如果是数字字符,跳过
cmp byte ptr [inputStr+si], '0'
jb removeSkip
cmp byte ptr [inputStr+si], '9'
ja removeSkip
; 将非数字字符存入输入字符串中
mov al, [inputStr+si]
mov [inputStr+di], al
inc di
removeSkip:
; 继续循环
inc si
jmp removeLoop
removeEnd:
; 在输入字符串末尾添加 "$" 符号
mov [inputStr+di], '$'
ret
removeNums endp
; 大小写字母转换
convertCase proc
mov si, 0
convertLoop:
; 如果已经到达字符串末尾,结束循环
cmp byte ptr [inputStr+si], '$'
je convertEnd
; 如果是大写字母,转换为小写字母
cmp byte ptr [inputStr+si], 'A'
jb convertSkip
cmp byte ptr [inputStr+si], 'Z'
ja convertSkip
add byte ptr [inputStr+si], 32
; 如果是小写字母,转换为大写字母
jmp convertNext
cmp byte ptr [inputStr+si], 'a'
jb convertNext
cmp byte ptr [inputStr+si], 'z'
ja convertNext
sub byte ptr [inputStr+si], 32
convertNext:
; 继续循环
inc si
jmp convertLoop
convertSkip:
; 继续循环
inc si
jmp convertLoop
convertEnd:
ret
convertCase endp
; 统计字符个数
countChars proc
mov si, 0
mov di, offset outputStr
mov word ptr [numCount], 0
mov word ptr [upperCount], 0
mov word ptr [lowerCount], 0
countLoop:
; 如果已经到达字符串末尾,结束循环
cmp byte ptr [inputStr+si], '$'
je countEnd
; 统计数字个数
cmp byte ptr [inputStr+si], '0'
jb countSkip
cmp byte ptr [inputStr+si], '9'
ja countNext
inc word ptr [numCount]
; 统计大写字母个数
jmp countLower
cmp byte ptr [inputStr+si], 'A'
jb countLower
cmp byte ptr [inputStr+si], 'Z'
ja countLower
inc word ptr [upperCount]
jmp countNext
countLower:
; 统计小写字母个数
cmp byte ptr [inputStr+si], 'a'
jb countNext
cmp byte ptr [inputStr+si], 'z'
ja countNext
inc word ptr [lowerCount]
countNext:
; 将字符存入输出字符串中
mov al, [inputStr+si]
mov [di], al
inc di
; 继续循环
inc si
jmp countLoop
countSkip:
; 将字符存入输出字符串中
mov al, [inputStr+si]
mov [di], al
inc di
; 继续循环
inc si
jmp countLoop
countEnd:
; 在输出字符串末尾添加 "$" 符号
mov [di], '$'
; 将字符个数统计结果存入输出字符串中
mov word ptr [di+2], [numCount]
mov word ptr [di+6], [upperCount]
mov word ptr [di+10], [lowerCount]
ret
countChars endp
; 累加数字
sumNums proc
mov si, 0
mov word ptr [sum], 0
sumLoop:
; 如果已经到达字符串末尾,结束循环
cmp byte ptr [inputStr+si], '$'
je sumEnd
; 如果是数字字符,累加到总和中
cmp byte ptr [inputStr+si], '0'
jb sumNext
cmp byte ptr [inputStr+si], '9'
ja sumNext
sub byte ptr [inputStr+si], 48
mov ax, [sum]
add ax, byte ptr [inputStr+si]
mov [sum], ax
sumNext:
; 继续循环
inc si
jmp sumLoop
sumEnd:
; 将数字累加结果转换为字符串
mov ax, [sum]
call wordToString
; 将数字累加结果存入输出字符串中
mov di, offset outputStr
mov [di], 'S'
mov [di+1], 'u'
mov [di+2], 'm'
mov [di+3], ':'
mov [di+4], ' '
mov dx, offset numStr
mov ah, 09h
int 21h
; 在输出字符串末尾添加 "$" 符号
mov [di+5], '$'
ret
sumNums endp
; 将十进制数转换为字符串
wordToString proc
push ax
push bx
push cx
mov bx, 10
mov cx, 0
numLoop:
xor dx, dx
div bx
push dx
inc cx
cmp ax, 0
jne numLoop
mov si, 0
strLoop:
pop dx
add dl, 48
mov [numStr+si], dl
inc si
loop strLoop
pop cx
pop bx
pop ax
ret
wordToString endp
end main
```
注:该代码使用的汇编语言是8086汇编。
输入一个字符串,将这个字符串中的大写英文字母除去,输出剩余的字符组成的字符串。(要求用指针做)
好的,您的要求我已经了解了。现在回答您的问题:
可以通过遍历输入的字符串,判断每个字符是否是大写英文字母,如果不是就将该字符拷贝到另一个字符串中。最后将这个新字符串输出即可。
以下是示例代码:
```c
#include <stdio.h>
#include <ctype.h>
void remove_upper(char *str)
{
char *new_str = str; // 新字符串的指针初始化指向原字符串的首地址
while (*str) {
if (!isupper(*str)) { // 判断当前字符是否是大写英文字母
*new_str = *str; // 拷贝当前字符到新字符串中
new_str++; // 新字符串的指针后移一位
}
str++; // 原字符串的指针后移一位
}
*new_str = '\0'; // 在新字符串的末尾添加结束符
}
int main()
{
char str[100];
printf("请输入字符串:");
scanf("%s", str);
remove_upper(str);
printf("处理结果:%s\n", str);
return 0;
}
```
在这个示例中,我们先定义了一个 `remove_upper` 函数,用于移除输入字符串中的大写英文字母。这个函数的参数 `str` 是一个指向输入字符串的指针。
函数内部我们定义了一个新字符串 `new_str` 的指针,并将其初始化为 `str` 的首地址。然后我们使用一个 `while` 循环依次遍历 `str` 字符串中的每个字符,并判断该字符是否是大写英文字母。如果当前字符不是大写英文字母,就将其拷贝到 `new_str` 指向的内存地址中,然后将 `new_str` 指针后移一位,以准备拷贝下一个字符。最后,我们在新字符串的末尾添加一个 `\0` 结束符,以确保新字符串的结尾处不会出现意外字符。
最后,我们在 `main` 函数中调用 `remove_upper` 函数,并将输入的字符串作为参数传递给它。运行程序时,程序会提示用户输入一个字符串,并在输入完成后将结果输出。
阅读全文